diff --git a/16/16.ipynb b/16/16.ipynb index 2623fb5..e32162c 100644 --- a/16/16.ipynb +++ b/16/16.ipynb @@ -2,761 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 10, + "execution_count": 72, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([(1, 13),\n", - " (1, 12),\n", - " (1, 11),\n", - " (2, 11),\n", - " (3, 11),\n", - " (4, 11),\n", - " (5, 11),\n", - " (5, 10),\n", - " (5, 9),\n", - " (5, 8),\n", - " (5, 7),\n", - " (6, 7),\n", - " (7, 7),\n", - " (8, 7),\n", - " (9, 7),\n", - " (9, 6),\n", - " (9, 5),\n", - " (10, 5),\n", - " (11, 5),\n", - " (11, 4),\n", - " (11, 3),\n", - " (10, 3),\n", - " (9, 3),\n", - " (9, 2),\n", - " (9, 1),\n", - " (10, 1),\n", - " (11, 1),\n", - " (12, 1),\n", - " (13, 1)],\n", - " 28)" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Rechecking the imports and retrying the execution\n", - "\n", - "# Importing NetworkX again to ensure proper initialization\n", - "import networkx as nx\n", - "\n", - "# Retry defining and executing the code\n", - "with open('testinput','r') as infile:\n", - " ascii_map = infile.read()\n", - "\n", - "def parse_ascii_map(ascii_map):\n", - " graph = nx.DiGraph() # Directed graph for flexibility with edge weights\n", - " rows = ascii_map.strip().split(\"\\n\")\n", - " height, width = len(rows), len(rows[0])\n", - " directions = [(-1, 0), (1, 0), (0, -1), (0, 1)] # Up, Down, Left, Right\n", - "\n", - " start, end = None, None\n", - " for y, row in enumerate(rows):\n", - " for x, char in enumerate(row):\n", - " if char != '#': # Not a wall\n", - " graph.add_node((x, y))\n", - " if char == 'S':\n", - " start = (x, y)\n", - " elif char == 'E':\n", - " end = (x, y)\n", - "\n", - " # Add edges for neighbors\n", - " for dx, dy in directions:\n", - " nx_new, ny_new = x + dx, y + dy\n", - " if 0 <= nx_new < width and 0 <= ny_new < height and rows[ny_new][nx_new] != '#':\n", - " graph.add_edge((x, y), (nx_new, ny_new), weight=1)\n", - " return graph, start, end\n", - "\n", - "def find_shortest_path(graph, start, end):\n", - " try:\n", - " path = nx.shortest_path(graph, source=start, target=end, weight='weight')\n", - " cost = nx.shortest_path_length(graph, source=start, target=end, weight='weight')\n", - " return path, cost\n", - " except nx.NetworkXNoPath:\n", - " return None, float('inf')\n", - "\n", - "# Parse and solve\n", - "graph, start, end = parse_ascii_map(ascii_map)\n", - "path, cost = find_shortest_path(graph, start, end)\n", - "\n", - "path, cost\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "([(1, 139, 'E'),\n", - " (2, 139, 'E'),\n", - " (3, 139, 'E'),\n", - " (3, 139, 'N'),\n", - " (3, 138, 'N'),\n", - " (3, 137, 'N'),\n", - " (3, 137, 'E'),\n", - " (4, 137, 'E'),\n", - " (5, 137, 'E'),\n", - " (5, 137, 'S'),\n", - " (5, 138, 'S'),\n", - " (5, 139, 'S'),\n", - " (5, 139, 'E'),\n", - " (6, 139, 'E'),\n", - " (7, 139, 'E'),\n", - " (7, 139, 'N'),\n", - " (7, 138, 'N'),\n", - " (7, 137, 'N'),\n", - " (7, 137, 'E'),\n", - " (8, 137, 'E'),\n", - " (9, 137, 'E'),\n", - " (10, 137, 'E'),\n", - " (11, 137, 'E'),\n", - " (11, 137, 'S'),\n", - " (11, 138, 'S'),\n", - " (11, 139, 'S'),\n", - " (11, 139, 'E'),\n", - " (12, 139, 'E'),\n", - " (13, 139, 'E'),\n", - " (13, 139, 'N'),\n", - " (13, 138, 'N'),\n", - " (13, 137, 'N'),\n", - " (13, 137, 'E'),\n", - " (14, 137, 'E'),\n", - " (15, 137, 'E'),\n", - " (15, 137, 'S'),\n", - " (15, 138, 'S'),\n", - " (15, 139, 'S'),\n", - " (15, 139, 'E'),\n", - " (16, 139, 'E'),\n", - " (17, 139, 'E'),\n", - " (17, 139, 'N'),\n", - " (17, 138, 'N'),\n", - " (17, 137, 'N'),\n", - " (17, 136, 'N'),\n", - " (17, 135, 'N'),\n", - " (17, 134, 'N'),\n", - " (17, 133, 'N'),\n", - " (17, 133, 'E'),\n", - " (18, 133, 'E'),\n", - " (19, 133, 'E'),\n", - " (20, 133, 'E'),\n", - " (21, 133, 'E'),\n", - " (22, 133, 'E'),\n", - " (23, 133, 'E'),\n", - " (24, 133, 'E'),\n", - " (25, 133, 'E'),\n", - " (26, 133, 'E'),\n", - " (27, 133, 'E'),\n", - " (28, 133, 'E'),\n", - " (29, 133, 'E'),\n", - " (30, 133, 'E'),\n", - " (31, 133, 'E'),\n", - " (32, 133, 'E'),\n", - " (33, 133, 'E'),\n", - " (34, 133, 'E'),\n", - " (35, 133, 'E'),\n", - " (35, 133, 'S'),\n", - " (35, 134, 'S'),\n", - " (35, 135, 'S'),\n", - " (35, 136, 'S'),\n", - " (35, 137, 'S'),\n", - " (35, 138, 'S'),\n", - " (35, 139, 'S'),\n", - " (35, 139, 'E'),\n", - " (36, 139, 'E'),\n", - " (37, 139, 'E'),\n", - " (37, 139, 'N'),\n", - " (37, 138, 'N'),\n", - " (37, 137, 'N'),\n", - " (37, 137, 'E'),\n", - " (38, 137, 'E'),\n", - " (39, 137, 'E'),\n", - " (39, 137, 'N'),\n", - " (39, 136, 'N'),\n", - " (39, 135, 'N'),\n", - " (39, 134, 'N'),\n", - " (39, 133, 'N'),\n", - " (39, 133, 'E'),\n", - " (40, 133, 'E'),\n", - " (41, 133, 'E'),\n", - " (41, 133, 'S'),\n", - " (41, 134, 'S'),\n", - " (41, 135, 'S'),\n", - " (41, 136, 'S'),\n", - " (41, 137, 'S'),\n", - " (41, 138, 'S'),\n", - " (41, 139, 'S'),\n", - " (41, 139, 'E'),\n", - " (42, 139, 'E'),\n", - " (43, 139, 'E'),\n", - " (44, 139, 'E'),\n", - " (45, 139, 'E'),\n", - " (45, 139, 'N'),\n", - " (45, 138, 'N'),\n", - " (45, 137, 'N'),\n", - " (45, 137, 'E'),\n", - " (46, 137, 'E'),\n", - " (47, 137, 'E'),\n", - " (48, 137, 'E'),\n", - " (49, 137, 'E'),\n", - " (49, 137, 'N'),\n", - " (49, 136, 'N'),\n", - " (49, 135, 'N'),\n", - " (49, 134, 'N'),\n", - " (49, 133, 'N'),\n", - " (49, 133, 'E'),\n", - " (50, 133, 'E'),\n", - " (51, 133, 'E'),\n", - " (52, 133, 'E'),\n", - " (53, 133, 'E'),\n", - " (53, 133, 'S'),\n", - " (53, 134, 'S'),\n", - " (53, 135, 'S'),\n", - " (53, 136, 'S'),\n", - " (53, 137, 'S'),\n", - " (53, 138, 'S'),\n", - " (53, 139, 'S'),\n", - " (53, 139, 'E'),\n", - " (54, 139, 'E'),\n", - " (55, 139, 'E'),\n", - " (56, 139, 'E'),\n", - " (57, 139, 'E'),\n", - " (57, 139, 'N'),\n", - " (57, 138, 'N'),\n", - " (57, 137, 'N'),\n", - " (57, 136, 'N'),\n", - " (57, 135, 'N'),\n", - " (57, 135, 'E'),\n", - " (58, 135, 'E'),\n", - " (59, 135, 'E'),\n", - " (60, 135, 'E'),\n", - " (61, 135, 'E'),\n", - " (61, 135, 'S'),\n", - " (61, 136, 'S'),\n", - " (61, 137, 'S'),\n", - " (61, 137, 'W'),\n", - " (60, 137, 'W'),\n", - " (59, 137, 'W'),\n", - " (59, 137, 'S'),\n", - " (59, 138, 'S'),\n", - " (59, 139, 'S'),\n", - " (59, 139, 'E'),\n", - " (60, 139, 'E'),\n", - " (61, 139, 'E'),\n", - " (62, 139, 'E'),\n", - " (63, 139, 'E'),\n", - " (64, 139, 'E'),\n", - " (65, 139, 'E'),\n", - " (66, 139, 'E'),\n", - " (67, 139, 'E'),\n", - " (68, 139, 'E'),\n", - " (69, 139, 'E'),\n", - " (69, 139, 'N'),\n", - " (69, 138, 'N'),\n", - " (69, 137, 'N'),\n", - " (69, 137, 'E'),\n", - " (70, 137, 'E'),\n", - " (71, 137, 'E'),\n", - " (72, 137, 'E'),\n", - " (73, 137, 'E'),\n", - " (74, 137, 'E'),\n", - " (75, 137, 'E'),\n", - " (76, 137, 'E'),\n", - " (77, 137, 'E'),\n", - " (78, 137, 'E'),\n", - " (79, 137, 'E'),\n", - " (79, 137, 'S'),\n", - " (79, 138, 'S'),\n", - " (79, 139, 'S'),\n", - " (79, 139, 'E'),\n", - " (80, 139, 'E'),\n", - " (81, 139, 'E'),\n", - " (82, 139, 'E'),\n", - " (83, 139, 'E'),\n", - " (84, 139, 'E'),\n", - " (85, 139, 'E'),\n", - " (86, 139, 'E'),\n", - " (87, 139, 'E'),\n", - " (88, 139, 'E'),\n", - " (89, 139, 'E'),\n", - " (90, 139, 'E'),\n", - " (91, 139, 'E'),\n", - " (92, 139, 'E'),\n", - " (93, 139, 'E'),\n", - " (94, 139, 'E'),\n", - " (95, 139, 'E'),\n", - " (96, 139, 'E'),\n", - " (97, 139, 'E'),\n", - " (98, 139, 'E'),\n", - " (99, 139, 'E'),\n", - " (100, 139, 'E'),\n", - " (101, 139, 'E'),\n", - " (102, 139, 'E'),\n", - " (103, 139, 'E'),\n", - " (104, 139, 'E'),\n", - " (105, 139, 'E'),\n", - " (106, 139, 'E'),\n", - " (107, 139, 'E'),\n", - " (108, 139, 'E'),\n", - " (109, 139, 'E'),\n", - " (110, 139, 'E'),\n", - " (111, 139, 'E'),\n", - " (112, 139, 'E'),\n", - " (113, 139, 'E'),\n", - " (113, 139, 'N'),\n", - " (113, 138, 'N'),\n", - " (113, 137, 'N'),\n", - " (113, 136, 'N'),\n", - " (113, 135, 'N'),\n", - " (113, 134, 'N'),\n", - " (113, 133, 'N'),\n", - " (113, 132, 'N'),\n", - " (113, 131, 'N'),\n", - " (113, 130, 'N'),\n", - " (113, 129, 'N'),\n", - " (113, 128, 'N'),\n", - " (113, 127, 'N'),\n", - " (113, 126, 'N'),\n", - " (113, 125, 'N'),\n", - " (113, 124, 'N'),\n", - " (113, 123, 'N'),\n", - " (113, 123, 'E'),\n", - " (114, 123, 'E'),\n", - " (115, 123, 'E'),\n", - " (115, 123, 'N'),\n", - " (115, 122, 'N'),\n", - " (115, 121, 'N'),\n", - " (115, 121, 'E'),\n", - " (116, 121, 'E'),\n", - " (117, 121, 'E'),\n", - " (118, 121, 'E'),\n", - " (119, 121, 'E'),\n", - " (120, 121, 'E'),\n", - " (121, 121, 'E'),\n", - " (121, 121, 'N'),\n", - " (121, 120, 'N'),\n", - " (121, 119, 'N'),\n", - " (121, 119, 'E'),\n", - " (122, 119, 'E'),\n", - " (123, 119, 'E'),\n", - " (123, 119, 'N'),\n", - " (123, 118, 'N'),\n", - " (123, 117, 'N'),\n", - " (123, 116, 'N'),\n", - " (123, 115, 'N'),\n", - " (123, 115, 'W'),\n", - " (122, 115, 'W'),\n", - " (121, 115, 'W'),\n", - " (121, 115, 'N'),\n", - " (121, 114, 'N'),\n", - " (121, 113, 'N'),\n", - " (121, 112, 'N'),\n", - " (121, 111, 'N'),\n", - " (121, 110, 'N'),\n", - " (121, 109, 'N'),\n", - " (121, 108, 'N'),\n", - " (121, 107, 'N'),\n", - " (121, 107, 'W'),\n", - " (120, 107, 'W'),\n", - " (119, 107, 'W'),\n", - " (119, 107, 'N'),\n", - " (119, 106, 'N'),\n", - " (119, 105, 'N'),\n", - " (119, 104, 'N'),\n", - " (119, 103, 'N'),\n", - " (119, 103, 'W'),\n", - " (118, 103, 'W'),\n", - " (117, 103, 'W'),\n", - " (117, 103, 'S'),\n", - " (117, 104, 'S'),\n", - " (117, 105, 'S'),\n", - " (117, 105, 'W'),\n", - " (116, 105, 'W'),\n", - " (115, 105, 'W'),\n", - " (115, 105, 'N'),\n", - " (115, 104, 'N'),\n", - " (115, 103, 'N'),\n", - " (115, 102, 'N'),\n", - " (115, 101, 'N'),\n", - " (115, 100, 'N'),\n", - " (115, 99, 'N'),\n", - " (115, 99, 'W'),\n", - " (114, 99, 'W'),\n", - " (113, 99, 'W'),\n", - " (113, 99, 'N'),\n", - " (113, 98, 'N'),\n", - " (113, 97, 'N'),\n", - " (113, 97, 'W'),\n", - " (112, 97, 'W'),\n", - " (111, 97, 'W'),\n", - " (111, 97, 'N'),\n", - " (111, 96, 'N'),\n", - " (111, 95, 'N'),\n", - " (111, 95, 'E'),\n", - " (112, 95, 'E'),\n", - " (113, 95, 'E'),\n", - " (113, 95, 'N'),\n", - " (113, 94, 'N'),\n", - " (113, 93, 'N'),\n", - " (113, 92, 'N'),\n", - " (113, 91, 'N'),\n", - " (113, 90, 'N'),\n", - " (113, 89, 'N'),\n", - " (113, 89, 'E'),\n", - " (114, 89, 'E'),\n", - " (115, 89, 'E'),\n", - " (116, 89, 'E'),\n", - " (117, 89, 'E'),\n", - " (117, 89, 'S'),\n", - " (117, 90, 'S'),\n", - " (117, 91, 'S'),\n", - " (117, 91, 'E'),\n", - " (118, 91, 'E'),\n", - " (119, 91, 'E'),\n", - " (119, 91, 'N'),\n", - " (119, 90, 'N'),\n", - " (119, 89, 'N'),\n", - " (119, 89, 'E'),\n", - " (120, 89, 'E'),\n", - " (121, 89, 'E'),\n", - " (122, 89, 'E'),\n", - " (123, 89, 'E'),\n", - " (123, 89, 'N'),\n", - " (123, 88, 'N'),\n", - " (123, 87, 'N'),\n", - " (123, 86, 'N'),\n", - " (123, 85, 'N'),\n", - " (123, 84, 'N'),\n", - " (123, 83, 'N'),\n", - " (123, 82, 'N'),\n", - " (123, 81, 'N'),\n", - " (123, 81, 'E'),\n", - " (124, 81, 'E'),\n", - " (125, 81, 'E'),\n", - " (125, 81, 'S'),\n", - " (125, 82, 'S'),\n", - " (125, 83, 'S'),\n", - " (125, 83, 'E'),\n", - " (126, 83, 'E'),\n", - " (127, 83, 'E'),\n", - " (127, 83, 'N'),\n", - " (127, 82, 'N'),\n", - " (127, 81, 'N'),\n", - " (127, 80, 'N'),\n", - " (127, 79, 'N'),\n", - " (127, 79, 'E'),\n", - " (128, 79, 'E'),\n", - " (129, 79, 'E'),\n", - " (129, 79, 'N'),\n", - " (129, 78, 'N'),\n", - " (129, 77, 'N'),\n", - " (129, 77, 'W'),\n", - " (128, 77, 'W'),\n", - " (127, 77, 'W'),\n", - " (126, 77, 'W'),\n", - " (125, 77, 'W'),\n", - " (124, 77, 'W'),\n", - " (123, 77, 'W'),\n", - " (123, 77, 'S'),\n", - " (123, 78, 'S'),\n", - " (123, 79, 'S'),\n", - " (123, 79, 'W'),\n", - " (122, 79, 'W'),\n", - " (121, 79, 'W'),\n", - " (121, 79, 'N'),\n", - " (121, 78, 'N'),\n", - " (121, 77, 'N'),\n", - " (121, 76, 'N'),\n", - " (121, 75, 'N'),\n", - " (121, 75, 'E'),\n", - " (122, 75, 'E'),\n", - " (123, 75, 'E'),\n", - " (124, 75, 'E'),\n", - " (125, 75, 'E'),\n", - " (125, 75, 'N'),\n", - " (125, 74, 'N'),\n", - " (125, 73, 'N'),\n", - " (125, 73, 'W'),\n", - " (124, 73, 'W'),\n", - " (123, 73, 'W'),\n", - " (123, 73, 'N'),\n", - " (123, 72, 'N'),\n", - " (123, 71, 'N'),\n", - " (123, 71, 'E'),\n", - " (124, 71, 'E'),\n", - " (125, 71, 'E'),\n", - " (126, 71, 'E'),\n", - " (127, 71, 'E'),\n", - " (128, 71, 'E'),\n", - " (129, 71, 'E'),\n", - " (129, 71, 'N'),\n", - " (129, 70, 'N'),\n", - " (129, 69, 'N'),\n", - " (129, 69, 'E'),\n", - " (130, 69, 'E'),\n", - " (131, 69, 'E'),\n", - " (131, 69, 'S'),\n", - " (131, 70, 'S'),\n", - " (131, 71, 'S'),\n", - " (131, 72, 'S'),\n", - " (131, 73, 'S'),\n", - " (131, 74, 'S'),\n", - " (131, 75, 'S'),\n", - " (131, 75, 'E'),\n", - " (132, 75, 'E'),\n", - " (133, 75, 'E'),\n", - " (134, 75, 'E'),\n", - " (135, 75, 'E'),\n", - " (136, 75, 'E'),\n", - " (137, 75, 'E'),\n", - " (138, 75, 'E'),\n", - " (139, 75, 'E'),\n", - " (139, 75, 'N'),\n", - " (139, 74, 'N'),\n", - " (139, 73, 'N'),\n", - " (139, 73, 'W'),\n", - " (138, 73, 'W'),\n", - " (137, 73, 'W'),\n", - " (137, 73, 'N'),\n", - " (137, 72, 'N'),\n", - " (137, 71, 'N'),\n", - " (137, 71, 'W'),\n", - " (136, 71, 'W'),\n", - " (135, 71, 'W'),\n", - " (134, 71, 'W'),\n", - " (133, 71, 'W'),\n", - " (133, 71, 'N'),\n", - " (133, 70, 'N'),\n", - " (133, 69, 'N'),\n", - " (133, 68, 'N'),\n", - " (133, 67, 'N'),\n", - " (133, 67, 'W'),\n", - " (132, 67, 'W'),\n", - " (131, 67, 'W'),\n", - " (131, 67, 'N'),\n", - " (131, 66, 'N'),\n", - " (131, 65, 'N'),\n", - " (131, 65, 'E'),\n", - " (132, 65, 'E'),\n", - " (133, 65, 'E'),\n", - " (133, 65, 'N'),\n", - " (133, 64, 'N'),\n", - " (133, 63, 'N'),\n", - " (133, 63, 'W'),\n", - " (132, 63, 'W'),\n", - " (131, 63, 'W'),\n", - " (131, 63, 'N'),\n", - " (131, 62, 'N'),\n", - " (131, 61, 'N'),\n", - " (131, 61, 'W'),\n", - " (130, 61, 'W'),\n", - " (129, 61, 'W'),\n", - " (128, 61, 'W'),\n", - " (127, 61, 'W'),\n", - " (127, 61, 'S'),\n", - " (127, 62, 'S'),\n", - " (127, 63, 'S'),\n", - " (127, 64, 'S'),\n", - " (127, 65, 'S'),\n", - " (127, 65, 'E'),\n", - " (128, 65, 'E'),\n", - " (129, 65, 'E'),\n", - " (129, 65, 'S'),\n", - " (129, 66, 'S'),\n", - " (129, 67, 'S'),\n", - " (129, 67, 'W'),\n", - " (128, 67, 'W'),\n", - " (127, 67, 'W'),\n", - " (127, 67, 'S'),\n", - " (127, 68, 'S'),\n", - " (127, 69, 'S'),\n", - " (127, 69, 'W'),\n", - " (126, 69, 'W'),\n", - " (125, 69, 'W'),\n", - " (124, 69, 'W'),\n", - " (123, 69, 'W'),\n", - " (122, 69, 'W'),\n", - " (121, 69, 'W'),\n", - " (121, 69, 'N'),\n", - " (121, 68, 'N'),\n", - " (121, 67, 'N'),\n", - " (121, 66, 'N'),\n", - " (121, 65, 'N'),\n", - " (121, 64, 'N'),\n", - " (121, 63, 'N'),\n", - " (121, 63, 'W'),\n", - " (120, 63, 'W'),\n", - " (119, 63, 'W'),\n", - " (119, 63, 'N'),\n", - " (119, 62, 'N'),\n", - " (119, 61, 'N'),\n", - " (119, 61, 'E'),\n", - " (120, 61, 'E'),\n", - " (121, 61, 'E'),\n", - " (121, 61, 'N'),\n", - " (121, 60, 'N'),\n", - " (121, 59, 'N'),\n", - " (121, 58, 'N'),\n", - " (121, 57, 'N'),\n", - " (121, 56, 'N'),\n", - " (121, 55, 'N'),\n", - " (121, 54, 'N'),\n", - " (121, 53, 'N'),\n", - " (121, 53, 'W'),\n", - " (120, 53, 'W'),\n", - " (119, 53, 'W'),\n", - " (118, 53, 'W'),\n", - " (117, 53, 'W'),\n", - " (117, 53, 'N'),\n", - " (117, 52, 'N'),\n", - " (117, 51, 'N'),\n", - " (117, 51, 'E'),\n", - " (118, 51, 'E'),\n", - " (119, 51, 'E'),\n", - " (119, 51, 'N'),\n", - " (119, 50, 'N'),\n", - " (119, 49, 'N'),\n", - " (119, 49, 'W'),\n", - " (118, 49, 'W'),\n", - " (117, 49, 'W'),\n", - " (117, 49, 'N'),\n", - " (117, 48, 'N'),\n", - " (117, 47, 'N'),\n", - " (117, 47, 'E'),\n", - " (118, 47, 'E'),\n", - " (119, 47, 'E'),\n", - " (120, 47, 'E'),\n", - " (121, 47, 'E'),\n", - " (121, 47, 'N'),\n", - " (121, 46, 'N'),\n", - " (121, 45, 'N'),\n", - " (121, 44, 'N'),\n", - " (121, 43, 'N'),\n", - " (121, 42, 'N'),\n", - " (121, 41, 'N'),\n", - " (121, 40, 'N'),\n", - " (121, 39, 'N'),\n", - " (121, 38, 'N'),\n", - " (121, 37, 'N'),\n", - " (121, 37, 'E'),\n", - " (122, 37, 'E'),\n", - " (123, 37, 'E'),\n", - " (124, 37, 'E'),\n", - " (125, 37, 'E'),\n", - " (125, 37, 'N'),\n", - " (125, 36, 'N'),\n", - " (125, 35, 'N'),\n", - " (125, 35, 'E'),\n", - " (126, 35, 'E'),\n", - " (127, 35, 'E'),\n", - " (127, 35, 'N'),\n", - " (127, 34, 'N'),\n", - " (127, 33, 'N'),\n", - " (127, 33, 'E'),\n", - " (128, 33, 'E'),\n", - " (129, 33, 'E'),\n", - " (130, 33, 'E'),\n", - " (131, 33, 'E'),\n", - " (132, 33, 'E'),\n", - " (133, 33, 'E'),\n", - " (134, 33, 'E'),\n", - " (135, 33, 'E'),\n", - " (136, 33, 'E'),\n", - " (137, 33, 'E'),\n", - " (138, 33, 'E'),\n", - " (139, 33, 'E'),\n", - " (139, 33, 'N'),\n", - " (139, 32, 'N'),\n", - " (139, 31, 'N'),\n", - " (139, 31, 'W'),\n", - " (138, 31, 'W'),\n", - " (137, 31, 'W'),\n", - " (137, 31, 'N'),\n", - " (137, 30, 'N'),\n", - " (137, 29, 'N'),\n", - " (137, 28, 'N'),\n", - " (137, 27, 'N'),\n", - " (137, 27, 'E'),\n", - " (138, 27, 'E'),\n", - " (139, 27, 'E'),\n", - " (139, 27, 'N'),\n", - " (139, 26, 'N'),\n", - " (139, 25, 'N'),\n", - " (139, 24, 'N'),\n", - " (139, 23, 'N'),\n", - " (139, 22, 'N'),\n", - " (139, 21, 'N'),\n", - " (139, 21, 'W'),\n", - " (138, 21, 'W'),\n", - " (137, 21, 'W'),\n", - " (137, 21, 'S'),\n", - " (137, 22, 'S'),\n", - " (137, 23, 'S'),\n", - " (137, 24, 'S'),\n", - " (137, 25, 'S'),\n", - " (137, 25, 'W'),\n", - " (136, 25, 'W'),\n", - " (135, 25, 'W'),\n", - " (135, 25, 'N'),\n", - " (135, 24, 'N'),\n", - " (135, 23, 'N'),\n", - " (135, 22, 'N'),\n", - " (135, 21, 'N'),\n", - " (135, 20, 'N'),\n", - " (135, 19, 'N'),\n", - " (135, 19, 'E'),\n", - " (136, 19, 'E'),\n", - " (137, 19, 'E'),\n", - " (138, 19, 'E'),\n", - " (139, 19, 'E'),\n", - " (139, 19, 'N'),\n", - " (139, 18, 'N'),\n", - " (139, 17, 'N'),\n", - " (139, 16, 'N'),\n", - " (139, 15, 'N'),\n", - " (139, 14, 'N'),\n", - " (139, 13, 'N'),\n", - " (139, 12, 'N'),\n", - " (139, 11, 'N'),\n", - " (139, 10, 'N'),\n", - " (139, 9, 'N'),\n", - " (139, 8, 'N'),\n", - " (139, 7, 'N'),\n", - " (139, 7, 'W'),\n", - " (138, 7, 'W'),\n", - " (137, 7, 'W'),\n", - " (137, 7, 'N'),\n", - " (137, 6, 'N'),\n", - " (137, 5, 'N'),\n", - " (137, 5, 'E'),\n", - " (138, 5, 'E'),\n", - " (139, 5, 'E'),\n", - " (139, 5, 'N'),\n", - " (139, 4, 'N'),\n", - " (139, 3, 'N'),\n", - " (139, 2, 'N'),\n", - " (139, 1, 'N')],\n", - " 135512)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "import networkx as nx\n", "\n", @@ -791,7 +39,10 @@ " dx, dy = MOVEMENTS[direction]\n", " nx_new, ny_new = x + dx, y + dy\n", " if 0 <= nx_new < width and 0 <= ny_new < height and rows[ny_new][nx_new] != '#':\n", - " graph.add_edge((x, y, direction), (nx_new, ny_new, direction), weight=1)\n", + " if rows[ny_new][nx_new] == 'E':\n", + " graph.add_edge((x, y, direction), (nx_new, ny_new), weight=1)\n", + " else:\n", + " graph.add_edge((x, y, direction), (nx_new, ny_new, direction), weight=1)\n", "\n", " # Add edges for turning (clockwise and counterclockwise)\n", " for i, direction in enumerate(DIRECTIONS):\n", @@ -799,135 +50,83 @@ " prev_dir = DIRECTIONS[(i - 1) % 4] # Counterclockwise\n", " graph.add_edge((x, y, direction), (x, y, next_dir), weight=1000)\n", " graph.add_edge((x, y, direction), (x, y, prev_dir), weight=1000)\n", - " return graph, start, end\n", "\n", - "# Find the shortest path with the new graph\n", - "def find_shortest_path_with_costs(graph, start, end):\n", - " try:\n", - " # Extract all possible end states (any direction at the endpoint)\n", - " end_nodes = [(end[0], end[1], d) for d in DIRECTIONS]\n", - " shortest_cost = float('inf')\n", - " best_path = None\n", - "\n", - " # Evaluate paths to all possible orientations at the endpoint\n", - " for end_node in end_nodes:\n", - " try:\n", - " path = nx.shortest_path(graph, source=start, target=end_node, weight='weight')\n", - " cost = nx.shortest_path_length(graph, source=start, target=end_node, weight='weight')\n", - " if cost < shortest_cost:\n", - " shortest_cost = cost\n", - " best_path = path\n", - " except nx.NetworkXNoPath:\n", - " continue\n", - " return best_path, shortest_cost\n", - " except nx.NetworkXNoPath:\n", - " return None, float('inf')\n", - "\n", - "# Example ASCII map\n", - "with open('input','r') as infile:\n", - " ascii_map = infile.read()\n", - "\n", - "# Parse the map and solve\n", - "graph, start, end = parse_ascii_map_with_costs(ascii_map)\n", - "path, cost = find_shortest_path_with_costs(graph, start, end)\n", - "\n", - "# Output the results\n", - "path, cost\n" + " return graph, start, end" ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 73, + "metadata": {}, + "outputs": [], + "source": [ + "with open('input','r') as infile:\n", + " ascii_map = infile.read()\n", + "\n", + "# Parse the map and solve\n", + "graph, start, end = parse_ascii_map_with_costs(ascii_map)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [], + "source": [ + "shortestpath = nx.shortest_path(graph,start,end,weight='weight')\n", + "shortestpath_cost = nx.shortest_path_length(graph,start,end,weight='weight')" + ] + }, + { + "cell_type": "code", + "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Minimum Cost to Reach the End: 135512\n" + "135512\n" ] } ], "source": [ - "import heapq\n", - "\n", - "# Define directions and corresponding movements\n", - "DIRECTIONS = ['N', 'E', 'S', 'W']\n", - "MOVEMENTS = {\n", - " 'N': (0, -1), # Move up\n", - " 'E': (1, 0), # Move right\n", - " 'S': (0, 1), # Move down\n", - " 'W': (-1, 0) # Move left\n", - "}\n", - "\n", - "def solve_maze_with_costs(ascii_map):\n", - " rows = ascii_map.strip().split(\"\\n\")\n", - " height, width = len(rows), len(rows[0])\n", - "\n", - " # Find start and end positions\n", - " start, end = None, None\n", - " for y, row in enumerate(rows):\n", - " for x, char in enumerate(row):\n", - " if char == 'S':\n", - " start = (x, y, 'E') # Start facing North\n", - " elif char == 'E':\n", - " end = (x, y)\n", - " \n", - " # Priority queue for Dijkstra's algorithm\n", - " pq = []\n", - " heapq.heappush(pq, (0, start)) # (cost, (x, y, direction))\n", - "\n", - " # Visited states: {(x, y, direction): cost}\n", - " visited = {}\n", - "\n", - " while pq:\n", - " cost, (x, y, direction) = heapq.heappop(pq)\n", - "\n", - " # Goal check: If we reach the endpoint\n", - " if (x, y) == end:\n", - " return cost\n", - "\n", - " # Avoid revisiting with higher cost\n", - " if (x, y, direction) in visited and visited[(x, y, direction)] <= cost:\n", - " continue\n", - " visited[(x, y, direction)] = cost\n", - "\n", - " # 1. Move forward\n", - " dx, dy = MOVEMENTS[direction]\n", - " nx, ny = x + dx, y + dy\n", - " if 0 <= nx < width and 0 <= ny < height and rows[ny][nx] != '#':\n", - " heapq.heappush(pq, (cost + 1, (nx, ny, direction)))\n", - "\n", - " # 2. Rotate clockwise\n", - " next_direction = DIRECTIONS[(DIRECTIONS.index(direction) + 1) % 4]\n", - " heapq.heappush(pq, (cost + 1000, (x, y, next_direction)))\n", - "\n", - " # 3. Rotate counterclockwise\n", - " prev_direction = DIRECTIONS[(DIRECTIONS.index(direction) - 1) % 4]\n", - " heapq.heappush(pq, (cost + 1000, (x, y, prev_direction)))\n", - " \n", - " return float('inf') # No path found\n", - "\n", - "# Example ASCII map\n", - "with open('input','r') as infile:\n", - " ascii_map = infile.read()\n", - "\n", - "# Solve the maze\n", - "cost = solve_maze_with_costs(ascii_map)\n", - "print(\"Minimum Cost to Reach the End:\", cost)\n" + "print(shortestpath_cost)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 76, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "541" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "\n", + "paths = nx.all_shortest_paths(graph,source=start,target=end,weight='weight')\n", + "visited_nodes = set()\n", + "\n", + "for path in paths:\n", + " for grid_node in path:\n", + " visited_nodes.add((grid_node[0],grid_node[1]))\n", + "\n", + "len(visited_nodes)" + ] } ], "metadata": { "kernelspec": { - "display_name": "pdf", + "display_name": "advent", "language": "python", "name": "python3" }, @@ -941,7 +140,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.7" + "version": "3.13.0" } }, "nbformat": 4, diff --git a/16/16_heaptry.ipynb b/16/16_heaptry.ipynb new file mode 100644 index 0000000..899fe07 --- /dev/null +++ b/16/16_heaptry.ipynb @@ -0,0 +1,131 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "all visited nodes for cheapest path: {(113, 26), (132, 39), (71, 29), (16, 93), (134, 85), (111, 101), (50, 91), (83, 39), (127, 45), (27, 107), (25, 34), (85, 48), (117, 37), (62, 101), (103, 102), (122, 115), (106, 107), (39, 117), (139, 55), (59, 32), (78, 45), (23, 109), (97, 58), (96, 99), (55, 61), (113, 39), (13, 101), (57, 107), (131, 56), (29, 45), (115, 48), (15, 110), (18, 115), (133, 102), (6, 61), (92, 101), (105, 40), (124, 53), (69, 117), (108, 45), (127, 58), (25, 47), (85, 61), (30, 125), (103, 115), (101, 5), (1, 67), (87, 107), (59, 45), (45, 110), (119, 59), (64, 123), (36, 61), (99, 117), (11, 4), (52, 5), (57, 120), (98, 121), (131, 69), (115, 61), (15, 123), (54, 51), (133, 115), (31, 67), (64, 15), (91, 118), (105, 53), (3, 5), (94, 123), (66, 61), (11, 125), (98, 13), (43, 77), (82, 5), (101, 18), (1, 80), (45, 123), (17, 61), (3, 126), (77, 75), (75, 2), (61, 67), (135, 16), (33, 5), (93, 19), (79, 121), (137, 62), (101, 139), (128, 13), (40, 129), (73, 77), (67, 3), (12, 67), (31, 80), (91, 131), (130, 59), (75, 123), (89, 21), (135, 137), (107, 75), (52, 139), (5, 27), (79, 13), (65, 78), (63, 5), (123, 19), (68, 83), (109, 121), (67, 124), (86, 137), (70, 129), (3, 139), (135, 29), (121, 131), (33, 18), (74, 19), (19, 83), (63, 126), (137, 75), (82, 139), (51, 35), (35, 27), (21, 129), (109, 13), (67, 16), (53, 81), (86, 29), (116, 137), (9, 11), (47, 37), (33, 139), (129, 76), (65, 91), (63, 18), (49, 83), (109, 134), (21, 21), (81, 35), (67, 137), (39, 38), (9, 132), (83, 81), (116, 29), (19, 96), (63, 139), (16, 27), (35, 40), (95, 91), (34, 81), (53, 94), (139, 97), (37, 86), (111, 35), (56, 99), (28, 37), (129, 89), (113, 81), (27, 41), (90, 97), (7, 99), (122, 49), (125, 91), (39, 51), (23, 43), (83, 94), (96, 33), (41, 97), (25, 89), (13, 35), (99, 38), (118, 51), (57, 41), (2, 105), (136, 105), (139, 110), (37, 99), (97, 113), (69, 51), (14, 115), (55, 116), (8, 41), (113, 94), (11, 46), (71, 97), (131, 111), (103, 49), (48, 113), (87, 41), (23, 56), (105, 95), (127, 113), (25, 102), (99, 51), (85, 116), (57, 54), (43, 119), (117, 105), (15, 57), (133, 49), (78, 113), (31, 1), (17, 103), (50, 51), (91, 52), (55, 129), (94, 57), (11, 59), (85, 8), (112, 111), (131, 124), (84, 49), (29, 113), (43, 11), (1, 14), (73, 119), (6, 129), (45, 57), (119, 6), (105, 108), (77, 9), (61, 1), (121, 52), (85, 129), (79, 55), (24, 119), (43, 132), (115, 8), (15, 70), (101, 73), (1, 135), (73, 11), (59, 113), (18, 75), (119, 127), (12, 1), (31, 14), (91, 65), (77, 130), (75, 57), (135, 71), (80, 135), (107, 9), (52, 73), (24, 11), (65, 12), (115, 129), (109, 55), (54, 119), (86, 71), (31, 135), (3, 73), (77, 22), (42, 1), (61, 14), (47, 79), (80, 27), (107, 130), (121, 65), (19, 17), (65, 133), (98, 81), (63, 60), (137, 9), (82, 73), (21, 63), (53, 15), (116, 71), (61, 135), (135, 84), (88, 9), (33, 73), (107, 22), (93, 87), (65, 25), (51, 90), (137, 130), (49, 17), (95, 133), (7, 20), (67, 71), (12, 135), (26, 33), (130, 127), (89, 89), (83, 15), (47, 92), (60, 31), (5, 95), (63, 73), (137, 22), (123, 87), (21, 76), (95, 25), (40, 89), (34, 15), (139, 31), (39, 93), (125, 133), (56, 33), (129, 23), (113, 15), (13, 77), (46, 25), (51, 103), (49, 30), (90, 31), (35, 95), (7, 33), (67, 84), (125, 25), (70, 89), (9, 79), (83, 28), (69, 93), (102, 41), (41, 31), (25, 23), (123, 100), (117, 26), (81, 103), (120, 31), (20, 93), (139, 44), (39, 106), (37, 33), (138, 85), (97, 47), (55, 50), (99, 93), (71, 31), (16, 95), (131, 45), (76, 109), (29, 34), (134, 87), (48, 47), (111, 103), (9, 92), (50, 93), (105, 29), (69, 106), (41, 44), (127, 47), (27, 109), (11, 101), (76, 1), (62, 103), (117, 39), (59, 34), (23, 111), (55, 63), (27, 1), (99, 106), (118, 119), (71, 44), (57, 109), (29, 47), (115, 50), (15, 112), (18, 117), (6, 63), (92, 103), (91, 107), (22, 7), (8, 109), (108, 47), (11, 114), (85, 63), (57, 1), (43, 66), (103, 117), (15, 4), (101, 7), (1, 69), (87, 109), (59, 47), (119, 61), (36, 63), (3, 115), (121, 107), (80, 69), (52, 7), (115, 63), (15, 125), (101, 128), (87, 1), (54, 53), (133, 117), (45, 4), (86, 5), (31, 69), (91, 120), (110, 133), (3, 7), (94, 125), (33, 115), (126, 77), (43, 79), (84, 117), (87, 122), (45, 125), (119, 74), (89, 131), (77, 77), (61, 69), (135, 18), (121, 120), (33, 7), (93, 21), (79, 123), (63, 115), (137, 64), (51, 24), (10, 23), (40, 131), (67, 5), (31, 82), (130, 61), (75, 125), (89, 23), (135, 139), (28, 13), (47, 26), (107, 77), (46, 67), (5, 29), (79, 15), (63, 7), (49, 72), (123, 21), (68, 85), (109, 123), (21, 10), (67, 126), (86, 139), (125, 67), (70, 131), (42, 69), (102, 83), (135, 31), (19, 85), (93, 34), (63, 128), (137, 77), (51, 37), (35, 29), (21, 131), (95, 80), (53, 83), (70, 23), (111, 24), (116, 139), (9, 13), (14, 91), (88, 77), (129, 78), (47, 39), (5, 42), (65, 93), (104, 21), (49, 85), (21, 23), (81, 37), (67, 139), (125, 80), (23, 32), (9, 134), (83, 83), (138, 19), (41, 86), (60, 99), (13, 24), (16, 29), (117, 81), (76, 43), (139, 99), (111, 37), (97, 102), (9, 26), (69, 40), (129, 91), (113, 83), (27, 43), (71, 86), (90, 99), (7, 101), (106, 43), (39, 53), (23, 45), (83, 96), (124, 97), (41, 99), (127, 102), (25, 91), (13, 37), (99, 40), (118, 53), (57, 43), (2, 107), (15, 46), (120, 99), (139, 112), (18, 51), (37, 101), (97, 115), (36, 105), (69, 53), (55, 118), (8, 43), (27, 56), (71, 99), (30, 61), (131, 113), (29, 102), (103, 51), (87, 43), (1, 3), (45, 46), (64, 59), (105, 97), (127, 115), (25, 104), (66, 105), (99, 53), (38, 43), (131, 5), (43, 121), (15, 59), (101, 62), (1, 124), (133, 51), (78, 115), (31, 3), (17, 105), (55, 131), (11, 61), (112, 113), (10, 65), (29, 115), (115, 118), (43, 13), (87, 56), (128, 57), (73, 121), (1, 16), (45, 59), (105, 110), (3, 62), (77, 11), (22, 75), (61, 3), (121, 54), (85, 131), (79, 57), (24, 121), (43, 134), (101, 75), (1, 137), (40, 65), (59, 115), (73, 13), (119, 129), (17, 118), (58, 119), (91, 67), (75, 59), (135, 73), (33, 62), (107, 11), (52, 75), (93, 76), (65, 14), (115, 131), (49, 6), (68, 19), (54, 121), (109, 57), (31, 137), (70, 65), (3, 75), (42, 3), (61, 16), (47, 81), (88, 119), (121, 67), (19, 19), (65, 135), (137, 11), (82, 75), (21, 65), (114, 27), (53, 17), (116, 73), (61, 137), (88, 11), (33, 75), (93, 89), (132, 17), (32, 79), (65, 27), (51, 92), (49, 19), (35, 84), (109, 70), (95, 135), (7, 22), (67, 73), (53, 138), (89, 91), (83, 17), (28, 81), (47, 94), (46, 135), (5, 97), (63, 75), (123, 89), (62, 79), (95, 27), (81, 92), (34, 17), (53, 30), (139, 33), (39, 95), (125, 135), (37, 22), (56, 35), (129, 25), (113, 17), (13, 79), (51, 105), (71, 20), (90, 33), (35, 97), (7, 35), (92, 79), (125, 27), (111, 92), (9, 81), (83, 30), (124, 31), (69, 95), (41, 33), (113, 138), (25, 25), (104, 89), (136, 41), (81, 105), (120, 33), (20, 95), (139, 46), (37, 35), (23, 100), (138, 87), (97, 49), (13, 92), (99, 95), (71, 33), (131, 47), (76, 111), (29, 36), (134, 89), (48, 49), (111, 105), (105, 31), (50, 95), (69, 108), (127, 49), (27, 111), (25, 38), (11, 103), (44, 51), (43, 55), (117, 41), (122, 119), (87, 98), (106, 111), (59, 36), (78, 49), (23, 113), (17, 39), (96, 103), (55, 65), (57, 111), (29, 49), (15, 114), (73, 55), (91, 109), (22, 9), (8, 111), (108, 49), (85, 65), (24, 55), (103, 119), (101, 9), (1, 71), (87, 111), (59, 49), (18, 11), (119, 63), (17, 52), (91, 1), (36, 65), (3, 117), (77, 66), (135, 7), (121, 109), (80, 71), (52, 9), (79, 112), (98, 125), (82, 117), (15, 127), (101, 130), (115, 65), (54, 55), (73, 68), (133, 119), (86, 7), (31, 71), (91, 122), (3, 9), (89, 12), (75, 114), (94, 127), (135, 128), (47, 15), (33, 117), (121, 1), (79, 4), (65, 69), (109, 112), (1, 84), (128, 125), (45, 127), (3, 130), (89, 133), (77, 79), (75, 6), (61, 71), (135, 20), (33, 9), (19, 74), (93, 23), (79, 125), (63, 117), (137, 66), (10, 25), (21, 120), (95, 69), (40, 133), (128, 17), (67, 7), (12, 71), (31, 84), (72, 85), (130, 63), (75, 127), (89, 25), (47, 28), (74, 131), (107, 79), (46, 69), (5, 31), (65, 82), (63, 9), (123, 23), (109, 125), (68, 87), (7, 77), (81, 26), (125, 69), (70, 133), (39, 29), (42, 71), (61, 84), (102, 85), (74, 23), (19, 87), (93, 36), (13, 13), (104, 131), (137, 79), (51, 39), (35, 31), (21, 133), (53, 85), (37, 77), (70, 25), (9, 15), (69, 29), (14, 93), (5, 44), (104, 23), (49, 87), (7, 90), (81, 39), (20, 29), (125, 82), (39, 42), (138, 21), (83, 85), (41, 88), (60, 101), (13, 26), (99, 29), (32, 39), (16, 31), (35, 44), (117, 83), (76, 45), (34, 85), (139, 101), (37, 90), (111, 39), (97, 104), (69, 42), (55, 107), (129, 93), (113, 85), (27, 45), (11, 37), (90, 101), (29, 91), (106, 45), (6, 107), (23, 47), (124, 99), (41, 101), (127, 104), (25, 93), (85, 107), (57, 45), (2, 109), (117, 96), (136, 109), (15, 48), (120, 101), (139, 114), (59, 91), (133, 40), (97, 117), (91, 43), (27, 58), (11, 50), (71, 101), (131, 115), (29, 104), (115, 107), (48, 117), (103, 53), (87, 45), (1, 5), (4, 47), (105, 99), (3, 51), (127, 117), (121, 43), (66, 107), (85, 120), (38, 45), (57, 58), (43, 123), (15, 61), (101, 64), (73, 2), (59, 104), (133, 53), (119, 118), (31, 5), (17, 107), (77, 121), (75, 48), (33, 51), (112, 115), (131, 128), (10, 67), (84, 53), (87, 58), (128, 59), (73, 123), (1, 18), (45, 61), (119, 10), (89, 67), (77, 13), (61, 5), (121, 56), (107, 121), (19, 8), (79, 59), (24, 123), (63, 51), (101, 77), (1, 139), (95, 3), (119, 131), (31, 18), (72, 19), (58, 121), (75, 61), (61, 126), (135, 75), (80, 139), (107, 13), (19, 129), (93, 78), (52, 77), (137, 121), (68, 21), (109, 59), (31, 139), (89, 80), (47, 83), (88, 121), (19, 21), (79, 72), (65, 137), (63, 64), (137, 13), (49, 129), (82, 77), (123, 78), (21, 67), (95, 16), (81, 81), (114, 29), (53, 19), (116, 75), (61, 139), (135, 88), (129, 14), (93, 91), (132, 19), (51, 94), (49, 21), (95, 137), (67, 75), (12, 139), (26, 37), (111, 81), (130, 131), (83, 19), (28, 83), (47, 96), (129, 135), (41, 22), (46, 137), (5, 99), (123, 91), (117, 17), (81, 94), (53, 32), (139, 35), (125, 137), (39, 97), (37, 24), (42, 139), (129, 27), (113, 19), (13, 81), (118, 97), (90, 35), (35, 99), (7, 37), (92, 81), (6, 41), (9, 83), (124, 33), (69, 97), (41, 35), (27, 100), (25, 27), (30, 105), (104, 91), (2, 43), (103, 95), (136, 43), (4, 89), (138, 89), (97, 51), (36, 41), (99, 97), (71, 35), (57, 100), (131, 49), (134, 91), (133, 95), (105, 33), (50, 97), (69, 110), (127, 51), (27, 113), (25, 40), (66, 41), (11, 105), (85, 54), (43, 57), (103, 108), (122, 121), (1, 60), (78, 51), (17, 41), (55, 67), (112, 49), (57, 113), (131, 62), (10, 1), (29, 51), (73, 57), (18, 121), (133, 108), (91, 111), (75, 103), (22, 11), (85, 67), (101, 11), (1, 73), (87, 113), (40, 1), (45, 116), (119, 65), (17, 54), (91, 3), (3, 119), (77, 68), (135, 9), (121, 111), (52, 11), (38, 113), (98, 127), (82, 119), (115, 67), (54, 57), (73, 70), (114, 71), (31, 73), (91, 124), (70, 1), (3, 11), (89, 14), (75, 116), (94, 129), (135, 130), (88, 55), (33, 119), (47, 17), (79, 6), (65, 71), (10, 135), (82, 11), (21, 1), (67, 117), (26, 79), (89, 135), (77, 81), (61, 73), (135, 22), (121, 124), (33, 11), (93, 25), (79, 127), (63, 119), (137, 68), (35, 20), (95, 71), (67, 9), (53, 74), (72, 87), (56, 79), (89, 27), (9, 4), (74, 133), (107, 81), (5, 33), (63, 11), (49, 76), (123, 25), (109, 127), (21, 14), (7, 79), (67, 130), (125, 71), (70, 135), (39, 31), (19, 89), (13, 15), (118, 31), (51, 41), (35, 33), (21, 135), (53, 87), (139, 90), (92, 15), (37, 79), (111, 28), (9, 17), (69, 31), (14, 95), (129, 82), (113, 74), (132, 87), (49, 89), (7, 92), (134, 133), (81, 41), (20, 31), (23, 36), (83, 87), (60, 103), (99, 31), (117, 85), (76, 47), (34, 87), (139, 103), (37, 92), (78, 93), (111, 41), (97, 106), (50, 31), (69, 44), (110, 45), (55, 109), (129, 95), (113, 87), (27, 47), (11, 39), (90, 103), (131, 104), (84, 29), (29, 93), (103, 42), (87, 34), (106, 47), (6, 109), (23, 49), (55, 1), (41, 103), (96, 39), (25, 95), (99, 44), (85, 109), (57, 47), (2, 111), (15, 50), (59, 93), (18, 55), (133, 42), (6, 1), (97, 119), (17, 96), (91, 45), (36, 109), (55, 122), (85, 1), (71, 103), (131, 117), (29, 106), (115, 109), (103, 55), (87, 47), (1, 7), (73, 112), (45, 50), (105, 101), (64, 63), (3, 53), (77, 2), (127, 119), (121, 45), (66, 109), (80, 7), (38, 47), (79, 48), (43, 125), (115, 1), (15, 63), (1, 128), (100, 107), (133, 55), (31, 7), (17, 109), (77, 123), (94, 63), (135, 64), (33, 53), (65, 5), (10, 69), (115, 122), (1, 20), (128, 61), (73, 125), (45, 63), (31, 128), (3, 66), (130, 107), (89, 69), (77, 15), (61, 7), (121, 58), (107, 123), (19, 10), (79, 61), (65, 126), (63, 53), (101, 79), (21, 56), (95, 5), (119, 133), (72, 21), (58, 123), (77, 136), (42, 115), (75, 63), (135, 77), (33, 66), (74, 67), (19, 131), (107, 15), (46, 5), (137, 123), (51, 83), (109, 61), (54, 125), (95, 126), (114, 139), (7, 13), (67, 64), (86, 77), (125, 5), (70, 69), (89, 82), (102, 21), (47, 85), (107, 136), (19, 23), (5, 88), (65, 139), (137, 15), (49, 131), (21, 69), (81, 83), (53, 21), (37, 13), (14, 29), (93, 93), (13, 70), (132, 21), (32, 83), (137, 136), (49, 23), (95, 139), (7, 26), (67, 77), (37, 134), (111, 83), (83, 21), (28, 85), (129, 137), (41, 24), (60, 37), (5, 101), (123, 93), (117, 19), (62, 83), (122, 97), (53, 34), (139, 37), (125, 139), (39, 99), (37, 26), (23, 91), (97, 40), (55, 43), (129, 29), (113, 21), (13, 83), (99, 86), (35, 101), (29, 27), (111, 96), (9, 85), (69, 99), (41, 37), (127, 40), (27, 102), (25, 29), (85, 43), (2, 45), (117, 32), (103, 97), (20, 99), (139, 50), (39, 112), (59, 27), (4, 91), (23, 104), (97, 53), (99, 99), (71, 37), (131, 51), (29, 40), (115, 43), (15, 105), (48, 53), (133, 97), (105, 35), (110, 113), (127, 53), (27, 115), (11, 107), (85, 56), (43, 59), (1, 62), (87, 102), (45, 105), (78, 53), (119, 54), (17, 43), (77, 57), (22, 121), (121, 100), (57, 115), (15, 118), (101, 121), (73, 59), (18, 123), (133, 110), (31, 62), (91, 113), (89, 3), (75, 105), (22, 13), (11, 120), (107, 57), (24, 59), (101, 13), (1, 75), (87, 115), (40, 3), (119, 67), (58, 57), (3, 121), (61, 62), (135, 11), (121, 113), (80, 75), (19, 65), (52, 13), (79, 116), (137, 57), (82, 121), (51, 17), (101, 134), (31, 75), (70, 3), (75, 118), (135, 132), (47, 19), (33, 121), (93, 135), (126, 83), (5, 22), (65, 73), (10, 137), (49, 65), (82, 13), (109, 116), (123, 14), (21, 3), (81, 17), (67, 119), (26, 81), (3, 134), (89, 137), (116, 11), (61, 75), (135, 24), (93, 27), (79, 129), (32, 17), (63, 121), (51, 30), (123, 135), (21, 124), (95, 73), (67, 11), (12, 75), (72, 89), (111, 17), (28, 19), (47, 32), (33, 134), (74, 135), (129, 71), (46, 73), (5, 35), (65, 86), (123, 27), (68, 91), (109, 129), (21, 16), (7, 81), (81, 30), (67, 132), (125, 73), (70, 137), (39, 33), (23, 25), (9, 127), (41, 79), (74, 27), (13, 17), (35, 35), (21, 137), (95, 86), (136, 87), (53, 89), (139, 92), (37, 81), (138, 133), (97, 95), (9, 19), (69, 33), (113, 76), (13, 138), (132, 89), (27, 36), (71, 79), (7, 94), (48, 95), (134, 135), (103, 31), (20, 33), (125, 86), (4, 25), (23, 38), (83, 89), (41, 92), (127, 95), (25, 84), (99, 33), (44, 97), (57, 36), (117, 87), (134, 27), (139, 105), (37, 94), (133, 31), (50, 33), (69, 46), (110, 47), (55, 111), (113, 89), (27, 49), (11, 41), (71, 92), (84, 31), (29, 95), (106, 49), (45, 39), (108, 95), (55, 3), (25, 97), (85, 111), (57, 49), (2, 113), (117, 100), (15, 52), (101, 55), (1, 117), (59, 95), (18, 57), (133, 44), (119, 109), (17, 98), (91, 47), (75, 39), (131, 119), (43, 6), (29, 108), (115, 111), (87, 49), (1, 9), (119, 1), (31, 117), (105, 103), (64, 65), (3, 55), (77, 4), (121, 47), (85, 124), (126, 125), (38, 49), (43, 127), (82, 55), (73, 6), (59, 108), (119, 122), (31, 9), (17, 111), (77, 125), (75, 52), (61, 117), (33, 55), (65, 7), (10, 71), (73, 127), (67, 53), (12, 117), (3, 68), (130, 109), (89, 71), (77, 17), (61, 9), (121, 60), (107, 125), (79, 63), (65, 128), (63, 55), (123, 69), (95, 7), (40, 71), (12, 9), (53, 10), (72, 23), (58, 125), (56, 15), (42, 117), (135, 79), (19, 133), (93, 82), (46, 7), (137, 125), (51, 85), (49, 12), (68, 25), (54, 127), (95, 128), (7, 15), (67, 66), (53, 131), (86, 79), (70, 71), (83, 10), (47, 87), (88, 125), (19, 25), (63, 68), (49, 133), (123, 82), (21, 71), (81, 85), (53, 23), (139, 26), (39, 88), (125, 128), (37, 15), (83, 131), (13, 72), (132, 23), (32, 85), (16, 77), (49, 25), (35, 90), (48, 29), (34, 131), (111, 85), (9, 74), (83, 23), (28, 87), (129, 139), (41, 26), (113, 131), (5, 103), (60, 39), (117, 21), (81, 98), (34, 23), (139, 39), (39, 101), (78, 29), (23, 93), (96, 83), (55, 45), (113, 23), (25, 139), (13, 85), (118, 101), (71, 26), (90, 39), (35, 103), (131, 40), (29, 29), (6, 45), (105, 24), (124, 37), (69, 101), (108, 29), (8, 91), (41, 39), (27, 104), (25, 31), (85, 45), (117, 34), (103, 99), (59, 29), (4, 93), (23, 106), (64, 107), (97, 55), (36, 45), (99, 101), (71, 39), (57, 104), (131, 53), (76, 117), (29, 42), (115, 45), (15, 107), (133, 99), (105, 37), (110, 115), (127, 55), (27, 117), (66, 45), (11, 109), (43, 61), (84, 99), (103, 112), (1, 64), (106, 117), (59, 42), (100, 43), (45, 107), (119, 56), (17, 45), (3, 110), (77, 59), (57, 117), (115, 58), (101, 123), (73, 61), (18, 125), (133, 112), (12, 51), (91, 115), (130, 43), (75, 107), (89, 5), (33, 110), (107, 59), (52, 123), (24, 61), (65, 62), (109, 105), (1, 77), (68, 67), (101, 15), (40, 5), (119, 69), (3, 123), (89, 126), (77, 72), (61, 64), (135, 13), (121, 115), (74, 3), (19, 67), (93, 16), (79, 118), (137, 59), (51, 19), (101, 136), (31, 77), (89, 18), (116, 121), (135, 134), (88, 59), (33, 123), (107, 72), (47, 21), (93, 137), (65, 75), (63, 2), (49, 67), (123, 16), (109, 118), (21, 5), (81, 19), (67, 121), (125, 62), (89, 139), (116, 13), (61, 77), (19, 80), (60, 81), (93, 29), (13, 6), (32, 19), (63, 123), (137, 72), (51, 32), (123, 137), (35, 24), (21, 126), (95, 75), (40, 139), (34, 65), (67, 13), (53, 78), (72, 91), (111, 19), (56, 83), (9, 8), (69, 22), (129, 73), (74, 137), (5, 37), (46, 75), (49, 80), (123, 29), (62, 19), (7, 83), (81, 32), (67, 134), (122, 33), (125, 75), (39, 35), (23, 27), (9, 129), (102, 91), (41, 81), (13, 19), (99, 22), (104, 137), (35, 37), (21, 139), (117, 76), (120, 81), (53, 91), (139, 94), (37, 83), (97, 97), (138, 135), (9, 21), (69, 35), (14, 99), (55, 100), (8, 25), (71, 81), (29, 84), (103, 33), (138, 27), (83, 91), (41, 94), (127, 97), (25, 86), (99, 35), (44, 99), (38, 25), (57, 38), (117, 89), (76, 51), (15, 41), (139, 107), (59, 84), (133, 33), (91, 36), (110, 49), (55, 113), (113, 91), (27, 51), (11, 43), (71, 94), (112, 95), (84, 33), (29, 97), (115, 100), (87, 38), (6, 113), (45, 41), (22, 57), (25, 99), (121, 36), (85, 113), (57, 51), (15, 54), (1, 119), (59, 97), (119, 111), (17, 100), (91, 49), (36, 113), (77, 114), (75, 41), (131, 121), (43, 8), (115, 113), (54, 103), (87, 51), (73, 116), (1, 11), (119, 3), (31, 119), (105, 105), (3, 57), (77, 6), (121, 49), (107, 114), (126, 127), (19, 1), (79, 52), (43, 129), (1, 132), (114, 9), (100, 111), (31, 11), (17, 113), (77, 127), (75, 54), (116, 55), (61, 119), (135, 68), (33, 57), (93, 71), (126, 19), (65, 9), (49, 1), (109, 52), (128, 65), (73, 129), (67, 55), (12, 119), (26, 17), (31, 132), (72, 133), (89, 73), (61, 11), (107, 127), (46, 117), (5, 79), (65, 130), (79, 65), (63, 57), (137, 6), (123, 71), (68, 135), (95, 9), (40, 73), (12, 11), (72, 25), (58, 127), (56, 17), (61, 132), (102, 133), (135, 81), (74, 71), (19, 135), (93, 84), (46, 9), (137, 127), (51, 87), (35, 79), (68, 27), (7, 17), (53, 133), (9, 63), (102, 25), (47, 89), (41, 15), (5, 92), (132, 133), (49, 135), (123, 84), (21, 73), (95, 22), (7, 138), (81, 87), (53, 25), (39, 90), (125, 130), (37, 17), (138, 69), (83, 133), (97, 31), (14, 33), (41, 136), (113, 12), (13, 74), (51, 100), (71, 15), (35, 92), (7, 30), (134, 71), (34, 133), (37, 138), (111, 87), (9, 76), (83, 25), (69, 90), (41, 28), (127, 31), (27, 93), (113, 133), (60, 41), (25, 20), (117, 23), (62, 87), (81, 100), (34, 25), (139, 41), (39, 103), (23, 95), (55, 47), (113, 25), (13, 87), (99, 90), (118, 103), (57, 93), (131, 42), (90, 41), (29, 31), (133, 88), (69, 103), (108, 31), (27, 106), (25, 33), (11, 98), (85, 47), (2, 49), (43, 50), (117, 36), (103, 101), (1, 53), (20, 103), (87, 93), (120, 41), (59, 31), (4, 95), (23, 108), (64, 109), (119, 45), (17, 34), (36, 47), (55, 60), (99, 103), (57, 106), (131, 55), (29, 44), (115, 47), (15, 109), (133, 101), (31, 53), (105, 39), (94, 109), (11, 111), (85, 60), (43, 63), (84, 101), (1, 66), (87, 106), (106, 119), (59, 44), (45, 109), (119, 58), (17, 47), (77, 61), (61, 53), (94, 1), (121, 104), (93, 5), (79, 107), (115, 60), (101, 125), (73, 63), (18, 127), (12, 53), (91, 117), (130, 45), (75, 109), (89, 7), (135, 123), (107, 61), (52, 125), (24, 63), (123, 5), (109, 107), (68, 69), (45, 122), (58, 61), (3, 125), (42, 53), (135, 15), (47, 131), (121, 117), (80, 79), (33, 4), (19, 69), (137, 61), (51, 21), (21, 115), (54, 63), (114, 77), (67, 2), (53, 67), (70, 7), (75, 122), (135, 136), (88, 61), (33, 125), (47, 23), (93, 139), (5, 26), (65, 77), (104, 5), (49, 69), (123, 18), (109, 120), (21, 7), (7, 72), (81, 21), (67, 123), (125, 64), (39, 24), (83, 67), (28, 131), (60, 83), (13, 8), (32, 21), (63, 125), (123, 139), (35, 26), (21, 128), (95, 77), (134, 5), (34, 67), (53, 80), (139, 83), (111, 21), (9, 10), (28, 23), (129, 75), (74, 139), (113, 67), (13, 129), (46, 77), (5, 39), (90, 83), (7, 85), (81, 34), (67, 136), (122, 35), (125, 77), (39, 37), (23, 29), (9, 131), (83, 80), (102, 93), (96, 19), (41, 83), (25, 75), (13, 21), (118, 37), (104, 139), (2, 91), (117, 78), (136, 91), (139, 96), (37, 85), (138, 137), (97, 99), (69, 37), (55, 102), (129, 88), (113, 80), (11, 32), (71, 83), (30, 45), (131, 97), (103, 35), (48, 99), (87, 27), (4, 29), (105, 81), (41, 96), (127, 99), (25, 88), (99, 37), (44, 101), (38, 27), (43, 105), (117, 91), (15, 43), (133, 35), (97, 112), (17, 89), (50, 37), (91, 38), (110, 51), (55, 115), (27, 53), (11, 45), (112, 97), (29, 99), (115, 102), (73, 105), (45, 43), (105, 94), (3, 46), (108, 99), (22, 59), (121, 38), (85, 115), (79, 41), (24, 105), (43, 118), (15, 56), (1, 121), (59, 99), (18, 61), (119, 113), (91, 51), (36, 115), (75, 43), (80, 121), (52, 59), (115, 115), (68, 3), (1, 13), (109, 41), (119, 5), (31, 121), (3, 59), (77, 8), (121, 51), (66, 115), (107, 116), (80, 13), (19, 3), (65, 119), (63, 46), (82, 59), (119, 126), (31, 13), (77, 129), (75, 56), (116, 57), (61, 121), (33, 59), (93, 73), (65, 11), (137, 116), (49, 3), (95, 119), (128, 67), (7, 6), (67, 57), (72, 135), (89, 75), (28, 65), (61, 13), (47, 78), (107, 129), (60, 17), (46, 119), (5, 81), (65, 132), (63, 59), (137, 8), (123, 73), (68, 137), (95, 11), (40, 75), (81, 76), (34, 1), (125, 119), (56, 19), (129, 9), (74, 73), (19, 137), (46, 11), (51, 89), (137, 129), (35, 81), (95, 132), (7, 19), (67, 70), (53, 135), (37, 127), (111, 76), (9, 65), (83, 14), (102, 27), (47, 91), (129, 130), (41, 17), (104, 73), (49, 137), (123, 86), (21, 75), (117, 12), (136, 25), (81, 89), (120, 17), (20, 79), (53, 27), (39, 92), (125, 132), (139, 30), (37, 19), (97, 33), (83, 135), (14, 35), (129, 22), (41, 138), (113, 14), (71, 17), (76, 95), (117, 133), (134, 73), (48, 33), (111, 89), (9, 78), (50, 79), (83, 27), (41, 30), (127, 33), (27, 95), (113, 135), (25, 22), (117, 25), (62, 89), (122, 103), (139, 43), (39, 105), (59, 20), (78, 33), (23, 97), (96, 87), (55, 49), (113, 27), (13, 89), (99, 92), (71, 30), (112, 31), (57, 95), (29, 33), (115, 36), (15, 98), (18, 103), (92, 89), (105, 28), (69, 105), (8, 95), (25, 35), (85, 49), (103, 103), (1, 55), (87, 95), (59, 33), (119, 47), (64, 111), (17, 36), (36, 49), (99, 105), (38, 95), (98, 109), (131, 57), (115, 49), (15, 111), (101, 114), (73, 52), (133, 103), (31, 55), (105, 41), (94, 111), (11, 113), (10, 117), (84, 103), (43, 65), (1, 68), (128, 109), (87, 108), (45, 111), (17, 49), (3, 114), (77, 63), (22, 127), (61, 55), (135, 4), (19, 58), (93, 7), (79, 109), (137, 50), (101, 127), (73, 65), (31, 68), (91, 119), (130, 47), (75, 111), (89, 9), (135, 125), (33, 114), (52, 127), (46, 53), (5, 15), (65, 66), (79, 1), (109, 109), (40, 9), (67, 112), (70, 117), (3, 127), (89, 130), (58, 63), (135, 17), (47, 133), (74, 7), (19, 71), (93, 20), (79, 122), (63, 114), (137, 63), (82, 127), (51, 23), (35, 15), (21, 117), (95, 66), (53, 69), (70, 9), (135, 138), (88, 63), (33, 127), (47, 25), (32, 131), (65, 79), (49, 71), (35, 136), (109, 122), (21, 9), (81, 23), (67, 125), (9, 120), (83, 69), (28, 133), (138, 5), (41, 72), (44, 77), (63, 127), (35, 28), (21, 130), (62, 131), (95, 79), (53, 82), (139, 85), (37, 74), (111, 23), (56, 87), (97, 88), (50, 13), (129, 77), (27, 29), (13, 131), (113, 69), (90, 85), (7, 87), (103, 24), (122, 37), (92, 131), (125, 79), (39, 39), (23, 31), (9, 133), (96, 21), (41, 85), (127, 88), (25, 77), (13, 23), (99, 26), (118, 39), (57, 29), (2, 93), (117, 80), (120, 85), (139, 98), (37, 87), (138, 139), (97, 101), (69, 39), (8, 29), (27, 42), (71, 85), (30, 47), (131, 99), (103, 37), (48, 101), (87, 29), (4, 31), (105, 83), (127, 101), (25, 90), (99, 39), (38, 29), (57, 42), (43, 107), (117, 93), (15, 45), (59, 88), (133, 37), (78, 101), (17, 91), (110, 53), (55, 117), (11, 47), (84, 37), (29, 101), (115, 104), (87, 42), (1, 2), (73, 107), (45, 45), (22, 61), (121, 40), (85, 117), (79, 43), (43, 120), (101, 61), (1, 123), (59, 101), (18, 63), (119, 115), (31, 2), (17, 104), (58, 105), (91, 53), (75, 45), (61, 110), (135, 59), (80, 123), (115, 117), (109, 43), (31, 123), (3, 61), (89, 64), (77, 10), (88, 105), (47, 67), (107, 118), (121, 53), (80, 15), (19, 5), (79, 56), (65, 121), (101, 74), (1, 136), (21, 51), (114, 13), (53, 3), (77, 131), (61, 123), (33, 61), (19, 126), (93, 75), (65, 13), (10, 77), (137, 118), (49, 5), (109, 56), (95, 121), (67, 59), (72, 137), (130, 115), (89, 77), (83, 3), (47, 80), (107, 131), (46, 121), (5, 83), (63, 61), (123, 75), (68, 139), (21, 64), (95, 13), (7, 129), (40, 77), (139, 19), (39, 81), (125, 121), (56, 21), (83, 124), (129, 11), (74, 75), (19, 139), (13, 65), (46, 13), (51, 91), (137, 131), (90, 19), (35, 83), (136, 135), (7, 21), (53, 137), (37, 129), (111, 78), (9, 67), (83, 16), (69, 81), (102, 29), (129, 132), (41, 19), (113, 124), (5, 96), (132, 137), (25, 11), (49, 139), (123, 88), (2, 27), (117, 14), (81, 91), (139, 32), (37, 21), (23, 86), (138, 73), (83, 137), (97, 35), (55, 38), (13, 78), (99, 81), (32, 91), (71, 19), (16, 83), (35, 96), (117, 135), (131, 33), (29, 22), (134, 75), (34, 137), (48, 35), (111, 91), (105, 17), (50, 81), (69, 94), (41, 32), (127, 35), (27, 97), (113, 137), (25, 24), (11, 89), (85, 38), (43, 41), (62, 91), (117, 27), (122, 105), (106, 97), (23, 99), (105, 138), (97, 48), (17, 25), (55, 51), (112, 33), (57, 97), (131, 46), (29, 35), (115, 38), (73, 41), (6, 51), (133, 92), (105, 30), (91, 95), (124, 43), (8, 97), (27, 110), (85, 51), (103, 105), (1, 57), (87, 97), (59, 35), (4, 99), (45, 100), (119, 49), (64, 113), (3, 103), (36, 51), (121, 95), (80, 57), (38, 97), (57, 110), (98, 111), (115, 51), (15, 113), (54, 41), (73, 54), (133, 105), (31, 57), (75, 100), (33, 103), (66, 51), (107, 52), (65, 55), (84, 105), (98, 3), (87, 110), (128, 111), (100, 49), (45, 113), (119, 62), (89, 119), (22, 129), (77, 65), (61, 57), (135, 6), (121, 108), (93, 9), (79, 111), (63, 103), (137, 52), (51, 12), (10, 11), (101, 129), (95, 55), (12, 57), (31, 70), (89, 11), (75, 113), (135, 127), (33, 116), (107, 65), (93, 130), (46, 55), (5, 17), (51, 133), (49, 60), (109, 111), (7, 63), (67, 114), (86, 127), (125, 55), (70, 119), (89, 132), (42, 57), (61, 70), (47, 135), (74, 9), (19, 73), (93, 22), (5, 138), (63, 116), (137, 65), (82, 129), (123, 130), (51, 25), (35, 17), (21, 119), (95, 68), (81, 133), (67, 6), (53, 71), (37, 63), (70, 11), (111, 12), (9, 1), (14, 79), (47, 27), (129, 66), (32, 133), (49, 73), (35, 138), (7, 76), (81, 25), (67, 127), (20, 15), (39, 28), (111, 133), (23, 20), (9, 122), (83, 71), (138, 7), (41, 74), (13, 12), (44, 79), (32, 25), (21, 132), (62, 133), (117, 69), (76, 31), (134, 9), (139, 87), (37, 76), (111, 25), (56, 89), (9, 14), (50, 15), (129, 79), (113, 71), (13, 133), (27, 31), (71, 74), (90, 87), (29, 77), (62, 25), (106, 31), (39, 41), (23, 33), (9, 135), (83, 84), (41, 87), (127, 90), (25, 79), (99, 28), (85, 93), (118, 41), (57, 31), (117, 82), (120, 87), (59, 77), (18, 39), (133, 26), (92, 25), (97, 103), (69, 41), (55, 106), (11, 36), (71, 87), (30, 49), (131, 101), (29, 90), (115, 93), (48, 103), (103, 39), (87, 31), (45, 34), (105, 85), (64, 47), (127, 103), (121, 29), (85, 106), (38, 31), (57, 44), (98, 45), (43, 109), (15, 47), (1, 112), (133, 39), (78, 103), (119, 104), (17, 93), (91, 42), (110, 55), (94, 47), (11, 49), (112, 101), (131, 114), (43, 1), (1, 4), (128, 45), (73, 109), (45, 47), (31, 112), (3, 50), (108, 103), (22, 63), (121, 42), (107, 107), (79, 45), (43, 122), (101, 63), (1, 125), (40, 53), (73, 1), (119, 117), (31, 4), (72, 5), (58, 107), (77, 120), (75, 47), (61, 112), (135, 61), (33, 50), (93, 64), (65, 2), (137, 107), (109, 45), (54, 109), (73, 122), (114, 123), (67, 48), (86, 61), (31, 125), (70, 53), (3, 63), (89, 66), (102, 5), (47, 69), (107, 120), (19, 7), (5, 72), (65, 123), (63, 50), (82, 63), (123, 64), (21, 53), (114, 15), (100, 117), (53, 5), (61, 125), (14, 13), (33, 63), (93, 77), (132, 5), (32, 67), (65, 15), (137, 120), (51, 80), (49, 7), (109, 58), (95, 123), (7, 10), (67, 61), (12, 125), (72, 139), (89, 79), (130, 117), (9, 56), (83, 5), (47, 82), (129, 121), (41, 8), (60, 21), (46, 123), (5, 85), (65, 136), (44, 13), (63, 63), (123, 77), (62, 67), (7, 131), (95, 15), (53, 18), (139, 21), (39, 83), (125, 123), (37, 10), (56, 23), (42, 125), (83, 126), (102, 139), (129, 13), (13, 67), (118, 83), (51, 93), (71, 8), (90, 21), (35, 85), (7, 23), (53, 139), (92, 67), (37, 131), (6, 27), (9, 69), (124, 19), (69, 83), (41, 21), (113, 126), (132, 139), (25, 13), (104, 77), (81, 93), (120, 21), (20, 83), (4, 75), (37, 23), (23, 88), (138, 75), (83, 139), (97, 37), (55, 40), (99, 83), (71, 21), (16, 85), (57, 86), (131, 35), (76, 99), (117, 137), (134, 77), (34, 139), (111, 93), (105, 19), (50, 83), (69, 96), (127, 37), (27, 99), (113, 139), (11, 91), (84, 81), (43, 43), (117, 29), (122, 107), (78, 37), (23, 101), (17, 27), (22, 105), (96, 91), (55, 53), (112, 35), (57, 99), (29, 37), (15, 102), (73, 43), (18, 107), (133, 94), (105, 32), (91, 97), (8, 99), (11, 104), (52, 105), (85, 53), (24, 43), (43, 56), (103, 107), (1, 59), (87, 99), (59, 37), (119, 51), (58, 41), (3, 105), (121, 97), (79, 100), (82, 105), (15, 115), (115, 53), (133, 107), (31, 59), (91, 110), (94, 115), (47, 3), (33, 105), (107, 54), (126, 67), (65, 57), (128, 113), (100, 51), (45, 115), (89, 121), (77, 67), (61, 59), (121, 110), (93, 11), (79, 113), (63, 105), (137, 54), (101, 131), (21, 108), (95, 57), (40, 121), (12, 59), (53, 60), (72, 73), (130, 51), (75, 115), (89, 13), (135, 129), (28, 3), (33, 118), (74, 119), (93, 132), (46, 57), (5, 19), (65, 70), (51, 135), (49, 62), (109, 113), (7, 65), (40, 13), (86, 129), (39, 17), (70, 121), (125, 57), (42, 59), (102, 73), (47, 137), (19, 75), (13, 1), (137, 67), (51, 27), (35, 19), (21, 121), (95, 70), (136, 71), (81, 135), (53, 73), (37, 65), (111, 14), (116, 129), (9, 3), (69, 17), (14, 81), (113, 60), (5, 32), (132, 73), (32, 135), (104, 11), (49, 75), (7, 78), (81, 27), (26, 91), (67, 129), (20, 17), (111, 135), (23, 22), (83, 73), (28, 137), (69, 138), (60, 89), (25, 68), (99, 17), (16, 19), (35, 32), (117, 71), (76, 33), (34, 73), (139, 89), (111, 27), (9, 16), (50, 17), (55, 95), (129, 81), (113, 73), (13, 135), (27, 33), (11, 25), (71, 76), (29, 79), (103, 28), (122, 41), (106, 33), (92, 135), (23, 35), (9, 137), (105, 74), (96, 25), (41, 89), (127, 92), (25, 81), (85, 95), (118, 43), (57, 33), (2, 97), (15, 36), (120, 89), (59, 79), (133, 28), (97, 105), (91, 31), (8, 33), (11, 38), (71, 89), (30, 51), (131, 103), (29, 92), (115, 95), (103, 41), (87, 33), (4, 35), (45, 36), (105, 87), (3, 39), (127, 105), (121, 31), (66, 95), (85, 108), (98, 47), (43, 111), (15, 49), (59, 92), (133, 41), (119, 106), (17, 95), (77, 109), (75, 36), (33, 39), (10, 55), (87, 46), (128, 47), (73, 111), (1, 6), (45, 49), (31, 114), (130, 93), (89, 55), (77, 1), (121, 44), (107, 109), (79, 47), (24, 111), (43, 124), (63, 39), (101, 65), (1, 127), (40, 55), (119, 119), (58, 109), (75, 49), (61, 114), (135, 63), (19, 117), (93, 66), (52, 65), (137, 109), (51, 69), (68, 9), (109, 47), (31, 127), (58, 1), (89, 68), (102, 7), (47, 71), (107, 122), (19, 9), (79, 60), (65, 125), (49, 117), (82, 65), (21, 55), (95, 4), (81, 69), (26, 133), (114, 17), (53, 7), (125, 112), (61, 127), (93, 79), (32, 69), (137, 122), (51, 82), (49, 9), (95, 125), (7, 12), (67, 63), (12, 127), (53, 128), (111, 69), (56, 133), (83, 7), (28, 71), (47, 84), (129, 123), (41, 10), (60, 23), (46, 125), (5, 87), (44, 15), (49, 130), (123, 79), (21, 68), (117, 5), (7, 133), (81, 82), (34, 7), (53, 20), (139, 23), (39, 85), (125, 125), (23, 77), (55, 29), (41, 131), (74, 79), (129, 15), (13, 69), (118, 85), (90, 23), (35, 87), (117, 126), (136, 139), (29, 13), (37, 133), (9, 71), (124, 21), (69, 85), (129, 136), (41, 23), (127, 26), (27, 88), (113, 128), (25, 15), (85, 29), (71, 131), (117, 18), (103, 83), (120, 23), (39, 98), (59, 13), (4, 77), (97, 39), (36, 29), (55, 42), (113, 20), (25, 136), (99, 85), (71, 23), (16, 87), (131, 37), (117, 139), (29, 26), (115, 29), (15, 91), (48, 39), (133, 83), (105, 21), (127, 39), (27, 101), (25, 28), (66, 29), (11, 93), (85, 42), (43, 45), (103, 96), (87, 88), (1, 48), (106, 101), (59, 26), (45, 91), (119, 40), (17, 29), (77, 43), (112, 37), (57, 101), (131, 50), (115, 42), (101, 107), (73, 45), (18, 109), (91, 99), (75, 91), (108, 39), (107, 43), (52, 107), (24, 45), (1, 61), (87, 101), (45, 104), (119, 53), (17, 42), (3, 107), (77, 56), (61, 48), (121, 99), (98, 115), (137, 43), (82, 107), (101, 120), (31, 61), (75, 104), (94, 117), (135, 118), (88, 43), (33, 107), (47, 5), (107, 56), (93, 121), (126, 69), (65, 59), (49, 51), (67, 105), (100, 53), (3, 120), (89, 123), (61, 61), (135, 10), (121, 112), (19, 64), (93, 13), (79, 115), (63, 107), (137, 56), (123, 121), (21, 110), (95, 59), (40, 123), (12, 61), (53, 62), (72, 75), (56, 67), (130, 53), (89, 15), (135, 131), (28, 5), (129, 57), (74, 121), (93, 134), (5, 21), (51, 137), (123, 13), (35, 129), (109, 115), (21, 2), (62, 3), (7, 67), (81, 16), (86, 131), (125, 59), (39, 19), (89, 136), (42, 61), (9, 113), (83, 62), (47, 139), (74, 13), (13, 3), (63, 120), (104, 121), (51, 29), (118, 19), (35, 21), (21, 123), (95, 72), (81, 137), (53, 75), (139, 78), (37, 67), (116, 131), (9, 5), (69, 19), (129, 70), (27, 22), (13, 124), (132, 75), (113, 62), (71, 65), (104, 13), (7, 80), (134, 121), (81, 29), (39, 32), (111, 137), (9, 126), (83, 75), (28, 139), (138, 11), (41, 78), (25, 70), (13, 16), (99, 19), (16, 21), (117, 73), (76, 35), (139, 91), (78, 81), (111, 29), (97, 94), (50, 19), (110, 33), (55, 97), (96, 135), (113, 75), (13, 137), (27, 35), (11, 27), (71, 78), (131, 92), (29, 81), (87, 22), (106, 35), (6, 97), (23, 37), (22, 41), (96, 27), (25, 83), (85, 97), (57, 35), (117, 86), (59, 81), (17, 84), (91, 33), (36, 97), (55, 110), (11, 40), (131, 105), (29, 94), (115, 97), (103, 43), (87, 35), (45, 38), (105, 89), (3, 41), (121, 33), (66, 97), (126, 111), (38, 35), (79, 36), (98, 49), (43, 113), (15, 51), (101, 54), (1, 116), (100, 95), (119, 108), (17, 97), (91, 46), (77, 111), (75, 38), (33, 41), (115, 110), (128, 49), (73, 113), (45, 51), (89, 57), (77, 3), (47, 60), (121, 46), (107, 111), (79, 49), (65, 114), (63, 41), (68, 119), (1, 129), (40, 57), (58, 111), (77, 124), (56, 1), (75, 51), (135, 65), (80, 129), (74, 55), (19, 119), (65, 6), (137, 111), (51, 71), (109, 49), (95, 114), (114, 127), (7, 1), (67, 52), (31, 129), (89, 70), (47, 73), (88, 111), (107, 124), (19, 11), (65, 127), (63, 54), (49, 119), (21, 57), (81, 71), (26, 135), (53, 9), (139, 12), (39, 74), (37, 1), (61, 129), (19, 132), (93, 81), (132, 9), (16, 63), (49, 11), (35, 76), (95, 127), (134, 55), (67, 65), (48, 15), (53, 130), (37, 122), (111, 71), (56, 135), (83, 9), (28, 73), (69, 74), (129, 125), (41, 12), (46, 127), (5, 89), (25, 4), (44, 17), (90, 133), (123, 81), (117, 7), (62, 71), (7, 135), (122, 85), (34, 9), (139, 25), (39, 87), (125, 127), (37, 14), (23, 79), (97, 28), (83, 130), (55, 31), (41, 133), (129, 17), (113, 9), (13, 71), (35, 89), (117, 128), (131, 26), (29, 15), (120, 133), (92, 71), (37, 135), (111, 84), (9, 73), (124, 23), (69, 87), (108, 15), (8, 77), (41, 25), (27, 90), (113, 130), (25, 17), (11, 82), (85, 31), (71, 133), (2, 33), (117, 20), (29, 136), (103, 85), (120, 25), (20, 87), (59, 15), (64, 93), (138, 79), (97, 41), (55, 44), (25, 138), (99, 87), (71, 25), (57, 90), (131, 39), (76, 103), (29, 28), (115, 31), (15, 93), (133, 85), (105, 23), (50, 87), (91, 88), (110, 101), (94, 93), (27, 103), (127, 41), (66, 31), (11, 95), (85, 44), (126, 45), (43, 47), (45, 93), (17, 31), (3, 96), (77, 45), (112, 39), (57, 103), (115, 44), (101, 109), (73, 47), (18, 111), (133, 98), (31, 50), (91, 101), (75, 93), (22, 1), (33, 96), (107, 45), (52, 109), (1, 63), (87, 103), (119, 55), (3, 109), (89, 112), (61, 50), (121, 101), (19, 53), (52, 1), (93, 2), (63, 96), (137, 45), (51, 5), (101, 122), (54, 47), (95, 48), (114, 61), (31, 63), (89, 4), (116, 107), (47, 7), (33, 109), (107, 58), (93, 123), (5, 10), (65, 61), (49, 53), (82, 1), (128, 117), (81, 5), (67, 107), (26, 69), (125, 48), (89, 125), (28, 115), (61, 63), (135, 12), (93, 15), (5, 131), (79, 117), (63, 109), (137, 58), (123, 123), (21, 112), (95, 61), (40, 125), (81, 126), (53, 64), (135, 133), (47, 20), (129, 59), (93, 136), (5, 23), (51, 139), (123, 15), (35, 131), (109, 117), (21, 4), (62, 5), (7, 69), (125, 61), (39, 21), (23, 13), (9, 115), (41, 67), (74, 15), (13, 5), (118, 21), (104, 123), (35, 23), (21, 125), (117, 62), (136, 75), (81, 139), (20, 129), (139, 80), (53, 77), (92, 5), (37, 69), (97, 83), (9, 7), (69, 21), (132, 77), (32, 139), (71, 67), (16, 131), (104, 15), (7, 82), (103, 19), (20, 21), (111, 139), (4, 13), (50, 129), (83, 77), (127, 83), (13, 18), (99, 21), (44, 85), (117, 75), (62, 139), (15, 27), (139, 93), (133, 19), (50, 21), (69, 34), (110, 35), (55, 99), (96, 137), (113, 77), (13, 139), (27, 37), (11, 29), (71, 80), (84, 19), (29, 83), (103, 32), (106, 37), (92, 139), (45, 27), (105, 78), (124, 91), (108, 83), (22, 43), (25, 85), (99, 34), (85, 99), (57, 37), (43, 102), (15, 40), (101, 43), (1, 105), (59, 83), (133, 32), (119, 97), (91, 35), (36, 99), (55, 112), (75, 27), (11, 42), (131, 107), (115, 99), (87, 37), (45, 40), (31, 105), (105, 91), (64, 53), (3, 43), (121, 35), (85, 112), (98, 51), (43, 115), (82, 43), (1, 118), (100, 97), (119, 110), (17, 99), (91, 48), (77, 113), (61, 105), (94, 53), (33, 43), (93, 57), (126, 5), (10, 59), (109, 38), (73, 115), (67, 41), (31, 118), (3, 56), (130, 97), (89, 59), (107, 113), (5, 65), (24, 115), (65, 116), (79, 51), (63, 43), (123, 57), (68, 121), (40, 59), (72, 11), (58, 113), (77, 126), (135, 67), (33, 56), (74, 57), (19, 121), (93, 70), (65, 8), (137, 113), (51, 73), (35, 65), (68, 13), (109, 51), (114, 129), (7, 3), (67, 54), (53, 119), (86, 67), (9, 49), (47, 75), (41, 1), (5, 78), (65, 129), (63, 56), (49, 121), (21, 59), (81, 73), (53, 11), (139, 14), (125, 116), (37, 3), (83, 119), (116, 67), (60, 135), (13, 60), (132, 11), (51, 86), (71, 1), (16, 65), (95, 129), (7, 16), (48, 17), (34, 119), (139, 135), (37, 124), (111, 73), (9, 62), (83, 11), (28, 75), (69, 76), (129, 127), (41, 14), (127, 17), (113, 119), (46, 129), (27, 79), (60, 27), (49, 134), (117, 9), (62, 73), (7, 137), (34, 11), (139, 27), (39, 89), (125, 129), (37, 16), (78, 17), (23, 81), (97, 30), (83, 132), (55, 33), (41, 135), (113, 11), (25, 127), (13, 73), (99, 76), (57, 79), (131, 28), (90, 27), (29, 17), (92, 73), (37, 137), (111, 86), (6, 33), (105, 12), (124, 25), (69, 89), (108, 17), (127, 30), (27, 92), (113, 132), (25, 19), (85, 33), (30, 97), (71, 135), (2, 35), (43, 36), (29, 138), (103, 87), (117, 22), (87, 79), (120, 27), (59, 17), (4, 81), (119, 31), (64, 95), (105, 133), (99, 89), (38, 79), (131, 41), (29, 30), (115, 33), (15, 95), (73, 36), (59, 138), (133, 87), (105, 25), (110, 103), (94, 95), (66, 33), (11, 97), (126, 47), (43, 49), (1, 52), (87, 92), (100, 31), (45, 95), (119, 44), (17, 33), (77, 47), (22, 111), (79, 93), (101, 111), (73, 49), (18, 113), (12, 39), (91, 103), (130, 31), (75, 95), (135, 109), (33, 98), (107, 47), (52, 111), (24, 49), (65, 50), (109, 93), (1, 65), (68, 55), (3, 111), (61, 52), (121, 103), (19, 55), (93, 4), (63, 98), (137, 47), (51, 7), (101, 124), (21, 101), (95, 50), (86, 1), (31, 65), (75, 108), (116, 109), (135, 122), (47, 9), (33, 111), (93, 125), (5, 12), (65, 63), (10, 127), (51, 128), (49, 55), (109, 106), (128, 119), (81, 7), (67, 109), (26, 71), (89, 127), (116, 1), (28, 117), (47, 130), (19, 68), (60, 69), (5, 133), (93, 17), (32, 7), (63, 111), (137, 60), (51, 20), (123, 125), (95, 63), (40, 127), (34, 53), (67, 1), (37, 58), (56, 71), (28, 9), (129, 61), (74, 125), (93, 138), (113, 53), (13, 115), (5, 25), (49, 68), (90, 69), (35, 133), (123, 17), (62, 7), (7, 71), (81, 20), (122, 21), (125, 63), (39, 23), (23, 15), (9, 117), (83, 66), (102, 79), (96, 5), (41, 69), (13, 7), (123, 138), (2, 77), (117, 64), (35, 25), (136, 77), (53, 79), (92, 7), (37, 71), (111, 20), (23, 136), (138, 123), (97, 85), (9, 9), (69, 23), (8, 13), (27, 26), (13, 128), (99, 131), (132, 79), (11, 18), (71, 69), (16, 133), (30, 31), (29, 72), (103, 21), (20, 23), (23, 28), (64, 29), (50, 131), (138, 15), (41, 82), (127, 85), (25, 74), (99, 23), (44, 87), (85, 88), (38, 13), (57, 26), (117, 77), (76, 39), (15, 29), (139, 95), (133, 21), (50, 23), (91, 24), (110, 37), (55, 101), (96, 139), (27, 39), (11, 31), (112, 83), (131, 96), (84, 21), (29, 85), (87, 26), (6, 101), (45, 29), (105, 80), (3, 32), (108, 85), (22, 45), (25, 87), (121, 24), (85, 101), (57, 39), (43, 104), (101, 45), (1, 107), (59, 85), (133, 34), (119, 99), (91, 37), (75, 29), (80, 107), (131, 109), (115, 101), (54, 91), (87, 39), (73, 104), (31, 107), (3, 45), (89, 48), (121, 37), (66, 101), (126, 115), (79, 40), (98, 53), (43, 117), (1, 120), (119, 112), (17, 101), (77, 115), (75, 42), (61, 107), (135, 56), (33, 45), (19, 110), (93, 59), (10, 61), (51, 62), (73, 117), (67, 43), (12, 107), (130, 99), (89, 61), (47, 64), (107, 115), (19, 2), (46, 105), (5, 67), (79, 53), (63, 45), (123, 59), (68, 123), (21, 48), (40, 61), (81, 62), (72, 13), (56, 5), (135, 69), (74, 59), (19, 123), (137, 115), (51, 75), (35, 67), (109, 53), (95, 118), (114, 131), (7, 5), (53, 121), (111, 62), (9, 51), (102, 13), (14, 129), (47, 77), (41, 3), (5, 80), (65, 131), (49, 123), (123, 72), (21, 61), (7, 126), (81, 75), (20, 65), (53, 13), (39, 78), (139, 16), (37, 5), (23, 70), (138, 57), (83, 121), (97, 19), (14, 21), (60, 137), (44, 129), (32, 75), (71, 3), (35, 80), (76, 81), (95, 131), (48, 19), (34, 121), (53, 134), (139, 137), (111, 75), (56, 139), (50, 65), (83, 13), (69, 78), (129, 129), (127, 19), (113, 121), (27, 81), (71, 124), (90, 137), (117, 11), (62, 75), (7, 139), (103, 76), (122, 89), (139, 29), (39, 91), (125, 131), (23, 83), (83, 134), (124, 135), (55, 35), (41, 137), (113, 13), (25, 129), (13, 75), (118, 91), (112, 17), (57, 81), (131, 30), (117, 132), (29, 19), (120, 137), (6, 35), (37, 139), (105, 14), (124, 27), (69, 91), (127, 32), (113, 134), (25, 21), (85, 35), (71, 137), (43, 38), (103, 89), (87, 81), (1, 41), (59, 19), (119, 33), (105, 135), (17, 22), (99, 91), (38, 81), (57, 94), (98, 95), (131, 43), (115, 35), (15, 97), (101, 100), (73, 38), (133, 89), (31, 41), (105, 27), (91, 92), (110, 105), (75, 84), (11, 99), (126, 49), (43, 51), (128, 95), (45, 97), (17, 35), (3, 100), (77, 49), (61, 41), (121, 92), (79, 95), (137, 36), (101, 113), (73, 51), (12, 41), (31, 54), (91, 105), (130, 33), (75, 97), (135, 111), (107, 49), (5, 1), (109, 95), (68, 57), (67, 98), (86, 111), (70, 103), (3, 113), (89, 116), (77, 62), (42, 41), (135, 3), (47, 119), (121, 105), (80, 67), (19, 57), (63, 100), (137, 49), (51, 9), (35, 1), (21, 103), (95, 52), (114, 65), (53, 55), (135, 124), (47, 11), (33, 113), (88, 49), (93, 127), (65, 65), (10, 129), (49, 57), (109, 108), (81, 9), (67, 111), (39, 12), (89, 129), (9, 106), (83, 55), (28, 119), (116, 3), (47, 132), (60, 71), (5, 135), (32, 9), (63, 113), (51, 22), (123, 127), (16, 1), (35, 14), (21, 116), (62, 117), (95, 65), (34, 55), (53, 68), (139, 71), (39, 133), (72, 81), (111, 9), (56, 73), (28, 11), (69, 12), (129, 63), (27, 15), (13, 117), (46, 65), (113, 55), (35, 135), (7, 73), (81, 22), (122, 23), (92, 117), (125, 65), (111, 130), (39, 25), (23, 17), (9, 119), (69, 133), (102, 81), (96, 7), (41, 71), (25, 63), (13, 9), (99, 12), (104, 127), (57, 15), (136, 79), (120, 71), (20, 133), (139, 84), (37, 73), (23, 138), (138, 125), (97, 87), (69, 25), (14, 89), (55, 90), (99, 133), (11, 20), (71, 71), (131, 85), (103, 23), (134, 127), (87, 15), (20, 25), (4, 17), (64, 31), (50, 133), (41, 84), (127, 87), (99, 25), (44, 89), (57, 28), (43, 93), (117, 79), (15, 31), (59, 74), (133, 23), (78, 87), (17, 77), (50, 25), (55, 103), (94, 31), (11, 33), (71, 84), (112, 85), (29, 87), (103, 36), (73, 93), (45, 31), (105, 82), (124, 95), (22, 47), (127, 100), (85, 103), (79, 29), (24, 93), (43, 106), (15, 44), (101, 47), (1, 109), (59, 87), (18, 49), (119, 101), (17, 90), (91, 39), (75, 31), (135, 45), (80, 109), (52, 47), (115, 103), (109, 29), (54, 93), (1, 1), (73, 106), (45, 44), (86, 45), (31, 109), (3, 47), (47, 53), (121, 39), (107, 104), (80, 1), (126, 117), (65, 107), (98, 55), (63, 34), (82, 47), (1, 122), (21, 37), (119, 114), (77, 117), (61, 109), (33, 47), (93, 61), (10, 63), (137, 104), (51, 64), (109, 42), (95, 107), (67, 45), (12, 109), (26, 7), (31, 122), (89, 63), (28, 53), (47, 66), (107, 117), (19, 4), (60, 5), (5, 69), (65, 120), (63, 47), (123, 61), (68, 125), (21, 50), (40, 63), (7, 115), (125, 107), (72, 15), (56, 7), (61, 122), (74, 61), (19, 125), (93, 74), (13, 51), (137, 117), (51, 77), (49, 4), (90, 5), (35, 69), (7, 7), (67, 58), (53, 123), (37, 115), (111, 64), (9, 53), (69, 67), (88, 117), (102, 15), (41, 5), (5, 82), (104, 61), (49, 125), (2, 13), (136, 13), (81, 77), (20, 67), (139, 18), (39, 80), (37, 7), (138, 59), (83, 123), (97, 21), (14, 23), (60, 139), (44, 131), (32, 77), (71, 5), (16, 69), (117, 121), (76, 83), (134, 61), (53, 136), (139, 139), (111, 77), (9, 66), (69, 80), (129, 131), (41, 18), (127, 21), (113, 123), (27, 83), (85, 24), (71, 126), (90, 139), (117, 13), (29, 129), (122, 91), (106, 83), (23, 85), (83, 136), (124, 137), (55, 37), (41, 139), (25, 131), (118, 93), (71, 18), (57, 83), (117, 134), (29, 21), (115, 24), (120, 139), (59, 129), (6, 37), (91, 81), (127, 34), (27, 96), (113, 136), (11, 88), (85, 37), (71, 139), (24, 27), (43, 40), (103, 91), (87, 83), (1, 43), (59, 21), (45, 86), (119, 35), (105, 137), (36, 37), (121, 81), (80, 43), (38, 83), (57, 96), (98, 97), (115, 37), (15, 99), (101, 102), (54, 27), (73, 40), (133, 91), (31, 43), (110, 107), (75, 86), (94, 99), (126, 51), (43, 53), (87, 96), (128, 97), (45, 99), (17, 37), (77, 51), (61, 43), (121, 94), (79, 97), (63, 89), (137, 38), (101, 115), (40, 105), (73, 53), (130, 35), (75, 99), (135, 113), (33, 102), (107, 51), (52, 115), (46, 41), (5, 3), (49, 46), (109, 97), (68, 59), (86, 113), (58, 51), (42, 43), (61, 56), (135, 5), (47, 121), (19, 59), (93, 8), (5, 124), (79, 110), (63, 102), (137, 51), (82, 115), (123, 116), (51, 11), (35, 3), (21, 105), (95, 54), (114, 67), (53, 57), (14, 65), (129, 52), (47, 13), (88, 51), (93, 129), (5, 16), (65, 67), (49, 59), (35, 124), (109, 110), (81, 11), (67, 113), (26, 75), (39, 14), (9, 108), (83, 57), (28, 121), (47, 134), (60, 73), (5, 137), (44, 65), (123, 129), (16, 3), (35, 16), (76, 17), (62, 119), (95, 67), (81, 132), (34, 57), (53, 70), (139, 73), (39, 135), (111, 11), (56, 75), (50, 1), (69, 14), (129, 65), (74, 129), (27, 17), (13, 119), (113, 57), (118, 135), (71, 60), (90, 73), (35, 137), (62, 11), (7, 75), (106, 17), (39, 27), (111, 132), (23, 19), (9, 121), (83, 70), (124, 71), (69, 135), (96, 9), (41, 73), (27, 138), (25, 65), (13, 11), (104, 129), (57, 17), (2, 81), (136, 81), (120, 73), (20, 135), (139, 86), (18, 25), (37, 75), (133, 12), (92, 11), (97, 89), (36, 79), (69, 27), (55, 92), (13, 132), (99, 135), (11, 22), (71, 73), (57, 138), (131, 87), (29, 76), (103, 25), (134, 129), (87, 17), (133, 133), (4, 19), (45, 20), (127, 89), (66, 79), (99, 27), (85, 92), (98, 31), (43, 95), (15, 33), (101, 36), (87, 138), (1, 98), (133, 25), (119, 90), (17, 79), (55, 105), (11, 35), (112, 87), (131, 100), (29, 89), (115, 92), (87, 30), (73, 95), (45, 33), (105, 84), (108, 89), (85, 105), (79, 31), (43, 108), (101, 49), (1, 111), (40, 39), (59, 89), (119, 103), (17, 92), (58, 93), (91, 41), (77, 106), (75, 33), (61, 98), (135, 47), (33, 36), (52, 49), (93, 50), (115, 105), (109, 31), (67, 34), (86, 47), (31, 111), (70, 39), (3, 49), (89, 52), (88, 93), (47, 55), (107, 106), (121, 41), (126, 119), (80, 3), (65, 109), (63, 36), (123, 50), (21, 39), (114, 1), (26, 117), (100, 103), (77, 119), (61, 111), (135, 60), (33, 49), (93, 63), (32, 53), (65, 1), (109, 44), (95, 109), (67, 47), (12, 111), (53, 112), (26, 9), (89, 65), (9, 42), (28, 55), (107, 119), (19, 6), (60, 7), (5, 71), (65, 122), (63, 49), (123, 63), (21, 52), (62, 53), (7, 117), (95, 1), (139, 7), (39, 69), (125, 109), (56, 9), (42, 111), (83, 112), (74, 63), (19, 127), (13, 53), (118, 69), (137, 119), (51, 79), (90, 7), (35, 71), (95, 122), (7, 9), (53, 125), (139, 128), (92, 53), (37, 117), (111, 66), (125, 1), (9, 55), (83, 4), (69, 69), (14, 133), (41, 7), (5, 84), (132, 125), (49, 127), (2, 15), (136, 15), (81, 79), (120, 7), (20, 69), (125, 122), (37, 9), (23, 74), (138, 61), (83, 125), (97, 23), (14, 25), (55, 26), (41, 128), (99, 69), (71, 7), (131, 21), (117, 123), (76, 85), (37, 130), (111, 79), (105, 5), (50, 69), (129, 133), (41, 20), (127, 23), (113, 125), (27, 85), (11, 77), (44, 25), (85, 26), (43, 29), (29, 131), (103, 80), (117, 15), (106, 85), (59, 10), (78, 23), (23, 87), (105, 126), (97, 36), (124, 139), (17, 13), (108, 131), (96, 77), (55, 39), (25, 133), (112, 21), (57, 85), (29, 23), (15, 88), (73, 29), (59, 131), (133, 80), (6, 39), (105, 18), (17, 134), (91, 83), (108, 23), (8, 85), (127, 36), (85, 39), (30, 103), (103, 93), (87, 85), (1, 45), (59, 23), (45, 88), (119, 37), (105, 139), (3, 91), (77, 40), (36, 39), (121, 83), (80, 45), (38, 85), (79, 86), (98, 99), (115, 39), (15, 101), (133, 93), (31, 45), (75, 88), (94, 101), (33, 91), (107, 40), (65, 43), (1, 58), (128, 99), (100, 37), (45, 101), (119, 50), (89, 107), (22, 117), (77, 53), (61, 45), (121, 96), (19, 48), (79, 99), (63, 91), (137, 40), (101, 117), (95, 43), (40, 107), (31, 58), (130, 37), (75, 101), (135, 115), (47, 2), (33, 104), (107, 53), (52, 117), (5, 5), (65, 56), (51, 121), (109, 99), (7, 51), (67, 102), (86, 115), (125, 43), (39, 3), (89, 120), (47, 123), (19, 61), (93, 10), (104, 105), (137, 53), (123, 118), (51, 13), (35, 5), (21, 107), (81, 121), (114, 69), (53, 59), (37, 51), (69, 3), (88, 53), (129, 54), (93, 131), (5, 18), (132, 59), (49, 61), (35, 126), (7, 64), (134, 105), (67, 115), (26, 77), (81, 13), (39, 16), (125, 56), (111, 121), (83, 59), (60, 75), (5, 139), (99, 3), (44, 67), (123, 131), (16, 5), (117, 57), (76, 19), (34, 59), (139, 75), (39, 137), (37, 64), (111, 13), (23, 129), (56, 77), (69, 16), (55, 81), (129, 67), (27, 19), (13, 121), (113, 59), (118, 137), (11, 11), (71, 62), (90, 75), (35, 139), (29, 65), (62, 13), (103, 14), (122, 27), (106, 19), (23, 21), (9, 123), (83, 72), (124, 73), (69, 137), (96, 11), (41, 75), (25, 67), (99, 16), (85, 81), (118, 29), (57, 19), (2, 83), (117, 70), (103, 135), (15, 22), (20, 137), (139, 88), (59, 65), (92, 13), (133, 14), (97, 91), (91, 17), (8, 19), (113, 72), (99, 137), (11, 24), (71, 75), (16, 139), (131, 89), (29, 78), (115, 81), (103, 27), (87, 19), (133, 135), (4, 21), (45, 22), (105, 73), (64, 35), (127, 91), (25, 80), (121, 17), (85, 94), (38, 19), (57, 32), (98, 33), (43, 97), (15, 35), (1, 100), (59, 78), (133, 27), (119, 92), (17, 81), (91, 30), (77, 95), (75, 22), (94, 35), (33, 25), (10, 41), (115, 94), (128, 33), (73, 97), (45, 35), (31, 100), (105, 86), (3, 38), (89, 41), (108, 91), (107, 95), (79, 33), (24, 97), (63, 25), (101, 51), (1, 113), (40, 41), (119, 105), (77, 108), (75, 35), (135, 49), (19, 103), (137, 95), (109, 33), (54, 97), (73, 110), (114, 111), (67, 36), (31, 113), (47, 57), (65, 111), (63, 38), (49, 103), (21, 41), (26, 119), (100, 105), (61, 113), (14, 1), (19, 116), (93, 65), (65, 3), (137, 108), (51, 68), (95, 111), (67, 49), (12, 113), (26, 11), (72, 127), (111, 55), (47, 70), (129, 109), (60, 9), (46, 111), (5, 73), (44, 1), (49, 116), (123, 65), (21, 54), (7, 119), (81, 68), (139, 9), (39, 71), (125, 111), (56, 11), (42, 113), (83, 114), (102, 127), (41, 117), (74, 65), (13, 55), (118, 71), (51, 81), (90, 9), (35, 73), (136, 125), (7, 11), (53, 127), (139, 130), (92, 55), (37, 119), (111, 68), (6, 15), (97, 133), (9, 57), (69, 71), (14, 135), (129, 122), (41, 9), (127, 12), (25, 1), (71, 117), (104, 65), (117, 4), (7, 132), (20, 71), (139, 22), (39, 84), (125, 124), (37, 11), (138, 63), (83, 127), (97, 25), (55, 28), (127, 133), (13, 68), (99, 71), (44, 135), (71, 9), (57, 74), (131, 23), (117, 125), (34, 127), (37, 132), (78, 133), (133, 69), (105, 7), (127, 25), (27, 87), (113, 127), (25, 14), (11, 79), (85, 28), (71, 130), (84, 69), (29, 133), (43, 31), (87, 74), (106, 87), (59, 12), (23, 89), (119, 26), (17, 15), (22, 93), (108, 133), (96, 79), (55, 41), (25, 135), (57, 87), (29, 25), (115, 28), (15, 90), (73, 31), (59, 133), (133, 82), (31, 34), (17, 136), (91, 85), (8, 87), (11, 92), (85, 41), (24, 31), (43, 44), (87, 87), (1, 47), (59, 25), (119, 39), (64, 103), (17, 28), (58, 29), (3, 93), (61, 34), (121, 85), (80, 47), (98, 101), (82, 93), (15, 103), (115, 41), (114, 45), (31, 47), (94, 103), (135, 104), (88, 29), (33, 93), (126, 55), (65, 45), (45, 103), (89, 109), (77, 55), (61, 47), (79, 101), (63, 93), (51, 2), (101, 119), (21, 96), (95, 45), (40, 109), (12, 47), (130, 39), (56, 53), (89, 1), (135, 117), (47, 4), (33, 106), (74, 107), (107, 55), (93, 120), (5, 7), (51, 123), (49, 50), (109, 101), (68, 63), (7, 53), (67, 104), (125, 45), (39, 5), (42, 47), (102, 61), (47, 125), (19, 63), (5, 128), (63, 106), (137, 55), (51, 15), (35, 7), (21, 109), (95, 58), (81, 123), (53, 61), (139, 64), (39, 126), (37, 53), (116, 117), (69, 5), (129, 56), (93, 133), (51, 136), (49, 63), (35, 128), (134, 107), (48, 67), (81, 15), (125, 58), (111, 123), (9, 112), (83, 61), (69, 126), (60, 77), (99, 5), (44, 69), (123, 133), (16, 7), (57, 8), (117, 59), (76, 21), (34, 61), (139, 77), (39, 139), (37, 66), (111, 15), (23, 131), (97, 80), (50, 5), (110, 19), (129, 69), (55, 83), (27, 21), (13, 123), (113, 61), (118, 139), (11, 13), (90, 77), (131, 78), (84, 3), (29, 67), (122, 29), (111, 136), (23, 23), (9, 125), (124, 75), (69, 139), (96, 13), (8, 129), (41, 77), (127, 80), (25, 69), (99, 18), (85, 83), (57, 21), (2, 85), (103, 137), (20, 139), (59, 67), (4, 131), (133, 16), (97, 93), (91, 19), (36, 83), (55, 96), (99, 139), (38, 129), (71, 77), (131, 91), (29, 80), (115, 83), (103, 29), (87, 21), (133, 137), (105, 75), (50, 139), (3, 27), (127, 93), (121, 19), (66, 83), (85, 96), (126, 97), (98, 35), (43, 99), (15, 37), (101, 40), (1, 102), (100, 81), (133, 29), (119, 94), (17, 83), (77, 97), (33, 27), (115, 96), (109, 22), (73, 99), (12, 89), (45, 37), (31, 102), (130, 81), (89, 43), (107, 97), (79, 35), (24, 99), (65, 100), (63, 27), (101, 53), (1, 115), (119, 107), (75, 37), (135, 51), (33, 40), (74, 41), (19, 105), (137, 97), (51, 57), (109, 35), (95, 100), (114, 113), (67, 38), (86, 51), (31, 115), (89, 56), (47, 59), (5, 62), (65, 113), (63, 40), (104, 41), (49, 105), (123, 54), (21, 43), (81, 57), (26, 121), (61, 115), (14, 3), (60, 119), (93, 67), (95, 113), (67, 51), (26, 13), (53, 116), (37, 108), (111, 57), (9, 46), (129, 111), (46, 113), (5, 75), (44, 3), (123, 67), (62, 57), (7, 121), (139, 11), (39, 73), (125, 113), (23, 65), (56, 13), (96, 55), (41, 119), (55, 17), (13, 57), (118, 73), (35, 75), (136, 127), (29, 1), (120, 119), (53, 129), (139, 132), (92, 57), (37, 121), (97, 135), (9, 59), (83, 8), (69, 73), (14, 137), (41, 11), (113, 116), (132, 129), (25, 3), (85, 17), (71, 119), (2, 19), (117, 6), (136, 19), (20, 73), (139, 24), (59, 1), (4, 65), (23, 78), (97, 27), (83, 129), (55, 30), (127, 135), (99, 73), (44, 137), (71, 11), (131, 25), (117, 127), (76, 89), (29, 14), (115, 17), (15, 79), (133, 71), (78, 135), (105, 9), (69, 86), (110, 87), (127, 27), (27, 89), (113, 129), (25, 16), (66, 17), (11, 81), (43, 33), (29, 135), (103, 84), (87, 76), (1, 36), (59, 14), (45, 79), (78, 27), (105, 130), (17, 17), (77, 31), (22, 95), (25, 137), (57, 89), (15, 92), (101, 95), (73, 33), (59, 135), (133, 84), (31, 36), (17, 138), (91, 87), (75, 79), (8, 89), (108, 27), (11, 94), (52, 95), (107, 31), (43, 46), (87, 89), (1, 49), (45, 92), (119, 41), (64, 105), (3, 95), (121, 87), (80, 49), (19, 39), (79, 90), (137, 31), (82, 95), (73, 46), (114, 47), (31, 49), (75, 92), (94, 105), (135, 106), (33, 95), (93, 109), (65, 47), (10, 111), (49, 39), (67, 93), (89, 111), (61, 49), (47, 114), (19, 52), (93, 1), (5, 117), (79, 103), (63, 95), (123, 109), (95, 47), (40, 111), (53, 50), (72, 63), (56, 55), (135, 119), (47, 6), (129, 45), (46, 47), (5, 9), (65, 60), (51, 125), (123, 1), (35, 117), (109, 103), (7, 55), (81, 4), (86, 119), (125, 47), (70, 111), (39, 7), (9, 101), (83, 50), (42, 49), (47, 127), (41, 53), (35, 9), (21, 111), (95, 60), (81, 125), (53, 63), (139, 66), (37, 55), (97, 69), (69, 7), (113, 50), (13, 112), (132, 63), (32, 125), (51, 138), (71, 53), (30, 15), (35, 130), (7, 68), (134, 109), (103, 5), (20, 7), (125, 60), (39, 20), (111, 125), (9, 114), (83, 63), (28, 127), (69, 128), (41, 66), (127, 69), (27, 131), (60, 79), (13, 4), (99, 7), (44, 71), (16, 9), (117, 61), (81, 138), (122, 139), (139, 79), (133, 5), (78, 69), (23, 133), (96, 123), (55, 85), (27, 23), (13, 125), (99, 128), (113, 63), (11, 15), (57, 131), (131, 80), (29, 69), (103, 18), (87, 10), (92, 125), (6, 85), (124, 77), (108, 69), (8, 131), (127, 82), (22, 29), (96, 15), (25, 71), (85, 85), (57, 23), (2, 87), (103, 139), (15, 26), (87, 131), (59, 69), (18, 31), (119, 83), (17, 72), (91, 21), (75, 13), (11, 28), (52, 29), (38, 131), (131, 93), (115, 85), (87, 23), (73, 88), (133, 139), (31, 91), (105, 77), (64, 39), (3, 29), (121, 21), (85, 98), (126, 99), (79, 24), (98, 37), (43, 101), (84, 139), (15, 39), (100, 83), (17, 85), (77, 99), (75, 26), (61, 91), (135, 40), (33, 29), (112, 93), (109, 24), (128, 37), (73, 101), (67, 27), (12, 91), (3, 42), (130, 83), (89, 45), (47, 48), (107, 99), (79, 37), (65, 102), (63, 29), (40, 45), (58, 99), (42, 91), (135, 53), (74, 43), (19, 107), (137, 99), (51, 59), (109, 37), (67, 40), (53, 105), (70, 45), (88, 99), (47, 61), (107, 112), (65, 115), (63, 42), (104, 43), (49, 107), (123, 56), (21, 45), (7, 110), (81, 59), (26, 123), (125, 102), (83, 105), (116, 53), (19, 120), (60, 121), (93, 69), (13, 46), (32, 59), (137, 112), (51, 72), (95, 115), (134, 43), (139, 121), (37, 110), (111, 59), (56, 123), (9, 48), (69, 62), (129, 113), (113, 105), (46, 115), (5, 77), (44, 5), (49, 120), (62, 59), (7, 123), (81, 72), (139, 13), (39, 75), (125, 115), (37, 2), (23, 67), (97, 16), (102, 131), (55, 19), (41, 121), (129, 5), (25, 113), (13, 59), (2, 129), (35, 77), (117, 116), (29, 3), (120, 121), (139, 134), (92, 59), (37, 123), (111, 72), (6, 19), (97, 137), (9, 61), (69, 75), (129, 126), (8, 65), (41, 13), (113, 118), (25, 5), (85, 19), (71, 121), (131, 135), (2, 21), (117, 8), (29, 124), (103, 73), (48, 137), (120, 13), (20, 75), (59, 3), (64, 81), (105, 119), (97, 29), (17, 6), (36, 19), (55, 32), (41, 134), (127, 137), (25, 126), (99, 75), (44, 139), (71, 13), (57, 78), (131, 27), (117, 129), (76, 91), (115, 19), (15, 81), (133, 73), (78, 137), (105, 11), (50, 75), (91, 76), (110, 89), (94, 81), (27, 91), (127, 29), (66, 19), (11, 83), (126, 33), (43, 35), (29, 137), (103, 86), (1, 38), (106, 91), (45, 81), (119, 30), (105, 132), (17, 19), (77, 33), (22, 97), (108, 137), (121, 76), (57, 91), (101, 97), (73, 35), (59, 137), (133, 86), (12, 25), (31, 38), (91, 89), (130, 17), (75, 81), (107, 33), (52, 97), (24, 35), (1, 51), (87, 91), (45, 94), (119, 43), (3, 97), (89, 100), (42, 25), (61, 38), (121, 89), (19, 41), (137, 33), (82, 97), (101, 110), (54, 35), (95, 36), (31, 51), (88, 33), (33, 97), (93, 111), (65, 49), (49, 41), (67, 95), (26, 57), (125, 36), (89, 113), (61, 51), (60, 55), (5, 119), (79, 105), (93, 3), (63, 97), (137, 46), (51, 6), (123, 111), (21, 100), (95, 49), (81, 114), (72, 65), (56, 57), (135, 121), (129, 47), (74, 111), (46, 49), (5, 11), (51, 127), (35, 119), (7, 57), (67, 108), (125, 49), (70, 113), (111, 114), (39, 9), (23, 1), (9, 103), (83, 52), (102, 65), (47, 129), (41, 55), (5, 132), (118, 9), (123, 124), (2, 63), (21, 113), (35, 11), (136, 63), (81, 127), (120, 55), (20, 117), (53, 65), (37, 57), (97, 71), (69, 9), (132, 65), (32, 127), (71, 55), (16, 119), (30, 17), (35, 132), (76, 133), (29, 58), (103, 7), (48, 71), (134, 111), (39, 22), (111, 127), (4, 1), (23, 14), (50, 117), (83, 65), (69, 130), (41, 68), (127, 71), (27, 133), (99, 9), (44, 73), (85, 74), (57, 12), (76, 25), (117, 63), (15, 15), (139, 81), (133, 7), (78, 71), (23, 135), (97, 84), (50, 9), (91, 10), (55, 87), (27, 25), (13, 127), (99, 130), (113, 65), (11, 17), (71, 68), (112, 69), (57, 133), (29, 71), (115, 74), (103, 20), (87, 12), (106, 25), (6, 87), (92, 127), (45, 15), (108, 71), (22, 31), (25, 73), (121, 10), (11, 138), (85, 87), (24, 77), (57, 25), (43, 90), (101, 31), (87, 133), (1, 93), (59, 71), (18, 33), (133, 20), (119, 85), (91, 23), (36, 87), (75, 15), (131, 95), (115, 87), (87, 25), (45, 28), (31, 93), (105, 79), (3, 31), (121, 23), (107, 88), (43, 103), (101, 44), (1, 106), (100, 85), (119, 98), (17, 87), (77, 101), (61, 93), (33, 31), (93, 45), (73, 103), (67, 29), (130, 85), (89, 47), (107, 101), (46, 91), (5, 53), (79, 39), (63, 31), (123, 45), (21, 34), (40, 47), (58, 101), (42, 93), (61, 106), (102, 107), (135, 55), (33, 44), (74, 45), (19, 109), (137, 101), (51, 61), (35, 53), (109, 39), (53, 107), (70, 47), (89, 60), (9, 37), (47, 63), (129, 102), (5, 66), (132, 107), (65, 117), (104, 45), (49, 109), (123, 58), (21, 47), (81, 61), (26, 125), (139, 2), (39, 64), (125, 104), (138, 43), (83, 107), (97, 5), (60, 123), (95, 117), (48, 5), (34, 107), (53, 120), (139, 123), (111, 61), (9, 50), (28, 63), (129, 115), (41, 2), (127, 5), (27, 67), (113, 107), (44, 7), (71, 110), (90, 123), (62, 61), (7, 125), (122, 75), (139, 15), (39, 77), (125, 117), (37, 4), (23, 69), (97, 18), (83, 120), (124, 121), (55, 21), (41, 123), (25, 115), (13, 61), (71, 2), (57, 67), (2, 131), (90, 15), (136, 131), (29, 5), (92, 61), (37, 125), (97, 139), (69, 77), (127, 18), (25, 7), (85, 21), (71, 123), (131, 137), (2, 23), (117, 10), (103, 75), (48, 139), (87, 67), (20, 77), (1, 27), (120, 15), (59, 5), (23, 82), (105, 121), (119, 19), (36, 21), (127, 139), (25, 128), (99, 77), (38, 67), (131, 29), (117, 131), (29, 18), (115, 21), (15, 83), (133, 75), (78, 139), (31, 27), (17, 129), (50, 77), (105, 13), (110, 91), (66, 21), (11, 85), (85, 34), (126, 35), (84, 75), (29, 139), (103, 88), (43, 37), (1, 40), (106, 93), (59, 18), (100, 19), (45, 83), (105, 134), (17, 21), (3, 86), (77, 35), (22, 99), (108, 139), (61, 27), (121, 78), (79, 81), (112, 29), (115, 34), (101, 99), (73, 37), (18, 101), (59, 139), (91, 91), (130, 19), (75, 83), (135, 97), (107, 35), (52, 99), (65, 38), (109, 81), (68, 43), (45, 96), (58, 35), (3, 99), (77, 48), (61, 40), (47, 105), (121, 91), (80, 53), (19, 43), (79, 94), (63, 86), (137, 35), (21, 89), (114, 51), (53, 41), (75, 96), (116, 97), (88, 35), (33, 99), (93, 113), (65, 51), (49, 43), (109, 94), (128, 107), (7, 46), (67, 97), (26, 59), (89, 115), (83, 41), (19, 56), (5, 121), (63, 99), (137, 48), (123, 113), (21, 102), (95, 51), (40, 115), (139, 57), (39, 119), (72, 67), (56, 59), (129, 49), (74, 113), (113, 41), (13, 103), (5, 13), (51, 129), (90, 57), (35, 121), (7, 59), (81, 8), (39, 11), (70, 115), (125, 51), (23, 3), (9, 105), (69, 119), (41, 57), (25, 49), (104, 113), (35, 13), (117, 52), (136, 65), (81, 129), (20, 119), (139, 70), (37, 59), (23, 124), (97, 73), (69, 11), (55, 76), (8, 1), (27, 14), (13, 116), (99, 119), (32, 129), (132, 67), (113, 54), (11, 6), (71, 57), (16, 121), (35, 134), (131, 71), (103, 9), (48, 73), (111, 129), (4, 3), (23, 16), (9, 118), (50, 119), (64, 17), (69, 132), (105, 55), (127, 73), (27, 135), (99, 11), (11, 127), (38, 1), (117, 65), (62, 129), (15, 17), (106, 135), (59, 60), (133, 9), (78, 73), (23, 137), (17, 63), (50, 11), (91, 12), (110, 25), (55, 89), (94, 17), (27, 27), (99, 132), (11, 19), (57, 135), (29, 73), (15, 138), (87, 14), (73, 79), (45, 17), (91, 133), (124, 81), (8, 135), (127, 86), (121, 12), (85, 89), (57, 27), (101, 33), (87, 135), (1, 95), (59, 73), (4, 137), (45, 138), (119, 87), (133, 22), (17, 76), (91, 25), (36, 89), (77, 90), (75, 17), (121, 133), (115, 89), (109, 15), (73, 92), (45, 30), (86, 31), (31, 95), (3, 33), (121, 25), (66, 89), (98, 41), (82, 33), (1, 108), (100, 87), (77, 103), (75, 30), (116, 31), (61, 95), (135, 44), (33, 33), (19, 98), (93, 47), (10, 49), (95, 93), (128, 41), (67, 31), (31, 108), (130, 87), (89, 49), (28, 39), (47, 52), (107, 103), (5, 55), (63, 33), (49, 98), (123, 47), (68, 111), (21, 36), (81, 50), (125, 93), (72, 1), (42, 95), (102, 109), (135, 57), (19, 111), (93, 60), (137, 103), (51, 63), (35, 55), (114, 119), (53, 109), (111, 50), (9, 39), (47, 65), (129, 104), (5, 68), (132, 109), (104, 47), (49, 111), (123, 60), (21, 49), (81, 63), (53, 1), (139, 4), (125, 106), (97, 7), (83, 109), (55, 10), (41, 112), (60, 125), (13, 50), (32, 63), (35, 68), (117, 107), (134, 47), (34, 109), (139, 125), (111, 63), (56, 127), (97, 128), (9, 52), (83, 1), (69, 66), (129, 117), (41, 4), (27, 69), (113, 109), (44, 9), (85, 10), (7, 127), (103, 64), (139, 17), (39, 79), (78, 7), (23, 71), (96, 61), (41, 125), (127, 128), (55, 23), (113, 1), (25, 117), (13, 63), (71, 4), (57, 69), (2, 133), (117, 120), (136, 133), (29, 7), (15, 72), (120, 125), (139, 138), (18, 77), (133, 64), (6, 23), (36, 131), (69, 79), (8, 69), (27, 82), (25, 9), (11, 74), (85, 23), (30, 87), (71, 125), (131, 139), (24, 13), (43, 26), (29, 128), (103, 77), (87, 69), (1, 29), (59, 7), (119, 21), (105, 123), (64, 85), (17, 10), (36, 23), (25, 130), (99, 79), (38, 69), (57, 82), (98, 83), (131, 31), (115, 23), (15, 85), (101, 88), (54, 13), (59, 128), (133, 77), (31, 29), (17, 131), (91, 80), (105, 15), (110, 93), (75, 72), (94, 85), (11, 87), (112, 139), (10, 91), (84, 77), (43, 39), (1, 42), (100, 21), (45, 85), (119, 34), (17, 23), (77, 37), (61, 29), (79, 83), (137, 24), (101, 101), (73, 39), (12, 29), (31, 42), (72, 43), (91, 93), (130, 21), (75, 85), (135, 99), (33, 88), (107, 37), (52, 101), (109, 83), (3, 101), (89, 104), (47, 107), (121, 93), (19, 45), (79, 96), (5, 110), (137, 37), (123, 102), (21, 91), (95, 40), (114, 53), (53, 43), (88, 37), (33, 101), (93, 115), (65, 53), (51, 118), (49, 45), (109, 96), (7, 48), (67, 99), (26, 61), (125, 40), (89, 117), (83, 43), (60, 59), (5, 123), (63, 101), (123, 115), (35, 2), (95, 53), (81, 118), (34, 43), (53, 56), (139, 59), (39, 121), (97, 62), (129, 51), (74, 115), (27, 3), (13, 105), (113, 43), (118, 121), (51, 131), (35, 123), (7, 61), (81, 10), (92, 105), (39, 13), (111, 118), (125, 53), (23, 5), (9, 107), (69, 121), (41, 59), (127, 62), (27, 124), (25, 51), (118, 13), (30, 129), (104, 115), (57, 3), (136, 67), (81, 131), (139, 72), (39, 134), (37, 61), (23, 126), (97, 75), (69, 13), (8, 3), (27, 16), (99, 121), (11, 8), (71, 59), (16, 123), (30, 21), (131, 73), (76, 137), (29, 62), (103, 11), (134, 115), (48, 75), (87, 3), (20, 13), (111, 131), (4, 5), (23, 18), (64, 19), (105, 57), (69, 134), (110, 135), (127, 75), (27, 137), (66, 65), (11, 129), (99, 13), (43, 81), (84, 119), (117, 67), (15, 19), (87, 124), (133, 11), (78, 75), (23, 139), (119, 76), (17, 65), (91, 14), (110, 27), (55, 91), (94, 19), (99, 134), (11, 21), (57, 137), (131, 86), (29, 75), (115, 78), (73, 81), (6, 91), (133, 132), (106, 29), (45, 19), (91, 135), (8, 137), (85, 91), (79, 17), (43, 94), (15, 32), (101, 35), (87, 137), (1, 97), (59, 75), (119, 89), (17, 78), (91, 27), (75, 19), (135, 33), (80, 97), (121, 135), (33, 22), (52, 35), (38, 137), (79, 138), (115, 91), (109, 17), (45, 32), (31, 97), (3, 35), (89, 38), (88, 79), (47, 41), (121, 27), (126, 105), (79, 30), (65, 95), (98, 43), (63, 22), (82, 35), (101, 48), (21, 25), (77, 105), (75, 32), (61, 97), (33, 35), (93, 49), (137, 92), (51, 52), (109, 30), (95, 95), (67, 33), (12, 97), (31, 110), (130, 89), (89, 51), (107, 105), (5, 57), (63, 35), (49, 100), (123, 49), (21, 38), (7, 103), (125, 95), (39, 55), (74, 49), (19, 113), (13, 39), (137, 105), (51, 65), (35, 57), (95, 108), (67, 46), (53, 111), (37, 103), (70, 51), (9, 41), (69, 55), (129, 106), (113, 98), (5, 70), (132, 111), (104, 49), (49, 113), (123, 62), (2, 1), (7, 116), (81, 65), (39, 68), (125, 108), (138, 47), (83, 111), (97, 9), (60, 127), (13, 52), (99, 55), (44, 119), (32, 65), (16, 57), (35, 70), (76, 71), (117, 109), (134, 49), (34, 111), (48, 9), (53, 124), (139, 127), (111, 65), (97, 130), (9, 54), (50, 55), (55, 133), (129, 119), (41, 6), (127, 9), (27, 71), (113, 111), (11, 63), (44, 11), (85, 12), (90, 127), (43, 15), (29, 117), (117, 1), (122, 79), (6, 133), (78, 9), (23, 73), (105, 112), (97, 22), (96, 63), (41, 127), (127, 130), (55, 25), (25, 119), (85, 133), (57, 71), (2, 135), (29, 9), (115, 12), (15, 74), (120, 127), (73, 15), (59, 117), (92, 65), (6, 25), (91, 69), (36, 133), (108, 9), (8, 71), (127, 22), (85, 25), (30, 89), (71, 127), (43, 28), (29, 130), (115, 133), (103, 79), (87, 71), (1, 31), (59, 9), (4, 73), (119, 23), (105, 125), (17, 12), (3, 77), (77, 26), (121, 69), (38, 71), (115, 25), (15, 87), (101, 90), (54, 15), (73, 28), (133, 79), (31, 31), (17, 133), (94, 87), (33, 77), (107, 26), (126, 39), (65, 29), (84, 79), (87, 84), (128, 85), (100, 23), (45, 87), (119, 36), (3, 90), (89, 93), (22, 103), (77, 39), (61, 31), (79, 85), (63, 77), (101, 103), (95, 29), (12, 31), (31, 44), (75, 87), (135, 101), (33, 90), (107, 39), (65, 42), (51, 107), (109, 85), (68, 47), (67, 88), (86, 101), (125, 29), (58, 39), (61, 44), (102, 45), (47, 109), (19, 47), (5, 112), (63, 90), (137, 39), (82, 103), (21, 93), (95, 42), (81, 107), (114, 55), (53, 45), (37, 37), (47, 1), (129, 40), (93, 117), (132, 45), (32, 107), (51, 120), (49, 47), (35, 112), (109, 98), (7, 50), (67, 101), (26, 63), (125, 42), (39, 2), (111, 107), (83, 45), (28, 109), (5, 125), (44, 53), (123, 117), (35, 4), (21, 106), (76, 5), (117, 43), (139, 61), (39, 123), (23, 115), (97, 64), (129, 53), (27, 5), (13, 107), (113, 45), (118, 123), (71, 48), (90, 61), (35, 125), (92, 107), (39, 15), (111, 120), (23, 7), (9, 109), (69, 123), (41, 61), (127, 64), (25, 53), (118, 15), (30, 131), (57, 5), (2, 69), (117, 56), (103, 121), (136, 69), (15, 8), (120, 61), (20, 123), (139, 74), (39, 136), (59, 51), (4, 115), (97, 77), (69, 15), (55, 80), (8, 5), (113, 58), (13, 120), (99, 123), (71, 61), (16, 125), (57, 126), (131, 75), (76, 139), (30, 23), (103, 13), (15, 129), (134, 117), (87, 5), (133, 121), (4, 7), (64, 21), (50, 123), (105, 59), (69, 136), (110, 137), (127, 77), (27, 139), (25, 66), (99, 15), (11, 131), (85, 80), (38, 5), (57, 18), (43, 83), (84, 121), (103, 134), (15, 21), (106, 139), (133, 13), (45, 129), (78, 77), (119, 78), (17, 67), (91, 16), (96, 131), (55, 93), (99, 136), (11, 23), (112, 75), (57, 139), (10, 27), (115, 80), (73, 83), (45, 21), (31, 86), (91, 137), (3, 24), (75, 129), (8, 139), (108, 77), (121, 16), (79, 19), (24, 83), (43, 96), (101, 37), (87, 139), (1, 99), (119, 91), (58, 81), (91, 29), (77, 94), (75, 21), (61, 86), (135, 35), (80, 99), (121, 137), (52, 37), (93, 38), (137, 81), (109, 19), (86, 35), (31, 99), (70, 27), (3, 37), (89, 40), (47, 43), (79, 32), (65, 97), (82, 37), (123, 38), (21, 27), (77, 107), (61, 99), (33, 37), (93, 51), (32, 41), (137, 94), (51, 54), (95, 97), (67, 35), (12, 99), (72, 113), (130, 91), (89, 53), (9, 30), (28, 43), (5, 59), (63, 37), (49, 102), (123, 51), (68, 115), (7, 105), (81, 54), (125, 97), (39, 57), (83, 100), (102, 113), (74, 51), (19, 115), (13, 41), (51, 67), (35, 59), (136, 111), (53, 113), (139, 116), (37, 105), (111, 54), (9, 43), (69, 57), (14, 121), (27, 60), (132, 113), (30, 65), (49, 115), (2, 3), (7, 118), (81, 67), (139, 8), (138, 49), (83, 113), (97, 11), (60, 129), (25, 108), (13, 54), (16, 59), (131, 9), (117, 111), (139, 129), (37, 118), (78, 119), (111, 67), (50, 57), (110, 71), (55, 135), (127, 11), (27, 73), (113, 113), (66, 1), (11, 65), (85, 14), (90, 129), (84, 55), (29, 119), (43, 17), (117, 3), (122, 81), (106, 73), (6, 135), (23, 75), (119, 12), (124, 127), (17, 1), (22, 79), (41, 129), (127, 132), (55, 27), (25, 121), (99, 70), (85, 135), (112, 9), (57, 73), (117, 124), (29, 11), (115, 14), (15, 76), (73, 17), (59, 119), (18, 81), (133, 68), (105, 6), (91, 71), (36, 135), (108, 11), (8, 73), (11, 78), (52, 79), (71, 129), (85, 27), (43, 30), (29, 132), (115, 135), (103, 81), (87, 73), (1, 33), (59, 11), (119, 25), (105, 127), (17, 14), (58, 15), (3, 79), (61, 20), (121, 71), (66, 135), (38, 73), (82, 79), (15, 89), (101, 92), (115, 27), (59, 132), (133, 81), (114, 31), (31, 33), (17, 135), (91, 84), (75, 76), (33, 79), (65, 31), (10, 95), (109, 74), (1, 46), (45, 89), (89, 95), (77, 41), (61, 33), (19, 36), (79, 87), (63, 79), (137, 28), (101, 105), (21, 82), (95, 31), (40, 95), (12, 33), (72, 47), (75, 89), (135, 103), (33, 92), (74, 93), (107, 41), (93, 106), (46, 31), (65, 44), (51, 109), (49, 36), (109, 87), (68, 49), (7, 39), (86, 103), (125, 31), (89, 108), (102, 47), (47, 111), (19, 49), (104, 93), (137, 41), (123, 106), (51, 1), (21, 95), (95, 44), (136, 45), (81, 109), (53, 47), (37, 39), (14, 55), (93, 119), (13, 96), (132, 47), (5, 6), (16, 101), (49, 49), (81, 1), (67, 103), (111, 109), (83, 47), (41, 50), (5, 127), (44, 55), (32, 1), (123, 119), (35, 6), (117, 45), (62, 109), (122, 123), (34, 47), (139, 63), (39, 125), (37, 52), (111, 1), (23, 117), (97, 66), (56, 65), (69, 4), (96, 107), (129, 55), (55, 69), (27, 7), (13, 109), (113, 47), (90, 63), (35, 127), (29, 53), (62, 1), (6, 69), (111, 122), (23, 9), (9, 111), (69, 125), (41, 63), (8, 115), (27, 128), (25, 55), (99, 4), (85, 69), (30, 133), (57, 7), (2, 71), (103, 123), (15, 10), (120, 63), (59, 53), (18, 15), (92, 1), (138, 117), (97, 79), (91, 5), (36, 69), (55, 82), (8, 7), (27, 20), (99, 125), (38, 115), (71, 63), (57, 128), (131, 77), (115, 69), (15, 131), (103, 15), (87, 7), (133, 123), (4, 9), (64, 23), (50, 125), (105, 61), (110, 139), (3, 13), (127, 79), (121, 5), (11, 133), (38, 7), (43, 85), (84, 123), (103, 136), (15, 23), (101, 26), (1, 88), (87, 128), (59, 66), (133, 15), (45, 131), (17, 69), (77, 83), (110, 31), (75, 10), (94, 23), (33, 13), (84, 15), (115, 82), (73, 85), (133, 136), (45, 23), (91, 139), (89, 29), (75, 131), (22, 39), (121, 18), (107, 83), (79, 21), (43, 98), (63, 13), (101, 39), (1, 101), (119, 93), (17, 82), (75, 23), (135, 37), (121, 139), (80, 101), (19, 91), (52, 39), (93, 40), (63, 134), (137, 83), (51, 43), (109, 21), (54, 85), (114, 99), (67, 24), (31, 101), (70, 29), (47, 45), (107, 96), (126, 109), (5, 48), (65, 99), (63, 26), (49, 91), (82, 39), (123, 40), (21, 29), (81, 43), (26, 107), (61, 101), (135, 50), (93, 53), (32, 43), (137, 96), (109, 34), (95, 99), (67, 37), (12, 101), (53, 102), (72, 115), (111, 43), (56, 107), (28, 45), (47, 58), (129, 97), (5, 61), (65, 112), (123, 53), (68, 117), (62, 43), (7, 107), (39, 59), (125, 99), (23, 51), (102, 115), (41, 105), (13, 43), (118, 59), (35, 61), (136, 113), (53, 115), (6, 3), (37, 107), (97, 121), (9, 45), (69, 59), (14, 123), (113, 102), (132, 115), (85, 3), (71, 105), (30, 67), (7, 120), (48, 121), (136, 5), (103, 57), (20, 59), (139, 10), (39, 72), (138, 51), (83, 115), (97, 13), (41, 118), (127, 121), (60, 131), (25, 110), (57, 62), (131, 11), (117, 113), (115, 3), (15, 65), (48, 13), (139, 131), (37, 120), (78, 121), (133, 57), (97, 134), (69, 72), (110, 73), (55, 137), (127, 13), (113, 115), (27, 75), (25, 2), (11, 67), (131, 132), (84, 57), (29, 121), (43, 19), (122, 83), (1, 22), (106, 75), (45, 65), (17, 3), (22, 81), (96, 67), (127, 134), (25, 123), (85, 137), (112, 11), (57, 75), (2, 139), (131, 24), (15, 78), (101, 81), (120, 131), (73, 19), (59, 121), (133, 70), (119, 135), (105, 8), (91, 73), (75, 65), (108, 13), (107, 17), (43, 32), (29, 134), (115, 137), (87, 75), (1, 35), (119, 27), (64, 91), (105, 129), (3, 81), (77, 30), (121, 73), (80, 35), (98, 89), (137, 17), (114, 33), (31, 35), (17, 137), (88, 17), (33, 81), (93, 95), (126, 43), (65, 33), (67, 79), (26, 41), (100, 27), (130, 135), (89, 97), (61, 35), (47, 100), (19, 38), (79, 89), (63, 81), (137, 30), (123, 95), (95, 33), (72, 49), (135, 105), (129, 31), (51, 111), (109, 89), (7, 41), (67, 92), (125, 33), (70, 97), (9, 87), (47, 113), (19, 51), (5, 116), (51, 3), (21, 97), (136, 47), (81, 111), (53, 49), (139, 52), (37, 41), (116, 105), (14, 57), (129, 44), (113, 36), (30, 1), (35, 116), (7, 54), (134, 95), (48, 55), (81, 3), (125, 46), (111, 111), (9, 100), (83, 49), (28, 113), (41, 52), (60, 65), (5, 129), (25, 44), (117, 47), (81, 124), (34, 49), (139, 65), (39, 127), (78, 55), (23, 119), (69, 6), (96, 109), (55, 71), (27, 9), (13, 111), (99, 114), (113, 49), (11, 1), (131, 66), (29, 55), (106, 9), (92, 111), (111, 124), (23, 11), (105, 50), (69, 127), (96, 1), (41, 65), (127, 68), (25, 57), (11, 122), (85, 71), (30, 135), (57, 9), (2, 73), (43, 74), (103, 125), (87, 117), (59, 55), (4, 119), (18, 17), (64, 133), (97, 81), (91, 7), (36, 71), (55, 84), (99, 127), (11, 14), (52, 15), (57, 130), (131, 79), (29, 68), (115, 71), (15, 133), (103, 17), (87, 9), (133, 125), (45, 12), (50, 127), (3, 15), (94, 133), (127, 81), (121, 7), (66, 71), (11, 135), (85, 84), (126, 85), (79, 10), (98, 23), (43, 87), (15, 25), (1, 90), (87, 130), (133, 17), (45, 133), (119, 82), (17, 71), (91, 20), (77, 85), (33, 15), (79, 131), (112, 79), (10, 31), (128, 23), (73, 87), (12, 77), (45, 25), (31, 90), (3, 28), (130, 69), (75, 133), (89, 31), (33, 136), (107, 85), (79, 23), (65, 88), (63, 15), (68, 93), (1, 103), (109, 131), (101, 41), (21, 18), (119, 95), (58, 85), (77, 98), (75, 25), (61, 90), (135, 39), (80, 103), (74, 29), (19, 93), (93, 42), (63, 136), (137, 85), (51, 45), (109, 23), (54, 87), (86, 39), (31, 103), (70, 31), (89, 44), (88, 85), (47, 47), (5, 50), (65, 101), (49, 93), (21, 31), (81, 45), (125, 88), (61, 103), (19, 106), (60, 107), (93, 55), (137, 98), (51, 58), (16, 37), (35, 50), (95, 101), (67, 39), (26, 1), (53, 104), (72, 117), (111, 45), (129, 99), (5, 63), (49, 106), (90, 107), (123, 55), (62, 45), (7, 109), (81, 58), (125, 101), (39, 61), (23, 53), (97, 2), (102, 117), (55, 5), (41, 107), (13, 45), (99, 48), (118, 61), (35, 63), (136, 115), (120, 107), (53, 117), (139, 120), (92, 45), (37, 109), (111, 58), (97, 123), (9, 47), (69, 61), (129, 112), (113, 104), (11, 56), (85, 5), (71, 107), (103, 59), (48, 123), (20, 61), (4, 53), (23, 66), (97, 15), (83, 117), (41, 120), (127, 123), (85, 126), (38, 51), (57, 64), (76, 77), (117, 115), (29, 2), (115, 5), (15, 67), (139, 133), (133, 59), (78, 123), (97, 136), (55, 139), (113, 117), (27, 77), (11, 69), (85, 18), (112, 121), (84, 59), (29, 123), (115, 126), (43, 21), (87, 64), (1, 24), (6, 139), (45, 67), (105, 118), (17, 5), (77, 19), (22, 83), (108, 123), (25, 125), (85, 139), (112, 13), (57, 77), (101, 83), (73, 21), (59, 123), (119, 137), (17, 126), (91, 75), (36, 139), (75, 67), (33, 70), (107, 19), (24, 21), (43, 34), (115, 139), (87, 77), (1, 37), (45, 80), (86, 81), (105, 131), (119, 29), (58, 19), (3, 83), (61, 24), (121, 75), (66, 139), (80, 37), (19, 27), (79, 78), (137, 19), (82, 83), (100, 137), (31, 37), (17, 139), (75, 80), (135, 94), (33, 83), (93, 97), (65, 35), (49, 27), (109, 78), (128, 91), (67, 81), (26, 43), (125, 22), (89, 99), (61, 37), (19, 40), (79, 91), (5, 105), (63, 83), (123, 97), (21, 86), (95, 35), (53, 38), (72, 51), (135, 107), (129, 33), (74, 97), (93, 110), (46, 35), (65, 48), (51, 113), (35, 105), (109, 91), (7, 43), (125, 35), (70, 99), (111, 100), (9, 89), (102, 51), (47, 115), (41, 41), (104, 97), (123, 110), (21, 99), (81, 113), (53, 51), (139, 54), (39, 116), (37, 43), (97, 57), (129, 46), (13, 100), (71, 41), (16, 105), (7, 56), (134, 97), (48, 57), (39, 8), (111, 113), (83, 51), (127, 57), (27, 119), (60, 67), (25, 46), (44, 59), (117, 49), (76, 11), (122, 127), (15, 1), (139, 67), (39, 129), (37, 56), (23, 121), (110, 9), (55, 73), (27, 11), (13, 113), (113, 51), (11, 3), (57, 119), (29, 57), (133, 114), (45, 1), (105, 52), (124, 65), (69, 129), (27, 132), (25, 59), (99, 8), (11, 124), (85, 73), (57, 11), (43, 76), (103, 127), (15, 14), (101, 17), (1, 79), (87, 119), (18, 19), (4, 121), (59, 57), (119, 71), (133, 6), (17, 60), (91, 9), (75, 1), (99, 129), (52, 17), (57, 132), (131, 81), (115, 73), (15, 135), (87, 11), (133, 127), (31, 79), (64, 27), (105, 65), (3, 17), (121, 9), (66, 73), (11, 137), (85, 86), (126, 87), (79, 12), (98, 25), (43, 89), (82, 17), (101, 30), (87, 132), (128, 133), (45, 135), (17, 73), (3, 138), (77, 87), (61, 79), (135, 28), (94, 27), (33, 17), (93, 31), (79, 133), (112, 81), (109, 12), (73, 89), (67, 15), (89, 33), (75, 135), (107, 87), (79, 25), (63, 17), (123, 31), (109, 133), (21, 20), (77, 100), (42, 79), (135, 41), (80, 105), (33, 30), (19, 95), (93, 44), (137, 87), (51, 47), (35, 39), (109, 25), (95, 90), (67, 28), (53, 93), (89, 46), (9, 23), (88, 87), (47, 49), (107, 100), (65, 103), (49, 95), (123, 44), (21, 33), (7, 98), (81, 47), (83, 93), (116, 41), (32, 47), (16, 39), (95, 103), (134, 31), (34, 93), (53, 106), (139, 109), (72, 119), (111, 47), (9, 36), (28, 49), (69, 50), (129, 101), (113, 93), (46, 103), (60, 1), (49, 108), (90, 109), (7, 111), (81, 60), (39, 63), (125, 103), (23, 55), (102, 119), (55, 7), (41, 109), (96, 45), (25, 101), (13, 47), (57, 53), (2, 117), (117, 104), (90, 1), (139, 122), (37, 111), (111, 60), (97, 125), (69, 63), (14, 127), (55, 128), (27, 66), (113, 106), (85, 7), (71, 109), (30, 71), (131, 123), (29, 112), (103, 61), (48, 125), (87, 53), (120, 1), (4, 55), (105, 107), (64, 69), (138, 55), (97, 17), (36, 7), (55, 20), (127, 125), (44, 127), (43, 131), (117, 117), (76, 79), (115, 7), (15, 69), (73, 10), (133, 61), (97, 138), (17, 115), (91, 64), (11, 71), (71, 122), (112, 123), (126, 21), (131, 136), (43, 23), (29, 125), (103, 74), (87, 66), (1, 26), (73, 131), (59, 4), (100, 5), (45, 69), (119, 18), (105, 120), (124, 133), (17, 7), (77, 21), (22, 85), (108, 125), (121, 64), (79, 67), (24, 131), (115, 20), (15, 82), (101, 85), (73, 23), (59, 125), (18, 87), (119, 139), (31, 26), (17, 128), (91, 77), (130, 5), (75, 69), (135, 83), (33, 72), (107, 21), (52, 85), (65, 24), (68, 29), (1, 39), (45, 82), (86, 83), (58, 21), (3, 85), (42, 13), (121, 77), (80, 39), (19, 29), (98, 93), (137, 21), (82, 85), (101, 98), (54, 23), (95, 24), (100, 139), (31, 39), (88, 21), (33, 85), (107, 34), (93, 99), (65, 37), (10, 101), (51, 102), (49, 29), (109, 80), (7, 32), (67, 83), (130, 139), (89, 101), (61, 39), (5, 107), (63, 85), (123, 99), (95, 37), (40, 101), (34, 27), (53, 40), (37, 32), (56, 45), (129, 35), (93, 112), (46, 37), (51, 115), (49, 42), (90, 43), (35, 107), (7, 45), (67, 96), (125, 37), (111, 102), (9, 91), (83, 40), (47, 117), (41, 43), (104, 99), (2, 51), (117, 38), (136, 51), (81, 115), (20, 105), (53, 53), (39, 118), (37, 45), (97, 59), (129, 48), (55, 62), (132, 53), (32, 115), (71, 43), (16, 107), (30, 5), (35, 120), (76, 121), (29, 46), (134, 99), (48, 59), (111, 115), (23, 2), (9, 104), (83, 53), (64, 3), (41, 56), (127, 59), (27, 121), (117, 51), (76, 13), (103, 116), (122, 129), (15, 3), (106, 121), (39, 131), (139, 69), (59, 46), (78, 59), (23, 123), (97, 72), (96, 113), (55, 75), (27, 13), (99, 118), (11, 5), (71, 56), (112, 57), (57, 121), (131, 70), (29, 59), (115, 62), (103, 8), (106, 13), (18, 129), (6, 75), (133, 116), (92, 115), (45, 3), (105, 54), (124, 67), (69, 131), (22, 19), (27, 134), (25, 61), (85, 75), (30, 139), (24, 65), (57, 13), (103, 129), (15, 16), (101, 19), (87, 121), (1, 81), (59, 59), (4, 123), (119, 73), (64, 137), (91, 11), (36, 75), (75, 3), (121, 119), (80, 81), (33, 6), (131, 83), (115, 75), (15, 137), (87, 13), (73, 78), (133, 129), (86, 17), (31, 81), (91, 132), (3, 19), (94, 137), (121, 11), (11, 139), (107, 76), (43, 91), (82, 19), (87, 134), (1, 94), (100, 73), (45, 137), (17, 75), (77, 89), (116, 17), (61, 81), (135, 30), (33, 19), (19, 84), (93, 33), (79, 135), (10, 35), (73, 91), (67, 17), (12, 81), (31, 94), (72, 95), (89, 35), (75, 137), (28, 25), (47, 38), (107, 89), (5, 41), (79, 27), (65, 92), (63, 19), (49, 84), (123, 33), (68, 97), (109, 135), (58, 89), (61, 94), (102, 95), (135, 43), (74, 33), (19, 97), (137, 89), (51, 49), (35, 41), (109, 27), (95, 92), (53, 95), (70, 35), (9, 25), (14, 103), (88, 89), (47, 51), (132, 95), (65, 105), (49, 97), (123, 46), (21, 35), (81, 49), (26, 113), (125, 92), (39, 52), (138, 31), (83, 95), (41, 98), (13, 36), (16, 41), (35, 54), (95, 105), (134, 33), (34, 95), (139, 111), (37, 100), (111, 49), (9, 38), (129, 103), (113, 95), (27, 55), (62, 49), (7, 113), (122, 63), (139, 3), (39, 65), (125, 105), (6, 117), (23, 57), (97, 6), (124, 109), (55, 9), (41, 111), (127, 114), (25, 103), (13, 49), (118, 65), (57, 55), (2, 119), (136, 119), (139, 124), (92, 49), (37, 113), (133, 50), (6, 9), (97, 127), (124, 1), (36, 117), (69, 65), (55, 130), (27, 68), (113, 108), (85, 9), (71, 111), (30, 73), (131, 125), (43, 12), (29, 114), (103, 63), (48, 127), (87, 55), (1, 15), (119, 7), (105, 109), (36, 9), (127, 127), (25, 116), (66, 117), (85, 130), (38, 55), (57, 68), (98, 69), (43, 133), (117, 119), (131, 17), (115, 9), (15, 71), (73, 12), (59, 114), (133, 63), (119, 128), (31, 15), (17, 117), (91, 66), (11, 73), (85, 22), (112, 125), (84, 63), (29, 127), (43, 25), (1, 28), (73, 133), (100, 7), (45, 71), (17, 9), (77, 23), (108, 127), (61, 15), (121, 66), (79, 69), (24, 133), (115, 22), (101, 87), (73, 25), (59, 127), (18, 89), (12, 15), (31, 28), (17, 130), (91, 79), (75, 71), (61, 136), (135, 85), (33, 74), (107, 23), (24, 25), (65, 26), (109, 69), (68, 31), (58, 23), (3, 87), (89, 90), (77, 36), (42, 15), (61, 28), (47, 93), (121, 79), (19, 31), (137, 23), (21, 77), (54, 25), (114, 39), (53, 29), (116, 85), (135, 98), (88, 23), (33, 87), (107, 36), (93, 101), (65, 39), (10, 103), (51, 104), (49, 31), (67, 85), (26, 47), (89, 103), (83, 29), (47, 106), (19, 44), (60, 45), (5, 109), (63, 87), (123, 101), (21, 90), (95, 39), (40, 103), (53, 42), (139, 45), (39, 107), (72, 55), (37, 34), (56, 47), (129, 37), (74, 101), (113, 29), (13, 91), (46, 39), (51, 117), (49, 44), (35, 109), (7, 47), (92, 91), (125, 39), (9, 93), (69, 107), (41, 45), (25, 37), (104, 101), (2, 53), (136, 53), (81, 117), (139, 58), (39, 120), (37, 47), (23, 112), (138, 99), (97, 61), (14, 63), (129, 50), (27, 2), (13, 104), (99, 107), (113, 42), (71, 45), (30, 7), (131, 59), (76, 123), (134, 101), (111, 117), (23, 4), (64, 5), (50, 107), (105, 43), (127, 61), (27, 123), (44, 63), (11, 115), (85, 64), (57, 2), (43, 67), (117, 53), (76, 15), (122, 131), (15, 5), (59, 48), (23, 125), (97, 74), (17, 51), (110, 13), (55, 77), (99, 120), (11, 7), (71, 58), (57, 123), (131, 72), (29, 61), (115, 64), (15, 126), (103, 10), (87, 2), (73, 67), (6, 77), (106, 15), (45, 5), (105, 56), (91, 121), (124, 69), (3, 8), (108, 61), (8, 123), (127, 74), (85, 77), (79, 3), (43, 80), (103, 131), (15, 18), (101, 21), (1, 83), (87, 123), (59, 61), (18, 23), (45, 126), (119, 75), (64, 139), (91, 13), (3, 129), (75, 5), (135, 19), (121, 121), (38, 123), (57, 136), (115, 77), (15, 139), (133, 131), (45, 18), (86, 19), (31, 83), (3, 21), (89, 24), (75, 126), (94, 139), (121, 13), (33, 129), (66, 77), (79, 16), (65, 81), (101, 34), (87, 136), (128, 137), (1, 96), (21, 11), (100, 75), (45, 139), (119, 88), (77, 91), (75, 18), (61, 83), (33, 21), (19, 86), (93, 35), (79, 137), (63, 129), (137, 78), (109, 16), (95, 81), (67, 19), (12, 83), (31, 96), (72, 97), (89, 37), (75, 139), (47, 40), (107, 91), (5, 43), (63, 21), (49, 86), (123, 35), (68, 99), (109, 137), (7, 89), (40, 37), (125, 81), (58, 91), (61, 96), (74, 35), (19, 99), (93, 48), (13, 25), (137, 91), (51, 51), (35, 43), (53, 97), (37, 89), (70, 37), (9, 27), (14, 105), (104, 35), (49, 99), (7, 102), (81, 51), (20, 41), (125, 94), (138, 33), (83, 97), (41, 100), (13, 38), (99, 41), (16, 43), (117, 95), (76, 57), (139, 113), (37, 102), (111, 51), (97, 116), (9, 40), (50, 41), (69, 54), (55, 119), (129, 105), (113, 97), (27, 57), (71, 100), (90, 113), (29, 103), (103, 52), (139, 5), (39, 67), (23, 59), (97, 8), (83, 110), (55, 11), (41, 113), (25, 105), (99, 54), (85, 119), (118, 67), (57, 57), (117, 108), (15, 60), (139, 126), (59, 103), (133, 52), (97, 129), (91, 55), (55, 132), (85, 11), (71, 113), (131, 127), (115, 119), (103, 65), (87, 57), (1, 17), (45, 60), (119, 9), (105, 111), (64, 73), (36, 11), (127, 129), (121, 55), (66, 119), (98, 71), (43, 135), (131, 19), (115, 11), (15, 73), (101, 76), (1, 138), (133, 65), (119, 130), (31, 17), (17, 119), (77, 133), (110, 81), (11, 75), (107, 12), (126, 25), (112, 127), (10, 79), (84, 65), (43, 27), (1, 30), (128, 71), (73, 135), (100, 9), (45, 73), (31, 138), (105, 124), (17, 11), (3, 76), (77, 25), (22, 89), (61, 17), (121, 68), (107, 133), (19, 20), (79, 71), (137, 12), (101, 89), (73, 27), (12, 17), (17, 132), (72, 31), (130, 9), (75, 73), (135, 87), (107, 25), (52, 89), (93, 90), (46, 15), (137, 133), (109, 71), (68, 33), (67, 74), (58, 25), (3, 89), (102, 31), (47, 95), (19, 33), (79, 84), (63, 76), (137, 25), (21, 79), (95, 28), (114, 41), (53, 31), (116, 87), (14, 39), (33, 89), (129, 26), (93, 103), (32, 93), (65, 41), (49, 33), (109, 84), (7, 36), (67, 87), (125, 28), (89, 105), (9, 82), (83, 31), (28, 95), (47, 108), (41, 34), (60, 47), (5, 111), (123, 103), (62, 93), (95, 41), (34, 31), (53, 44), (139, 47), (39, 109), (56, 49), (97, 50), (129, 39), (74, 103), (113, 31), (13, 93), (51, 119), (71, 34), (35, 111), (7, 49), (6, 53), (125, 41), (39, 1), (9, 95), (83, 44), (69, 109), (41, 47), (27, 112), (25, 39), (118, 1), (30, 117), (104, 103), (2, 55), (81, 119), (120, 47), (37, 49), (23, 114), (138, 101), (97, 63), (69, 1), (55, 66), (99, 109), (71, 47), (30, 9), (131, 61), (48, 63), (111, 119), (105, 45), (50, 109), (69, 122), (127, 63), (27, 125), (25, 52), (66, 53), (11, 117), (57, 4), (43, 69), (117, 55), (103, 120), (122, 133), (15, 7), (101, 10), (1, 72), (23, 127), (17, 53), (91, 2), (22, 131), (55, 79), (94, 7), (99, 122), (11, 9), (57, 125), (131, 74), (29, 63), (128, 5), (73, 69), (18, 133), (133, 120), (45, 7), (105, 58), (91, 123), (3, 10), (22, 23), (8, 125), (11, 130), (52, 131), (85, 79), (79, 5), (43, 82), (103, 133), (101, 23), (1, 85), (87, 125), (59, 63), (119, 77), (91, 15), (3, 131), (75, 7), (135, 21), (80, 85), (121, 123), (79, 126), (98, 139), (115, 79), (54, 69), (73, 82), (114, 83), (67, 8), (31, 85), (91, 136), (3, 23), (89, 26), (75, 128), (47, 29), (33, 131), (107, 80), (121, 15), (65, 83), (63, 10), (109, 126), (128, 139), (21, 13), (77, 93), (61, 85), (135, 34), (121, 136), (33, 23), (93, 37), (79, 139), (63, 131), (51, 40), (21, 134), (95, 83), (67, 21), (72, 99), (89, 39), (28, 29), (47, 42), (107, 93), (5, 45), (63, 23), (49, 88), (123, 37), (68, 101), (109, 139), (7, 91), (125, 83), (39, 43), (83, 86), (102, 99), (19, 101), (13, 27), (137, 93), (51, 53), (35, 45), (95, 96), (53, 99), (139, 102), (37, 91), (111, 40), (9, 29), (69, 43), (14, 107), (129, 94), (5, 58), (132, 99), (49, 101), (7, 104), (81, 53), (20, 43), (23, 48), (138, 35), (83, 99), (60, 115), (25, 94), (13, 40), (44, 107), (99, 43), (117, 97), (76, 59), (134, 37), (34, 99), (139, 115), (78, 105), (111, 53), (97, 118), (69, 56), (55, 121), (129, 107), (113, 99), (27, 59), (11, 51), (84, 41), (29, 105), (43, 3), (103, 54), (106, 59), (6, 121), (23, 61), (124, 113), (55, 13), (41, 115), (25, 107), (85, 121), (57, 59), (117, 110), (73, 3), (59, 105), (18, 67), (97, 131), (91, 57), (124, 5), (8, 59), (127, 10), (85, 13), (71, 115), (131, 129), (43, 16), (115, 121), (87, 59), (1, 19), (73, 124), (4, 61), (45, 62), (119, 11), (64, 75), (105, 113), (3, 65), (36, 13), (77, 14), (127, 131), (121, 57), (80, 19), (85, 134), (126, 135), (98, 73), (43, 137), (115, 13), (15, 75), (101, 78), (54, 3), (73, 16), (59, 118), (133, 67), (31, 19), (17, 121), (91, 70), (77, 135), (75, 62), (33, 65), (126, 27), (112, 129), (65, 17), (10, 81), (115, 134), (109, 60), (1, 32), (128, 73), (73, 137), (45, 75), (119, 24), (3, 78), (89, 81), (22, 91), (77, 27), (61, 19), (107, 135), (79, 73), (63, 65), (101, 91), (95, 17), (40, 81), (31, 32), (72, 33), (58, 135), (130, 11), (42, 127), (75, 75), (135, 89), (33, 78), (107, 27), (93, 92), (46, 17), (51, 95), (137, 135), (49, 22), (109, 73), (7, 25), (67, 76), (86, 89), (102, 33), (88, 135), (47, 97), (19, 35), (5, 100), (63, 78), (137, 27), (21, 81), (81, 95), (53, 33), (37, 25), (116, 89), (14, 41), (129, 28), (93, 105), (132, 33), (49, 35), (67, 89), (26, 51), (111, 95), (9, 84), (83, 33), (47, 110), (41, 36), (5, 113), (123, 105), (117, 31), (53, 46), (139, 49), (39, 111), (37, 38), (23, 103), (129, 41), (55, 55), (113, 33), (13, 95), (35, 113), (29, 39), (122, 1), (92, 95), (111, 108), (9, 97), (83, 46), (69, 111), (41, 49), (127, 52), (25, 41), (85, 55), (30, 119), (2, 57), (103, 109), (136, 57), (139, 62), (59, 39), (4, 103), (18, 1), (97, 65), (27, 6), (113, 46), (99, 111), (71, 49), (30, 11), (57, 114), (131, 63), (29, 52), (115, 55), (15, 117), (133, 109), (64, 9), (50, 111), (105, 47), (127, 65), (27, 127), (25, 54), (11, 119), (85, 68), (98, 7), (43, 71), (84, 109), (122, 135), (15, 9), (101, 12), (1, 74), (87, 114), (106, 127), (59, 52), (45, 117), (119, 66), (17, 55), (77, 69), (22, 133), (110, 17), (57, 127), (84, 1), (115, 68), (15, 130), (101, 133), (87, 6), (73, 71), (133, 122), (45, 9), (31, 74), (91, 125), (75, 117), (22, 25), (11, 132), (52, 133), (107, 69), (79, 7), (24, 71), (43, 84), (101, 25), (1, 87), (87, 127), (119, 79), (17, 68), (58, 69), (3, 133), (77, 82), (75, 9), (135, 23), (80, 87), (121, 125), (33, 12), (19, 77), (38, 127), (79, 128), (93, 26), (137, 69), (73, 84), (114, 85), (67, 10), (31, 87), (70, 15), (3, 25), (88, 69), (33, 133), (107, 82), (47, 31), (126, 95), (79, 20), (65, 85), (49, 77), (82, 25), (109, 128), (123, 26), (21, 15), (26, 93), (67, 131), (61, 87), (135, 36), (19, 90), (93, 39), (32, 29), (63, 133), (137, 82), (35, 34), (109, 20), (95, 85), (67, 23), (12, 87), (53, 88), (72, 101), (9, 18), (28, 31), (47, 44), (129, 83), (5, 47), (65, 98), (123, 39), (62, 29), (7, 93), (81, 42), (125, 85), (39, 45), (9, 139), (42, 87), (83, 88), (41, 91), (13, 29), (118, 45), (51, 55), (35, 47), (136, 99), (53, 101), (139, 104), (92, 29), (37, 93), (111, 42), (97, 107), (9, 31), (69, 45), (14, 109), (27, 48), (71, 91), (7, 106), (81, 55), (20, 45), (4, 37), (23, 50), (138, 37), (83, 101), (55, 2), (41, 104), (127, 107), (60, 117), (13, 42), (99, 45), (44, 109), (117, 99), (76, 61), (134, 39), (34, 101), (139, 117), (37, 106), (78, 107), (133, 43), (97, 120), (55, 123), (113, 101), (27, 61), (11, 53), (71, 104), (90, 117), (131, 118), (84, 43), (29, 107), (43, 5), (103, 56), (122, 69), (1, 8), (106, 61), (6, 123), (23, 63), (22, 67), (55, 15), (127, 120), (25, 109), (85, 123), (57, 61), (43, 126), (117, 112), (15, 64), (120, 117), (73, 5), (59, 107), (133, 56), (119, 121), (91, 59), (55, 136), (52, 67), (85, 15), (131, 131), (24, 5), (43, 18), (115, 123), (87, 61), (1, 21), (119, 13), (105, 115), (58, 3), (3, 67), (121, 59), (80, 21), (126, 137), (38, 61), (79, 62), (43, 139), (115, 15), (15, 77), (54, 5), (114, 19), (119, 134), (31, 21), (17, 123), (77, 137), (88, 3), (33, 67), (107, 16), (126, 29), (65, 19), (115, 136), (128, 75), (73, 139), (100, 13), (45, 77), (89, 83), (130, 121), (77, 29), (61, 21), (47, 86), (121, 72), (107, 137), (19, 24), (79, 75), (24, 139), (63, 67), (137, 16), (101, 93), (95, 19), (12, 21), (53, 22), (75, 77), (135, 91), (107, 29), (93, 94), (65, 32), (51, 97), (137, 137), (109, 75), (54, 139), (7, 27), (86, 91), (125, 19), (70, 83), (89, 96), (42, 21), (83, 22), (47, 99), (19, 37), (5, 102), (63, 80), (104, 81), (137, 29), (123, 94), (21, 83), (95, 32), (136, 33), (81, 97), (53, 35), (139, 38), (37, 27), (129, 30), (93, 107), (13, 84), (132, 35), (49, 37), (35, 102), (7, 40), (134, 81), (67, 91), (125, 32), (111, 97), (83, 35), (28, 99), (5, 115), (44, 43), (123, 107), (117, 33), (81, 110), (34, 35), (139, 51), (39, 113), (78, 41), (23, 105), (129, 43), (55, 57), (113, 35), (13, 97), (71, 38), (90, 51), (35, 115), (29, 41), (6, 57), (92, 97), (9, 99), (69, 113), (108, 41), (41, 51), (127, 54), (25, 43), (11, 108), (85, 57), (30, 121), (117, 46), (103, 111), (20, 113), (59, 41), (4, 105), (23, 118), (138, 105), (97, 67), (17, 44), (36, 57), (99, 113), (38, 103), (71, 51), (57, 116), (131, 65), (30, 13), (115, 57), (15, 119), (73, 60), (133, 111), (105, 49), (50, 113), (91, 114), (3, 1), (94, 119), (27, 129), (127, 67), (66, 57), (11, 121), (126, 71), (43, 73), (103, 124), (15, 11), (1, 76), (59, 54), (45, 119), (17, 57), (77, 71), (22, 135), (121, 114), (33, 1), (112, 65), (57, 129), (101, 135), (128, 9), (73, 73), (12, 63), (45, 11), (91, 127), (130, 55), (75, 119), (22, 27), (89, 17), (33, 122), (107, 71), (79, 9), (24, 73), (63, 1), (101, 27), (1, 89), (87, 129), (40, 17), (45, 132), (86, 133), (119, 81), (58, 71), (3, 135), (42, 63), (75, 11), (61, 76), (135, 25), (80, 89), (121, 127), (33, 14), (19, 79), (52, 27), (79, 130), (63, 122), (137, 71), (82, 135), (51, 31), (109, 9), (95, 74), (114, 87), (67, 12), (86, 25), (31, 89), (70, 17), (89, 30), (88, 71), (33, 135), (47, 33), (65, 87), (49, 79), (123, 28), (109, 130), (21, 17), (81, 31), (26, 95), (67, 133), (125, 74), (61, 89), (19, 92), (93, 41), (63, 135), (137, 84), (51, 44), (21, 138), (95, 87), (134, 15), (34, 77), (67, 25), (37, 82), (111, 31), (28, 33), (129, 85), (5, 49), (49, 92), (90, 93), (123, 41), (62, 31), (7, 95), (81, 44), (125, 87), (39, 47), (23, 39), (83, 90), (41, 93), (13, 31), (118, 47), (35, 49), (136, 101), (120, 93), (53, 103), (139, 106), (37, 95), (111, 44), (97, 109), (9, 33), (69, 47), (113, 90), (132, 103), (71, 93), (30, 55), (103, 45), (20, 47), (39, 60), (4, 39), (23, 52), (97, 1), (83, 103), (127, 109), (13, 44), (99, 47), (44, 111), (16, 49), (57, 50), (117, 101), (76, 63), (15, 53), (48, 1), (139, 119), (59, 96), (133, 45), (69, 60), (55, 125), (113, 103), (27, 63), (11, 55), (85, 4), (71, 106), (131, 120), (43, 7), (29, 109), (115, 112), (103, 58), (87, 50), (1, 10), (45, 53), (78, 1), (105, 104), (119, 2), (77, 5), (108, 109), (127, 122), (25, 111), (85, 125), (57, 63), (2, 127), (43, 128), (115, 4), (15, 66), (1, 131), (73, 7), (59, 109), (18, 71), (133, 58), (119, 123), (17, 112), (91, 61), (36, 125), (55, 138), (75, 53), (131, 133), (24, 7), (43, 20), (115, 125), (87, 63), (1, 23), (119, 15), (31, 131), (105, 117), (58, 5), (3, 69), (77, 18), (61, 10), (121, 61), (80, 23), (126, 139), (19, 13), (79, 64), (98, 77), (137, 5), (54, 7), (31, 23), (17, 125), (77, 139), (61, 131), (33, 69), (93, 83), (65, 21), (10, 85), (49, 13), (128, 77), (67, 67), (26, 29), (3, 82), (130, 123), (89, 85), (61, 23), (47, 88), (107, 139), (19, 26), (5, 91), (79, 77), (63, 69), (123, 83), (21, 72), (95, 21), (56, 29), (42, 131), (135, 93), (33, 82), (129, 19), (65, 34), (51, 99), (137, 139), (49, 26), (35, 91), (109, 77), (7, 29), (67, 80), (125, 21), (9, 75), (42, 23), (83, 24), (102, 37), (47, 101), (88, 139), (41, 27), (21, 85), (81, 99), (53, 37), (139, 40), (39, 102), (37, 29), (97, 43), (116, 93), (129, 32), (113, 24), (13, 86), (132, 37), (32, 99), (51, 112), (71, 27), (35, 104), (7, 42), (111, 99), (9, 88), (83, 37), (69, 102), (41, 40), (127, 43), (27, 105), (117, 35), (81, 112), (122, 113), (34, 37), (139, 53), (39, 115), (37, 42), (78, 43), (23, 107), (97, 56), (96, 97), (55, 59), (113, 37), (13, 99), (99, 102), (118, 115), (71, 40), (57, 105), (90, 53), (29, 43), (122, 5), (6, 59), (105, 38), (124, 51), (69, 115), (108, 43), (27, 118), (25, 45), (85, 59), (30, 123), (117, 48), (103, 113), (87, 105), (20, 115), (120, 53), (59, 43), (4, 107), (119, 57), (138, 107), (17, 46), (36, 59), (55, 72), (99, 115), (52, 3), (57, 118), (131, 67), (76, 131), (115, 59), (15, 121), (133, 113), (64, 13), (50, 115), (105, 51), (3, 3), (94, 121), (11, 123), (85, 72), (98, 11), (43, 75), (103, 126), (15, 13), (101, 16), (1, 78), (45, 121), (17, 59), (91, 8), (3, 124), (77, 73), (61, 65), (94, 13), (33, 3), (79, 119), (10, 19), (101, 137), (128, 11), (73, 75), (18, 139), (133, 126), (12, 65), (45, 13), (31, 78), (91, 129), (3, 16), (130, 57), (75, 121), (89, 19), (135, 135), (47, 22), (33, 124), (107, 73), (121, 8), (79, 11), (63, 3), (109, 119), (1, 91), (68, 81), (101, 29), (86, 135), (3, 137), (77, 86), (135, 27), (80, 91), (121, 129), (74, 17), (19, 81), (93, 30), (79, 132), (63, 124), (137, 73), (82, 137), (51, 33), (109, 11), (21, 127), (95, 76), (114, 89), (86, 27), (88, 73), (33, 137), (47, 35), (65, 89), (63, 16), (104, 17), (49, 81), (123, 30), (109, 132), (21, 19), (81, 33), (26, 97), (67, 135), (39, 36), (83, 79), (116, 27), (60, 95), (93, 43), (32, 33), (63, 137), (137, 86), (51, 46), (16, 25), (95, 89), (111, 33), (56, 97), (9, 22), (129, 87), (113, 79), (5, 51), (90, 95), (123, 43), (62, 33), (7, 97), (125, 89), (39, 49), (23, 41), (102, 105), (41, 95), (13, 33), (118, 49), (2, 103), (117, 90), (35, 51), (136, 103), (120, 95), (139, 108), (92, 33), (37, 97), (111, 46), (97, 111), (9, 35), (69, 49), (55, 114), (129, 100), (113, 92), (27, 52), (132, 105), (11, 44), (71, 95), (30, 57), (29, 98), (103, 47), (4, 41), (105, 93), (64, 55), (97, 3), (41, 108), (127, 111), (25, 100), (99, 49), (44, 113), (117, 103), (76, 65), (15, 55), (133, 47), (97, 124), (50, 49), (55, 127), (94, 55), (27, 65), (11, 57), (71, 108), (112, 109), (43, 9), (29, 111), (115, 114), (1, 12), (106, 65), (6, 127), (45, 55), (119, 4), (124, 119), (3, 58), (77, 7), (22, 71), (121, 50), (85, 127), (112, 1), (57, 65), (115, 6), (1, 133), (73, 9), (59, 111), (133, 60), (119, 125), (31, 12), (17, 114), (91, 63), (36, 127), (77, 128), (75, 55), (80, 133), (52, 71), (24, 9), (115, 127), (68, 15), (87, 65), (1, 25), (73, 130), (119, 17), (31, 133), (58, 7), (3, 71), (121, 63), (66, 127), (107, 128), (19, 15), (79, 66), (98, 79), (137, 7), (95, 10), (114, 23), (100, 125), (31, 25), (17, 127), (75, 68), (61, 133), (135, 82), (33, 71), (107, 20), (19, 136), (93, 85), (65, 23), (137, 128), (49, 15), (128, 79), (67, 69), (12, 133), (26, 31), (89, 87), (28, 77), (61, 25), (47, 90), (19, 28), (5, 93), (79, 79), (63, 71), (49, 136), (123, 85), (95, 23), (81, 88), (34, 13), (53, 26), (135, 95), (129, 21), (93, 98), (46, 23), (51, 101), (49, 28), (35, 93), (109, 79), (7, 31), (125, 23), (111, 88), (9, 77), (102, 39), (47, 103), (41, 29), (21, 87), (117, 24), (81, 101), (120, 29), (53, 39), (139, 42), (37, 31), (138, 83), (97, 45), (129, 34)}\n", + "cost of cheapest path: 135512\n" + ] + } + ], + "source": [ + "import heapq\n", + "\n", + "# Define directions and corresponding movements\n", + "DIRECTIONS = ['N', 'E', 'S', 'W']\n", + "MOVEMENTS = {\n", + " 'N': (0, -1), # Move up\n", + " 'E': (1, 0), # Move right\n", + " 'S': (0, 1), # Move down\n", + " 'W': (-1, 0) # Move left\n", + "}\n", + "\n", + "def solve_maze_with_costs(ascii_map):\n", + " rows = ascii_map.strip().split(\"\\n\")\n", + " height, width = len(rows), len(rows[0])\n", + "\n", + " # Find start and end positions\n", + " start, end = None, None\n", + " for y, row in enumerate(rows):\n", + " for x, char in enumerate(row):\n", + " if char == 'S':\n", + " start = (x, y, 'E') # Start facing North\n", + " elif char == 'E':\n", + " end = (x, y)\n", + " \n", + " # Priority queue for Dijkstra's algorithm\n", + " pq = []\n", + " heapq.heappush(pq, (0, start)) # (cost, (x, y, direction))\n", + "\n", + " # Visited states: {(x, y, direction): cost}\n", + " visited = {}\n", + "\n", + " while pq:\n", + " cost, (x, y, direction) = heapq.heappop(pq)\n", + "\n", + " # Goal check: If we reach the endpoint\n", + " if (x, y) == end:\n", + " yield cost,visited\n", + "\n", + " # Avoid revisiting with higher cost\n", + " if (x, y, direction) in visited and visited[(x, y, direction)] <= cost:\n", + " continue\n", + " visited[(x, y, direction)] = cost\n", + "\n", + " # 1. Move forward\n", + " dx, dy = MOVEMENTS[direction]\n", + " nx, ny = x + dx, y + dy\n", + " if 0 <= nx < width and 0 <= ny < height and rows[ny][nx] != '#':\n", + " heapq.heappush(pq, (cost + 1, (nx, ny, direction)))\n", + "\n", + " # 2. Rotate clockwise\n", + " next_direction = DIRECTIONS[(DIRECTIONS.index(direction) + 1) % 4]\n", + " heapq.heappush(pq, (cost + 1000, (x, y, next_direction)))\n", + "\n", + " # 3. Rotate counterclockwise\n", + " prev_direction = DIRECTIONS[(DIRECTIONS.index(direction) - 1) % 4]\n", + " heapq.heappush(pq, (cost + 1000, (x, y, prev_direction)))\n", + " \n", + " return float('inf') # No path found\n", + "\n", + "# Example ASCII map\n", + "with open('input','r') as infile:\n", + " ascii_map = infile.read()\n", + "\n", + "# Solve the maze\n", + "minkost = float('inf')\n", + "\n", + "visited_nodes = {}\n", + "for cost,visited in solve_maze_with_costs(ascii_map):\n", + " # Strip visited to just coordinates\n", + " visited = {(x, y) for x, y, _ in visited}\n", + " if cost in visited_nodes:\n", + " visited_nodes[cost].update(visited)\n", + " else:\n", + " visited_nodes[cost] = set(visited)\n", + " if cost < minkost:\n", + " minkost = cost\n", + "\n", + "print(f\"all visited nodes for cheapest path: {visited_nodes[minkost]}\")\n", + "print(f\"cost of cheapest path: {minkost}\")\n", + "\n", + "\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "advent", + "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.13.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}