From 55032cf79fa658908ecd454d541f9f1c89d646f2 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 30 Dec 2025 12:16:41 +0000 Subject: [PATCH 1/3] feat: Move board configuration data to backend and expose via GraphQL This reduces client bundle size by moving large configuration data (~260KB) to the backend and making it available via GraphQL queries. Changes: - Add board configuration data module to backend (packages/backend/src/data/) - product-sizes-data.ts: Product sizes, layouts, sets, image filenames, hole placements - led-placements-data.ts: LED position mappings for Bluetooth control - board-data.ts: Static board dimensions, angles, and grades - types.ts: TypeScript type definitions - index.ts: Module exports - Add GraphQL types and queries for board configuration - ProductSize, Layout, HoldSet, BoardDetails, LedPlacements types - boardDetails, layouts, sizesForLayout, setsForLayoutAndSize queries - ledPlacements query for Bluetooth LED control - boardSelectorOptions query for setup wizard - Update Bluetooth components to fetch LED placements via GraphQL - use-board-bluetooth.ts: Async fetch with caching - send-climb-to-board-button.tsx: Async fetch with caching - Add server-side cached GraphQL operations for board config - board-config.ts: Server-only cached queries - board-config.client.ts: Client-side fetcher for LED placements This is the first phase of the migration. Server components still use the bundled data files; future work will update them to use GraphQL. --- packages/backend/src/data/board-data.ts | 121 +++++ packages/backend/src/data/index.ts | 57 +++ .../backend/src/data/led-placements-data.ts | 74 +++ .../backend/src/data/product-sizes-data.ts | 476 ++++++++++++++++++ packages/backend/src/data/types.ts | 71 +++ .../src/graphql/resolvers/board/queries.ts | 86 ++++ packages/backend/tsconfig.json | 1 + packages/shared-schema/src/schema.ts | 83 +++ packages/shared-schema/src/types.ts | 78 +++ .../send-climb-to-board-button.tsx | 63 ++- .../use-board-bluetooth.ts | 39 +- .../graphql/operations/board-config.client.ts | 42 ++ .../lib/graphql/operations/board-config.ts | 243 +++++++++ 13 files changed, 1418 insertions(+), 16 deletions(-) create mode 100644 packages/backend/src/data/board-data.ts create mode 100644 packages/backend/src/data/index.ts create mode 100644 packages/backend/src/data/led-placements-data.ts create mode 100644 packages/backend/src/data/product-sizes-data.ts create mode 100644 packages/backend/src/data/types.ts create mode 100644 packages/web/app/lib/graphql/operations/board-config.client.ts create mode 100644 packages/web/app/lib/graphql/operations/board-config.ts diff --git a/packages/backend/src/data/board-data.ts b/packages/backend/src/data/board-data.ts new file mode 100644 index 00000000..3f3549a0 --- /dev/null +++ b/packages/backend/src/data/board-data.ts @@ -0,0 +1,121 @@ +/** + * Static board configuration data. + * This mirrors the web package's board-data.ts but is self-contained for the backend. + */ + +import type { BoardName, Angle } from './types.js'; + +type ImageDimensions = { + [imageName: string]: { + width: number; + height: number; + }; +}; + +export const SUPPORTED_BOARDS = ['kilter', 'tension']; + +export const BOARD_IMAGE_DIMENSIONS: Record = { + kilter: { + 'product_sizes_layouts_sets/15_5_24.png': { width: 1080, height: 2498 }, + 'product_sizes_layouts_sets/36-1.png': { width: 1080, height: 1350 }, + 'product_sizes_layouts_sets/38-1.png': { width: 1080, height: 1350 }, + 'product_sizes_layouts_sets/39-1.png': { width: 1080, height: 1755 }, + 'product_sizes_layouts_sets/41-1.png': { width: 1080, height: 1755 }, + 'product_sizes_layouts_sets/45-1.png': { width: 1080, height: 1170 }, + 'product_sizes_layouts_sets/46-1.png': { width: 1080, height: 1170 }, + 'product_sizes_layouts_sets/47.png': { width: 1200, height: 663 }, + 'product_sizes_layouts_sets/48.png': { width: 1080, height: 1080 }, + 'product_sizes_layouts_sets/49.png': { width: 1080, height: 1188 }, + 'product_sizes_layouts_sets/50-1.png': { width: 1080, height: 1473 }, + 'product_sizes_layouts_sets/51-1.png': { width: 1080, height: 1473 }, + 'product_sizes_layouts_sets/53.png': { width: 1080, height: 1636 }, + 'product_sizes_layouts_sets/54.png': { width: 1080, height: 1636 }, + 'product_sizes_layouts_sets/55-v2.png': { width: 1080, height: 1473 }, + 'product_sizes_layouts_sets/56-v3.png': { width: 1080, height: 1473 }, + 'product_sizes_layouts_sets/59.png': { width: 1080, height: 1404 }, + 'product_sizes_layouts_sets/60-v3.png': { width: 1080, height: 1157 }, + 'product_sizes_layouts_sets/61-v3.png': { width: 1080, height: 1157 }, + 'product_sizes_layouts_sets/63-v3.png': { width: 1080, height: 1915 }, + 'product_sizes_layouts_sets/64-v3.png': { width: 1080, height: 1915 }, + 'product_sizes_layouts_sets/65-v2.png': { width: 1080, height: 1915 }, + 'product_sizes_layouts_sets/66-v2.png': { width: 1080, height: 1915 }, + 'product_sizes_layouts_sets/70-v2.png': { width: 1080, height: 1504 }, + 'product_sizes_layouts_sets/71-v3.png': { width: 1080, height: 1504 }, + 'product_sizes_layouts_sets/72.png': { width: 1080, height: 1504 }, + 'product_sizes_layouts_sets/73.png': { width: 1080, height: 1504 }, + 'product_sizes_layouts_sets/77-1.png': { width: 1080, height: 1080 }, + 'product_sizes_layouts_sets/78-1.png': { width: 1080, height: 1080 }, + 'product_sizes_layouts_sets/original-16x12-bolt-ons-v2.png': { width: 1477, height: 1200 }, + 'product_sizes_layouts_sets/original-16x12-screw-ons-v2.png': { width: 1477, height: 1200 }, + }, + tension: { + 'product_sizes_layouts_sets/1.png': { width: 1080, height: 1755 }, + 'product_sizes_layouts_sets/10.png': { width: 1080, height: 1665 }, + 'product_sizes_layouts_sets/11.png': { width: 1080, height: 1665 }, + 'product_sizes_layouts_sets/12.png': { width: 1080, height: 1665 }, + 'product_sizes_layouts_sets/12x10-tb2-plastic.png': { width: 1080, height: 953 }, + 'product_sizes_layouts_sets/12x10-tb2-wood.png': { width: 1080, height: 953 }, + 'product_sizes_layouts_sets/12x12-tb2-plastic.png': { width: 1080, height: 1144 }, + 'product_sizes_layouts_sets/12x12-tb2-wood.png': { width: 1080, height: 1144 }, + 'product_sizes_layouts_sets/13.png': { width: 1080, height: 1395 }, + 'product_sizes_layouts_sets/14.png': { width: 1080, height: 1395 }, + 'product_sizes_layouts_sets/15.png': { width: 1080, height: 1395 }, + 'product_sizes_layouts_sets/16.png': { width: 1080, height: 1395 }, + 'product_sizes_layouts_sets/17.png': { width: 1080, height: 2093 }, + 'product_sizes_layouts_sets/18.png': { width: 1080, height: 2093 }, + 'product_sizes_layouts_sets/19.png': { width: 1080, height: 2093 }, + 'product_sizes_layouts_sets/2.png': { width: 1080, height: 1755 }, + 'product_sizes_layouts_sets/20.png': { width: 1080, height: 2093 }, + 'product_sizes_layouts_sets/21-2.png': { width: 1080, height: 1144 }, + 'product_sizes_layouts_sets/22-2.png': { width: 1080, height: 1144 }, + 'product_sizes_layouts_sets/23.png': { width: 1080, height: 953 }, + 'product_sizes_layouts_sets/24-2.png': { width: 1080, height: 953 }, + 'product_sizes_layouts_sets/25.png': { width: 1080, height: 1767 }, + 'product_sizes_layouts_sets/26.png': { width: 1080, height: 1767 }, + 'product_sizes_layouts_sets/27.png': { width: 1080, height: 1473 }, + 'product_sizes_layouts_sets/28.png': { width: 1080, height: 1473 }, + 'product_sizes_layouts_sets/3.png': { width: 1080, height: 1755 }, + 'product_sizes_layouts_sets/4.png': { width: 1080, height: 1755 }, + 'product_sizes_layouts_sets/5.png': { width: 1080, height: 1710 }, + 'product_sizes_layouts_sets/6.png': { width: 1080, height: 1710 }, + 'product_sizes_layouts_sets/7.png': { width: 1080, height: 1710 }, + 'product_sizes_layouts_sets/8.png': { width: 1080, height: 1710 }, + 'product_sizes_layouts_sets/8x10-tb2-plastic.png': { width: 1080, height: 1473 }, + 'product_sizes_layouts_sets/8x10-tb2-wood.png': { width: 1080, height: 1473 }, + 'product_sizes_layouts_sets/8x12-tb2-plastic.png': { width: 1080, height: 1767 }, + 'product_sizes_layouts_sets/8x12-tb2-wood.png': { width: 1080, height: 1767 }, + 'product_sizes_layouts_sets/9.png': { width: 1080, height: 1665 }, + }, +}; + +export const ANGLES: Record = { + kilter: [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70], + tension: [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70], +}; + +export const TENSION_KILTER_GRADES = [ + { difficulty_id: 10, difficulty_name: '4a/V0' }, + { difficulty_id: 11, difficulty_name: '4b/V0' }, + { difficulty_id: 12, difficulty_name: '4c/V0' }, + { difficulty_id: 13, difficulty_name: '5a/V1' }, + { difficulty_id: 14, difficulty_name: '5b/V1' }, + { difficulty_id: 15, difficulty_name: '5c/V2' }, + { difficulty_id: 16, difficulty_name: '6a/V3' }, + { difficulty_id: 17, difficulty_name: '6a+/V3' }, + { difficulty_id: 18, difficulty_name: '6b/V4' }, + { difficulty_id: 19, difficulty_name: '6b+/V4' }, + { difficulty_id: 20, difficulty_name: '6c/V5' }, + { difficulty_id: 21, difficulty_name: '6c+/V5' }, + { difficulty_id: 22, difficulty_name: '7a/V6' }, + { difficulty_id: 23, difficulty_name: '7a+/V7' }, + { difficulty_id: 24, difficulty_name: '7b/V8' }, + { difficulty_id: 25, difficulty_name: '7b+/V8' }, + { difficulty_id: 26, difficulty_name: '7c/V9' }, + { difficulty_id: 27, difficulty_name: '7c+/V10' }, + { difficulty_id: 28, difficulty_name: '8a/V11' }, + { difficulty_id: 29, difficulty_name: '8a+/V12' }, + { difficulty_id: 30, difficulty_name: '8b/V13' }, + { difficulty_id: 31, difficulty_name: '8b+/V14' }, + { difficulty_id: 32, difficulty_name: '8c/V15' }, + { difficulty_id: 33, difficulty_name: '8c+/V16' }, +]; diff --git a/packages/backend/src/data/index.ts b/packages/backend/src/data/index.ts new file mode 100644 index 00000000..3662b875 --- /dev/null +++ b/packages/backend/src/data/index.ts @@ -0,0 +1,57 @@ +/** + * Board configuration data module. + * This module contains all static board configuration data that was previously + * bundled with the web package. Moving it to the backend reduces client bundle size. + */ + +// Re-export types +export type { + BoardName, + Angle, + SetIdList, + ImageFileName, + HoldTuple, + HoldRenderData, + ImagesToHolds, + BoardDetails, + ProductSizeData, + LayoutData, + SetData, + SizeEdges, +} from './types.js'; + +// Re-export board data constants +export { + SUPPORTED_BOARDS, + BOARD_IMAGE_DIMENSIONS, + ANGLES, + TENSION_KILTER_GRADES, +} from './board-data.js'; + +// Re-export product sizes data and functions +export { + PRODUCT_SIZES, + LAYOUTS, + SETS, + IMAGE_FILENAMES, + HOLE_PLACEMENTS, + DEFAULT_SIZE_FOR_LAYOUT, + getSizeEdges, + getProductSize, + getLayout, + getAllLayouts, + getSizesForLayoutId, + getSizesForProduct, + getSetsForLayoutAndSize, + getDefaultSizeForLayout, + getImageFilename, + getHolePlacements, + getBoardDetails, + getBoardSelectorOptions, +} from './product-sizes-data.js'; + +// Re-export LED placements data and functions +export { + LED_PLACEMENTS, + getLedPlacements, +} from './led-placements-data.js'; diff --git a/packages/backend/src/data/led-placements-data.ts b/packages/backend/src/data/led-placements-data.ts new file mode 100644 index 00000000..ca2d290b --- /dev/null +++ b/packages/backend/src/data/led-placements-data.ts @@ -0,0 +1,74 @@ +/** + * ⚠️ DO NOT EDIT THIS FILE MANUALLY ⚠️ + * + * This file is auto-generated by running: + * npx tsx scripts/generate-size-edges.ts + * + * LED placement data for each board type. + * This maps placement IDs to physical LED positions in the board's LED chain. + * Only used by the bluetooth module for controlling board LEDs. + * + * Kept in a separate file to enable code-splitting - this data is only loaded + * when the user actually needs to control the board via bluetooth. + * + * Generated at: 2025-12-29T01:39:48.095Z + */ + +import type { BoardName } from './types.js'; + +// LED placements indexed by "layoutId-sizeId" key, value is Record +export const LED_PLACEMENTS: Record>> = { + kilter: { + '1-7': { 1073: 1, 1074: 3, 1075: 5, 1076: 7, 1077: 9, 1078: 11, 1079: 13, 1080: 15, 1081: 17, 1082: 19, 1083: 21, 1084: 23, 1085: 25, 1086: 27, 1087: 29, 1088: 31, 1089: 34, 1090: 36, 1091: 100, 1092: 101, 1093: 157, 1094: 158, 1095: 214, 1096: 215, 1097: 271, 1098: 272, 1099: 328, 1100: 329, 1101: 385, 1102: 386, 1103: 442, 1104: 443, 1105: 499, 1106: 500, 1107: 38, 1108: 98, 1109: 102, 1110: 155, 1111: 159, 1112: 212, 1113: 216, 1114: 269, 1115: 273, 1116: 326, 1117: 330, 1118: 383, 1119: 387, 1120: 440, 1121: 444, 1122: 497, 1123: 501, 1124: 40, 1125: 97, 1126: 104, 1127: 154, 1128: 161, 1129: 211, 1130: 218, 1131: 268, 1132: 275, 1133: 325, 1134: 332, 1135: 382, 1136: 389, 1137: 439, 1138: 446, 1139: 496, 1140: 503, 1141: 42, 1142: 95, 1143: 105, 1144: 152, 1145: 162, 1146: 209, 1147: 219, 1148: 266, 1149: 276, 1150: 323, 1151: 333, 1152: 380, 1153: 390, 1154: 437, 1155: 447, 1156: 494, 1157: 504, 1158: 44, 1159: 94, 1160: 107, 1161: 151, 1162: 164, 1163: 208, 1164: 221, 1165: 265, 1166: 278, 1167: 322, 1168: 335, 1169: 379, 1170: 392, 1171: 436, 1172: 449, 1173: 493, 1174: 506, 1175: 46, 1176: 92, 1177: 108, 1178: 149, 1179: 165, 1180: 206, 1181: 222, 1182: 263, 1183: 279, 1184: 320, 1185: 336, 1186: 377, 1187: 393, 1188: 434, 1189: 450, 1190: 491, 1191: 507, 1192: 48, 1193: 91, 1194: 110, 1195: 148, 1196: 167, 1197: 205, 1198: 224, 1199: 262, 1200: 281, 1201: 319, 1202: 338, 1203: 376, 1204: 395, 1205: 433, 1206: 452, 1207: 490, 1208: 509, 1209: 50, 1210: 89, 1211: 111, 1212: 146, 1213: 168, 1214: 203, 1215: 225, 1216: 260, 1217: 282, 1218: 317, 1219: 339, 1220: 374, 1221: 396, 1222: 431, 1223: 453, 1224: 488, 1225: 510, 1226: 52, 1227: 88, 1228: 113, 1229: 145, 1230: 170, 1231: 202, 1232: 227, 1233: 259, 1234: 284, 1235: 316, 1236: 341, 1237: 373, 1238: 398, 1239: 430, 1240: 455, 1241: 487, 1242: 512, 1243: 54, 1244: 86, 1245: 114, 1246: 143, 1247: 171, 1248: 200, 1249: 228, 1250: 257, 1251: 285, 1252: 314, 1253: 342, 1254: 371, 1255: 399, 1256: 428, 1257: 456, 1258: 485, 1259: 513, 1260: 56, 1261: 85, 1262: 116, 1263: 142, 1264: 173, 1265: 199, 1266: 230, 1267: 256, 1268: 287, 1269: 313, 1270: 344, 1271: 370, 1272: 401, 1273: 427, 1274: 458, 1275: 484, 1276: 515, 1277: 58, 1278: 83, 1279: 117, 1280: 140, 1281: 174, 1282: 197, 1283: 231, 1284: 254, 1285: 288, 1286: 311, 1287: 345, 1288: 368, 1289: 402, 1290: 425, 1291: 459, 1292: 482, 1293: 516, 1294: 60, 1295: 82, 1296: 119, 1297: 139, 1298: 176, 1299: 196, 1300: 233, 1301: 253, 1302: 290, 1303: 310, 1304: 347, 1305: 367, 1306: 404, 1307: 424, 1308: 461, 1309: 481, 1310: 518, 1311: 62, 1312: 80, 1313: 120, 1314: 137, 1315: 177, 1316: 194, 1317: 234, 1318: 251, 1319: 291, 1320: 308, 1321: 348, 1322: 365, 1323: 405, 1324: 422, 1325: 462, 1326: 479, 1327: 519, 1328: 64, 1329: 79, 1330: 122, 1331: 136, 1332: 179, 1333: 193, 1334: 236, 1335: 250, 1336: 293, 1337: 307, 1338: 350, 1339: 364, 1340: 407, 1341: 421, 1342: 464, 1343: 478, 1344: 521, 1345: 66, 1346: 77, 1347: 123, 1348: 134, 1349: 180, 1350: 191, 1351: 237, 1352: 248, 1353: 294, 1354: 305, 1355: 351, 1356: 362, 1357: 408, 1358: 419, 1359: 465, 1360: 476, 1361: 522, 1362: 67, 1363: 76, 1364: 124, 1365: 133, 1366: 181, 1367: 190, 1368: 238, 1369: 247, 1370: 295, 1371: 304, 1372: 352, 1373: 361, 1374: 409, 1375: 418, 1376: 466, 1377: 475, 1378: 523, 1379: 68, 1380: 75, 1381: 125, 1382: 132, 1383: 182, 1384: 189, 1385: 239, 1386: 246, 1387: 296, 1388: 303, 1389: 353, 1390: 360, 1391: 410, 1392: 417, 1393: 467, 1394: 474, 1395: 524, 1396: 69, 1397: 74, 1398: 126, 1399: 131, 1400: 183, 1401: 188, 1402: 240, 1403: 245, 1404: 297, 1405: 302, 1406: 354, 1407: 359, 1408: 411, 1409: 416, 1410: 468, 1411: 473, 1412: 525, 1413: 70, 1414: 73, 1415: 127, 1416: 130, 1417: 184, 1418: 187, 1419: 241, 1420: 244, 1421: 298, 1422: 301, 1423: 355, 1424: 358, 1425: 412, 1426: 415, 1427: 469, 1428: 472, 1429: 526, 1430: 71, 1431: 72, 1432: 128, 1433: 129, 1434: 185, 1435: 186, 1436: 242, 1437: 243, 1438: 299, 1439: 300, 1440: 356, 1441: 357, 1442: 413, 1443: 414, 1444: 470, 1445: 471, 1446: 527, 1447: 0, 1448: 2, 1449: 4, 1450: 6, 1451: 8, 1452: 10, 1453: 12, 1454: 14, 1455: 16, 1456: 18, 1457: 20, 1458: 22, 1459: 24, 1460: 26, 1461: 28, 1462: 30, 1463: 32, 1464: 33, 1465: 37, 1466: 99, 1467: 156, 1468: 213, 1469: 270, 1470: 327, 1471: 384, 1472: 441, 1473: 498, 1474: 39, 1475: 103, 1476: 160, 1477: 217, 1478: 274, 1479: 331, 1480: 388, 1481: 445, 1482: 502, 1483: 41, 1484: 96, 1485: 153, 1486: 210, 1487: 267, 1488: 324, 1489: 381, 1490: 438, 1491: 495, 1492: 43, 1493: 106, 1494: 163, 1495: 220, 1496: 277, 1497: 334, 1498: 391, 1499: 448, 1500: 505, 1501: 45, 1502: 93, 1503: 150, 1504: 207, 1505: 264, 1506: 321, 1507: 378, 1508: 435, 1509: 492, 1510: 47, 1511: 109, 1512: 166, 1513: 223, 1514: 280, 1515: 337, 1516: 394, 1517: 451, 1518: 508, 1519: 49, 1520: 90, 1521: 147, 1522: 204, 1523: 261, 1524: 318, 1525: 375, 1526: 432, 1527: 489, 1528: 51, 1529: 112, 1530: 169, 1531: 226, 1532: 283, 1533: 340, 1534: 397, 1535: 454, 1536: 511, 1537: 53, 1538: 87, 1539: 144, 1540: 201, 1541: 258, 1542: 315, 1543: 372, 1544: 429, 1545: 486, 1546: 55, 1547: 115, 1548: 172, 1549: 229, 1550: 286, 1551: 343, 1552: 400, 1553: 457, 1554: 514, 1555: 57, 1556: 84, 1557: 141, 1558: 198, 1559: 255, 1560: 312, 1561: 369, 1562: 426, 1563: 483, 1564: 59, 1565: 118, 1566: 175, 1567: 232, 1568: 289, 1569: 346, 1570: 403, 1571: 460, 1572: 517, 1573: 61, 1574: 81, 1575: 138, 1576: 195, 1577: 252, 1578: 309, 1579: 366, 1580: 423, 1581: 480, 1582: 63, 1583: 121, 1584: 178, 1585: 235, 1586: 292, 1587: 349, 1588: 406, 1589: 463, 1590: 520, 1591: 65, 1592: 78, 1593: 135, 1594: 192, 1595: 249, 1596: 306, 1597: 363, 1598: 420, 1599: 477 }, + '1-8': { 1076: 1, 1077: 3, 1078: 5, 1079: 7, 1080: 9, 1081: 11, 1082: 13, 1083: 15, 1084: 17, 1085: 19, 1086: 22, 1093: 24, 1094: 81, 1095: 82, 1096: 132, 1097: 133, 1098: 183, 1099: 184, 1100: 234, 1101: 235, 1102: 285, 1103: 286, 1110: 26, 1111: 80, 1112: 84, 1113: 131, 1114: 135, 1115: 182, 1116: 186, 1117: 233, 1118: 237, 1119: 284, 1120: 288, 1127: 28, 1128: 78, 1129: 85, 1130: 129, 1131: 136, 1132: 180, 1133: 187, 1134: 231, 1135: 238, 1136: 282, 1137: 289, 1144: 30, 1145: 77, 1146: 87, 1147: 128, 1148: 138, 1149: 179, 1150: 189, 1151: 230, 1152: 240, 1153: 281, 1154: 291, 1161: 32, 1162: 75, 1163: 88, 1164: 126, 1165: 139, 1166: 177, 1167: 190, 1168: 228, 1169: 241, 1170: 279, 1171: 292, 1178: 34, 1179: 74, 1180: 90, 1181: 125, 1182: 141, 1183: 176, 1184: 192, 1185: 227, 1186: 243, 1187: 278, 1188: 294, 1195: 36, 1196: 72, 1197: 91, 1198: 123, 1199: 142, 1200: 174, 1201: 193, 1202: 225, 1203: 244, 1204: 276, 1205: 295, 1212: 38, 1213: 71, 1214: 93, 1215: 122, 1216: 144, 1217: 173, 1218: 195, 1219: 224, 1220: 246, 1221: 275, 1222: 297, 1229: 40, 1230: 69, 1231: 94, 1232: 120, 1233: 145, 1234: 171, 1235: 196, 1236: 222, 1237: 247, 1238: 273, 1239: 298, 1246: 42, 1247: 68, 1248: 96, 1249: 119, 1250: 147, 1251: 170, 1252: 198, 1253: 221, 1254: 249, 1255: 272, 1256: 300, 1263: 44, 1264: 66, 1265: 97, 1266: 117, 1267: 148, 1268: 168, 1269: 199, 1270: 219, 1271: 250, 1272: 270, 1273: 301, 1280: 46, 1281: 65, 1282: 99, 1283: 116, 1284: 150, 1285: 167, 1286: 201, 1287: 218, 1288: 252, 1289: 269, 1290: 303, 1297: 48, 1298: 63, 1299: 100, 1300: 114, 1301: 151, 1302: 165, 1303: 202, 1304: 216, 1305: 253, 1306: 267, 1307: 304, 1314: 50, 1315: 62, 1316: 102, 1317: 113, 1318: 153, 1319: 164, 1320: 204, 1321: 215, 1322: 255, 1323: 266, 1324: 306, 1331: 52, 1332: 60, 1333: 103, 1334: 111, 1335: 154, 1336: 162, 1337: 205, 1338: 213, 1339: 256, 1340: 264, 1341: 307, 1348: 54, 1349: 59, 1350: 105, 1351: 110, 1352: 156, 1353: 161, 1354: 207, 1355: 212, 1356: 258, 1357: 263, 1358: 309, 1365: 55, 1366: 58, 1367: 106, 1368: 109, 1369: 157, 1370: 160, 1371: 208, 1372: 211, 1373: 259, 1374: 262, 1375: 310, 1382: 56, 1383: 57, 1384: 107, 1385: 108, 1386: 158, 1387: 159, 1388: 209, 1389: 210, 1390: 260, 1391: 261, 1392: 311, 1450: 0, 1451: 2, 1452: 4, 1453: 6, 1454: 8, 1455: 10, 1456: 12, 1457: 14, 1458: 16, 1459: 18, 1460: 20, 1461: 21, 1467: 25, 1468: 83, 1469: 134, 1470: 185, 1471: 236, 1472: 287, 1475: 27, 1476: 79, 1477: 130, 1478: 181, 1479: 232, 1480: 283, 1485: 29, 1486: 86, 1487: 137, 1488: 188, 1489: 239, 1490: 290, 1493: 31, 1494: 76, 1495: 127, 1496: 178, 1497: 229, 1498: 280, 1503: 33, 1504: 89, 1505: 140, 1506: 191, 1507: 242, 1508: 293, 1511: 35, 1512: 73, 1513: 124, 1514: 175, 1515: 226, 1516: 277, 1521: 37, 1522: 92, 1523: 143, 1524: 194, 1525: 245, 1526: 296, 1529: 39, 1530: 70, 1531: 121, 1532: 172, 1533: 223, 1534: 274, 1539: 41, 1540: 95, 1541: 146, 1542: 197, 1543: 248, 1544: 299, 1547: 43, 1548: 67, 1549: 118, 1550: 169, 1551: 220, 1552: 271, 1557: 45, 1558: 98, 1559: 149, 1560: 200, 1561: 251, 1562: 302, 1565: 47, 1566: 64, 1567: 115, 1568: 166, 1569: 217, 1570: 268, 1575: 49, 1576: 101, 1577: 152, 1578: 203, 1579: 254, 1580: 305, 1583: 51, 1584: 61, 1585: 112, 1586: 163, 1587: 214, 1588: 265, 1593: 53, 1594: 104, 1595: 155, 1596: 206, 1597: 257, 1598: 308 }, + '1-10': { 1073: 1, 1074: 3, 1075: 5, 1076: 7, 1077: 9, 1078: 11, 1079: 13, 1080: 15, 1081: 17, 1082: 19, 1083: 21, 1084: 23, 1085: 25, 1086: 27, 1087: 29, 1088: 31, 1089: 34, 1090: 36, 1091: 94, 1092: 95, 1093: 145, 1094: 146, 1095: 196, 1096: 197, 1097: 247, 1098: 248, 1099: 298, 1100: 299, 1101: 349, 1102: 350, 1103: 400, 1104: 401, 1105: 451, 1106: 452, 1107: 38, 1108: 92, 1109: 96, 1110: 143, 1111: 147, 1112: 194, 1113: 198, 1114: 245, 1115: 249, 1116: 296, 1117: 300, 1118: 347, 1119: 351, 1120: 398, 1121: 402, 1122: 449, 1123: 453, 1124: 40, 1125: 91, 1126: 98, 1127: 142, 1128: 149, 1129: 193, 1130: 200, 1131: 244, 1132: 251, 1133: 295, 1134: 302, 1135: 346, 1136: 353, 1137: 397, 1138: 404, 1139: 448, 1140: 455, 1141: 42, 1142: 89, 1143: 99, 1144: 140, 1145: 150, 1146: 191, 1147: 201, 1148: 242, 1149: 252, 1150: 293, 1151: 303, 1152: 344, 1153: 354, 1154: 395, 1155: 405, 1156: 446, 1157: 456, 1158: 44, 1159: 88, 1160: 101, 1161: 139, 1162: 152, 1163: 190, 1164: 203, 1165: 241, 1166: 254, 1167: 292, 1168: 305, 1169: 343, 1170: 356, 1171: 394, 1172: 407, 1173: 445, 1174: 458, 1175: 46, 1176: 86, 1177: 102, 1178: 137, 1179: 153, 1180: 188, 1181: 204, 1182: 239, 1183: 255, 1184: 290, 1185: 306, 1186: 341, 1187: 357, 1188: 392, 1189: 408, 1190: 443, 1191: 459, 1192: 48, 1193: 85, 1194: 104, 1195: 136, 1196: 155, 1197: 187, 1198: 206, 1199: 238, 1200: 257, 1201: 289, 1202: 308, 1203: 340, 1204: 359, 1205: 391, 1206: 410, 1207: 442, 1208: 461, 1209: 50, 1210: 83, 1211: 105, 1212: 134, 1213: 156, 1214: 185, 1215: 207, 1216: 236, 1217: 258, 1218: 287, 1219: 309, 1220: 338, 1221: 360, 1222: 389, 1223: 411, 1224: 440, 1225: 462, 1226: 52, 1227: 82, 1228: 107, 1229: 133, 1230: 158, 1231: 184, 1232: 209, 1233: 235, 1234: 260, 1235: 286, 1236: 311, 1237: 337, 1238: 362, 1239: 388, 1240: 413, 1241: 439, 1242: 464, 1243: 54, 1244: 80, 1245: 108, 1246: 131, 1247: 159, 1248: 182, 1249: 210, 1250: 233, 1251: 261, 1252: 284, 1253: 312, 1254: 335, 1255: 363, 1256: 386, 1257: 414, 1258: 437, 1259: 465, 1260: 56, 1261: 79, 1262: 110, 1263: 130, 1264: 161, 1265: 181, 1266: 212, 1267: 232, 1268: 263, 1269: 283, 1270: 314, 1271: 334, 1272: 365, 1273: 385, 1274: 416, 1275: 436, 1276: 467, 1277: 58, 1278: 77, 1279: 111, 1280: 128, 1281: 162, 1282: 179, 1283: 213, 1284: 230, 1285: 264, 1286: 281, 1287: 315, 1288: 332, 1289: 366, 1290: 383, 1291: 417, 1292: 434, 1293: 468, 1294: 60, 1295: 76, 1296: 113, 1297: 127, 1298: 164, 1299: 178, 1300: 215, 1301: 229, 1302: 266, 1303: 280, 1304: 317, 1305: 331, 1306: 368, 1307: 382, 1308: 419, 1309: 433, 1310: 470, 1311: 62, 1312: 74, 1313: 114, 1314: 125, 1315: 165, 1316: 176, 1317: 216, 1318: 227, 1319: 267, 1320: 278, 1321: 318, 1322: 329, 1323: 369, 1324: 380, 1325: 420, 1326: 431, 1327: 471, 1328: 64, 1329: 73, 1330: 116, 1331: 124, 1332: 167, 1333: 175, 1334: 218, 1335: 226, 1336: 269, 1337: 277, 1338: 320, 1339: 328, 1340: 371, 1341: 379, 1342: 422, 1343: 430, 1344: 473, 1345: 66, 1346: 71, 1347: 117, 1348: 122, 1349: 168, 1350: 173, 1351: 219, 1352: 224, 1353: 270, 1354: 275, 1355: 321, 1356: 326, 1357: 372, 1358: 377, 1359: 423, 1360: 428, 1361: 474, 1362: 67, 1363: 70, 1364: 118, 1365: 121, 1366: 169, 1367: 172, 1368: 220, 1369: 223, 1370: 271, 1371: 274, 1372: 322, 1373: 325, 1374: 373, 1375: 376, 1376: 424, 1377: 427, 1378: 475, 1379: 68, 1380: 69, 1381: 119, 1382: 120, 1383: 170, 1384: 171, 1385: 221, 1386: 222, 1387: 272, 1388: 273, 1389: 323, 1390: 324, 1391: 374, 1392: 375, 1393: 425, 1394: 426, 1395: 476, 1447: 0, 1448: 2, 1449: 4, 1450: 6, 1451: 8, 1452: 10, 1453: 12, 1454: 14, 1455: 16, 1456: 18, 1457: 20, 1458: 22, 1459: 24, 1460: 26, 1461: 28, 1462: 30, 1463: 32, 1464: 33, 1465: 37, 1466: 93, 1467: 144, 1468: 195, 1469: 246, 1470: 297, 1471: 348, 1472: 399, 1473: 450, 1474: 39, 1475: 97, 1476: 148, 1477: 199, 1478: 250, 1479: 301, 1480: 352, 1481: 403, 1482: 454, 1483: 41, 1484: 90, 1485: 141, 1486: 192, 1487: 243, 1488: 294, 1489: 345, 1490: 396, 1491: 447, 1492: 43, 1493: 100, 1494: 151, 1495: 202, 1496: 253, 1497: 304, 1498: 355, 1499: 406, 1500: 457, 1501: 45, 1502: 87, 1503: 138, 1504: 189, 1505: 240, 1506: 291, 1507: 342, 1508: 393, 1509: 444, 1510: 47, 1511: 103, 1512: 154, 1513: 205, 1514: 256, 1515: 307, 1516: 358, 1517: 409, 1518: 460, 1519: 49, 1520: 84, 1521: 135, 1522: 186, 1523: 237, 1524: 288, 1525: 339, 1526: 390, 1527: 441, 1528: 51, 1529: 106, 1530: 157, 1531: 208, 1532: 259, 1533: 310, 1534: 361, 1535: 412, 1536: 463, 1537: 53, 1538: 81, 1539: 132, 1540: 183, 1541: 234, 1542: 285, 1543: 336, 1544: 387, 1545: 438, 1546: 55, 1547: 109, 1548: 160, 1549: 211, 1550: 262, 1551: 313, 1552: 364, 1553: 415, 1554: 466, 1555: 57, 1556: 78, 1557: 129, 1558: 180, 1559: 231, 1560: 282, 1561: 333, 1562: 384, 1563: 435, 1564: 59, 1565: 112, 1566: 163, 1567: 214, 1568: 265, 1569: 316, 1570: 367, 1571: 418, 1572: 469, 1573: 61, 1574: 75, 1575: 126, 1576: 177, 1577: 228, 1578: 279, 1579: 330, 1580: 381, 1581: 432, 1582: 63, 1583: 115, 1584: 166, 1585: 217, 1586: 268, 1587: 319, 1588: 370, 1589: 421, 1590: 472, 1591: 65, 1592: 72, 1593: 123, 1594: 174, 1595: 225, 1596: 276, 1597: 327, 1598: 378, 1599: 429 }, + '1-14': { 1144: 0, 1145: 41, 1146: 42, 1147: 83, 1148: 84, 1149: 125, 1150: 126, 1151: 167, 1152: 168, 1153: 209, 1154: 210, 1161: 1, 1162: 39, 1163: 43, 1164: 81, 1165: 85, 1166: 123, 1167: 127, 1168: 165, 1169: 169, 1170: 207, 1171: 211, 1178: 3, 1179: 38, 1180: 45, 1181: 80, 1182: 87, 1183: 122, 1184: 129, 1185: 164, 1186: 171, 1187: 206, 1188: 212, 1195: 4, 1196: 36, 1197: 46, 1198: 78, 1199: 88, 1200: 120, 1201: 130, 1202: 162, 1203: 172, 1204: 204, 1205: 213, 1212: 6, 1213: 35, 1214: 48, 1215: 77, 1216: 90, 1217: 119, 1218: 132, 1219: 161, 1220: 174, 1221: 203, 1222: 214, 1229: 7, 1230: 33, 1231: 49, 1232: 75, 1233: 91, 1234: 117, 1235: 133, 1236: 159, 1237: 175, 1238: 201, 1239: 215, 1246: 9, 1247: 32, 1248: 51, 1249: 74, 1250: 93, 1251: 116, 1252: 135, 1253: 158, 1254: 177, 1255: 200, 1256: 216, 1263: 10, 1264: 30, 1265: 52, 1266: 72, 1267: 94, 1268: 114, 1269: 136, 1270: 156, 1271: 178, 1272: 198, 1273: 217, 1280: 12, 1281: 29, 1282: 54, 1283: 71, 1284: 96, 1285: 113, 1286: 138, 1287: 155, 1288: 180, 1289: 197, 1290: 218, 1297: 13, 1298: 27, 1299: 55, 1300: 69, 1301: 97, 1302: 111, 1303: 139, 1304: 153, 1305: 181, 1306: 195, 1307: 219, 1314: 15, 1315: 26, 1316: 57, 1317: 68, 1318: 99, 1319: 110, 1320: 141, 1321: 152, 1322: 183, 1323: 194, 1324: 220, 1331: 16, 1332: 24, 1333: 58, 1334: 66, 1335: 100, 1336: 108, 1337: 142, 1338: 150, 1339: 184, 1340: 192, 1341: 221, 1348: 18, 1349: 23, 1350: 60, 1351: 65, 1352: 102, 1353: 107, 1354: 144, 1355: 149, 1356: 186, 1357: 191, 1358: 222, 1365: 19, 1366: 22, 1367: 61, 1368: 64, 1369: 103, 1370: 106, 1371: 145, 1372: 148, 1373: 187, 1374: 190, 1375: 223, 1382: 20, 1383: 21, 1384: 62, 1385: 63, 1386: 104, 1387: 105, 1388: 146, 1389: 147, 1390: 188, 1391: 189, 1392: 224, 1494: 40, 1495: 82, 1496: 124, 1497: 166, 1498: 208, 1503: 2, 1504: 44, 1505: 86, 1506: 128, 1507: 170, 1512: 37, 1513: 79, 1514: 121, 1515: 163, 1516: 205, 1521: 5, 1522: 47, 1523: 89, 1524: 131, 1525: 173, 1530: 34, 1531: 76, 1532: 118, 1533: 160, 1534: 202, 1539: 8, 1540: 50, 1541: 92, 1542: 134, 1543: 176, 1548: 31, 1549: 73, 1550: 115, 1551: 157, 1552: 199, 1557: 11, 1558: 53, 1559: 95, 1560: 137, 1561: 179, 1566: 28, 1567: 70, 1568: 112, 1569: 154, 1570: 196, 1575: 14, 1576: 56, 1577: 98, 1578: 140, 1579: 182, 1584: 25, 1585: 67, 1586: 109, 1587: 151, 1588: 193, 1593: 17, 1594: 59, 1595: 101, 1596: 143, 1597: 185 }, + '1-27': { 1090: 0, 1091: 58, 1092: 59, 1093: 109, 1094: 110, 1095: 160, 1096: 161, 1097: 211, 1098: 212, 1099: 262, 1100: 263, 1101: 313, 1102: 314, 1103: 364, 1104: 365, 1105: 415, 1106: 416, 1107: 2, 1108: 56, 1109: 60, 1110: 107, 1111: 111, 1112: 158, 1113: 162, 1114: 209, 1115: 213, 1116: 260, 1117: 264, 1118: 311, 1119: 315, 1120: 362, 1121: 366, 1122: 413, 1123: 417, 1124: 4, 1125: 55, 1126: 62, 1127: 106, 1128: 113, 1129: 157, 1130: 164, 1131: 208, 1132: 215, 1133: 259, 1134: 266, 1135: 310, 1136: 317, 1137: 361, 1138: 368, 1139: 412, 1140: 419, 1141: 6, 1142: 53, 1143: 63, 1144: 104, 1145: 114, 1146: 155, 1147: 165, 1148: 206, 1149: 216, 1150: 257, 1151: 267, 1152: 308, 1153: 318, 1154: 359, 1155: 369, 1156: 410, 1157: 420, 1158: 8, 1159: 52, 1160: 65, 1161: 103, 1162: 116, 1163: 154, 1164: 167, 1165: 205, 1166: 218, 1167: 256, 1168: 269, 1169: 307, 1170: 320, 1171: 358, 1172: 371, 1173: 409, 1174: 422, 1175: 10, 1176: 50, 1177: 66, 1178: 101, 1179: 117, 1180: 152, 1181: 168, 1182: 203, 1183: 219, 1184: 254, 1185: 270, 1186: 305, 1187: 321, 1188: 356, 1189: 372, 1190: 407, 1191: 423, 1192: 12, 1193: 49, 1194: 68, 1195: 100, 1196: 119, 1197: 151, 1198: 170, 1199: 202, 1200: 221, 1201: 253, 1202: 272, 1203: 304, 1204: 323, 1205: 355, 1206: 374, 1207: 406, 1208: 425, 1209: 14, 1210: 47, 1211: 69, 1212: 98, 1213: 120, 1214: 149, 1215: 171, 1216: 200, 1217: 222, 1218: 251, 1219: 273, 1220: 302, 1221: 324, 1222: 353, 1223: 375, 1224: 404, 1225: 426, 1226: 16, 1227: 46, 1228: 71, 1229: 97, 1230: 122, 1231: 148, 1232: 173, 1233: 199, 1234: 224, 1235: 250, 1236: 275, 1237: 301, 1238: 326, 1239: 352, 1240: 377, 1241: 403, 1242: 428, 1243: 18, 1244: 44, 1245: 72, 1246: 95, 1247: 123, 1248: 146, 1249: 174, 1250: 197, 1251: 225, 1252: 248, 1253: 276, 1254: 299, 1255: 327, 1256: 350, 1257: 378, 1258: 401, 1259: 429, 1260: 20, 1261: 43, 1262: 74, 1263: 94, 1264: 125, 1265: 145, 1266: 176, 1267: 196, 1268: 227, 1269: 247, 1270: 278, 1271: 298, 1272: 329, 1273: 349, 1274: 380, 1275: 400, 1276: 431, 1277: 22, 1278: 41, 1279: 75, 1280: 92, 1281: 126, 1282: 143, 1283: 177, 1284: 194, 1285: 228, 1286: 245, 1287: 279, 1288: 296, 1289: 330, 1290: 347, 1291: 381, 1292: 398, 1293: 432, 1294: 24, 1295: 40, 1296: 77, 1297: 91, 1298: 128, 1299: 142, 1300: 179, 1301: 193, 1302: 230, 1303: 244, 1304: 281, 1305: 295, 1306: 332, 1307: 346, 1308: 383, 1309: 397, 1310: 434, 1311: 26, 1312: 38, 1313: 78, 1314: 89, 1315: 129, 1316: 140, 1317: 180, 1318: 191, 1319: 231, 1320: 242, 1321: 282, 1322: 293, 1323: 333, 1324: 344, 1325: 384, 1326: 395, 1327: 435, 1328: 28, 1329: 37, 1330: 80, 1331: 88, 1332: 131, 1333: 139, 1334: 182, 1335: 190, 1336: 233, 1337: 241, 1338: 284, 1339: 292, 1340: 335, 1341: 343, 1342: 386, 1343: 394, 1344: 437, 1345: 30, 1346: 35, 1347: 81, 1348: 86, 1349: 132, 1350: 137, 1351: 183, 1352: 188, 1353: 234, 1354: 239, 1355: 285, 1356: 290, 1357: 336, 1358: 341, 1359: 387, 1360: 392, 1361: 438, 1362: 31, 1363: 34, 1364: 82, 1365: 85, 1366: 133, 1367: 136, 1368: 184, 1369: 187, 1370: 235, 1371: 238, 1372: 286, 1373: 289, 1374: 337, 1375: 340, 1376: 388, 1377: 391, 1378: 439, 1379: 32, 1380: 33, 1381: 83, 1382: 84, 1383: 134, 1384: 135, 1385: 185, 1386: 186, 1387: 236, 1388: 237, 1389: 287, 1390: 288, 1391: 338, 1392: 339, 1393: 389, 1394: 390, 1395: 440, 1465: 1, 1466: 57, 1467: 108, 1468: 159, 1469: 210, 1470: 261, 1471: 312, 1472: 363, 1473: 414, 1474: 3, 1475: 61, 1476: 112, 1477: 163, 1478: 214, 1479: 265, 1480: 316, 1481: 367, 1482: 418, 1483: 5, 1484: 54, 1485: 105, 1486: 156, 1487: 207, 1488: 258, 1489: 309, 1490: 360, 1491: 411, 1492: 7, 1493: 64, 1494: 115, 1495: 166, 1496: 217, 1497: 268, 1498: 319, 1499: 370, 1500: 421, 1501: 9, 1502: 51, 1503: 102, 1504: 153, 1505: 204, 1506: 255, 1507: 306, 1508: 357, 1509: 408, 1510: 11, 1511: 67, 1512: 118, 1513: 169, 1514: 220, 1515: 271, 1516: 322, 1517: 373, 1518: 424, 1519: 13, 1520: 48, 1521: 99, 1522: 150, 1523: 201, 1524: 252, 1525: 303, 1526: 354, 1527: 405, 1528: 15, 1529: 70, 1530: 121, 1531: 172, 1532: 223, 1533: 274, 1534: 325, 1535: 376, 1536: 427, 1537: 17, 1538: 45, 1539: 96, 1540: 147, 1541: 198, 1542: 249, 1543: 300, 1544: 351, 1545: 402, 1546: 19, 1547: 73, 1548: 124, 1549: 175, 1550: 226, 1551: 277, 1552: 328, 1553: 379, 1554: 430, 1555: 21, 1556: 42, 1557: 93, 1558: 144, 1559: 195, 1560: 246, 1561: 297, 1562: 348, 1563: 399, 1564: 23, 1565: 76, 1566: 127, 1567: 178, 1568: 229, 1569: 280, 1570: 331, 1571: 382, 1572: 433, 1573: 25, 1574: 39, 1575: 90, 1576: 141, 1577: 192, 1578: 243, 1579: 294, 1580: 345, 1581: 396, 1582: 27, 1583: 79, 1584: 130, 1585: 181, 1586: 232, 1587: 283, 1588: 334, 1589: 385, 1590: 436, 1591: 29, 1592: 36, 1593: 87, 1594: 138, 1595: 189, 1596: 240, 1597: 291, 1598: 342, 1599: 393 }, + '1-28': { 1073: 7, 1074: 9, 1075: 11, 1076: 13, 1077: 15, 1078: 17, 1079: 19, 1080: 21, 1081: 23, 1082: 25, 1083: 27, 1084: 29, 1085: 31, 1086: 33, 1087: 35, 1088: 37, 1089: 39, 1090: 156, 1091: 157, 1092: 207, 1093: 208, 1094: 258, 1095: 259, 1096: 309, 1097: 310, 1098: 360, 1099: 361, 1100: 411, 1101: 412, 1102: 462, 1103: 463, 1104: 513, 1105: 514, 1106: 564, 1107: 155, 1108: 159, 1109: 206, 1110: 210, 1111: 257, 1112: 261, 1113: 308, 1114: 312, 1115: 359, 1116: 363, 1117: 410, 1118: 414, 1119: 461, 1120: 465, 1121: 512, 1122: 516, 1123: 563, 1124: 153, 1125: 160, 1126: 204, 1127: 211, 1128: 255, 1129: 262, 1130: 306, 1131: 313, 1132: 357, 1133: 364, 1134: 408, 1135: 415, 1136: 459, 1137: 466, 1138: 510, 1139: 517, 1140: 561, 1141: 152, 1142: 162, 1143: 203, 1144: 213, 1145: 254, 1146: 264, 1147: 305, 1148: 315, 1149: 356, 1150: 366, 1151: 407, 1152: 417, 1153: 458, 1154: 468, 1155: 509, 1156: 519, 1157: 560, 1158: 150, 1159: 163, 1160: 201, 1161: 214, 1162: 252, 1163: 265, 1164: 303, 1165: 316, 1166: 354, 1167: 367, 1168: 405, 1169: 418, 1170: 456, 1171: 469, 1172: 507, 1173: 520, 1174: 558, 1175: 149, 1176: 165, 1177: 200, 1178: 216, 1179: 251, 1180: 267, 1181: 302, 1182: 318, 1183: 353, 1184: 369, 1185: 404, 1186: 420, 1187: 455, 1188: 471, 1189: 506, 1190: 522, 1191: 557, 1192: 147, 1193: 166, 1194: 198, 1195: 217, 1196: 249, 1197: 268, 1198: 300, 1199: 319, 1200: 351, 1201: 370, 1202: 402, 1203: 421, 1204: 453, 1205: 472, 1206: 504, 1207: 523, 1208: 555, 1209: 146, 1210: 168, 1211: 197, 1212: 219, 1213: 248, 1214: 270, 1215: 299, 1216: 321, 1217: 350, 1218: 372, 1219: 401, 1220: 423, 1221: 452, 1222: 474, 1223: 503, 1224: 525, 1225: 554, 1226: 144, 1227: 169, 1228: 195, 1229: 220, 1230: 246, 1231: 271, 1232: 297, 1233: 322, 1234: 348, 1235: 373, 1236: 399, 1237: 424, 1238: 450, 1239: 475, 1240: 501, 1241: 526, 1242: 552, 1243: 143, 1244: 171, 1245: 194, 1246: 222, 1247: 245, 1248: 273, 1249: 296, 1250: 324, 1251: 347, 1252: 375, 1253: 398, 1254: 426, 1255: 449, 1256: 477, 1257: 500, 1258: 528, 1259: 551, 1260: 141, 1261: 172, 1262: 192, 1263: 223, 1264: 243, 1265: 274, 1266: 294, 1267: 325, 1268: 345, 1269: 376, 1270: 396, 1271: 427, 1272: 447, 1273: 478, 1274: 498, 1275: 529, 1276: 549, 1277: 140, 1278: 174, 1279: 191, 1280: 225, 1281: 242, 1282: 276, 1283: 293, 1284: 327, 1285: 344, 1286: 378, 1287: 395, 1288: 429, 1289: 446, 1290: 480, 1291: 497, 1292: 531, 1293: 548, 1294: 138, 1295: 175, 1296: 189, 1297: 226, 1298: 240, 1299: 277, 1300: 291, 1301: 328, 1302: 342, 1303: 379, 1304: 393, 1305: 430, 1306: 444, 1307: 481, 1308: 495, 1309: 532, 1310: 546, 1311: 137, 1312: 177, 1313: 188, 1314: 228, 1315: 239, 1316: 279, 1317: 290, 1318: 330, 1319: 341, 1320: 381, 1321: 392, 1322: 432, 1323: 443, 1324: 483, 1325: 494, 1326: 534, 1327: 545, 1328: 135, 1329: 178, 1330: 186, 1331: 229, 1332: 237, 1333: 280, 1334: 288, 1335: 331, 1336: 339, 1337: 382, 1338: 390, 1339: 433, 1340: 441, 1341: 484, 1342: 492, 1343: 535, 1344: 543, 1345: 134, 1346: 180, 1347: 185, 1348: 231, 1349: 236, 1350: 282, 1351: 287, 1352: 333, 1353: 338, 1354: 384, 1355: 389, 1356: 435, 1357: 440, 1358: 486, 1359: 491, 1360: 537, 1361: 542, 1362: 133, 1363: 181, 1364: 184, 1365: 232, 1366: 235, 1367: 283, 1368: 286, 1369: 334, 1370: 337, 1371: 385, 1372: 388, 1373: 436, 1374: 439, 1375: 487, 1376: 490, 1377: 538, 1378: 541, 1379: 132, 1380: 182, 1381: 183, 1382: 233, 1383: 234, 1384: 284, 1385: 285, 1386: 335, 1387: 336, 1388: 386, 1389: 387, 1390: 437, 1391: 438, 1392: 488, 1393: 489, 1394: 539, 1395: 540, 1447: 6, 1448: 8, 1449: 10, 1450: 12, 1451: 14, 1452: 16, 1453: 18, 1454: 20, 1455: 22, 1456: 24, 1457: 26, 1458: 28, 1459: 30, 1460: 32, 1461: 34, 1462: 36, 1463: 38, 1464: 40, 1465: 107, 1466: 158, 1467: 209, 1468: 260, 1469: 311, 1470: 362, 1471: 413, 1472: 464, 1473: 515, 1474: 154, 1475: 205, 1476: 256, 1477: 307, 1478: 358, 1479: 409, 1480: 460, 1481: 511, 1482: 562, 1483: 110, 1484: 161, 1485: 212, 1486: 263, 1487: 314, 1488: 365, 1489: 416, 1490: 467, 1491: 518, 1492: 151, 1493: 202, 1494: 253, 1495: 304, 1496: 355, 1497: 406, 1498: 457, 1499: 508, 1500: 559, 1501: 113, 1502: 164, 1503: 215, 1504: 266, 1505: 317, 1506: 368, 1507: 419, 1508: 470, 1509: 521, 1510: 148, 1511: 199, 1512: 250, 1513: 301, 1514: 352, 1515: 403, 1516: 454, 1517: 505, 1518: 556, 1519: 116, 1520: 167, 1521: 218, 1522: 269, 1523: 320, 1524: 371, 1525: 422, 1526: 473, 1527: 524, 1528: 145, 1529: 196, 1530: 247, 1531: 298, 1532: 349, 1533: 400, 1534: 451, 1535: 502, 1536: 553, 1537: 119, 1538: 170, 1539: 221, 1540: 272, 1541: 323, 1542: 374, 1543: 425, 1544: 476, 1545: 527, 1546: 142, 1547: 193, 1548: 244, 1549: 295, 1550: 346, 1551: 397, 1552: 448, 1553: 499, 1554: 550, 1555: 122, 1556: 173, 1557: 224, 1558: 275, 1559: 326, 1560: 377, 1561: 428, 1562: 479, 1563: 530, 1564: 139, 1565: 190, 1566: 241, 1567: 292, 1568: 343, 1569: 394, 1570: 445, 1571: 496, 1572: 547, 1573: 125, 1574: 176, 1575: 227, 1576: 278, 1577: 329, 1578: 380, 1579: 431, 1580: 482, 1581: 533, 1582: 136, 1583: 187, 1584: 238, 1585: 289, 1586: 340, 1587: 391, 1588: 442, 1589: 493, 1590: 544, 1591: 128, 1592: 179, 1593: 230, 1594: 281, 1595: 332, 1596: 383, 1597: 434, 1598: 485, 1599: 536, 4681: 41, 4682: 106, 4683: 108, 4684: 109, 4685: 111, 4686: 112, 4687: 114, 4688: 115, 4689: 117, 4690: 118, 4691: 120, 4692: 121, 4693: 123, 4694: 124, 4695: 126, 4696: 127, 4697: 129, 4698: 130, 4699: 131, 4700: 43, 4701: 105, 4702: 104, 4703: 102, 4704: 101, 4705: 99, 4706: 98, 4707: 96, 4708: 95, 4709: 93, 4710: 92, 4711: 90, 4712: 89, 4713: 87, 4714: 86, 4715: 84, 4716: 83, 4717: 82, 4718: 81, 4719: 46, 4720: 48, 4721: 50, 4722: 52, 4723: 54, 4724: 56, 4725: 58, 4726: 60, 4727: 62, 4728: 64, 4729: 66, 4730: 68, 4731: 70, 4732: 72, 4733: 74, 4734: 76, 4735: 78, 4736: 79, 4737: 80, 4738: 5, 4739: 565, 4740: 567, 4741: 568, 4742: 570, 4743: 571, 4744: 573, 4745: 574, 4746: 576, 4747: 577, 4748: 579, 4749: 580, 4750: 582, 4751: 583, 4752: 585, 4753: 586, 4754: 588, 4755: 589, 4756: 590, 4757: 3, 4758: 615, 4759: 614, 4760: 612, 4761: 611, 4762: 609, 4763: 608, 4764: 606, 4765: 605, 4766: 603, 4767: 602, 4768: 600, 4769: 599, 4770: 597, 4771: 596, 4772: 594, 4773: 593, 4774: 592, 4775: 591, 4776: 1, 4777: 616, 4778: 618, 4779: 619, 4780: 621, 4781: 622, 4782: 624, 4783: 625, 4784: 627, 4785: 628, 4786: 630, 4787: 631, 4788: 633, 4789: 634, 4790: 636, 4791: 637, 4792: 639, 4793: 640, 4794: 641, 4795: 42, 4796: 44, 4797: 45, 4798: 4, 4799: 2, 4800: 0, 4801: 49, 4802: 51, 4803: 103, 4804: 53, 4805: 55, 4806: 100, 4807: 57, 4808: 59, 4809: 97, 4810: 61, 4811: 63, 4812: 94, 4813: 65, 4814: 67, 4815: 91, 4816: 69, 4817: 71, 4818: 88, 4819: 73, 4820: 75, 4821: 85, 4822: 77, 4823: 566, 4824: 617, 4825: 613, 4826: 569, 4827: 620, 4828: 610, 4829: 572, 4830: 623, 4831: 607, 4832: 575, 4833: 626, 4834: 604, 4835: 578, 4836: 629, 4837: 601, 4838: 581, 4839: 632, 4840: 598, 4841: 584, 4842: 635, 4843: 595, 4844: 587, 4845: 638 }, + '2-11': { 1600: 0, 1601: 1, 1602: 2, 1603: 3, 1604: 4, 1605: 5, 1606: 6, 1607: 7, 1608: 8, 1609: 9, 1610: 10, 1611: 11, 1612: 12, 1613: 13, 1614: 14, 1615: 15, 1616: 16, 1617: 17, 1618: 18, 1619: 19, 1620: 20, 1621: 21, 1622: 22, 1623: 23, 1624: 24, 1625: 25, 1626: 26, 1627: 27, 1628: 28, 1629: 29, 1630: 30, 1631: 31, 1632: 32, 1633: 33, 1634: 34, 1635: 35, 1636: 36, 1637: 37, 1638: 38, 1639: 39, 1640: 40, 1641: 41, 1642: 42, 1643: 43, 1644: 44, 1645: 45, 1646: 46, 1647: 47, 1648: 48, 1649: 49, 1650: 50, 1651: 51, 1652: 52, 1653: 53, 1654: 54, 1655: 55, 1656: 56, 1657: 57, 1658: 58, 1659: 59, 1660: 60, 1661: 61, 1662: 62, 1663: 63, 1664: 64, 1665: 65, 1666: 66, 1667: 67, 1668: 68, 1669: 69, 1670: 70, 1671: 71, 1672: 72, 1673: 73, 1674: 74, 1675: 75, 1676: 76, 1677: 77, 1678: 78, 1679: 79, 1680: 80, 1681: 81, 1682: 82, 1683: 83, 1684: 84, 1685: 85, 1686: 86, 1687: 87, 1688: 88, 1689: 89, 1690: 90, 1691: 91, 1692: 92, 1693: 93, 1694: 94, 1695: 95, 1696: 96, 1697: 97, 1698: 98, 1699: 99, 1700: 100, 1701: 101, 1702: 102, 1703: 103, 1704: 104, 1705: 105, 1706: 106, 1707: 107, 1708: 108, 1709: 109, 1710: 110, 1711: 111, 1712: 112, 1713: 113, 1714: 114, 1715: 115, 1716: 116, 1717: 117, 1718: 118, 1719: 119, 1720: 120, 1721: 121, 1722: 122, 1723: 123, 1724: 124, 1725: 125, 1726: 126, 1727: 127, 1728: 128, 1729: 129, 1730: 130, 1731: 131, 1732: 132, 1733: 133, 1734: 134, 1735: 135, 1736: 136, 1737: 137, 1738: 138, 1739: 139, 1740: 140, 1741: 141, 1742: 142, 1743: 143, 1744: 144, 1745: 145, 1746: 146, 1747: 147, 1748: 148, 1749: 149, 1750: 150, 1751: 151, 1752: 152, 1753: 153, 1754: 154, 1755: 155, 1756: 156, 1757: 157, 1758: 158, 1759: 159, 1760: 160, 1761: 161, 1762: 162, 1763: 163, 1764: 164, 1765: 165, 1766: 166, 1767: 167, 1768: 168, 1769: 169, 1770: 170, 1771: 171, 1772: 172, 1773: 173, 1774: 174, 1775: 175, 1776: 176, 1777: 177, 1778: 178, 1779: 179, 1780: 180, 1781: 181, 1782: 182, 1783: 183, 1784: 184, 1785: 185, 1786: 186, 1787: 187, 1788: 188, 1789: 189, 1790: 190, 1791: 191, 1792: 192, 1793: 193, 1794: 194, 1795: 195, 1796: 196, 1797: 197, 1798: 198, 1799: 199, 1800: 200, 1801: 201, 1802: 202, 1803: 203, 1804: 204, 1805: 205, 1806: 206, 1807: 207, 1808: 208, 1809: 209, 1810: 210, 1811: 211, 1812: 212, 1813: 213, 1814: 214, 1815: 215, 1816: 216, 1817: 217, 1818: 218, 1819: 219, 1820: 220, 1821: 221, 1822: 222, 1823: 223, 1824: 224, 1825: 225, 1826: 226, 1827: 227, 1828: 228, 1829: 229, 1830: 230, 1831: 231, 1832: 232, 1833: 233, 1834: 234, 1835: 235, 1836: 236, 1837: 237, 1838: 238, 1839: 239, 1840: 240, 1841: 241, 1842: 242, 1843: 243, 1844: 244, 1845: 245, 1846: 246, 1847: 247, 1848: 248, 1849: 249, 1850: 250, 1851: 251, 1852: 252, 1853: 253, 1854: 254, 1855: 255, 1856: 256, 1857: 257, 1858: 258, 1859: 259, 1860: 260, 1861: 261, 1862: 262, 1863: 263, 1864: 264, 1865: 265, 1866: 266, 1867: 267, 1868: 268, 1869: 269, 1870: 270, 1871: 271, 1872: 272, 1873: 273, 1874: 274, 1875: 275, 1876: 276, 1877: 277, 1878: 278, 1879: 279, 1880: 280, 1881: 281, 1882: 282, 1883: 283, 1884: 284, 1885: 285, 1886: 286, 1887: 287, 1888: 288, 1889: 289, 1890: 290, 1891: 291, 1892: 292, 1893: 293, 1894: 294, 1895: 295, 1896: 296, 1897: 297, 1898: 298, 1899: 299, 1900: 300, 1901: 301, 1902: 302, 1903: 303, 1904: 304, 1905: 305, 1906: 306, 1907: 307, 1908: 308, 1909: 309, 1910: 310, 1911: 311, 1912: 312, 1913: 313, 1914: 314, 1915: 315, 1916: 316, 1917: 317, 1918: 318, 1919: 319, 1920: 320, 1921: 321, 1922: 322, 1923: 323, 1924: 324, 1925: 325, 1926: 326, 1927: 327, 1928: 328, 1929: 329, 1930: 330, 1931: 331, 1932: 332, 1933: 333, 1934: 334, 1935: 335, 1936: 336, 1937: 337, 1938: 338, 1939: 339, 1940: 340, 1941: 341, 1942: 342, 1943: 343, 1944: 344, 1945: 345, 1946: 346, 1947: 347, 1948: 348, 1949: 349, 1950: 350, 1951: 351, 1952: 352, 1953: 353, 1954: 354, 1955: 355, 1956: 356, 1957: 357, 1958: 358, 1959: 359, 1960: 360, 1961: 361, 1962: 362, 1963: 363, 1964: 364, 1965: 365, 1966: 366, 1967: 367, 1968: 368, 1969: 369, 1970: 370, 1971: 371, 1972: 372, 1973: 373, 1974: 374, 1975: 375, 1976: 376, 1977: 377, 1978: 378, 1979: 379, 1980: 380, 1981: 381, 1982: 382, 1983: 383, 1984: 384, 1985: 385, 1986: 386, 1987: 387, 1988: 388, 1989: 389, 1990: 390, 1991: 391, 1992: 392, 1993: 393, 1994: 394, 1995: 395, 1996: 396, 1997: 397, 1998: 398, 1999: 399, 2000: 400, 2001: 401, 2002: 402, 2003: 403, 2004: 404, 2005: 405, 2006: 406, 2007: 407, 2008: 408, 2009: 409, 2010: 410, 2011: 411, 2012: 412, 2013: 413, 2014: 414, 2015: 415, 2016: 416, 2017: 417, 2018: 418, 2019: 419, 2020: 420, 2021: 421, 2022: 422, 2023: 423, 2024: 424, 2025: 425, 2026: 426, 2027: 427, 2028: 428, 2029: 429, 2030: 430, 2031: 431, 2032: 432, 2033: 433, 2034: 434, 2035: 435, 2036: 436, 2037: 437, 2038: 438, 2039: 439, 2040: 440, 2041: 441, 2042: 442, 2043: 443, 2044: 444, 2045: 445, 2046: 446, 2047: 447, 2048: 448, 2049: 449, 2050: 450, 2051: 451, 2052: 452, 2053: 453, 2054: 454, 2055: 455, 2056: 456, 2057: 457, 2058: 458, 2059: 459, 2060: 460, 2061: 461, 2062: 462, 2063: 463, 2064: 464, 2065: 465, 2066: 466, 2067: 467, 2068: 468, 2069: 469, 2070: 470, 2071: 471 }, + '3-12': { 2072: 0, 2073: 1, 2074: 2, 2075: 3, 2076: 4 }, + '4-13': { 2077: 0, 2078: 1, 2079: 2, 2080: 3, 2081: 4, 2082: 5, 2083: 6, 2084: 7, 2085: 8, 2086: 9, 2087: 10, 2088: 11, 2089: 12, 2090: 13, 2091: 14, 2092: 15, 2093: 16, 2094: 17, 2095: 18, 2096: 19, 2097: 20, 2098: 21, 2099: 22, 2100: 23, 2101: 24, 2102: 25, 2103: 26, 2104: 27, 2105: 28, 2106: 30, 2107: 31, 2108: 32, 2109: 33, 2110: 34, 2111: 35, 2112: 36, 2113: 37, 2114: 38, 2115: 39, 2116: 40, 2117: 41, 2118: 42, 2119: 43, 2120: 44, 2121: 45, 2122: 46, 2123: 47, 2124: 48, 2125: 49, 2126: 50, 2127: 51, 2128: 52, 2129: 53, 2130: 54, 2131: 55, 2132: 56, 2133: 57, 2134: 58, 2135: 59, 2136: 60, 2137: 61, 2138: 62, 2139: 63, 2140: 64, 2141: 65, 2142: 66, 2143: 67, 2144: 68, 2145: 69, 2146: 70, 2147: 71, 2148: 72, 2149: 73, 2150: 74, 2151: 75, 2152: 76, 2153: 77, 2154: 78, 2155: 79, 2156: 80, 2157: 81, 2158: 82, 2159: 83, 2160: 84, 2161: 85, 2162: 86, 2163: 87, 2164: 88, 2165: 89, 2166: 90, 2167: 91, 2168: 92, 2169: 93, 2170: 94, 2171: 95, 2172: 96, 2173: 97, 2174: 98, 2175: 99, 2176: 100, 2177: 101, 2178: 102, 2179: 103, 2180: 104, 2181: 105, 2182: 106, 2183: 107, 2184: 108, 2185: 109, 2186: 110, 2187: 111, 2188: 112, 2189: 113, 2190: 114, 2191: 115, 2192: 116, 2193: 117, 2194: 118, 2195: 119, 2196: 120, 2197: 121, 2198: 122, 2199: 123, 2200: 124, 2201: 125, 2202: 126, 2203: 127, 2204: 128, 2205: 129, 2206: 130, 2207: 131, 2208: 132, 2209: 133, 2210: 134, 2211: 135, 2212: 136, 2213: 137, 2214: 138, 2215: 139, 2216: 140, 2217: 141, 2218: 142, 2219: 143, 2220: 144, 2221: 145, 2222: 146, 2223: 147, 2224: 148, 2225: 149, 2226: 150, 2227: 151, 2228: 152, 2229: 153, 2230: 154, 2231: 155, 2232: 156, 2233: 157, 2234: 158, 2235: 159, 2236: 160, 2237: 161, 2238: 162, 2239: 163, 2240: 164, 2241: 165, 2242: 166, 2243: 167, 2244: 168, 2245: 169, 2246: 170, 2247: 171, 2248: 172, 2249: 173, 2250: 174, 2251: 175, 2252: 176, 2253: 177, 2254: 178, 2255: 179, 2256: 180, 2257: 181, 2258: 182, 2259: 183, 2260: 184, 2261: 185, 2262: 186, 2263: 187, 2264: 188, 2265: 189, 2266: 190, 2267: 191, 2268: 192, 2269: 193, 2270: 194, 2271: 195, 2272: 196, 2273: 197, 2274: 198, 2275: 199, 2276: 200, 2277: 201, 2278: 202, 2279: 203, 2280: 204, 2281: 205, 2282: 206, 2283: 207, 2284: 208, 2285: 209, 2286: 210, 2287: 211, 2288: 212, 2289: 213, 2290: 214, 2291: 215, 2292: 216, 2293: 217, 2294: 218, 2295: 219, 2296: 220, 2297: 221, 2298: 222, 2299: 223, 2300: 224, 2301: 225, 2302: 226, 2303: 227, 2304: 228, 2305: 229, 2306: 230, 2307: 231, 2308: 232, 2309: 233, 2310: 234, 2311: 235, 2312: 236, 2313: 237, 2314: 238, 2315: 239, 2316: 240, 2317: 241, 2318: 242, 2319: 243, 2320: 244, 2321: 245, 2322: 246, 2323: 247, 2324: 248, 2325: 249, 2326: 250, 2327: 251, 2328: 252, 2329: 253, 2330: 254, 2331: 255, 2332: 256, 2333: 257, 2334: 258, 2335: 259, 2336: 260, 2337: 261, 2338: 262, 2339: 263, 2340: 264, 2341: 265, 2342: 266, 2343: 267, 2344: 268, 2345: 269, 2346: 270, 2347: 271, 2348: 272, 2349: 273, 2350: 274, 2351: 275, 2352: 276, 2353: 277, 2354: 278, 2355: 279, 2356: 280, 2357: 281, 2358: 282, 2359: 283, 2360: 284, 2361: 285, 2362: 286, 2363: 287, 2364: 288, 2365: 289, 2366: 290, 2367: 291, 2368: 292, 2369: 293, 2370: 294, 2371: 295, 2372: 296, 2373: 297, 2374: 298, 2375: 299, 2376: 300, 2377: 301, 2378: 302, 2379: 303, 2380: 304, 2381: 305, 2382: 306, 2383: 307, 2384: 308, 2385: 309, 2386: 310, 2387: 311, 2388: 312, 2389: 313, 2390: 314, 2391: 315, 2392: 316, 2393: 317, 2394: 318, 2395: 319, 2396: 320, 2397: 321, 2398: 322, 2399: 323, 2400: 324, 2401: 325, 2402: 326, 2403: 327, 2404: 328, 2405: 329, 2406: 330, 2407: 331, 2408: 332, 2409: 333, 2410: 334, 2411: 335, 2412: 336, 2413: 337, 2414: 338, 2415: 339, 2416: 340, 2417: 341, 2418: 342, 2419: 343, 2420: 344 }, + '4-20': { 2077: 0, 2078: 1, 2079: 2, 2080: 3, 2081: 4, 2082: 5, 2083: 6, 2084: 7, 2085: 8, 2086: 9, 2087: 10, 2088: 11, 2089: 12, 2090: 13, 2091: 14, 2092: 15, 2093: 16, 2094: 17, 2095: 18, 2096: 19, 2097: 20, 2098: 21, 2099: 22, 2100: 23, 2101: 24, 2102: 25, 2103: 26, 2104: 27, 2105: 28, 2106: 30, 2107: 31, 2108: 32, 2109: 33, 2110: 34, 2111: 35, 2112: 36, 2113: 37, 2114: 38, 2115: 39, 2116: 40, 2117: 41, 2118: 42, 2119: 43, 2120: 44, 2121: 45, 2122: 46, 2123: 47, 2124: 48, 2125: 49, 2126: 50, 2127: 51, 2128: 52, 2129: 53, 2130: 54, 2131: 55, 2132: 56, 2133: 57, 2134: 58, 2135: 70, 2136: 71, 2137: 72, 2138: 73, 2139: 74, 2140: 75, 2141: 76, 2142: 77, 2143: 78, 2144: 79, 2145: 80, 2146: 81, 2147: 82, 2148: 83, 2149: 84, 2150: 85, 2151: 86, 2152: 87, 2153: 88, 2154: 89, 2155: 90, 2156: 91, 2157: 92, 2158: 93, 2159: 94, 2160: 95, 2161: 96, 2162: 97, 2163: 98, 2164: 99, 2165: 100, 2166: 101, 2167: 102, 2168: 103, 2169: 104, 2170: 105, 2171: 106, 2172: 107, 2173: 108, 2174: 109, 2175: 110, 2176: 111, 2177: 112, 2178: 113, 2179: 123, 2180: 124, 2181: 125, 2182: 126, 2183: 127, 2184: 128, 2185: 129, 2186: 130, 2187: 131, 2188: 132, 2189: 133, 2190: 134, 2191: 135, 2192: 136, 2193: 137, 2194: 138, 2195: 139, 2196: 140, 2197: 141, 2198: 142, 2199: 143, 2200: 144, 2201: 145, 2202: 146, 2203: 147, 2204: 148, 2205: 149, 2206: 150, 2207: 151, 2208: 152, 2209: 153, 2210: 154, 2211: 155, 2212: 156, 2213: 157, 2214: 158, 2215: 159, 2216: 160, 2217: 161, 2218: 162, 2219: 163, 2220: 164, 2221: 165, 2222: 166, 2223: 176, 2224: 177, 2225: 178, 2226: 179, 2227: 180, 2228: 181, 2229: 182, 2230: 183, 2231: 184, 2232: 185, 2233: 186, 2234: 187, 2235: 188, 2236: 189, 2237: 190, 2238: 191, 2239: 192, 2240: 193, 2241: 194, 2242: 195, 2243: 196, 2244: 197, 2245: 198, 2246: 199, 2247: 200, 2248: 201, 2249: 202, 2250: 203, 2251: 204, 2252: 205, 2253: 206, 2254: 207, 2255: 208, 2256: 209, 2257: 210, 2258: 211, 2259: 212, 2260: 213, 2261: 214, 2262: 215, 2263: 216, 2264: 217, 2265: 218, 2266: 219, 2267: 229, 2268: 230, 2269: 231, 2270: 232, 2271: 233, 2272: 234, 2273: 235, 2274: 236, 2275: 237, 2276: 238, 2277: 239, 2278: 240, 2279: 241, 2280: 242, 2281: 243, 2282: 244, 2283: 245, 2284: 246, 2285: 247, 2286: 248, 2287: 249, 2288: 250, 2289: 251, 2290: 252, 2291: 253, 2292: 254, 2293: 255, 2294: 256, 2295: 257, 2296: 258, 2297: 259, 2298: 260, 2299: 261, 2300: 262, 2301: 263, 2302: 264, 2303: 265, 2304: 266, 2305: 267, 2306: 268, 2307: 269, 2308: 270, 2309: 271, 2310: 272, 2311: 282, 2312: 283, 2313: 284, 2314: 285, 2315: 286, 2316: 287, 2317: 288, 2318: 289, 2319: 290, 2320: 291, 2321: 292, 2322: 293, 2323: 294, 2324: 295, 2325: 296, 2326: 297, 2327: 298, 2328: 299, 2329: 300, 2330: 301, 2331: 302, 2332: 303, 2333: 304, 2334: 305, 2335: 306, 2336: 307, 2337: 308, 2338: 309, 2339: 310, 2340: 311, 2341: 312, 2342: 313, 2343: 314, 2344: 315, 2345: 316, 2346: 317, 2347: 318, 2348: 319, 2349: 320, 2350: 321, 2351: 322, 2352: 323, 2353: 324, 2354: 325, 2355: 335, 2356: 336, 2357: 337, 2358: 338, 2359: 339, 2360: 340, 2361: 341, 2362: 342, 2363: 343, 2364: 344, 2365: 345, 2366: 346, 2367: 347, 2368: 348, 2369: 349, 2370: 350, 2371: 351, 2372: 352, 2373: 353, 2374: 354, 2375: 355, 2376: 356, 2377: 357, 2378: 358, 2379: 359, 2380: 360, 2381: 361, 2382: 362, 2383: 363, 2384: 364, 2385: 365, 2386: 366, 2387: 367, 2388: 368, 2389: 369, 2390: 370, 2391: 371, 2392: 372, 2393: 373, 2394: 374, 2395: 375, 2396: 376, 2397: 377, 2398: 378, 2399: 388, 2400: 389, 2401: 390, 2402: 391, 2403: 392, 2404: 393, 2405: 394, 2406: 395, 2407: 396, 2408: 397, 2409: 398, 2410: 399, 2411: 400, 2412: 401, 2413: 402, 2414: 403, 2415: 404, 2416: 405, 2417: 406, 2418: 407, 2419: 408, 2420: 409, 4422: 59, 4423: 69, 4424: 122, 4425: 175, 4426: 228, 4427: 281, 4428: 334, 4429: 387, 4430: 60, 4431: 68, 4432: 114, 4433: 121, 4434: 167, 4435: 174, 4436: 220, 4437: 227, 4438: 273, 4439: 280, 4440: 326, 4441: 333, 4442: 379, 4443: 386, 4444: 61, 4445: 115, 4446: 168, 4447: 221, 4448: 274, 4449: 327, 4450: 380, 4451: 62, 4452: 67, 4453: 116, 4454: 120, 4455: 169, 4456: 173, 4457: 222, 4458: 226, 4459: 275, 4460: 279, 4461: 328, 4462: 332, 4463: 381, 4464: 385, 4465: 63, 4466: 66, 4467: 119, 4468: 172, 4469: 225, 4470: 278, 4471: 331, 4472: 384, 4473: 64, 4474: 65, 4475: 117, 4476: 118, 4477: 170, 4478: 171, 4479: 223, 4480: 224, 4481: 276, 4482: 277, 4483: 329, 4484: 330, 4485: 382, 4486: 383 }, + '5-15': { 2421: 0, 2422: 1, 2423: 2, 2424: 3, 2425: 4, 2426: 5, 2427: 6, 2428: 7, 2429: 8, 2430: 9, 2431: 10, 2432: 11, 2433: 12, 2434: 13, 2435: 14, 2436: 15, 2437: 16, 2438: 17, 2439: 18, 2440: 19, 2441: 20, 2442: 21, 2443: 22, 2444: 23, 2445: 24, 2446: 25, 2447: 26, 2448: 27, 2449: 28, 2450: 29, 2451: 30, 2452: 31, 2453: 32, 2454: 33, 2455: 34, 2456: 35, 2457: 36, 2458: 37, 2459: 38, 2460: 39, 2461: 40, 2462: 41, 2463: 42, 2464: 43, 2465: 44, 2466: 45, 2467: 46, 2468: 47, 2469: 48, 2470: 49, 2471: 50, 2472: 51, 2473: 52, 2474: 53, 2475: 54, 2476: 55, 2477: 56, 2478: 57, 2479: 58, 2480: 59, 2481: 60, 2482: 61, 2483: 62, 2484: 63, 2485: 64, 2486: 65, 2487: 66, 2488: 67, 2489: 68, 2490: 69, 2491: 70, 2492: 71, 2493: 72, 2494: 73, 2495: 74, 2496: 75, 2497: 76, 2498: 77, 2499: 78, 2500: 79, 2501: 80, 2502: 81, 2503: 82, 2504: 83, 2505: 84, 2506: 85, 2507: 86, 2508: 87, 2509: 88, 2510: 89, 2511: 90, 2512: 91, 2513: 92, 2514: 93, 2515: 94, 2516: 95, 2517: 96, 2518: 97, 2519: 98, 2520: 99, 2521: 100, 2522: 101, 2523: 102, 2524: 103, 2525: 104, 2526: 105, 2527: 106, 2528: 107, 2529: 108, 2530: 109, 2531: 110, 2532: 111, 2533: 112, 2534: 113, 2535: 114, 2536: 115, 2537: 116, 2538: 117, 2539: 118, 2540: 119, 2541: 120, 2542: 121, 2543: 122, 2544: 123, 2545: 124, 2546: 125, 2547: 126, 2548: 127, 2549: 128, 2550: 129, 2551: 130, 2552: 131, 2553: 132, 2554: 133, 2555: 134, 2556: 135, 2557: 136, 2558: 137, 2559: 138, 2560: 139, 2561: 140, 2562: 141, 2563: 142, 2564: 143, 2565: 144, 2566: 145, 2567: 146, 2568: 147, 2569: 148, 2570: 149, 2571: 150, 2572: 151, 2573: 152, 2574: 153, 2575: 154, 2576: 155, 2577: 156, 2578: 157, 2579: 158, 2580: 159, 2581: 160, 2582: 161, 2583: 162, 2584: 163, 2585: 164, 2586: 165, 2587: 166, 2588: 167, 2589: 168, 2590: 169, 2591: 170, 2592: 171, 2593: 172, 2594: 173, 2595: 174, 2596: 175, 2597: 176, 2598: 177, 2599: 178, 2600: 179, 2601: 180, 2602: 181, 2603: 182, 2604: 183, 2605: 184, 2606: 185, 2607: 186, 2608: 187, 2609: 188, 2610: 189, 2611: 190, 2612: 191, 2613: 192, 2614: 193, 2615: 194, 2616: 195, 2617: 196, 2618: 197, 2619: 198, 2620: 199, 2621: 200, 2622: 201, 2623: 202, 2624: 203, 2625: 204, 2626: 205, 2627: 206, 2628: 207, 2629: 208, 2630: 209, 2631: 210, 2632: 211, 2633: 212, 2634: 213, 2635: 214, 2636: 215, 2637: 216, 2638: 217, 2639: 218, 2640: 219, 2641: 220, 2642: 221, 2643: 222, 2644: 223, 2645: 224, 2646: 225, 2647: 226, 2648: 227, 2649: 228, 2650: 229, 2651: 230, 2652: 231, 2653: 232, 2654: 233, 2655: 234, 2656: 235, 2657: 236, 2658: 237, 2659: 238, 2660: 239, 2661: 240, 2662: 241, 2663: 242, 2664: 243, 2665: 244, 2666: 245, 2667: 246, 2668: 247, 2669: 248, 2670: 249, 2671: 250, 2672: 251, 2673: 252, 2674: 253, 2675: 254, 2676: 255, 2677: 256, 2678: 257, 2679: 258, 2680: 259, 2681: 260, 2682: 261, 2683: 262, 2684: 263, 2685: 264, 2686: 265, 2687: 266, 2688: 267, 2689: 268, 2690: 269, 2691: 270, 2692: 271, 2693: 272, 2694: 273, 2695: 274, 2696: 275, 2697: 276, 2698: 277, 2699: 278, 2700: 279, 2701: 280, 2702: 281, 2703: 282, 2704: 283, 2705: 284, 2706: 285, 2707: 286, 2708: 287, 2709: 288, 2710: 289, 2711: 290, 2712: 291, 2713: 292, 2714: 293, 2715: 294, 2716: 295, 2717: 296, 2718: 297, 2719: 298, 2720: 299, 2721: 300, 2722: 301, 2723: 302, 2724: 303, 2725: 304, 2726: 305, 2727: 306, 2728: 307, 2729: 308, 2730: 309, 2731: 310, 2732: 311, 2733: 312, 2734: 313, 2735: 314, 2736: 315, 2737: 316, 2738: 317, 2739: 318, 2740: 319, 2741: 320, 2742: 321, 2743: 322, 2744: 323, 2745: 324, 2746: 325, 2747: 326, 2748: 327, 2749: 328, 2750: 329, 2751: 330, 2752: 331, 2753: 332, 2754: 333, 2755: 334, 2756: 335, 2757: 336, 2758: 337, 2759: 338, 2760: 339, 2761: 340, 2762: 341, 2763: 342, 2764: 343, 2765: 344, 2766: 345, 2767: 346, 2768: 347, 2769: 348, 2770: 349, 2771: 350, 2772: 351, 2773: 352, 2774: 353, 2775: 354, 2776: 355, 2777: 356, 2778: 357, 2779: 358, 2780: 359, 2781: 360, 2782: 361, 2783: 362, 2784: 363, 2785: 364, 2786: 365, 2787: 366, 2788: 367, 2789: 368, 2790: 369, 2791: 370, 2792: 371, 2793: 372, 2794: 373, 2795: 374, 2796: 375, 2797: 376, 2798: 377, 2799: 378, 2800: 379, 2801: 380, 2802: 381, 2803: 382, 2804: 383, 2805: 384, 2806: 385, 2807: 386, 2808: 387, 2809: 388, 2810: 389, 2811: 390, 2812: 391, 2813: 392, 2814: 393, 2815: 394, 2816: 395, 2817: 396, 2818: 397, 2819: 398, 2820: 399, 2821: 400, 2822: 401, 2823: 402, 2824: 403, 2825: 404, 2826: 405, 2827: 406, 2828: 407, 2829: 408, 2830: 409, 2831: 410, 2832: 411, 2833: 412, 2834: 413, 2835: 414, 2836: 415, 2837: 416, 2838: 417, 2839: 418, 2840: 419, 2841: 420, 2842: 421, 2843: 422, 2844: 423, 2845: 424, 2846: 425, 2847: 426, 2848: 427, 2849: 428, 2850: 429, 2851: 430, 2852: 431, 2853: 432, 2854: 433, 2855: 434, 2856: 435, 2857: 436, 2858: 437, 2859: 438, 2860: 439, 2861: 440, 2862: 441, 2863: 442, 2864: 443, 2865: 444, 2866: 445, 2867: 446, 2868: 447, 2869: 448, 2870: 449, 2871: 450, 2872: 451, 2873: 452, 2874: 453, 2875: 454, 2876: 455, 2877: 456, 2878: 457, 2879: 458, 2880: 459, 2881: 460, 2882: 461, 2883: 462, 2884: 463, 2885: 464, 2886: 465, 2887: 466, 2888: 467, 2889: 468, 2890: 469, 2891: 470, 2892: 471, 2893: 472, 2894: 473, 2895: 474, 2896: 475, 2897: 476, 2898: 477, 2899: 478, 2900: 479, 2901: 480, 2902: 481, 2903: 482, 2904: 483, 2905: 484, 2906: 485, 2907: 486, 2908: 487, 2909: 488, 2910: 489, 2911: 490, 2912: 491, 2913: 492, 2914: 493, 2915: 494, 2916: 495, 2917: 496, 2918: 497, 2919: 498, 2920: 499, 2921: 500, 2922: 501, 2923: 502, 2924: 503, 2925: 504, 2926: 505, 2927: 506, 2928: 507, 2929: 508, 2930: 509, 2931: 510, 2932: 511, 2933: 513, 2934: 514, 2935: 515, 2936: 516, 2937: 517, 2938: 518, 2939: 519, 2940: 520, 2941: 521, 2942: 522, 2943: 523, 2944: 524, 2945: 525, 2946: 526, 2947: 527, 2948: 528, 2949: 531, 2950: 532, 2951: 533, 2952: 534, 2953: 535, 2954: 536, 2955: 537, 2956: 538, 2957: 539, 2958: 540, 2959: 541, 2960: 542, 2961: 543, 2962: 544, 2963: 545, 2964: 546 }, + '6-16': { 2965: 0, 2966: 1, 2967: 2, 2968: 3, 2969: 4, 2970: 5, 2971: 6, 2972: 7, 2973: 8, 2974: 9, 2975: 10, 2976: 11, 2977: 12, 2978: 13, 2979: 14, 2980: 15, 2981: 16, 2982: 17, 2983: 18, 2984: 19, 2985: 20, 2986: 21, 2987: 22, 2988: 24, 2989: 25, 2990: 26, 2991: 27, 2992: 28, 2993: 29, 2994: 30, 2995: 31, 2996: 32, 2997: 33, 2998: 34, 2999: 35, 3000: 36, 3001: 37, 3002: 38, 3003: 39, 3004: 40, 3005: 41, 3006: 42, 3007: 43, 3008: 44, 3009: 45, 3010: 46, 3011: 47, 3012: 48, 3013: 49, 3014: 50, 3015: 51, 3016: 52, 3017: 53, 3018: 54, 3019: 55, 3020: 56, 3021: 57, 3022: 58, 3023: 59, 3024: 60, 3025: 61, 3026: 62, 3027: 63, 3028: 64, 3029: 65, 3030: 66, 3031: 67, 3032: 68, 3033: 69, 3034: 70, 3035: 71, 3036: 72, 3037: 73, 3038: 74, 3039: 75, 3040: 76, 3041: 77, 3042: 78, 3043: 79, 3044: 80, 3045: 81, 3046: 82, 3047: 83, 3048: 84, 3049: 85, 3050: 86, 3051: 87, 3052: 88, 3053: 89, 3054: 90, 3055: 91, 3056: 92, 3057: 93, 3058: 94, 3059: 95, 3060: 96, 3061: 97, 3062: 98, 3063: 99, 3064: 100, 3065: 101, 3066: 102, 3067: 103, 3068: 104, 3069: 105, 3070: 106, 3071: 107, 3072: 108, 3073: 109, 3074: 110, 3075: 111, 3076: 112, 3077: 113, 3078: 114, 3079: 115, 3080: 116, 3081: 117, 3082: 118, 3083: 119, 3084: 120, 3085: 121, 3086: 122, 3087: 123, 3088: 124, 3089: 125, 3090: 126, 3091: 127, 3092: 128, 3093: 129, 3094: 130, 3095: 131, 3096: 132, 3097: 133, 3098: 134, 3099: 135, 3100: 136, 3101: 137, 3102: 138, 3103: 139, 3104: 140, 3105: 141, 3106: 142, 3107: 143, 3108: 144, 3109: 145, 3110: 146, 3111: 147, 3112: 148, 3113: 149, 3114: 150, 3115: 151, 3116: 152, 3117: 153, 3118: 154, 3119: 155, 3120: 156, 3121: 157, 3122: 158, 3123: 159, 3124: 160, 3125: 161, 3126: 162, 3127: 163, 3128: 164, 3129: 165, 3130: 166, 3131: 167, 3132: 168, 3133: 169, 3134: 170, 3135: 171, 3136: 172, 3137: 173, 3138: 174, 3139: 175, 3140: 176, 3141: 177, 3142: 178, 3143: 179, 3144: 180, 3145: 181, 3146: 182, 3147: 183, 3148: 184, 3149: 185, 3150: 186, 3151: 187, 3152: 188, 3153: 189, 3154: 190, 3155: 191, 3156: 192, 3157: 193, 3158: 194, 3159: 195, 3160: 196, 3161: 197, 3162: 198, 3163: 199, 3164: 200, 3165: 201, 3166: 202, 3167: 203, 3168: 204, 3169: 205, 3170: 206, 3171: 207, 3172: 208, 3173: 209, 3174: 210, 3175: 211, 3176: 212, 3177: 213, 3178: 214, 3179: 215, 3180: 216, 3181: 217, 3182: 218, 3183: 219, 3184: 220, 3185: 221, 3186: 222, 3187: 223, 3188: 224, 3189: 225, 3190: 226, 3191: 227, 3192: 228, 3193: 229, 3194: 230, 3195: 231, 3196: 232, 3197: 233, 3198: 234, 3199: 235, 3200: 236, 3201: 237, 3202: 238, 3203: 239, 3204: 240, 3205: 241, 3206: 242, 3207: 243, 3208: 244, 3209: 245, 3210: 246, 3211: 247, 3212: 248, 3213: 249, 3214: 250, 3215: 251, 3216: 252, 3217: 253, 3218: 254, 3219: 255, 3220: 256, 3221: 257, 3222: 258, 3223: 259, 3224: 260, 3225: 261, 3226: 262, 3227: 263, 3228: 264, 3229: 265, 3230: 266, 3231: 267, 3232: 268, 3233: 269, 3234: 270, 3235: 271, 3236: 272, 3237: 273, 3238: 274, 3239: 275, 3240: 276, 3241: 277, 3242: 278, 3243: 279, 3244: 280, 3245: 281, 3246: 282, 3247: 283, 3248: 284, 3249: 285, 3250: 286, 3251: 287, 3252: 288, 3253: 289, 3254: 290, 3255: 291, 3256: 292, 3257: 293, 3258: 294, 3259: 295, 3260: 296, 3261: 297, 3262: 298, 3263: 299, 3264: 300, 3265: 301, 3266: 302, 3267: 303, 3268: 304, 3269: 305, 3270: 306, 3271: 307, 3272: 308, 3273: 309, 3274: 310, 3275: 311, 3276: 312, 3277: 313, 3278: 314, 3279: 315, 3280: 316, 3281: 317, 3282: 318, 3283: 319, 3284: 320, 3285: 321, 3286: 322, 3287: 323, 3288: 324, 3289: 325, 3290: 326, 3291: 327, 3292: 328, 3293: 329, 3294: 330, 3295: 331, 3296: 332, 3297: 333, 3298: 334, 3299: 335, 3300: 336, 3301: 337, 3302: 338, 3303: 339, 3304: 340, 3305: 341, 3306: 342, 3307: 343, 3308: 344, 3309: 345, 3310: 346, 3311: 347, 3312: 348, 3313: 349, 3314: 350, 3315: 351, 3316: 352, 3317: 353, 3318: 354, 3319: 355, 3320: 356, 3321: 357, 3322: 358, 3323: 359, 3324: 360, 3325: 361, 3326: 362, 3327: 363, 3328: 364, 3329: 365, 3330: 366, 3331: 367, 3332: 368, 3333: 369, 3334: 370, 3335: 371, 3336: 372, 3337: 373, 3338: 374, 3339: 375, 3340: 376, 3341: 377, 3342: 378, 3343: 379, 3344: 380, 3345: 381, 3346: 382, 3347: 383, 3348: 384, 3349: 385, 3350: 386, 3351: 387, 3352: 388, 3353: 389, 3354: 390, 3355: 391, 3356: 392, 3357: 393, 3358: 394, 3359: 395, 3360: 396, 3361: 397, 3362: 398, 3363: 399, 3364: 400, 3365: 401, 3366: 402, 3367: 403, 3368: 404, 3369: 405, 3370: 406, 3371: 407, 3372: 408, 3373: 409, 3374: 410, 3375: 411, 3376: 412, 3377: 413, 3378: 414, 3379: 415, 3380: 416, 3381: 417, 3382: 418, 3383: 419, 3384: 420, 3385: 421, 3386: 422, 3387: 423, 3388: 424, 3389: 425, 3390: 426, 3391: 427, 3392: 428, 3393: 429, 3394: 430, 3395: 431, 3396: 432, 3397: 433, 3398: 434, 3399: 435, 3400: 436, 3401: 437, 3402: 438, 3403: 439, 3404: 440, 3405: 441, 3406: 442, 3407: 443, 3408: 444, 3409: 445, 3410: 446, 3411: 447, 3412: 448, 3413: 449, 3414: 450, 3415: 451, 3416: 452, 3417: 453, 3418: 454, 3419: 455, 3420: 456, 3421: 457, 3422: 458, 3423: 459, 3424: 460, 3425: 461, 3426: 462, 3427: 463, 3428: 464, 3429: 465, 3430: 466, 3431: 467, 3432: 468, 3433: 469, 3434: 470, 3435: 471, 3436: 472, 3437: 473, 3438: 474, 3439: 475, 3440: 476, 3441: 477, 3442: 478, 3443: 479, 3444: 480, 3445: 481, 3446: 482, 3447: 483, 3448: 484, 3449: 485, 3450: 486, 3451: 487, 3452: 488, 3453: 489, 3454: 490, 3455: 491, 3456: 492, 3457: 493, 3458: 494, 3459: 495, 3460: 496, 3461: 497, 3462: 498, 3463: 499, 3464: 500, 3465: 501, 3466: 502, 3467: 503, 3468: 504, 3469: 505, 3470: 506, 3471: 507, 3472: 508, 3473: 509, 3474: 510, 3475: 511, 3476: 512, 3477: 513, 3478: 514, 3479: 515, 3480: 516, 3481: 517, 3482: 518, 3483: 519, 3484: 520, 3485: 521, 3486: 522, 3487: 523, 3488: 524, 3489: 525, 3490: 526, 3491: 527, 3492: 528, 3493: 529, 3494: 530, 3495: 531, 3496: 532, 3497: 533, 3498: 534, 3499: 535, 3500: 536, 3501: 537, 3502: 538, 3503: 539, 3504: 540, 3505: 541, 3506: 542, 3507: 543, 3508: 544, 3509: 545, 3510: 546, 3511: 547, 3512: 548, 3513: 549, 3514: 550, 3515: 551, 3516: 552, 3517: 553, 3518: 554, 3519: 555, 3520: 556, 3521: 557, 3522: 558, 3523: 559, 3524: 560, 3525: 561, 3526: 562, 3527: 563, 3528: 564, 3529: 565, 3530: 566, 3531: 567, 3532: 568, 3533: 569, 3534: 570, 3535: 571, 3536: 572, 3537: 573, 3538: 574, 3539: 575, 3540: 576, 3541: 577, 3542: 578, 3543: 579, 3544: 580, 3545: 581, 3546: 582, 3547: 583, 3548: 584, 3549: 585, 3550: 586, 3551: 587, 3552: 588, 3553: 589, 3554: 590, 3555: 591, 3556: 592, 3557: 593, 3558: 594, 3559: 595, 3560: 596, 3561: 597, 3562: 598, 3563: 599, 3564: 600, 3565: 601, 3566: 602, 3567: 603, 3568: 604, 3569: 605, 3570: 606, 3571: 607, 3572: 608, 3573: 609, 3574: 610, 3575: 611, 3576: 612, 3577: 613, 3578: 614, 3579: 615, 3580: 616, 3581: 617, 3582: 618, 3583: 619, 3584: 620, 3585: 621, 3586: 622, 3587: 623, 3588: 624, 3589: 625, 3590: 626, 3591: 627, 3592: 628, 3593: 629, 3594: 630, 3595: 631, 3596: 632, 3597: 633, 3598: 634, 3599: 635, 3600: 636, 3601: 637, 3602: 638, 3603: 639, 3604: 640, 3605: 641, 3606: 642, 3607: 643, 3608: 644, 3609: 645, 3610: 646, 3611: 647, 3612: 648, 3613: 649, 3614: 650, 3615: 651, 3616: 652, 3617: 653, 3618: 654, 3619: 655, 3620: 656, 3621: 657, 3622: 658, 3623: 659, 3624: 660, 3625: 661, 3626: 662, 3627: 663, 3628: 664, 3629: 665, 3630: 666, 3631: 667, 3632: 668, 3633: 669, 3634: 670, 3635: 671, 3636: 672, 3637: 673 }, + '7-16': { 3638: 21, 3639: 27, 3640: 31, 3641: 35, 3642: 39, 3643: 43, 3644: 47, 3645: 51, 3646: 22, 3647: 24, 3648: 26, 3649: 28, 3650: 30, 3651: 32, 3652: 34, 3653: 36, 3654: 38, 3655: 40, 3656: 42, 3657: 44, 3658: 46, 3659: 48, 3660: 50, 3661: 52, 3662: 54, 3663: 55, 3664: 56, 3665: 20, 3666: 25, 3667: 29, 3668: 33, 3669: 37, 3670: 41, 3671: 45, 3672: 49, 3673: 53, 3674: 19, 3675: 81, 3676: 80, 3677: 78, 3678: 77, 3679: 75, 3680: 74, 3681: 72, 3682: 71, 3683: 69, 3684: 68, 3685: 66, 3686: 65, 3687: 63, 3688: 62, 3689: 60, 3690: 59, 3691: 58, 3692: 57, 3693: 18, 3694: 79, 3695: 76, 3696: 73, 3697: 70, 3698: 67, 3699: 64, 3700: 61, 3701: 17, 3702: 82, 3703: 84, 3704: 85, 3705: 87, 3706: 88, 3707: 90, 3708: 91, 3709: 93, 3710: 94, 3711: 96, 3712: 97, 3713: 99, 3714: 100, 3715: 102, 3716: 103, 3717: 105, 3718: 106, 3719: 107, 3720: 16, 3721: 83, 3722: 86, 3723: 89, 3724: 92, 3725: 95, 3726: 98, 3727: 101, 3728: 104, 3729: 15, 3730: 132, 3731: 131, 3732: 129, 3733: 128, 3734: 126, 3735: 125, 3736: 123, 3737: 122, 3738: 120, 3739: 119, 3740: 117, 3741: 116, 3742: 114, 3743: 113, 3744: 111, 3745: 110, 3746: 109, 3747: 108, 3748: 14, 3749: 130, 3750: 127, 3751: 124, 3752: 121, 3753: 118, 3754: 115, 3755: 112, 3756: 13, 3757: 133, 3758: 135, 3759: 136, 3760: 138, 3761: 139, 3762: 141, 3763: 142, 3764: 144, 3765: 145, 3766: 147, 3767: 148, 3768: 150, 3769: 151, 3770: 153, 3771: 154, 3772: 156, 3773: 157, 3774: 158, 3775: 12, 3776: 134, 3777: 137, 3778: 140, 3779: 143, 3780: 146, 3781: 149, 3782: 152, 3783: 155, 3784: 11, 3785: 183, 3786: 182, 3787: 180, 3788: 179, 3789: 177, 3790: 176, 3791: 174, 3792: 173, 3793: 171, 3794: 170, 3795: 168, 3796: 167, 3797: 165, 3798: 164, 3799: 162, 3800: 161, 3801: 160, 3802: 159, 3803: 10, 3804: 181, 3805: 178, 3806: 175, 3807: 172, 3808: 169, 3809: 166, 3810: 163, 3811: 9, 3812: 184, 3813: 186, 3814: 187, 3815: 189, 3816: 190, 3817: 192, 3818: 193, 3819: 195, 3820: 196, 3821: 198, 3822: 199, 3823: 201, 3824: 202, 3825: 204, 3826: 205, 3827: 207, 3828: 208, 3829: 209, 3830: 8, 3831: 185, 3832: 188, 3833: 191, 3834: 194, 3835: 197, 3836: 200, 3837: 203, 3838: 206, 3839: 7, 3840: 234, 3841: 233, 3842: 231, 3843: 230, 3844: 228, 3845: 227, 3846: 225, 3847: 224, 3848: 222, 3849: 221, 3850: 219, 3851: 218, 3852: 216, 3853: 215, 3854: 213, 3855: 212, 3856: 211, 3857: 210, 3858: 6, 3859: 232, 3860: 229, 3861: 226, 3862: 223, 3863: 220, 3864: 217, 3865: 214, 3866: 339, 3867: 337, 3868: 5, 3869: 235, 3870: 237, 3871: 238, 3872: 240, 3873: 241, 3874: 243, 3875: 244, 3876: 246, 3877: 247, 3878: 249, 3879: 250, 3880: 252, 3881: 253, 3882: 255, 3883: 256, 3884: 258, 3885: 259, 3886: 260, 3887: 4, 3888: 236, 3889: 239, 3890: 242, 3891: 245, 3892: 248, 3893: 251, 3894: 254, 3895: 257, 3896: 334, 3897: 3, 3898: 285, 3899: 284, 3900: 282, 3901: 281, 3902: 279, 3903: 278, 3904: 276, 3905: 275, 3906: 273, 3907: 272, 3908: 270, 3909: 269, 3910: 267, 3911: 266, 3912: 264, 3913: 263, 3914: 262, 3915: 261, 3916: 332, 3917: 2, 3918: 283, 3919: 280, 3920: 277, 3921: 274, 3922: 271, 3923: 268, 3924: 265, 3925: 645, 3926: 643, 3927: 1, 3928: 286, 3929: 288, 3930: 289, 3931: 291, 3932: 292, 3933: 294, 3934: 295, 3935: 297, 3936: 298, 3937: 300, 3938: 301, 3939: 303, 3940: 304, 3941: 306, 3942: 307, 3943: 309, 3944: 310, 3945: 311, 3946: 0, 3947: 287, 3948: 290, 3949: 293, 3950: 296, 3951: 299, 3952: 302, 3953: 305, 3954: 308, 3955: 329, 3956: 636, 3957: 314, 3958: 316, 3959: 648, 3960: 312, 3961: 322, 3962: 324, 3963: 327, 3964: 319, 3965: 634, 3966: 639, 3967: 650, 3968: 626, 3969: 669, 3970: 627, 3971: 670, 3972: 665, 3973: 664, 3974: 661, 3975: 672, 3976: 662, 3977: 660, 3978: 657, 3979: 651, 3980: 625, 3981: 622, 3982: 655, 3983: 604, 3984: 628, 3985: 623, 3986: 592, 3987: 596, 3988: 654, 3989: 590, 3990: 600, 3991: 602, 3992: 605, 3993: 594, 3994: 598, 3995: 613, 3996: 619, 3997: 611, 3998: 532, 3999: 616, 4000: 618, 4001: 535, 4002: 607, 4003: 610, 4004: 586, 4005: 583, 4006: 577, 4007: 585, 4008: 580, 4009: 576, 4010: 570, 4011: 568, 4012: 537, 4013: 538, 4014: 542, 4015: 566, 4016: 564, 4017: 530, 4018: 540, 4019: 571, 4020: 574, 4021: 527, 4022: 573, 4023: 559, 4024: 561, 4025: 469, 4026: 503, 4027: 521, 4028: 550, 4029: 552, 4030: 556, 4031: 471, 4032: 553, 4033: 498, 4034: 518, 4035: 514, 4036: 473, 4037: 516, 4038: 500, 4039: 513, 4040: 504, 4041: 475, 4042: 477, 4043: 497, 4044: 507, 4045: 474, 4046: 467, 4047: 510, 4048: 512, 4049: 494, 4050: 465, 4051: 479, 4052: 405, 4053: 407, 4054: 461, 4055: 440, 4056: 482, 4057: 441, 4058: 483, 4059: 408, 4060: 410, 4061: 445, 4062: 443, 4063: 460, 4064: 485, 4065: 446, 4066: 438, 4067: 448, 4068: 457, 4069: 432, 4070: 396, 4071: 433, 4072: 397, 4073: 449, 4074: 454, 4075: 414, 4076: 401, 4077: 418, 4078: 451, 4079: 395, 4080: 431, 4081: 402, 4082: 398, 4083: 350, 4084: 399, 4085: 428, 4086: 429, 4087: 352, 4088: 392, 4089: 426, 4090: 353, 4091: 347, 4092: 391, 4093: 382, 4094: 380, 4095: 422, 4096: 424, 4097: 355, 4098: 384, 4099: 344, 4100: 386, 4101: 387, 4102: 420, 4103: 421, 4104: 359, 4105: 341, 4106: 363, 4107: 361, 4108: 362, 4109: 377, 4110: 375, 4111: 373, 4112: 364, 4113: 371, 4114: 366, 4115: 369, 4116: 367 }, + '8-17': { 4117: 0, 4118: 1, 4119: 2, 4120: 3, 4121: 4, 4122: 5, 4123: 6, 4124: 7, 4125: 8, 4126: 9, 4127: 10, 4128: 11, 4129: 12, 4130: 13, 4131: 14, 4132: 15, 4133: 16, 4134: 17, 4135: 18, 4136: 19, 4137: 20, 4138: 21, 4139: 22, 4140: 23, 4141: 24, 4142: 25, 4143: 26, 4144: 27, 4145: 28, 4146: 29, 4147: 30, 4148: 31, 4149: 32, 4150: 33, 4151: 34, 4152: 35, 4153: 36, 4154: 37, 4155: 38, 4156: 39, 4157: 40, 4158: 41, 4159: 42, 4160: 43, 4161: 44, 4162: 45, 4163: 46, 4164: 47, 4165: 48, 4166: 49, 4167: 50, 4168: 51, 4169: 52, 4170: 53, 4171: 54, 4172: 55, 4173: 56, 4174: 57, 4175: 58, 4176: 59, 4177: 60, 4178: 61, 4179: 62, 4180: 63, 4181: 64, 4182: 65, 4183: 66, 4184: 67, 4185: 68, 4186: 69, 4187: 70, 4188: 71, 4189: 72, 4190: 73, 4191: 74, 4192: 75, 4193: 76, 4194: 77, 4195: 78, 4196: 79, 4197: 80, 4198: 81, 4199: 82, 4200: 83, 4201: 84, 4202: 85, 4203: 86, 4204: 87, 4205: 88, 4206: 89, 4207: 90, 4208: 91, 4209: 92, 4210: 93, 4211: 94, 4212: 95, 4213: 96, 4214: 97, 4215: 98, 4216: 99, 4217: 100, 4218: 101, 4219: 102, 4220: 103, 4221: 104, 4222: 105, 4223: 106, 4224: 107, 4225: 108, 4226: 109, 4227: 110, 4228: 111, 4229: 112, 4230: 113, 4231: 114, 4232: 115, 4233: 116, 4234: 117, 4235: 118, 4236: 119, 4237: 120, 4238: 121, 4239: 122, 4240: 123, 4241: 124, 4242: 125, 4243: 126, 4244: 127, 4245: 128, 4246: 129, 4247: 130, 4248: 131, 4249: 132, 4250: 133, 4251: 134, 4252: 135, 4253: 136, 4254: 137, 4255: 138, 4256: 139, 4257: 140, 4258: 141, 4259: 142, 4260: 143, 4261: 144, 4262: 145, 4263: 146, 4264: 147, 4265: 148, 4266: 149, 4267: 150, 4268: 151, 4269: 152, 4270: 153, 4271: 154, 4272: 155, 4273: 156, 4274: 157, 4275: 158, 4276: 159, 4277: 160, 4278: 161, 4279: 162, 4280: 163, 4281: 164, 4282: 165, 4283: 166, 4284: 167, 4285: 168, 4286: 169, 4287: 170, 4288: 171, 4289: 172, 4290: 173, 4291: 174, 4292: 175, 4293: 176, 4294: 177, 4295: 178, 4296: 179, 4297: 180, 4298: 181, 4299: 182, 4300: 183, 4301: 184, 4302: 185, 4303: 186, 4304: 187, 4305: 188, 4306: 189, 4307: 190, 4308: 191, 4309: 192, 4310: 193, 4311: 194, 4312: 195, 4313: 196, 4314: 197, 4315: 198, 4316: 199, 4317: 200, 4318: 201, 4319: 202, 4320: 203, 4321: 204, 4322: 205, 4323: 206, 4324: 207, 4325: 208, 4326: 209, 4327: 210, 4328: 211, 4329: 212, 4330: 213, 4331: 214, 4332: 215, 4333: 216, 4334: 217, 4335: 218, 4336: 219, 4337: 220, 4338: 221, 4339: 222, 4340: 223, 4341: 224, 4342: 225, 4343: 226, 4344: 227, 4345: 228, 4346: 229, 4347: 230, 4348: 231, 4349: 232, 4350: 233, 4351: 234, 4352: 235, 4353: 236, 4354: 237, 4355: 238, 4356: 239, 4357: 240, 4358: 241, 4359: 242, 4360: 243, 4361: 244, 4362: 245, 4363: 246, 4364: 247, 4365: 248, 4366: 249, 4367: 250, 4368: 251, 4369: 252, 4370: 253, 4371: 254, 4372: 255, 4373: 256, 4374: 257, 4375: 258, 4376: 259, 4377: 260, 4378: 261, 4379: 262, 4380: 263, 4381: 264, 4382: 265, 4383: 266, 4384: 267, 4385: 268, 4386: 269, 4387: 270, 4388: 271, 4389: 272, 4390: 273, 4391: 274, 4392: 275, 4393: 276, 4394: 277, 4395: 278, 4396: 279, 4397: 280, 4398: 281, 4399: 282, 4400: 283, 4401: 284, 4402: 285, 4403: 286, 4404: 287, 4405: 288, 4406: 289, 4407: 290, 4408: 291, 4409: 292, 4410: 293, 4411: 294, 4412: 295, 4413: 296, 4414: 297, 4415: 298, 4416: 299, 4417: 300, 4418: 301, 4419: 302, 4420: 303, 4421: 304 }, + '8-18': { 4117: 0, 4118: 1, 4119: 2, 4120: 3, 4121: 4, 4122: 5, 4123: 6, 4124: 7, 4125: 8, 4126: 9, 4127: 10, 4128: 11, 4129: 12, 4130: 13, 4131: 14, 4146: 29, 4147: 28, 4148: 27, 4149: 26, 4150: 25, 4151: 24, 4152: 23, 4153: 22, 4154: 21, 4155: 20, 4156: 19, 4157: 18, 4158: 17, 4159: 16, 4160: 15, 4175: 30, 4176: 31, 4177: 32, 4178: 33, 4179: 34, 4180: 35, 4181: 36, 4182: 37, 4183: 38, 4184: 39, 4185: 40, 4186: 41, 4187: 42, 4188: 43, 4189: 44, 4204: 59, 4205: 58, 4206: 57, 4207: 56, 4208: 55, 4209: 54, 4210: 53, 4211: 52, 4212: 51, 4213: 50, 4214: 49, 4215: 48, 4216: 47, 4217: 46, 4218: 45, 4233: 60, 4234: 61, 4235: 62, 4236: 63, 4237: 64, 4238: 65, 4239: 66, 4240: 67, 4241: 68, 4242: 69, 4243: 70, 4244: 71, 4245: 72, 4246: 73, 4247: 74, 4262: 89, 4263: 88, 4264: 87, 4265: 86, 4266: 85, 4267: 84, 4268: 83, 4269: 82, 4270: 81, 4271: 80, 4272: 79, 4273: 78, 4274: 77, 4275: 76, 4276: 75, 4291: 90, 4292: 91, 4293: 92, 4294: 93, 4295: 94, 4296: 95, 4297: 96, 4298: 97, 4299: 98, 4300: 99, 4301: 100, 4302: 101, 4303: 102, 4304: 103, 4305: 104, 4320: 119, 4321: 118, 4322: 117, 4323: 116, 4324: 115, 4325: 114, 4326: 113, 4327: 112, 4328: 111, 4329: 110, 4330: 109, 4331: 108, 4332: 107, 4333: 106, 4334: 105, 4349: 120, 4350: 121, 4351: 122, 4352: 123, 4353: 124, 4354: 125, 4355: 126, 4356: 127, 4357: 128, 4358: 129, 4359: 130, 4360: 131, 4361: 132, 4362: 133, 4363: 134, 4378: 149, 4379: 148, 4380: 147, 4381: 146, 4382: 145, 4383: 144, 4384: 143, 4385: 142, 4386: 141, 4387: 140, 4388: 139, 4389: 138, 4390: 137, 4391: 136, 4392: 135, 4407: 150, 4408: 151, 4409: 152, 4410: 153, 4411: 154, 4412: 155, 4413: 156, 4414: 157, 4415: 158, 4416: 159, 4417: 160, 4418: 161, 4419: 162, 4420: 163, 4421: 164 }, + '8-19': { 4132: 13, 4133: 12, 4134: 11, 4135: 10, 4136: 9, 4137: 8, 4138: 7, 4139: 6, 4140: 5, 4141: 4, 4142: 3, 4143: 2, 4144: 1, 4145: 0, 4161: 14, 4162: 15, 4163: 16, 4164: 17, 4165: 18, 4166: 19, 4167: 20, 4168: 21, 4169: 22, 4170: 23, 4171: 24, 4172: 25, 4173: 26, 4174: 27, 4190: 41, 4191: 40, 4192: 39, 4193: 38, 4194: 37, 4195: 36, 4196: 35, 4197: 34, 4198: 33, 4199: 32, 4200: 31, 4201: 30, 4202: 29, 4203: 28, 4219: 42, 4220: 43, 4221: 44, 4222: 45, 4223: 46, 4224: 47, 4225: 48, 4226: 49, 4227: 50, 4228: 51, 4229: 52, 4230: 53, 4231: 54, 4232: 55, 4248: 69, 4249: 68, 4250: 67, 4251: 66, 4252: 65, 4253: 64, 4254: 63, 4255: 62, 4256: 61, 4257: 60, 4258: 59, 4259: 58, 4260: 57, 4261: 56, 4277: 70, 4278: 71, 4279: 72, 4280: 73, 4281: 74, 4282: 75, 4283: 76, 4284: 77, 4285: 78, 4286: 79, 4287: 80, 4288: 81, 4289: 82, 4290: 83, 4306: 97, 4307: 96, 4308: 95, 4309: 94, 4310: 93, 4311: 92, 4312: 91, 4313: 90, 4314: 89, 4315: 88, 4316: 87, 4317: 86, 4318: 85, 4319: 84, 4335: 98, 4336: 99, 4337: 100, 4338: 101, 4339: 102, 4340: 103, 4341: 104, 4342: 105, 4343: 106, 4344: 107, 4345: 108, 4346: 109, 4347: 110, 4348: 111, 4364: 125, 4365: 124, 4366: 123, 4367: 122, 4368: 121, 4369: 120, 4370: 119, 4371: 118, 4372: 117, 4373: 116, 4374: 115, 4375: 114, 4376: 113, 4377: 112, 4393: 126, 4394: 127, 4395: 128, 4396: 129, 4397: 130, 4398: 131, 4399: 132, 4400: 133, 4401: 134, 4402: 135, 4403: 136, 4404: 137, 4405: 138, 4406: 139 }, + '8-21': { 4117: 57, 4118: 56, 4119: 55, 4120: 54, 4121: 53, 4122: 52, 4123: 51, 4124: 50, 4125: 49, 4126: 48, 4127: 47, 4128: 46, 4129: 45, 4130: 44, 4131: 43, 4132: 71, 4133: 70, 4134: 69, 4135: 68, 4136: 67, 4137: 66, 4138: 65, 4139: 64, 4140: 63, 4141: 62, 4142: 61, 4143: 60, 4144: 59, 4145: 58, 4146: 86, 4147: 85, 4148: 84, 4149: 83, 4150: 82, 4151: 81, 4152: 80, 4153: 79, 4154: 78, 4155: 77, 4156: 76, 4157: 75, 4158: 74, 4159: 73, 4160: 72, 4161: 100, 4162: 99, 4163: 98, 4164: 97, 4165: 96, 4166: 95, 4167: 94, 4168: 93, 4169: 92, 4170: 91, 4171: 90, 4172: 89, 4173: 88, 4174: 87, 4175: 115, 4176: 114, 4177: 113, 4178: 112, 4179: 111, 4180: 110, 4181: 109, 4182: 108, 4183: 107, 4184: 106, 4185: 105, 4186: 104, 4187: 103, 4188: 102, 4189: 101, 4190: 129, 4191: 128, 4192: 127, 4193: 126, 4194: 125, 4195: 124, 4196: 123, 4197: 122, 4198: 121, 4199: 120, 4200: 119, 4201: 118, 4202: 117, 4203: 116, 4204: 144, 4205: 143, 4206: 142, 4207: 141, 4208: 140, 4209: 139, 4210: 138, 4211: 137, 4212: 136, 4213: 135, 4214: 134, 4215: 133, 4216: 132, 4217: 131, 4218: 130, 4219: 158, 4220: 157, 4221: 156, 4222: 155, 4223: 154, 4224: 153, 4225: 152, 4226: 151, 4227: 150, 4228: 149, 4229: 148, 4230: 147, 4231: 146, 4232: 145, 4233: 173, 4234: 172, 4235: 171, 4236: 170, 4237: 169, 4238: 168, 4239: 167, 4240: 166, 4241: 165, 4242: 164, 4243: 163, 4244: 162, 4245: 161, 4246: 160, 4247: 159, 4248: 187, 4249: 186, 4250: 185, 4251: 184, 4252: 183, 4253: 182, 4254: 181, 4255: 180, 4256: 179, 4257: 178, 4258: 177, 4259: 176, 4260: 175, 4261: 174, 4262: 202, 4263: 201, 4264: 200, 4265: 199, 4266: 198, 4267: 197, 4268: 196, 4269: 195, 4270: 194, 4271: 193, 4272: 192, 4273: 191, 4274: 190, 4275: 189, 4276: 188, 4277: 216, 4278: 215, 4279: 214, 4280: 213, 4281: 212, 4282: 211, 4283: 210, 4284: 209, 4285: 208, 4286: 207, 4287: 206, 4288: 205, 4289: 204, 4290: 203, 4291: 231, 4292: 230, 4293: 229, 4294: 228, 4295: 227, 4296: 226, 4297: 225, 4298: 224, 4299: 223, 4300: 222, 4301: 221, 4302: 220, 4303: 219, 4304: 218, 4305: 217, 4306: 245, 4307: 244, 4308: 243, 4309: 242, 4310: 241, 4311: 240, 4312: 239, 4313: 238, 4314: 237, 4315: 236, 4316: 235, 4317: 234, 4318: 233, 4319: 232, 4320: 260, 4321: 259, 4322: 258, 4323: 257, 4324: 256, 4325: 255, 4326: 254, 4327: 253, 4328: 252, 4329: 251, 4330: 250, 4331: 249, 4332: 248, 4333: 247, 4334: 246, 4335: 274, 4336: 273, 4337: 272, 4338: 271, 4339: 270, 4340: 269, 4341: 268, 4342: 267, 4343: 266, 4344: 265, 4345: 264, 4346: 263, 4347: 262, 4348: 261, 4349: 289, 4350: 288, 4351: 287, 4352: 286, 4353: 285, 4354: 284, 4355: 283, 4356: 282, 4357: 281, 4358: 280, 4359: 279, 4360: 278, 4361: 277, 4362: 276, 4363: 275, 4364: 303, 4365: 302, 4366: 301, 4367: 300, 4368: 299, 4369: 298, 4370: 297, 4371: 296, 4372: 295, 4373: 294, 4374: 293, 4375: 292, 4376: 291, 4377: 290, 4378: 318, 4379: 317, 4380: 316, 4381: 315, 4382: 314, 4383: 313, 4384: 312, 4385: 311, 4386: 310, 4387: 309, 4388: 308, 4389: 307, 4390: 306, 4391: 305, 4392: 304, 4393: 332, 4394: 331, 4395: 330, 4396: 329, 4397: 328, 4398: 327, 4399: 326, 4400: 325, 4401: 324, 4402: 323, 4403: 322, 4404: 321, 4405: 320, 4406: 319, 4407: 347, 4408: 346, 4409: 345, 4410: 344, 4411: 343, 4412: 342, 4413: 341, 4414: 340, 4415: 339, 4416: 338, 4417: 337, 4418: 336, 4419: 335, 4420: 334, 4421: 333, 4487: 14, 4488: 15, 4489: 16, 4490: 17, 4491: 18, 4492: 19, 4493: 20, 4494: 21, 4495: 22, 4496: 23, 4497: 24, 4498: 25, 4499: 26, 4500: 27, 4501: 28, 4502: 362, 4503: 363, 4504: 364, 4505: 365, 4506: 366, 4507: 367, 4508: 368, 4509: 369, 4510: 370, 4511: 371, 4512: 372, 4513: 373, 4514: 374, 4515: 375, 4516: 376, 4556: 0, 4557: 1, 4558: 2, 4559: 3, 4560: 4, 4561: 5, 4562: 6, 4563: 7, 4564: 8, 4565: 9, 4566: 10, 4567: 11, 4568: 12, 4569: 13, 4570: 29, 4571: 30, 4572: 31, 4573: 32, 4574: 33, 4575: 34, 4576: 35, 4577: 36, 4578: 37, 4579: 38, 4580: 39, 4581: 40, 4582: 41, 4583: 42, 4584: 348, 4585: 349, 4586: 350, 4587: 351, 4588: 352, 4589: 353, 4590: 354, 4591: 355, 4592: 356, 4593: 357, 4594: 358, 4595: 359, 4596: 360, 4597: 361, 4598: 377, 4599: 378, 4600: 379, 4601: 380, 4602: 381, 4603: 382, 4604: 383, 4605: 384, 4606: 385, 4607: 386, 4608: 387, 4609: 388, 4610: 389, 4611: 390 }, + '8-22': { 4117: 29, 4118: 28, 4119: 27, 4120: 26, 4121: 25, 4122: 24, 4123: 23, 4124: 22, 4125: 21, 4126: 20, 4127: 19, 4128: 18, 4129: 17, 4130: 16, 4131: 15, 4146: 30, 4147: 31, 4148: 32, 4149: 33, 4150: 34, 4151: 35, 4152: 36, 4153: 37, 4154: 38, 4155: 39, 4156: 40, 4157: 41, 4158: 42, 4159: 43, 4160: 44, 4175: 59, 4176: 58, 4177: 57, 4178: 56, 4179: 55, 4180: 54, 4181: 53, 4182: 52, 4183: 51, 4184: 50, 4185: 49, 4186: 48, 4187: 47, 4188: 46, 4189: 45, 4204: 60, 4205: 61, 4206: 62, 4207: 63, 4208: 64, 4209: 65, 4210: 66, 4211: 67, 4212: 68, 4213: 69, 4214: 70, 4215: 71, 4216: 72, 4217: 73, 4218: 74, 4233: 89, 4234: 88, 4235: 87, 4236: 86, 4237: 85, 4238: 84, 4239: 83, 4240: 82, 4241: 81, 4242: 80, 4243: 79, 4244: 78, 4245: 77, 4246: 76, 4247: 75, 4262: 90, 4263: 91, 4264: 92, 4265: 93, 4266: 94, 4267: 95, 4268: 96, 4269: 97, 4270: 98, 4271: 99, 4272: 100, 4273: 101, 4274: 102, 4275: 103, 4276: 104, 4291: 119, 4292: 118, 4293: 117, 4294: 116, 4295: 115, 4296: 114, 4297: 113, 4298: 112, 4299: 111, 4300: 110, 4301: 109, 4302: 108, 4303: 107, 4304: 106, 4305: 105, 4320: 120, 4321: 121, 4322: 122, 4323: 123, 4324: 124, 4325: 125, 4326: 126, 4327: 127, 4328: 128, 4329: 129, 4330: 130, 4331: 131, 4332: 132, 4333: 133, 4334: 134, 4349: 149, 4350: 148, 4351: 147, 4352: 146, 4353: 145, 4354: 144, 4355: 143, 4356: 142, 4357: 141, 4358: 140, 4359: 139, 4360: 138, 4361: 137, 4362: 136, 4363: 135, 4378: 150, 4379: 151, 4380: 152, 4381: 153, 4382: 154, 4383: 155, 4384: 156, 4385: 157, 4386: 158, 4387: 159, 4388: 160, 4389: 161, 4390: 162, 4391: 163, 4392: 164, 4407: 179, 4408: 178, 4409: 177, 4410: 176, 4411: 175, 4412: 174, 4413: 173, 4414: 172, 4415: 171, 4416: 170, 4417: 169, 4418: 168, 4419: 167, 4420: 166, 4421: 165, 4487: 14, 4488: 13, 4489: 12, 4490: 11, 4491: 10, 4492: 9, 4493: 8, 4494: 7, 4495: 6, 4496: 5, 4497: 4, 4498: 3, 4499: 2, 4500: 1, 4501: 0, 4502: 194, 4503: 193, 4504: 192, 4505: 191, 4506: 190, 4507: 189, 4508: 188, 4509: 187, 4510: 186, 4511: 185, 4512: 184, 4513: 183, 4514: 182, 4515: 181, 4516: 180 }, + '8-23': { 4117: 25, 4118: 26, 4119: 27, 4120: 28, 4121: 29, 4122: 30, 4123: 31, 4124: 32, 4125: 33, 4126: 34, 4127: 35, 4128: 36, 4129: 37, 4130: 38, 4131: 39, 4132: 40, 4133: 41, 4134: 42, 4135: 43, 4136: 44, 4137: 45, 4138: 46, 4139: 47, 4140: 48, 4141: 49, 4142: 50, 4143: 51, 4144: 52, 4145: 53, 4146: 60, 4147: 61, 4148: 62, 4149: 63, 4150: 64, 4151: 65, 4152: 66, 4153: 67, 4154: 68, 4155: 69, 4156: 70, 4157: 71, 4158: 72, 4159: 73, 4160: 74, 4161: 75, 4162: 76, 4163: 77, 4164: 78, 4165: 79, 4166: 80, 4167: 81, 4168: 82, 4169: 83, 4170: 84, 4171: 85, 4172: 86, 4173: 87, 4174: 88, 4175: 95, 4176: 96, 4177: 97, 4178: 98, 4179: 99, 4180: 100, 4181: 101, 4182: 102, 4183: 103, 4184: 104, 4185: 105, 4186: 106, 4187: 107, 4188: 108, 4189: 109, 4190: 110, 4191: 111, 4192: 112, 4193: 113, 4194: 114, 4195: 115, 4196: 116, 4197: 117, 4198: 118, 4199: 119, 4200: 120, 4201: 121, 4202: 122, 4203: 123, 4204: 130, 4205: 131, 4206: 132, 4207: 133, 4208: 134, 4209: 135, 4210: 136, 4211: 137, 4212: 138, 4213: 139, 4214: 140, 4215: 141, 4216: 142, 4217: 143, 4218: 144, 4219: 145, 4220: 146, 4221: 147, 4222: 148, 4223: 149, 4224: 150, 4225: 151, 4226: 152, 4227: 153, 4228: 154, 4229: 155, 4230: 156, 4231: 157, 4232: 158, 4233: 165, 4234: 166, 4235: 167, 4236: 168, 4237: 169, 4238: 170, 4239: 171, 4240: 172, 4241: 173, 4242: 174, 4243: 175, 4244: 176, 4245: 177, 4246: 178, 4247: 179, 4248: 180, 4249: 181, 4250: 182, 4251: 183, 4252: 184, 4253: 185, 4254: 186, 4255: 187, 4256: 188, 4257: 189, 4258: 190, 4259: 191, 4260: 192, 4261: 193, 4262: 200, 4263: 201, 4264: 202, 4265: 203, 4266: 204, 4267: 205, 4268: 206, 4269: 207, 4270: 208, 4271: 209, 4272: 210, 4273: 211, 4274: 212, 4275: 213, 4276: 214, 4277: 215, 4278: 216, 4279: 217, 4280: 218, 4281: 219, 4282: 220, 4283: 221, 4284: 222, 4285: 223, 4286: 224, 4287: 225, 4288: 226, 4289: 227, 4290: 228, 4291: 235, 4292: 236, 4293: 237, 4294: 238, 4295: 239, 4296: 240, 4297: 241, 4298: 242, 4299: 243, 4300: 244, 4301: 245, 4302: 246, 4303: 247, 4304: 248, 4305: 249, 4306: 250, 4307: 251, 4308: 252, 4309: 253, 4310: 254, 4311: 255, 4312: 256, 4313: 257, 4314: 258, 4315: 259, 4316: 260, 4317: 261, 4318: 262, 4319: 263, 4320: 270, 4321: 271, 4322: 272, 4323: 273, 4324: 274, 4325: 275, 4326: 276, 4327: 277, 4328: 278, 4329: 279, 4330: 280, 4331: 281, 4332: 282, 4333: 283, 4334: 284, 4335: 285, 4336: 286, 4337: 287, 4338: 288, 4339: 289, 4340: 290, 4341: 291, 4342: 292, 4343: 293, 4344: 294, 4345: 295, 4346: 296, 4347: 297, 4348: 298, 4349: 305, 4350: 306, 4351: 307, 4352: 308, 4353: 309, 4354: 310, 4355: 311, 4356: 312, 4357: 313, 4358: 314, 4359: 315, 4360: 316, 4361: 317, 4362: 318, 4363: 319, 4364: 320, 4365: 321, 4366: 322, 4367: 323, 4368: 324, 4369: 325, 4370: 326, 4371: 327, 4372: 328, 4373: 329, 4374: 330, 4375: 331, 4376: 332, 4377: 333, 4378: 340, 4379: 341, 4380: 342, 4381: 343, 4382: 344, 4383: 345, 4384: 346, 4385: 347, 4386: 348, 4387: 349, 4388: 350, 4389: 351, 4390: 352, 4391: 353, 4392: 354, 4393: 355, 4394: 356, 4395: 357, 4396: 358, 4397: 359, 4398: 360, 4399: 361, 4400: 362, 4401: 363, 4402: 364, 4403: 365, 4404: 366, 4405: 367, 4406: 368, 4407: 375, 4408: 376, 4409: 377, 4410: 378, 4411: 379, 4412: 380, 4413: 381, 4414: 382, 4415: 383, 4416: 384, 4417: 385, 4418: 386, 4419: 387, 4420: 388, 4421: 389, 4520: 24, 4521: 23, 4522: 22, 4523: 59, 4524: 58, 4525: 57, 4526: 94, 4527: 93, 4528: 92, 4529: 129, 4530: 128, 4531: 127, 4532: 164, 4533: 163, 4534: 162, 4535: 199, 4536: 198, 4537: 197, 4538: 234, 4539: 233, 4540: 232, 4541: 269, 4542: 268, 4543: 267, 4544: 304, 4545: 303, 4546: 302, 4547: 339, 4548: 338, 4549: 337, 4550: 374, 4551: 373, 4552: 372, 4618: 56, 4619: 55, 4620: 54, 4621: 91, 4622: 90, 4623: 89, 4624: 126, 4625: 125, 4626: 124, 4627: 161, 4628: 160, 4629: 159, 4630: 196, 4631: 195, 4632: 194, 4633: 231, 4634: 230, 4635: 229, 4636: 266, 4637: 265, 4638: 264, 4639: 301, 4640: 300, 4641: 299, 4642: 336, 4643: 335, 4644: 334, 4645: 371, 4646: 370, 4647: 369, 4655: 0, 4656: 2, 4657: 4, 4658: 6, 4659: 8, 4660: 10, 4661: 12, 4662: 14, 4663: 16, 4664: 18, 4665: 20, 4669: 1, 4670: 3, 4671: 5, 4672: 7, 4673: 9, 4674: 11, 4675: 13, 4676: 15, 4677: 17, 4678: 19 }, + '8-24': { 4117: 25, 4118: 26, 4119: 27, 4120: 28, 4121: 29, 4122: 30, 4123: 31, 4124: 32, 4125: 33, 4126: 34, 4127: 35, 4128: 36, 4129: 37, 4130: 38, 4131: 39, 4146: 54, 4147: 53, 4148: 52, 4149: 51, 4150: 50, 4151: 49, 4152: 48, 4153: 47, 4154: 46, 4155: 45, 4156: 44, 4157: 43, 4158: 42, 4159: 41, 4160: 40, 4175: 61, 4176: 62, 4177: 63, 4178: 64, 4179: 65, 4180: 66, 4181: 67, 4182: 68, 4183: 69, 4184: 70, 4185: 71, 4186: 72, 4187: 73, 4188: 74, 4189: 75, 4204: 90, 4205: 89, 4206: 88, 4207: 87, 4208: 86, 4209: 85, 4210: 84, 4211: 83, 4212: 82, 4213: 81, 4214: 80, 4215: 79, 4216: 78, 4217: 77, 4218: 76, 4233: 97, 4234: 98, 4235: 99, 4236: 100, 4237: 101, 4238: 102, 4239: 103, 4240: 104, 4241: 105, 4242: 106, 4243: 107, 4244: 108, 4245: 109, 4246: 110, 4247: 111, 4262: 126, 4263: 125, 4264: 124, 4265: 123, 4266: 122, 4267: 121, 4268: 120, 4269: 119, 4270: 118, 4271: 117, 4272: 116, 4273: 115, 4274: 114, 4275: 113, 4276: 112, 4291: 133, 4292: 134, 4293: 135, 4294: 136, 4295: 137, 4296: 138, 4297: 139, 4298: 140, 4299: 141, 4300: 142, 4301: 143, 4302: 144, 4303: 145, 4304: 146, 4305: 147, 4320: 162, 4321: 161, 4322: 160, 4323: 159, 4324: 158, 4325: 157, 4326: 156, 4327: 155, 4328: 154, 4329: 153, 4330: 152, 4331: 151, 4332: 150, 4333: 149, 4334: 148, 4349: 169, 4350: 170, 4351: 171, 4352: 172, 4353: 173, 4354: 174, 4355: 175, 4356: 176, 4357: 177, 4358: 178, 4359: 179, 4360: 180, 4361: 181, 4362: 182, 4363: 183, 4378: 198, 4379: 197, 4380: 196, 4381: 195, 4382: 194, 4383: 193, 4384: 192, 4385: 191, 4386: 190, 4387: 189, 4388: 188, 4389: 187, 4390: 186, 4391: 185, 4392: 184, 4407: 205, 4408: 206, 4409: 207, 4410: 208, 4411: 209, 4412: 210, 4413: 211, 4414: 212, 4415: 213, 4416: 214, 4417: 215, 4418: 216, 4419: 217, 4420: 218, 4421: 219, 4520: 24, 4521: 23, 4522: 22, 4523: 55, 4524: 56, 4525: 57, 4526: 60, 4527: 59, 4528: 58, 4529: 91, 4530: 92, 4531: 93, 4532: 96, 4533: 95, 4534: 94, 4535: 127, 4536: 128, 4537: 129, 4538: 132, 4539: 131, 4540: 130, 4541: 163, 4542: 164, 4543: 165, 4544: 168, 4545: 167, 4546: 166, 4547: 199, 4548: 200, 4549: 201, 4550: 204, 4551: 203, 4552: 202, 4655: 0, 4656: 2, 4657: 4, 4658: 6, 4659: 8, 4660: 10, 4661: 12, 4662: 14, 4663: 16, 4664: 18, 4665: 20, 4669: 1, 4670: 3, 4671: 5, 4672: 7, 4673: 9, 4674: 11, 4675: 13, 4676: 15, 4677: 17, 4678: 19 }, + '8-25': { 4117: 94, 4118: 93, 4119: 92, 4120: 91, 4121: 90, 4122: 89, 4123: 88, 4124: 87, 4125: 86, 4126: 85, 4127: 84, 4128: 83, 4129: 82, 4130: 81, 4131: 80, 4132: 114, 4133: 113, 4134: 112, 4135: 111, 4136: 110, 4137: 109, 4138: 108, 4139: 107, 4140: 106, 4141: 105, 4142: 104, 4143: 103, 4144: 102, 4145: 101, 4146: 129, 4147: 128, 4148: 127, 4149: 126, 4150: 125, 4151: 124, 4152: 123, 4153: 122, 4154: 121, 4155: 120, 4156: 119, 4157: 118, 4158: 117, 4159: 116, 4160: 115, 4161: 149, 4162: 148, 4163: 147, 4164: 146, 4165: 145, 4166: 144, 4167: 143, 4168: 142, 4169: 141, 4170: 140, 4171: 139, 4172: 138, 4173: 137, 4174: 136, 4175: 164, 4176: 163, 4177: 162, 4178: 161, 4179: 160, 4180: 159, 4181: 158, 4182: 157, 4183: 156, 4184: 155, 4185: 154, 4186: 153, 4187: 152, 4188: 151, 4189: 150, 4190: 184, 4191: 183, 4192: 182, 4193: 181, 4194: 180, 4195: 179, 4196: 178, 4197: 177, 4198: 176, 4199: 175, 4200: 174, 4201: 173, 4202: 172, 4203: 171, 4204: 199, 4205: 198, 4206: 197, 4207: 196, 4208: 195, 4209: 194, 4210: 193, 4211: 192, 4212: 191, 4213: 190, 4214: 189, 4215: 188, 4216: 187, 4217: 186, 4218: 185, 4219: 219, 4220: 218, 4221: 217, 4222: 216, 4223: 215, 4224: 214, 4225: 213, 4226: 212, 4227: 211, 4228: 210, 4229: 209, 4230: 208, 4231: 207, 4232: 206, 4233: 234, 4234: 233, 4235: 232, 4236: 231, 4237: 230, 4238: 229, 4239: 228, 4240: 227, 4241: 226, 4242: 225, 4243: 224, 4244: 223, 4245: 222, 4246: 221, 4247: 220, 4248: 254, 4249: 253, 4250: 252, 4251: 251, 4252: 250, 4253: 249, 4254: 248, 4255: 247, 4256: 246, 4257: 245, 4258: 244, 4259: 243, 4260: 242, 4261: 241, 4262: 269, 4263: 268, 4264: 267, 4265: 266, 4266: 265, 4267: 264, 4268: 263, 4269: 262, 4270: 261, 4271: 260, 4272: 259, 4273: 258, 4274: 257, 4275: 256, 4276: 255, 4277: 289, 4278: 288, 4279: 287, 4280: 286, 4281: 285, 4282: 284, 4283: 283, 4284: 282, 4285: 281, 4286: 280, 4287: 279, 4288: 278, 4289: 277, 4290: 276, 4291: 304, 4292: 303, 4293: 302, 4294: 301, 4295: 300, 4296: 299, 4297: 298, 4298: 297, 4299: 296, 4300: 295, 4301: 294, 4302: 293, 4303: 292, 4304: 291, 4305: 290, 4306: 324, 4307: 323, 4308: 322, 4309: 321, 4310: 320, 4311: 319, 4312: 318, 4313: 317, 4314: 316, 4315: 315, 4316: 314, 4317: 313, 4318: 312, 4319: 311, 4320: 339, 4321: 338, 4322: 337, 4323: 336, 4324: 335, 4325: 334, 4326: 333, 4327: 332, 4328: 331, 4329: 330, 4330: 329, 4331: 328, 4332: 327, 4333: 326, 4334: 325, 4335: 359, 4336: 358, 4337: 357, 4338: 356, 4339: 355, 4340: 354, 4341: 353, 4342: 352, 4343: 351, 4344: 350, 4345: 349, 4346: 348, 4347: 347, 4348: 346, 4349: 374, 4350: 373, 4351: 372, 4352: 371, 4353: 370, 4354: 369, 4355: 368, 4356: 367, 4357: 366, 4358: 365, 4359: 364, 4360: 363, 4361: 362, 4362: 361, 4363: 360, 4364: 394, 4365: 393, 4366: 392, 4367: 391, 4368: 390, 4369: 389, 4370: 388, 4371: 387, 4372: 386, 4373: 385, 4374: 384, 4375: 383, 4376: 382, 4377: 381, 4378: 409, 4379: 408, 4380: 407, 4381: 406, 4382: 405, 4383: 404, 4384: 403, 4385: 402, 4386: 401, 4387: 400, 4388: 399, 4389: 398, 4390: 397, 4391: 396, 4392: 395, 4393: 429, 4394: 428, 4395: 427, 4396: 426, 4397: 425, 4398: 424, 4399: 423, 4400: 422, 4401: 421, 4402: 420, 4403: 419, 4404: 418, 4405: 417, 4406: 416, 4407: 444, 4408: 443, 4409: 442, 4410: 441, 4411: 440, 4412: 439, 4413: 438, 4414: 437, 4415: 436, 4416: 435, 4417: 434, 4418: 433, 4419: 432, 4420: 431, 4421: 430, 4487: 46, 4488: 47, 4489: 48, 4490: 49, 4491: 50, 4492: 51, 4493: 52, 4494: 53, 4495: 54, 4496: 55, 4497: 56, 4498: 57, 4499: 58, 4500: 59, 4501: 60, 4502: 465, 4503: 466, 4504: 467, 4505: 468, 4506: 469, 4507: 470, 4508: 471, 4509: 472, 4510: 473, 4511: 474, 4512: 475, 4513: 476, 4514: 477, 4515: 478, 4516: 479, 4517: 61, 4518: 62, 4519: 28, 4520: 95, 4521: 96, 4522: 97, 4523: 130, 4524: 131, 4525: 132, 4526: 165, 4527: 166, 4528: 167, 4529: 200, 4530: 201, 4531: 202, 4532: 235, 4533: 236, 4534: 237, 4535: 270, 4536: 271, 4537: 272, 4538: 305, 4539: 306, 4540: 307, 4541: 340, 4542: 341, 4543: 342, 4544: 375, 4545: 376, 4546: 377, 4547: 410, 4548: 411, 4549: 412, 4550: 445, 4551: 446, 4552: 447, 4553: 480, 4554: 481, 4555: 482, 4556: 32, 4557: 33, 4558: 34, 4559: 35, 4560: 36, 4561: 37, 4562: 38, 4563: 39, 4564: 40, 4565: 41, 4566: 42, 4567: 43, 4568: 44, 4569: 45, 4570: 66, 4571: 67, 4572: 68, 4573: 69, 4574: 70, 4575: 71, 4576: 72, 4577: 73, 4578: 74, 4579: 75, 4580: 76, 4581: 77, 4582: 78, 4583: 79, 4584: 451, 4585: 452, 4586: 453, 4587: 454, 4588: 455, 4589: 456, 4590: 457, 4591: 458, 4592: 459, 4593: 460, 4594: 461, 4595: 462, 4596: 463, 4597: 464, 4598: 486, 4599: 487, 4600: 488, 4601: 489, 4602: 490, 4603: 491, 4604: 492, 4605: 493, 4606: 494, 4607: 495, 4608: 496, 4609: 497, 4610: 498, 4611: 499, 4612: 29, 4613: 30, 4614: 31, 4615: 63, 4616: 64, 4617: 65, 4618: 98, 4619: 99, 4620: 100, 4621: 133, 4622: 134, 4623: 135, 4624: 168, 4625: 169, 4626: 170, 4627: 203, 4628: 204, 4629: 205, 4630: 238, 4631: 239, 4632: 240, 4633: 273, 4634: 274, 4635: 275, 4636: 308, 4637: 309, 4638: 310, 4639: 343, 4640: 344, 4641: 345, 4642: 378, 4643: 379, 4644: 380, 4645: 413, 4646: 414, 4647: 415, 4648: 448, 4649: 449, 4650: 450, 4651: 483, 4652: 484, 4653: 485, 4654: 1, 4655: 3, 4656: 5, 4657: 7, 4658: 9, 4659: 11, 4660: 13, 4661: 15, 4662: 17, 4663: 19, 4664: 21, 4665: 23, 4666: 26, 4667: 25, 4668: 2, 4669: 4, 4670: 6, 4671: 8, 4672: 10, 4673: 12, 4674: 14, 4675: 16, 4676: 18, 4677: 20, 4678: 22, 4679: 24, 4680: 0 }, + '8-26': { 4117: 60, 4118: 59, 4119: 58, 4120: 57, 4121: 56, 4122: 55, 4123: 54, 4124: 53, 4125: 52, 4126: 51, 4127: 50, 4128: 49, 4129: 48, 4130: 47, 4131: 46, 4146: 67, 4147: 68, 4148: 69, 4149: 70, 4150: 71, 4151: 72, 4152: 73, 4153: 74, 4154: 75, 4155: 76, 4156: 77, 4157: 78, 4158: 79, 4159: 80, 4160: 81, 4175: 96, 4176: 95, 4177: 94, 4178: 93, 4179: 92, 4180: 91, 4181: 90, 4182: 89, 4183: 88, 4184: 87, 4185: 86, 4186: 85, 4187: 84, 4188: 83, 4189: 82, 4204: 103, 4205: 104, 4206: 105, 4207: 106, 4208: 107, 4209: 108, 4210: 109, 4211: 110, 4212: 111, 4213: 112, 4214: 113, 4215: 114, 4216: 115, 4217: 116, 4218: 117, 4233: 132, 4234: 131, 4235: 130, 4236: 129, 4237: 128, 4238: 127, 4239: 126, 4240: 125, 4241: 124, 4242: 123, 4243: 122, 4244: 121, 4245: 120, 4246: 119, 4247: 118, 4262: 139, 4263: 140, 4264: 141, 4265: 142, 4266: 143, 4267: 144, 4268: 145, 4269: 146, 4270: 147, 4271: 148, 4272: 149, 4273: 150, 4274: 151, 4275: 152, 4276: 153, 4291: 168, 4292: 167, 4293: 166, 4294: 165, 4295: 164, 4296: 163, 4297: 162, 4298: 161, 4299: 160, 4300: 159, 4301: 158, 4302: 157, 4303: 156, 4304: 155, 4305: 154, 4320: 175, 4321: 176, 4322: 177, 4323: 178, 4324: 179, 4325: 180, 4326: 181, 4327: 182, 4328: 183, 4329: 184, 4330: 185, 4331: 186, 4332: 187, 4333: 188, 4334: 189, 4349: 204, 4350: 203, 4351: 202, 4352: 201, 4353: 200, 4354: 199, 4355: 198, 4356: 197, 4357: 196, 4358: 195, 4359: 194, 4360: 193, 4361: 192, 4362: 191, 4363: 190, 4378: 211, 4379: 212, 4380: 213, 4381: 214, 4382: 215, 4383: 216, 4384: 217, 4385: 218, 4386: 219, 4387: 220, 4388: 221, 4389: 222, 4390: 223, 4391: 224, 4392: 225, 4407: 240, 4408: 239, 4409: 238, 4410: 237, 4411: 236, 4412: 235, 4413: 234, 4414: 233, 4415: 232, 4416: 231, 4417: 230, 4418: 229, 4419: 228, 4420: 227, 4421: 226, 4487: 45, 4488: 44, 4489: 43, 4490: 42, 4491: 41, 4492: 40, 4493: 39, 4494: 38, 4495: 37, 4496: 36, 4497: 35, 4498: 34, 4499: 33, 4500: 32, 4501: 31, 4502: 261, 4503: 260, 4504: 259, 4505: 258, 4506: 257, 4507: 256, 4508: 255, 4509: 254, 4510: 253, 4511: 252, 4512: 251, 4513: 250, 4514: 249, 4515: 248, 4516: 247, 4517: 30, 4518: 29, 4519: 28, 4520: 61, 4521: 62, 4522: 63, 4523: 66, 4524: 65, 4525: 64, 4526: 97, 4527: 98, 4528: 99, 4529: 102, 4530: 101, 4531: 100, 4532: 133, 4533: 134, 4534: 135, 4535: 138, 4536: 137, 4537: 136, 4538: 169, 4539: 170, 4540: 171, 4541: 174, 4542: 173, 4543: 172, 4544: 205, 4545: 206, 4546: 207, 4547: 210, 4548: 209, 4549: 208, 4550: 241, 4551: 242, 4552: 243, 4553: 246, 4554: 245, 4555: 244, 4654: 1, 4655: 3, 4656: 5, 4657: 7, 4658: 9, 4659: 11, 4660: 13, 4661: 15, 4662: 17, 4663: 19, 4664: 21, 4665: 23, 4666: 26, 4667: 25, 4668: 2, 4669: 4, 4670: 6, 4671: 8, 4672: 10, 4673: 12, 4674: 14, 4675: 16, 4676: 18, 4677: 20, 4678: 22, 4679: 24, 4680: 0 }, + '8-29': { 4132: 41, 4133: 40, 4134: 39, 4135: 38, 4136: 37, 4137: 36, 4138: 35, 4139: 34, 4140: 33, 4141: 32, 4142: 31, 4143: 30, 4144: 29, 4145: 28, 4161: 42, 4162: 43, 4163: 44, 4164: 45, 4165: 46, 4166: 47, 4167: 48, 4168: 49, 4169: 50, 4170: 51, 4171: 52, 4172: 53, 4173: 54, 4174: 55, 4190: 69, 4191: 68, 4192: 67, 4193: 66, 4194: 65, 4195: 64, 4196: 63, 4197: 62, 4198: 61, 4199: 60, 4200: 59, 4201: 58, 4202: 57, 4203: 56, 4219: 70, 4220: 71, 4221: 72, 4222: 73, 4223: 74, 4224: 75, 4225: 76, 4226: 77, 4227: 78, 4228: 79, 4229: 80, 4230: 81, 4231: 82, 4232: 83, 4248: 97, 4249: 96, 4250: 95, 4251: 94, 4252: 93, 4253: 92, 4254: 91, 4255: 90, 4256: 89, 4257: 88, 4258: 87, 4259: 86, 4260: 85, 4261: 84, 4277: 98, 4278: 99, 4279: 100, 4280: 101, 4281: 102, 4282: 103, 4283: 104, 4284: 105, 4285: 106, 4286: 107, 4287: 108, 4288: 109, 4289: 110, 4290: 111, 4306: 125, 4307: 124, 4308: 123, 4309: 122, 4310: 121, 4311: 120, 4312: 119, 4313: 118, 4314: 117, 4315: 116, 4316: 115, 4317: 114, 4318: 113, 4319: 112, 4335: 126, 4336: 127, 4337: 128, 4338: 129, 4339: 130, 4340: 131, 4341: 132, 4342: 133, 4343: 134, 4344: 135, 4345: 136, 4346: 137, 4347: 138, 4348: 139, 4364: 153, 4365: 152, 4366: 151, 4367: 150, 4368: 149, 4369: 148, 4370: 147, 4371: 146, 4372: 145, 4373: 144, 4374: 143, 4375: 142, 4376: 141, 4377: 140, 4393: 154, 4394: 155, 4395: 156, 4396: 157, 4397: 158, 4398: 159, 4399: 160, 4400: 161, 4401: 162, 4402: 163, 4403: 164, 4404: 165, 4405: 166, 4406: 167, 4556: 0, 4557: 1, 4558: 2, 4559: 3, 4560: 4, 4561: 5, 4562: 6, 4563: 7, 4564: 8, 4565: 9, 4566: 10, 4567: 11, 4568: 12, 4569: 13, 4570: 27, 4571: 26, 4572: 25, 4573: 24, 4574: 23, 4575: 22, 4576: 21, 4577: 20, 4578: 19, 4579: 18, 4580: 17, 4581: 16, 4582: 15, 4583: 14, 4584: 168, 4585: 169, 4586: 170, 4587: 171, 4588: 172, 4589: 173, 4590: 174, 4591: 175, 4592: 176, 4593: 177, 4594: 178, 4595: 179, 4596: 180, 4597: 181, 4598: 195, 4599: 194, 4600: 193, 4601: 192, 4602: 191, 4603: 190, 4604: 189, 4605: 188, 4606: 187, 4607: 186, 4608: 185, 4609: 184, 4610: 183, 4611: 182 }, + }, + tension: { + '9-1': { 1: 74, 2: 354, 3: 59, 4: 339, 5: 164, 6: 234, 7: 199, 8: 37, 9: 387, 10: 70, 11: 350, 12: 142, 13: 282, 14: 139, 15: 279, 16: 137, 17: 277, 18: 135, 19: 275, 20: 172, 21: 242, 22: 168, 23: 238, 24: 32, 25: 382, 26: 143, 27: 283, 28: 171, 29: 241, 30: 106, 31: 316, 32: 94, 33: 304, 34: 165, 35: 235, 36: 69, 37: 349, 38: 212, 39: 208, 40: 177, 41: 247, 42: 29, 43: 379, 44: 173, 45: 243, 46: 204, 47: 95, 48: 305, 49: 133, 50: 273, 51: 175, 52: 245, 53: 132, 54: 272, 55: 34, 56: 384, 57: 103, 58: 313, 59: 98, 60: 308, 61: 178, 62: 248, 63: 72, 64: 352, 65: 66, 66: 346, 67: 130, 68: 270, 69: 214, 70: 209, 71: 203, 72: 197, 73: 202, 74: 36, 75: 386, 76: 60, 77: 340, 78: 104, 79: 314, 80: 101, 81: 311, 82: 144, 83: 284, 84: 62, 85: 342, 86: 39, 87: 389, 88: 174, 89: 244, 90: 109, 91: 319, 92: 25, 93: 375, 94: 131, 95: 271, 96: 73, 97: 353, 98: 68, 99: 348, 100: 63, 101: 343, 102: 61, 103: 341, 104: 102, 105: 312, 106: 134, 107: 274, 108: 167, 109: 237, 110: 210, 111: 105, 112: 315, 113: 33, 114: 383, 115: 163, 116: 233, 117: 38, 118: 388, 119: 100, 120: 310, 121: 93, 122: 303, 123: 141, 124: 281, 125: 166, 126: 236, 127: 107, 128: 317, 129: 138, 130: 278, 131: 205, 132: 108, 133: 318, 134: 71, 135: 351, 136: 65, 137: 345, 138: 169, 139: 239, 140: 213, 141: 200, 142: 179, 143: 249, 144: 30, 145: 380, 146: 136, 147: 276, 148: 176, 149: 246, 150: 67, 151: 347, 152: 207, 153: 140, 154: 280, 155: 170, 156: 240, 157: 28, 158: 378, 159: 35, 160: 385, 161: 97, 162: 307, 163: 99, 164: 309, 165: 211, 166: 206, 167: 77, 168: 322, 169: 84, 170: 329, 171: 159, 172: 264, 173: 184, 174: 219, 175: 186, 176: 221, 177: 191, 178: 226, 179: 47, 180: 362, 181: 52, 182: 367, 183: 79, 184: 324, 185: 151, 186: 256, 187: 182, 188: 217, 189: 187, 190: 222, 191: 189, 192: 224, 193: 193, 194: 228, 195: 48, 196: 363, 197: 114, 198: 289, 199: 147, 200: 252, 201: 152, 202: 257, 203: 49, 204: 364, 205: 53, 206: 368, 207: 80, 208: 325, 209: 83, 210: 328, 211: 156, 212: 261, 213: 158, 214: 263, 215: 190, 216: 225, 217: 78, 218: 323, 219: 81, 220: 326, 221: 85, 222: 330, 223: 89, 224: 334, 225: 121, 226: 296, 227: 148, 228: 253, 229: 150, 230: 255, 231: 181, 232: 216, 233: 185, 234: 220, 235: 188, 236: 223, 237: 192, 238: 227, 239: 194, 240: 229, 241: 50, 242: 365, 243: 54, 244: 369, 245: 116, 246: 291, 247: 123, 248: 298, 249: 154, 250: 259, 251: 31, 252: 381, 253: 27, 254: 377, 255: 24, 256: 374, 257: 22, 258: 372, 259: 20, 260: 0, 261: 64, 262: 344, 263: 58, 264: 338, 265: 17, 266: 3, 267: 96, 268: 306, 269: 92, 270: 302, 271: 16, 272: 4, 273: 129, 274: 269, 275: 127, 276: 267, 277: 12, 278: 8, 279: 11, 280: 9, 281: 201, 282: 198, 283: 26, 284: 376, 285: 23, 286: 373, 287: 19, 288: 1, 289: 57, 290: 337, 291: 18, 292: 2, 293: 15, 294: 5, 295: 128, 296: 268, 297: 14, 298: 6, 299: 13, 300: 7, 301: 162, 302: 232, 303: 10 }, + '9-2': { 1: 74, 2: 354, 3: 59, 4: 339, 5: 164, 6: 234, 7: 199, 8: 37, 9: 387, 10: 70, 11: 350, 12: 142, 13: 282, 14: 139, 15: 279, 16: 137, 17: 277, 18: 135, 19: 275, 20: 172, 21: 242, 22: 168, 23: 238, 24: 32, 25: 382, 26: 143, 27: 283, 28: 171, 29: 241, 30: 106, 31: 316, 32: 94, 33: 304, 34: 165, 35: 235, 36: 69, 37: 349, 38: 212, 39: 208, 40: 177, 41: 247, 42: 29, 43: 379, 44: 173, 45: 243, 46: 204, 47: 95, 48: 305, 49: 133, 50: 273, 51: 175, 52: 245, 53: 132, 54: 272, 55: 34, 56: 384, 57: 103, 58: 313, 59: 98, 60: 308, 61: 178, 62: 248, 63: 72, 64: 352, 65: 66, 66: 346, 67: 130, 68: 270, 69: 214, 70: 209, 71: 203, 72: 197, 73: 202, 74: 36, 75: 386, 76: 60, 77: 340, 78: 104, 79: 314, 80: 101, 81: 311, 82: 144, 83: 284, 84: 62, 85: 342, 86: 39, 87: 389, 88: 174, 89: 244, 90: 109, 91: 319, 92: 25, 93: 375, 94: 131, 95: 271, 96: 73, 97: 353, 98: 68, 99: 348, 100: 63, 101: 343, 102: 61, 103: 341, 104: 102, 105: 312, 106: 134, 107: 274, 108: 167, 109: 237, 110: 210, 111: 105, 112: 315, 113: 33, 114: 383, 115: 163, 116: 233, 117: 38, 118: 388, 119: 100, 120: 310, 121: 93, 122: 303, 123: 141, 124: 281, 125: 166, 126: 236, 127: 107, 128: 317, 129: 138, 130: 278, 131: 205, 132: 108, 133: 318, 134: 71, 135: 351, 136: 65, 137: 345, 138: 169, 139: 239, 140: 213, 141: 200, 142: 179, 143: 249, 144: 30, 145: 380, 146: 136, 147: 276, 148: 176, 149: 246, 150: 67, 151: 347, 152: 207, 153: 140, 154: 280, 155: 170, 156: 240, 157: 28, 158: 378, 159: 35, 160: 385, 161: 97, 162: 307, 163: 99, 164: 309, 165: 211, 166: 206, 167: 77, 168: 322, 169: 84, 170: 329, 171: 159, 172: 264, 173: 184, 174: 219, 175: 186, 176: 221, 177: 191, 178: 226, 179: 47, 180: 362, 181: 52, 182: 367, 183: 79, 184: 324, 185: 151, 186: 256, 187: 182, 188: 217, 189: 187, 190: 222, 191: 189, 192: 224, 193: 193, 194: 228, 195: 48, 196: 363, 197: 114, 198: 289, 199: 147, 200: 252, 201: 152, 202: 257, 203: 49, 204: 364, 205: 53, 206: 368, 207: 80, 208: 325, 209: 83, 210: 328, 211: 156, 212: 261, 213: 158, 214: 263, 215: 190, 216: 225, 217: 78, 218: 323, 219: 81, 220: 326, 221: 85, 222: 330, 223: 89, 224: 334, 225: 121, 226: 296, 227: 148, 228: 253, 229: 150, 230: 255, 231: 181, 232: 216, 233: 185, 234: 220, 235: 188, 236: 223, 237: 192, 238: 227, 239: 194, 240: 229, 241: 50, 242: 365, 243: 54, 244: 369, 245: 116, 246: 291, 247: 123, 248: 298, 249: 154, 250: 259, 251: 31, 252: 381, 253: 27, 254: 377, 255: 24, 256: 374, 257: 22, 258: 372, 259: 20, 260: 0, 261: 64, 262: 344, 263: 58, 264: 338, 267: 96, 268: 306, 269: 92, 270: 302, 271: 16, 272: 4, 273: 129, 274: 269, 275: 127, 276: 267, 277: 12, 278: 8, 281: 201, 282: 198, 283: 26, 284: 376, 285: 23, 286: 373, 289: 57, 290: 337, 291: 18, 292: 2, 295: 128, 296: 268, 297: 14, 298: 6, 301: 162, 302: 232, 303: 10 }, + '9-3': { 1: 74, 2: 354, 3: 59, 4: 339, 5: 164, 6: 234, 7: 199, 8: 37, 9: 387, 10: 70, 11: 350, 12: 142, 13: 282, 14: 139, 15: 279, 16: 137, 17: 277, 18: 135, 19: 275, 20: 172, 21: 242, 22: 168, 23: 238, 24: 32, 25: 382, 26: 143, 27: 283, 28: 171, 29: 241, 30: 106, 31: 316, 32: 94, 33: 304, 34: 165, 35: 235, 36: 69, 37: 349, 38: 212, 39: 208, 40: 177, 41: 247, 42: 29, 43: 379, 44: 173, 45: 243, 46: 204, 47: 95, 48: 305, 49: 133, 50: 273, 51: 175, 52: 245, 53: 132, 54: 272, 55: 34, 56: 384, 57: 103, 58: 313, 59: 98, 60: 308, 61: 178, 62: 248, 63: 72, 64: 352, 65: 66, 66: 346, 67: 130, 68: 270, 69: 214, 70: 209, 71: 203, 72: 197, 73: 202, 74: 36, 75: 386, 76: 60, 77: 340, 78: 104, 79: 314, 80: 101, 81: 311, 82: 144, 83: 284, 84: 62, 85: 342, 86: 39, 87: 389, 88: 174, 89: 244, 90: 109, 91: 319, 92: 25, 93: 375, 94: 131, 95: 271, 96: 73, 97: 353, 98: 68, 99: 348, 100: 63, 101: 343, 102: 61, 103: 341, 104: 102, 105: 312, 106: 134, 107: 274, 108: 167, 109: 237, 110: 210, 111: 105, 112: 315, 113: 33, 114: 383, 115: 163, 116: 233, 117: 38, 118: 388, 119: 100, 120: 310, 121: 93, 122: 303, 123: 141, 124: 281, 125: 166, 126: 236, 127: 107, 128: 317, 129: 138, 130: 278, 131: 205, 132: 108, 133: 318, 134: 71, 135: 351, 136: 65, 137: 345, 138: 169, 139: 239, 140: 213, 141: 200, 142: 179, 143: 249, 144: 30, 145: 380, 146: 136, 147: 276, 148: 176, 149: 246, 150: 67, 151: 347, 152: 207, 153: 140, 154: 280, 155: 170, 156: 240, 157: 28, 158: 378, 159: 35, 160: 385, 161: 97, 162: 307, 163: 99, 164: 309, 165: 211, 166: 206, 167: 77, 168: 322, 169: 84, 170: 329, 171: 159, 172: 264, 173: 184, 174: 219, 175: 186, 176: 221, 177: 191, 178: 226, 179: 47, 180: 362, 181: 52, 182: 367, 183: 79, 184: 324, 185: 151, 186: 256, 187: 182, 188: 217, 189: 187, 190: 222, 191: 189, 192: 224, 193: 193, 194: 228, 195: 48, 196: 363, 197: 114, 198: 289, 199: 147, 200: 252, 201: 152, 202: 257, 203: 49, 204: 364, 205: 53, 206: 368, 207: 80, 208: 325, 209: 83, 210: 328, 211: 156, 212: 261, 213: 158, 214: 263, 215: 190, 216: 225, 217: 78, 218: 323, 219: 81, 220: 326, 221: 85, 222: 330, 223: 89, 224: 334, 225: 121, 226: 296, 227: 148, 228: 253, 229: 150, 230: 255, 231: 181, 232: 216, 233: 185, 234: 220, 235: 188, 236: 223, 237: 192, 238: 227, 239: 194, 240: 229, 241: 50, 242: 365, 243: 54, 244: 369, 245: 116, 246: 291, 247: 123, 248: 298, 249: 154, 250: 259, 251: 31, 252: 381, 253: 27, 254: 377, 255: 24, 256: 374, 257: 22, 258: 372, 261: 64, 262: 344, 263: 58, 264: 338, 267: 96, 268: 306, 269: 92, 270: 302, 273: 129, 274: 269, 275: 127, 276: 267, 281: 201, 282: 198, 283: 26, 284: 376, 285: 23, 286: 373, 289: 57, 290: 337, 295: 128, 296: 268, 301: 162, 302: 232 }, + '9-4': { 3: 31, 4: 263, 5: 118, 6: 176, 7: 147, 10: 42, 11: 274, 14: 99, 15: 215, 16: 97, 17: 213, 18: 95, 19: 211, 20: 126, 21: 184, 22: 122, 23: 180, 24: 10, 25: 300, 28: 125, 29: 183, 30: 72, 31: 246, 32: 60, 33: 234, 34: 119, 35: 177, 36: 41, 37: 273, 39: 156, 42: 7, 43: 297, 44: 127, 45: 185, 46: 152, 47: 61, 48: 235, 49: 93, 50: 209, 51: 129, 52: 187, 53: 92, 54: 208, 55: 12, 56: 302, 57: 69, 58: 243, 59: 64, 60: 238, 65: 38, 66: 270, 67: 90, 68: 206, 70: 157, 71: 151, 72: 145, 73: 150, 74: 14, 75: 304, 76: 32, 77: 264, 78: 70, 79: 244, 80: 67, 81: 241, 84: 34, 85: 266, 88: 128, 89: 186, 92: 3, 93: 293, 94: 91, 95: 207, 98: 40, 99: 272, 100: 35, 101: 267, 102: 33, 103: 265, 104: 68, 105: 242, 106: 94, 107: 210, 108: 121, 109: 179, 110: 158, 111: 71, 112: 245, 113: 11, 114: 301, 115: 117, 116: 175, 119: 66, 120: 240, 121: 59, 122: 233, 123: 101, 124: 217, 125: 120, 126: 178, 129: 98, 130: 214, 131: 153, 134: 43, 135: 275, 136: 37, 137: 269, 138: 123, 139: 181, 141: 148, 144: 8, 145: 298, 146: 96, 147: 212, 148: 130, 149: 188, 150: 39, 151: 271, 152: 155, 153: 100, 154: 216, 155: 124, 156: 182, 157: 6, 158: 296, 159: 13, 160: 303, 161: 63, 162: 237, 163: 65, 164: 239, 165: 159, 166: 154, 169: 50, 170: 253, 171: 113, 172: 200, 173: 132, 174: 161, 175: 134, 176: 163, 177: 139, 178: 168, 179: 19, 180: 280, 181: 24, 182: 285, 183: 45, 184: 248, 185: 105, 186: 192, 189: 135, 190: 164, 191: 137, 192: 166, 193: 141, 194: 170, 195: 20, 196: 281, 197: 74, 198: 219, 201: 106, 202: 193, 203: 21, 204: 282, 205: 25, 206: 286, 207: 46, 208: 249, 209: 49, 210: 252, 211: 110, 212: 197, 213: 112, 214: 199, 215: 138, 216: 167, 217: 44, 218: 247, 219: 47, 220: 250, 221: 51, 222: 254, 223: 55, 224: 258, 225: 81, 226: 226, 227: 102, 228: 189, 229: 104, 230: 191, 233: 133, 234: 162, 235: 136, 236: 165, 237: 140, 238: 169, 239: 142, 240: 171, 241: 22, 242: 283, 243: 26, 244: 287, 245: 76, 246: 221, 247: 83, 248: 228, 249: 108, 250: 195, 251: 9, 252: 299, 253: 5, 254: 295, 255: 2, 256: 292, 257: 0, 258: 290, 261: 36, 262: 268, 263: 30, 264: 262, 267: 62, 268: 236, 269: 58, 270: 232, 273: 89, 274: 205, 275: 87, 276: 203, 281: 149, 282: 146, 283: 4, 284: 294, 285: 1, 286: 291, 289: 29, 290: 261, 295: 88, 296: 204, 301: 116, 302: 174 }, + '9-5': { 5: 84, 6: 142, 7: 113, 14: 45, 15: 161, 16: 47, 17: 163, 18: 49, 19: 165, 20: 76, 21: 134, 22: 80, 23: 138, 28: 77, 29: 135, 30: 14, 31: 188, 32: 26, 33: 200, 34: 83, 35: 141, 39: 104, 44: 75, 45: 133, 46: 108, 47: 25, 48: 199, 49: 51, 50: 167, 51: 73, 52: 131, 53: 52, 54: 168, 57: 17, 58: 191, 59: 22, 60: 196, 67: 54, 68: 170, 70: 103, 71: 109, 72: 115, 73: 110, 78: 16, 79: 190, 80: 19, 81: 193, 88: 74, 89: 132, 94: 53, 95: 169, 104: 18, 105: 192, 106: 50, 107: 166, 108: 81, 109: 139, 110: 102, 111: 15, 112: 189, 115: 85, 116: 143, 119: 20, 120: 194, 121: 27, 122: 201, 123: 43, 124: 159, 125: 82, 126: 140, 129: 46, 130: 162, 131: 107, 138: 79, 139: 137, 141: 112, 146: 48, 147: 164, 148: 72, 149: 130, 152: 105, 153: 44, 154: 160, 155: 78, 156: 136, 161: 23, 162: 197, 163: 21, 164: 195, 165: 101, 166: 106, 169: 7, 170: 210, 171: 60, 172: 147, 173: 99, 174: 128, 175: 97, 176: 126, 177: 92, 178: 121, 183: 12, 184: 215, 185: 68, 186: 155, 189: 96, 190: 125, 191: 94, 192: 123, 193: 90, 194: 119, 197: 41, 198: 186, 201: 67, 202: 154, 207: 11, 208: 214, 209: 8, 210: 211, 211: 63, 212: 150, 213: 61, 214: 148, 215: 93, 216: 122, 217: 13, 218: 216, 219: 10, 220: 213, 221: 6, 222: 209, 223: 2, 224: 205, 225: 34, 226: 179, 227: 71, 228: 158, 229: 69, 230: 156, 233: 98, 234: 127, 235: 95, 236: 124, 237: 91, 238: 120, 239: 89, 240: 118, 245: 39, 246: 184, 247: 32, 248: 177, 249: 65, 250: 152, 267: 24, 268: 198, 269: 28, 270: 202, 273: 55, 274: 171, 275: 57, 276: 173, 281: 111, 282: 114, 295: 56, 296: 172, 301: 86, 302: 144 }, + '10-6': { 304: 282, 305: 285, 306: 286, 307: 289, 308: 292, 309: 294, 310: 279, 311: 270, 312: 269, 313: 268, 314: 267, 315: 266, 316: 265, 317: 245, 318: 246, 319: 249, 320: 250, 321: 252, 322: 254, 323: 255, 324: 260, 325: 261, 326: 262, 327: 241, 328: 240, 329: 238, 330: 237, 331: 233, 332: 232, 333: 231, 334: 230, 335: 228, 336: 212, 337: 213, 338: 218, 339: 220, 340: 223, 341: 225, 342: 226, 343: 204, 344: 202, 345: 199, 346: 197, 347: 195, 348: 175, 349: 176, 350: 179, 351: 180, 352: 181, 353: 184, 354: 185, 355: 186, 356: 191, 357: 192, 358: 170, 359: 168, 360: 166, 361: 165, 362: 163, 363: 162, 364: 160, 365: 141, 366: 142, 367: 143, 368: 147, 369: 148, 370: 152, 371: 153, 372: 154, 373: 156, 374: 157, 375: 136, 376: 134, 377: 130, 378: 129, 379: 105, 380: 110, 381: 112, 382: 114, 383: 116, 384: 117, 385: 119, 386: 103, 387: 100, 388: 98, 389: 92, 390: 90, 391: 89, 392: 70, 393: 73, 394: 74, 395: 76, 396: 78, 397: 79, 398: 80, 399: 82, 400: 84, 401: 87, 402: 69, 403: 66, 404: 61, 405: 60, 406: 57, 407: 55, 408: 54, 409: 36, 410: 37, 411: 39, 412: 46, 413: 48, 414: 50, 415: 30, 416: 28, 417: 27, 418: 22, 419: 3, 420: 4, 421: 5, 422: 6, 423: 8, 424: 9, 425: 10, 426: 12, 427: 14, 428: 314, 429: 305, 430: 304, 431: 303, 432: 302, 433: 301, 434: 300, 435: 315, 436: 316, 437: 319, 438: 320, 439: 322, 440: 324, 441: 325, 442: 330, 443: 331, 444: 332, 445: 346, 446: 345, 447: 343, 448: 342, 449: 338, 450: 337, 451: 336, 452: 335, 453: 333, 454: 352, 455: 353, 456: 358, 457: 360, 458: 363, 459: 365, 460: 366, 461: 379, 462: 377, 463: 374, 464: 372, 465: 370, 466: 385, 467: 386, 468: 389, 469: 390, 470: 391, 471: 394, 472: 395, 473: 396, 474: 401, 475: 402, 476: 415, 477: 413, 478: 411, 479: 410, 480: 408, 481: 407, 482: 405, 483: 421, 484: 422, 485: 423, 486: 427, 487: 428, 488: 432, 489: 433, 490: 434, 491: 436, 492: 437, 493: 451, 494: 449, 495: 445, 496: 444, 497: 455, 498: 460, 499: 462, 500: 464, 501: 466, 502: 467, 503: 469, 504: 488, 505: 485, 506: 483, 507: 477, 508: 475, 509: 474, 510: 490, 511: 493, 512: 494, 513: 496, 514: 498, 515: 499, 516: 500, 517: 502, 518: 504, 519: 507, 520: 524, 521: 521, 522: 516, 523: 515, 524: 512, 525: 510, 526: 509, 527: 526, 528: 527, 529: 529, 530: 536, 531: 538, 532: 540, 533: 555, 534: 553, 535: 552, 536: 547, 537: 563, 538: 564, 539: 565, 540: 566, 541: 568, 542: 569, 543: 570, 544: 572, 545: 574, 546: 280, 547: 281, 548: 283, 549: 284, 550: 287, 551: 288, 552: 290, 553: 291, 554: 293, 555: 295, 556: 296, 557: 297, 558: 276, 559: 275, 560: 274, 561: 273, 562: 272, 563: 271, 564: 264, 565: 263, 566: 247, 567: 248, 568: 251, 569: 253, 570: 256, 571: 257, 572: 258, 573: 259, 574: 239, 575: 236, 576: 235, 577: 234, 578: 229, 579: 210, 580: 211, 581: 214, 582: 215, 583: 216, 584: 217, 585: 219, 586: 221, 587: 222, 588: 224, 589: 227, 590: 207, 591: 203, 592: 201, 593: 200, 594: 198, 595: 196, 596: 194, 597: 193, 598: 178, 599: 182, 600: 183, 601: 187, 602: 188, 603: 189, 604: 190, 605: 173, 606: 167, 607: 164, 608: 161, 609: 159, 610: 158, 611: 140, 612: 144, 613: 145, 614: 146, 615: 149, 616: 150, 617: 151, 618: 155, 619: 133, 620: 132, 621: 128, 622: 127, 623: 126, 624: 125, 625: 123, 626: 106, 627: 107, 628: 108, 629: 109, 630: 111, 631: 113, 632: 115, 633: 118, 634: 120, 635: 121, 636: 122, 637: 102, 638: 101, 639: 99, 640: 96, 641: 95, 642: 93, 643: 91, 644: 77, 645: 81, 646: 83, 647: 85, 648: 86, 649: 68, 650: 67, 651: 65, 652: 64, 653: 63, 654: 62, 655: 59, 656: 35, 657: 42, 658: 43, 659: 44, 660: 45, 661: 47, 662: 49, 663: 51, 664: 52, 665: 31, 666: 29, 667: 25, 668: 24, 669: 23, 670: 20, 671: 19, 672: 0, 673: 2, 674: 7, 675: 11, 676: 13, 677: 15, 678: 16, 679: 17, 680: 311, 681: 310, 682: 309, 683: 308, 684: 307, 685: 306, 686: 299, 687: 298, 688: 317, 689: 318, 690: 321, 691: 323, 692: 326, 693: 327, 694: 328, 695: 329, 696: 344, 697: 341, 698: 340, 699: 339, 700: 334, 701: 350, 702: 351, 703: 354, 704: 355, 705: 356, 706: 357, 707: 359, 708: 361, 709: 362, 710: 364, 711: 367, 712: 382, 713: 378, 714: 376, 715: 375, 716: 373, 717: 371, 718: 369, 719: 368, 720: 388, 721: 392, 722: 393, 723: 397, 724: 398, 725: 399, 726: 400, 727: 418, 728: 412, 729: 409, 730: 406, 731: 404, 732: 403, 733: 420, 734: 424, 735: 425, 736: 426, 737: 429, 738: 430, 739: 431, 740: 435, 741: 448, 742: 447, 743: 443, 744: 442, 745: 441, 746: 440, 747: 438, 748: 456, 749: 457, 750: 458, 751: 459, 752: 461, 753: 463, 754: 465, 755: 468, 756: 470, 757: 471, 758: 472, 759: 487, 760: 486, 761: 484, 762: 481, 763: 480, 764: 478, 765: 476, 766: 497, 767: 501, 768: 503, 769: 505, 770: 506, 771: 523, 772: 522, 773: 520, 774: 519, 775: 518, 776: 517, 777: 514, 778: 525, 779: 532, 780: 533, 781: 534, 782: 535, 783: 537, 784: 539, 785: 541, 786: 542, 787: 556, 788: 554, 789: 550, 790: 549, 791: 548, 792: 545, 793: 544, 794: 560, 795: 562, 796: 567, 797: 571, 798: 573, 799: 575, 800: 576, 801: 577 }, + '10-7': { 304: 234, 305: 237, 306: 238, 307: 241, 308: 244, 309: 246, 310: 231, 311: 222, 312: 221, 313: 220, 314: 219, 315: 218, 317: 203, 318: 204, 319: 207, 320: 208, 321: 210, 322: 212, 323: 213, 327: 199, 328: 198, 329: 196, 330: 195, 331: 191, 332: 190, 333: 189, 336: 176, 337: 177, 338: 182, 339: 184, 340: 187, 343: 168, 344: 166, 345: 163, 346: 161, 348: 145, 349: 146, 350: 149, 351: 150, 352: 151, 353: 154, 354: 155, 355: 156, 358: 140, 359: 138, 360: 136, 361: 135, 362: 133, 363: 132, 365: 117, 366: 118, 367: 119, 368: 123, 369: 124, 370: 128, 371: 129, 372: 130, 375: 112, 376: 110, 377: 106, 378: 105, 379: 87, 380: 92, 381: 94, 382: 96, 383: 98, 384: 99, 385: 101, 386: 85, 387: 82, 388: 80, 389: 74, 392: 58, 393: 61, 394: 62, 395: 64, 396: 66, 397: 67, 398: 68, 399: 70, 400: 72, 402: 57, 403: 54, 404: 49, 405: 48, 406: 45, 409: 30, 410: 31, 411: 33, 412: 40, 413: 42, 415: 24, 416: 22, 417: 21, 418: 16, 419: 3, 420: 4, 421: 5, 422: 6, 423: 8, 424: 9, 425: 10, 426: 12, 427: 14, 428: 260, 429: 251, 430: 250, 431: 249, 432: 248, 433: 247, 435: 261, 436: 262, 437: 265, 438: 266, 439: 268, 440: 270, 441: 271, 445: 286, 446: 285, 447: 283, 448: 282, 449: 278, 450: 277, 451: 276, 454: 292, 455: 293, 456: 298, 457: 300, 458: 303, 461: 313, 462: 311, 463: 308, 464: 306, 466: 319, 467: 320, 468: 323, 469: 324, 470: 325, 471: 328, 472: 329, 473: 330, 476: 343, 477: 341, 478: 339, 479: 338, 480: 336, 481: 335, 483: 349, 484: 350, 485: 351, 486: 355, 487: 356, 488: 360, 489: 361, 490: 362, 493: 373, 494: 371, 495: 367, 496: 366, 497: 377, 498: 382, 499: 384, 500: 386, 501: 388, 502: 389, 503: 391, 504: 404, 505: 401, 506: 399, 507: 393, 510: 406, 511: 409, 512: 410, 513: 412, 514: 414, 515: 415, 516: 416, 517: 418, 518: 420, 520: 434, 521: 431, 522: 426, 523: 425, 524: 422, 527: 436, 528: 437, 529: 439, 530: 446, 531: 448, 533: 459, 534: 457, 535: 456, 536: 451, 537: 467, 538: 468, 539: 469, 540: 470, 541: 472, 542: 473, 543: 474, 544: 476, 545: 478, 546: 232, 547: 233, 548: 235, 549: 236, 550: 239, 551: 240, 552: 242, 553: 243, 554: 245, 558: 228, 559: 227, 560: 226, 561: 225, 562: 224, 563: 223, 566: 205, 567: 206, 568: 209, 569: 211, 570: 214, 571: 215, 572: 216, 573: 217, 574: 197, 575: 194, 576: 193, 577: 192, 579: 174, 580: 175, 581: 178, 582: 179, 583: 180, 584: 181, 585: 183, 586: 185, 587: 186, 588: 188, 590: 171, 591: 167, 592: 165, 593: 164, 594: 162, 595: 160, 598: 148, 599: 152, 600: 153, 601: 157, 602: 158, 603: 159, 605: 143, 606: 137, 607: 134, 608: 131, 611: 116, 612: 120, 613: 121, 614: 122, 615: 125, 616: 126, 617: 127, 619: 109, 620: 108, 621: 104, 622: 103, 623: 102, 626: 88, 627: 89, 628: 90, 629: 91, 630: 93, 631: 95, 632: 97, 633: 100, 637: 84, 638: 83, 639: 81, 640: 78, 641: 77, 642: 75, 643: 73, 644: 65, 645: 69, 646: 71, 649: 56, 650: 55, 651: 53, 652: 52, 653: 51, 654: 50, 655: 47, 656: 29, 657: 36, 658: 37, 659: 38, 660: 39, 661: 41, 662: 43, 665: 25, 666: 23, 667: 19, 668: 18, 669: 17, 672: 0, 673: 2, 674: 7, 675: 11, 676: 13, 680: 257, 681: 256, 682: 255, 683: 254, 684: 253, 685: 252, 688: 263, 689: 264, 690: 267, 691: 269, 692: 272, 693: 273, 694: 274, 695: 275, 696: 284, 697: 281, 698: 280, 699: 279, 701: 290, 702: 291, 703: 294, 704: 295, 705: 296, 706: 297, 707: 299, 708: 301, 709: 302, 710: 304, 712: 316, 713: 312, 714: 310, 715: 309, 716: 307, 717: 305, 720: 322, 721: 326, 722: 327, 723: 331, 724: 332, 725: 333, 727: 346, 728: 340, 729: 337, 730: 334, 733: 348, 734: 352, 735: 353, 736: 354, 737: 357, 738: 358, 739: 359, 741: 370, 742: 369, 743: 365, 744: 364, 745: 363, 748: 378, 749: 379, 750: 380, 751: 381, 752: 383, 753: 385, 754: 387, 755: 390, 759: 403, 760: 402, 761: 400, 762: 397, 763: 396, 764: 394, 765: 392, 766: 413, 767: 417, 768: 419, 771: 433, 772: 432, 773: 430, 774: 429, 775: 428, 776: 427, 777: 424, 778: 435, 779: 442, 780: 443, 781: 444, 782: 445, 783: 447, 784: 449, 787: 460, 788: 458, 789: 454, 790: 453, 791: 452, 794: 464, 795: 466, 796: 471, 797: 475, 798: 477 }, + '10-8': { 304: 177, 305: 180, 306: 181, 307: 184, 308: 187, 309: 189, 310: 174, 311: 165, 312: 164, 313: 163, 314: 162, 315: 161, 316: 160, 317: 140, 318: 141, 319: 144, 320: 145, 321: 147, 322: 149, 323: 150, 324: 155, 325: 156, 326: 157, 327: 136, 328: 135, 329: 133, 330: 132, 331: 128, 332: 127, 333: 126, 334: 125, 335: 123, 336: 107, 337: 108, 338: 113, 339: 115, 340: 118, 341: 120, 342: 121, 343: 99, 344: 97, 345: 94, 346: 92, 347: 90, 348: 70, 349: 71, 350: 74, 351: 75, 352: 76, 353: 79, 354: 80, 355: 81, 356: 86, 357: 87, 358: 65, 359: 63, 360: 61, 361: 60, 362: 58, 363: 57, 364: 55, 365: 36, 366: 37, 367: 38, 368: 42, 369: 43, 370: 47, 371: 48, 372: 49, 373: 51, 374: 52, 375: 31, 376: 29, 377: 25, 378: 24, 379: 0, 380: 5, 381: 7, 382: 9, 383: 11, 384: 12, 385: 14, 428: 209, 429: 200, 430: 199, 431: 198, 432: 197, 433: 196, 434: 195, 435: 210, 436: 211, 437: 214, 438: 215, 439: 217, 440: 219, 441: 220, 442: 225, 443: 226, 444: 227, 445: 241, 446: 240, 447: 238, 448: 237, 449: 233, 450: 232, 451: 231, 452: 230, 453: 228, 454: 247, 455: 248, 456: 253, 457: 255, 458: 258, 459: 260, 460: 261, 461: 274, 462: 272, 463: 269, 464: 267, 465: 265, 466: 280, 467: 281, 468: 284, 469: 285, 470: 286, 471: 289, 472: 290, 473: 291, 474: 296, 475: 297, 476: 310, 477: 308, 478: 306, 479: 305, 480: 303, 481: 302, 482: 300, 483: 316, 484: 317, 485: 318, 486: 322, 487: 323, 488: 327, 489: 328, 490: 329, 491: 331, 492: 332, 493: 346, 494: 344, 495: 340, 496: 339, 497: 350, 498: 355, 499: 357, 500: 359, 501: 361, 502: 362, 503: 364, 546: 175, 547: 176, 548: 178, 549: 179, 550: 182, 551: 183, 552: 185, 553: 186, 554: 188, 555: 190, 556: 191, 557: 192, 558: 171, 559: 170, 560: 169, 561: 168, 562: 167, 563: 166, 564: 159, 565: 158, 566: 142, 567: 143, 568: 146, 569: 148, 570: 151, 571: 152, 572: 153, 573: 154, 574: 134, 575: 131, 576: 130, 577: 129, 578: 124, 579: 105, 580: 106, 581: 109, 582: 110, 583: 111, 584: 112, 585: 114, 586: 116, 587: 117, 588: 119, 589: 122, 590: 102, 591: 98, 592: 96, 593: 95, 594: 93, 595: 91, 596: 89, 597: 88, 598: 73, 599: 77, 600: 78, 601: 82, 602: 83, 603: 84, 604: 85, 605: 68, 606: 62, 607: 59, 608: 56, 609: 54, 610: 53, 611: 35, 612: 39, 613: 40, 614: 41, 615: 44, 616: 45, 617: 46, 618: 50, 619: 28, 620: 27, 621: 23, 622: 22, 623: 21, 624: 20, 625: 18, 626: 1, 627: 2, 628: 3, 629: 4, 630: 6, 631: 8, 632: 10, 633: 13, 634: 15, 635: 16, 636: 17, 680: 206, 681: 205, 682: 204, 683: 203, 684: 202, 685: 201, 686: 194, 687: 193, 688: 212, 689: 213, 690: 216, 691: 218, 692: 221, 693: 222, 694: 223, 695: 224, 696: 239, 697: 236, 698: 235, 699: 234, 700: 229, 701: 245, 702: 246, 703: 249, 704: 250, 705: 251, 706: 252, 707: 254, 708: 256, 709: 257, 710: 259, 711: 262, 712: 277, 713: 273, 714: 271, 715: 270, 716: 268, 717: 266, 718: 264, 719: 263, 720: 283, 721: 287, 722: 288, 723: 292, 724: 293, 725: 294, 726: 295, 727: 313, 728: 307, 729: 304, 730: 301, 731: 299, 732: 298, 733: 315, 734: 319, 735: 320, 736: 321, 737: 324, 738: 325, 739: 326, 740: 330, 741: 343, 742: 342, 743: 338, 744: 337, 745: 336, 746: 335, 747: 333, 748: 351, 749: 352, 750: 353, 751: 354, 752: 356, 753: 358, 754: 360, 755: 363, 756: 365, 757: 366, 758: 367 }, + '10-9': { 304: 147, 305: 150, 306: 151, 307: 154, 308: 157, 309: 159, 310: 144, 311: 135, 312: 134, 313: 133, 314: 132, 315: 131, 317: 116, 318: 117, 319: 120, 320: 121, 321: 123, 322: 125, 323: 126, 327: 112, 328: 111, 329: 109, 330: 108, 331: 104, 332: 103, 333: 102, 336: 89, 337: 90, 338: 95, 339: 97, 340: 100, 343: 81, 344: 79, 345: 76, 346: 74, 348: 58, 349: 59, 350: 62, 351: 63, 352: 64, 353: 67, 354: 68, 355: 69, 358: 53, 359: 51, 360: 49, 361: 48, 362: 46, 363: 45, 365: 30, 366: 31, 367: 32, 368: 36, 369: 37, 370: 41, 371: 42, 372: 43, 375: 25, 376: 23, 377: 19, 378: 18, 379: 0, 380: 5, 381: 7, 382: 9, 383: 11, 384: 12, 385: 14, 428: 173, 429: 164, 430: 163, 431: 162, 432: 161, 433: 160, 435: 174, 436: 175, 437: 178, 438: 179, 439: 181, 440: 183, 441: 184, 445: 199, 446: 198, 447: 196, 448: 195, 449: 191, 450: 190, 451: 189, 454: 205, 455: 206, 456: 211, 457: 213, 458: 216, 461: 226, 462: 224, 463: 221, 464: 219, 466: 232, 467: 233, 468: 236, 469: 237, 470: 238, 471: 241, 472: 242, 473: 243, 476: 256, 477: 254, 478: 252, 479: 251, 480: 249, 481: 248, 483: 262, 484: 263, 485: 264, 486: 268, 487: 269, 488: 273, 489: 274, 490: 275, 493: 286, 494: 284, 495: 280, 496: 279, 497: 290, 498: 295, 499: 297, 500: 299, 501: 301, 502: 302, 503: 304, 546: 145, 547: 146, 548: 148, 549: 149, 550: 152, 551: 153, 552: 155, 553: 156, 554: 158, 558: 141, 559: 140, 560: 139, 561: 138, 562: 137, 563: 136, 566: 118, 567: 119, 568: 122, 569: 124, 570: 127, 571: 128, 572: 129, 573: 130, 574: 110, 575: 107, 576: 106, 577: 105, 579: 87, 580: 88, 581: 91, 582: 92, 583: 93, 584: 94, 585: 96, 586: 98, 587: 99, 588: 101, 590: 84, 591: 80, 592: 78, 593: 77, 594: 75, 595: 73, 598: 61, 599: 65, 600: 66, 601: 70, 602: 71, 603: 72, 605: 56, 606: 50, 607: 47, 608: 44, 611: 29, 612: 33, 613: 34, 614: 35, 615: 38, 616: 39, 617: 40, 619: 22, 620: 21, 621: 17, 622: 16, 623: 15, 626: 1, 627: 2, 628: 3, 629: 4, 630: 6, 631: 8, 632: 10, 633: 13, 680: 170, 681: 169, 682: 168, 683: 167, 684: 166, 685: 165, 688: 176, 689: 177, 690: 180, 691: 182, 692: 185, 693: 186, 694: 187, 695: 188, 696: 197, 697: 194, 698: 193, 699: 192, 701: 203, 702: 204, 703: 207, 704: 208, 705: 209, 706: 210, 707: 212, 708: 214, 709: 215, 710: 217, 712: 229, 713: 225, 714: 223, 715: 222, 716: 220, 717: 218, 720: 235, 721: 239, 722: 240, 723: 244, 724: 245, 725: 246, 727: 259, 728: 253, 729: 250, 730: 247, 733: 261, 734: 265, 735: 266, 736: 267, 737: 270, 738: 271, 739: 272, 741: 283, 742: 282, 743: 278, 744: 277, 745: 276, 748: 291, 749: 292, 750: 293, 751: 294, 752: 296, 753: 298, 754: 300, 755: 303 }, + '11-6': { 802: 0, 803: 2, 804: 4, 805: 6, 806: 9, 807: 10, 808: 12, 809: 16, 810: 30, 811: 29, 812: 27, 813: 24, 814: 23, 815: 20, 816: 19, 817: 36, 818: 37, 819: 38, 820: 41, 821: 43, 822: 44, 823: 47, 824: 52, 825: 66, 826: 62, 827: 60, 828: 57, 829: 56, 830: 70, 831: 71, 832: 74, 833: 77, 834: 81, 835: 82, 836: 83, 837: 84, 838: 85, 839: 86, 840: 102, 841: 99, 842: 96, 843: 107, 844: 109, 845: 110, 846: 111, 847: 112, 848: 114, 849: 116, 850: 117, 851: 119, 852: 122, 853: 130, 854: 129, 855: 128, 856: 124, 857: 123, 858: 140, 859: 141, 860: 142, 861: 144, 862: 147, 863: 153, 864: 154, 865: 155, 866: 157, 867: 169, 868: 168, 869: 165, 870: 164, 871: 163, 872: 162, 873: 161, 874: 178, 875: 179, 876: 181, 877: 182, 878: 184, 879: 185, 880: 187, 881: 191, 882: 203, 883: 201, 884: 199, 885: 198, 886: 196, 887: 195, 888: 194, 889: 193, 890: 210, 891: 211, 892: 214, 893: 215, 894: 218, 895: 222, 896: 224, 897: 225, 898: 226, 899: 239, 900: 238, 901: 237, 902: 236, 903: 234, 904: 232, 905: 231, 906: 247, 907: 251, 908: 254, 909: 258, 910: 260, 911: 261, 912: 262, 913: 275, 914: 274, 915: 272, 916: 269, 917: 268, 918: 281, 919: 283, 920: 284, 921: 287, 922: 290, 923: 293, 924: 294, 925: 296, 926: 308, 927: 305, 928: 303, 929: 302, 930: 301, 931: 299, 932: 315, 933: 317, 934: 320, 935: 323, 936: 326, 937: 332, 938: 345, 939: 344, 940: 343, 941: 341, 942: 340, 943: 337, 944: 335, 945: 350, 946: 351, 947: 353, 948: 354, 949: 357, 950: 358, 951: 360, 952: 361, 953: 362, 954: 363, 955: 365, 956: 367, 957: 379, 958: 378, 959: 377, 960: 371, 961: 387, 962: 394, 963: 395, 964: 397, 965: 398, 966: 401, 967: 416, 968: 415, 969: 414, 970: 413, 971: 411, 972: 404, 973: 420, 974: 425, 975: 426, 976: 428, 977: 430, 978: 431, 979: 433, 980: 434, 981: 435, 982: 436, 983: 437, 984: 452, 985: 451, 986: 450, 987: 446, 988: 445, 989: 443, 990: 441, 991: 440, 992: 439, 993: 438, 994: 457, 995: 459, 996: 461, 997: 462, 998: 465, 999: 467, 1000: 468, 1001: 484, 1002: 483, 1003: 482, 1004: 479, 1005: 475, 1006: 491, 1007: 493, 1008: 494, 1009: 496, 1010: 499, 1011: 501, 1012: 503, 1013: 505, 1014: 507, 1015: 522, 1016: 517, 1017: 515, 1018: 525, 1019: 526, 1020: 528, 1021: 534, 1022: 536, 1023: 537, 1024: 538, 1025: 539, 1026: 540, 1027: 541, 1028: 555, 1029: 554, 1030: 553, 1031: 552, 1032: 551, 1033: 550, 1034: 549, 1035: 547, 1036: 545, 1037: 562, 1038: 563, 1039: 564, 1040: 566, 1041: 568, 1042: 571, 1043: 573, 1044: 1, 1045: 3, 1046: 5, 1047: 7, 1048: 8, 1049: 11, 1050: 13, 1051: 14, 1052: 15, 1053: 17, 1054: 26, 1055: 25, 1056: 22, 1057: 35, 1058: 39, 1059: 40, 1060: 42, 1061: 45, 1062: 46, 1063: 48, 1064: 49, 1065: 50, 1066: 51, 1067: 61, 1068: 58, 1069: 55, 1070: 54, 1071: 72, 1072: 73, 1073: 75, 1074: 76, 1075: 78, 1076: 79, 1077: 80, 1078: 87, 1079: 103, 1080: 98, 1081: 97, 1082: 94, 1083: 93, 1084: 92, 1085: 91, 1086: 90, 1087: 89, 1088: 105, 1089: 106, 1090: 108, 1091: 113, 1092: 115, 1093: 118, 1094: 120, 1095: 121, 1096: 135, 1097: 134, 1098: 133, 1099: 131, 1100: 127, 1101: 126, 1102: 125, 1103: 143, 1104: 145, 1105: 146, 1106: 148, 1107: 149, 1108: 150, 1109: 151, 1110: 152, 1111: 156, 1112: 174, 1113: 172, 1114: 171, 1115: 170, 1116: 167, 1117: 160, 1118: 159, 1119: 175, 1120: 176, 1121: 177, 1122: 180, 1123: 183, 1124: 186, 1125: 188, 1126: 189, 1127: 190, 1128: 192, 1129: 204, 1130: 202, 1131: 200, 1132: 197, 1133: 212, 1134: 213, 1135: 216, 1136: 217, 1137: 219, 1138: 220, 1139: 221, 1140: 223, 1141: 227, 1142: 240, 1143: 235, 1144: 233, 1145: 230, 1146: 229, 1147: 228, 1148: 245, 1149: 246, 1150: 248, 1151: 249, 1152: 250, 1153: 252, 1154: 253, 1155: 255, 1156: 256, 1157: 257, 1158: 259, 1159: 273, 1160: 271, 1161: 270, 1162: 267, 1163: 266, 1164: 265, 1165: 264, 1166: 263, 1167: 280, 1168: 282, 1169: 285, 1170: 286, 1171: 288, 1172: 289, 1173: 291, 1174: 292, 1175: 295, 1176: 297, 1177: 311, 1178: 310, 1179: 309, 1180: 307, 1181: 306, 1182: 304, 1183: 300, 1184: 298, 1185: 316, 1186: 318, 1187: 319, 1188: 321, 1189: 322, 1190: 324, 1191: 325, 1192: 327, 1193: 328, 1194: 329, 1195: 330, 1196: 331, 1197: 342, 1198: 339, 1199: 338, 1200: 336, 1201: 334, 1202: 352, 1203: 355, 1204: 356, 1205: 359, 1206: 364, 1207: 366, 1208: 381, 1209: 380, 1210: 376, 1211: 375, 1212: 374, 1213: 373, 1214: 372, 1215: 370, 1216: 369, 1217: 368, 1218: 385, 1219: 386, 1220: 388, 1221: 390, 1222: 391, 1223: 392, 1224: 393, 1225: 396, 1226: 399, 1227: 400, 1228: 402, 1229: 410, 1230: 409, 1231: 408, 1232: 407, 1233: 406, 1234: 405, 1235: 403, 1236: 421, 1237: 422, 1238: 423, 1239: 424, 1240: 427, 1241: 429, 1242: 432, 1243: 449, 1244: 447, 1245: 444, 1246: 442, 1247: 455, 1248: 456, 1249: 458, 1250: 460, 1251: 463, 1252: 464, 1253: 466, 1254: 469, 1255: 470, 1256: 471, 1257: 472, 1258: 485, 1259: 481, 1260: 480, 1261: 477, 1262: 476, 1263: 474, 1264: 490, 1265: 492, 1266: 497, 1267: 498, 1268: 500, 1269: 502, 1270: 504, 1271: 506, 1272: 521, 1273: 520, 1274: 519, 1275: 518, 1276: 516, 1277: 514, 1278: 513, 1279: 510, 1280: 509, 1281: 508, 1282: 527, 1283: 532, 1284: 533, 1285: 535, 1286: 542, 1287: 548, 1288: 546, 1289: 544, 1290: 560, 1291: 561, 1292: 565, 1293: 567, 1294: 569, 1295: 570, 1296: 572, 1297: 574, 1298: 576, 1299: 577 }, + '11-7': { 802: 0, 803: 2, 804: 4, 805: 6, 806: 9, 807: 10, 808: 12, 810: 24, 811: 23, 812: 21, 813: 18, 814: 17, 817: 30, 818: 31, 819: 32, 820: 35, 821: 37, 822: 38, 823: 41, 825: 54, 826: 50, 827: 48, 828: 45, 829: 44, 830: 58, 831: 59, 832: 62, 833: 65, 834: 69, 835: 70, 836: 71, 837: 72, 840: 84, 841: 81, 842: 78, 843: 89, 844: 91, 845: 92, 846: 93, 847: 94, 848: 96, 849: 98, 850: 99, 851: 101, 853: 106, 854: 105, 855: 104, 858: 116, 859: 117, 860: 118, 861: 120, 862: 123, 863: 129, 864: 130, 867: 139, 868: 138, 869: 135, 870: 134, 871: 133, 872: 132, 873: 131, 874: 148, 875: 149, 876: 151, 877: 152, 878: 154, 879: 155, 880: 157, 882: 167, 883: 165, 884: 163, 885: 162, 886: 160, 890: 174, 891: 175, 892: 178, 893: 179, 894: 182, 895: 186, 896: 188, 899: 197, 900: 196, 901: 195, 902: 194, 903: 192, 904: 190, 905: 189, 906: 205, 907: 209, 908: 212, 909: 216, 913: 227, 914: 226, 915: 224, 916: 221, 917: 220, 918: 233, 919: 235, 920: 236, 921: 239, 922: 242, 923: 245, 924: 246, 926: 254, 927: 251, 928: 249, 929: 248, 930: 247, 932: 261, 933: 263, 934: 266, 935: 269, 936: 272, 938: 285, 939: 284, 940: 283, 941: 281, 942: 280, 943: 277, 945: 290, 946: 291, 947: 293, 948: 294, 949: 297, 950: 298, 951: 300, 952: 301, 953: 302, 954: 303, 957: 313, 958: 312, 959: 311, 960: 305, 961: 321, 962: 328, 963: 329, 964: 331, 965: 332, 967: 344, 968: 343, 969: 342, 970: 341, 971: 339, 973: 348, 974: 353, 975: 354, 976: 356, 977: 358, 978: 359, 979: 361, 980: 362, 984: 374, 985: 373, 986: 372, 987: 368, 988: 367, 989: 365, 990: 363, 994: 379, 995: 381, 996: 383, 997: 384, 998: 387, 999: 389, 1000: 390, 1001: 400, 1002: 399, 1003: 398, 1004: 395, 1006: 407, 1007: 409, 1008: 410, 1009: 412, 1010: 415, 1011: 417, 1012: 419, 1015: 432, 1016: 427, 1017: 425, 1018: 435, 1019: 436, 1020: 438, 1021: 444, 1022: 446, 1023: 447, 1024: 448, 1025: 449, 1028: 459, 1029: 458, 1030: 457, 1031: 456, 1032: 455, 1033: 454, 1034: 453, 1035: 451, 1037: 466, 1038: 467, 1039: 468, 1040: 470, 1041: 472, 1042: 475, 1043: 477, 1044: 1, 1045: 3, 1046: 5, 1047: 7, 1048: 8, 1049: 11, 1050: 13, 1051: 14, 1054: 20, 1055: 19, 1056: 16, 1057: 29, 1058: 33, 1059: 34, 1060: 36, 1061: 39, 1062: 40, 1063: 42, 1064: 43, 1067: 49, 1068: 46, 1071: 60, 1072: 61, 1073: 63, 1074: 64, 1075: 66, 1076: 67, 1077: 68, 1079: 85, 1080: 80, 1081: 79, 1082: 76, 1083: 75, 1084: 74, 1085: 73, 1088: 87, 1089: 88, 1090: 90, 1091: 95, 1092: 97, 1093: 100, 1096: 111, 1097: 110, 1098: 109, 1099: 107, 1100: 103, 1101: 102, 1103: 119, 1104: 121, 1105: 122, 1106: 124, 1107: 125, 1108: 126, 1109: 127, 1110: 128, 1112: 144, 1113: 142, 1114: 141, 1115: 140, 1116: 137, 1119: 145, 1120: 146, 1121: 147, 1122: 150, 1123: 153, 1124: 156, 1125: 158, 1126: 159, 1129: 168, 1130: 166, 1131: 164, 1132: 161, 1133: 176, 1134: 177, 1135: 180, 1136: 181, 1137: 183, 1138: 184, 1139: 185, 1140: 187, 1142: 198, 1143: 193, 1144: 191, 1148: 203, 1149: 204, 1150: 206, 1151: 207, 1152: 208, 1153: 210, 1154: 211, 1155: 213, 1156: 214, 1157: 215, 1158: 217, 1159: 225, 1160: 223, 1161: 222, 1162: 219, 1163: 218, 1167: 232, 1168: 234, 1169: 237, 1170: 238, 1171: 240, 1172: 241, 1173: 243, 1174: 244, 1177: 257, 1178: 256, 1179: 255, 1180: 253, 1181: 252, 1182: 250, 1185: 262, 1186: 264, 1187: 265, 1188: 267, 1189: 268, 1190: 270, 1191: 271, 1192: 273, 1193: 274, 1194: 275, 1197: 282, 1198: 279, 1199: 278, 1200: 276, 1202: 292, 1203: 295, 1204: 296, 1205: 299, 1206: 304, 1208: 315, 1209: 314, 1210: 310, 1211: 309, 1212: 308, 1213: 307, 1214: 306, 1218: 319, 1219: 320, 1220: 322, 1221: 324, 1222: 325, 1223: 326, 1224: 327, 1225: 330, 1226: 333, 1229: 338, 1230: 337, 1231: 336, 1232: 335, 1233: 334, 1236: 349, 1237: 350, 1238: 351, 1239: 352, 1240: 355, 1241: 357, 1242: 360, 1243: 371, 1244: 369, 1245: 366, 1246: 364, 1247: 377, 1248: 378, 1249: 380, 1250: 382, 1251: 385, 1252: 386, 1253: 388, 1254: 391, 1258: 401, 1259: 397, 1260: 396, 1261: 393, 1262: 392, 1264: 406, 1265: 408, 1266: 413, 1267: 414, 1268: 416, 1269: 418, 1270: 420, 1272: 431, 1273: 430, 1274: 429, 1275: 428, 1276: 426, 1277: 424, 1278: 423, 1282: 437, 1283: 442, 1284: 443, 1285: 445, 1287: 452, 1288: 450, 1290: 464, 1291: 465, 1292: 469, 1293: 471, 1294: 473, 1295: 474, 1296: 476, 1297: 478 }, + '11-8': { 843: 2, 844: 4, 845: 5, 846: 6, 847: 7, 848: 9, 849: 11, 850: 12, 851: 14, 852: 17, 853: 25, 854: 24, 855: 23, 856: 19, 857: 18, 858: 35, 859: 36, 860: 37, 861: 39, 862: 42, 863: 48, 864: 49, 865: 50, 866: 52, 867: 64, 868: 63, 869: 60, 870: 59, 871: 58, 872: 57, 873: 56, 874: 73, 875: 74, 876: 76, 877: 77, 878: 79, 879: 80, 880: 82, 881: 86, 882: 98, 883: 96, 884: 94, 885: 93, 886: 91, 887: 90, 888: 89, 889: 88, 890: 105, 891: 106, 892: 109, 893: 110, 894: 113, 895: 117, 896: 119, 897: 120, 898: 121, 899: 134, 900: 133, 901: 132, 902: 131, 903: 129, 904: 127, 905: 126, 906: 142, 907: 146, 908: 149, 909: 153, 910: 155, 911: 156, 912: 157, 913: 170, 914: 169, 915: 167, 916: 164, 917: 163, 918: 176, 919: 178, 920: 179, 921: 182, 922: 185, 923: 188, 924: 189, 925: 191, 926: 203, 927: 200, 928: 198, 929: 197, 930: 196, 931: 194, 932: 210, 933: 212, 934: 215, 935: 218, 936: 221, 937: 227, 938: 240, 939: 239, 940: 238, 941: 236, 942: 235, 943: 232, 944: 230, 945: 245, 946: 246, 947: 248, 948: 249, 949: 252, 950: 253, 951: 255, 952: 256, 953: 257, 954: 258, 955: 260, 956: 262, 957: 274, 958: 273, 959: 272, 960: 266, 961: 282, 962: 289, 963: 290, 964: 292, 965: 293, 966: 296, 967: 311, 968: 310, 969: 309, 970: 308, 971: 306, 972: 299, 973: 315, 974: 320, 975: 321, 976: 323, 977: 325, 978: 326, 979: 328, 980: 329, 981: 330, 982: 331, 983: 332, 984: 347, 985: 346, 986: 345, 987: 341, 988: 340, 989: 338, 990: 336, 991: 335, 992: 334, 993: 333, 994: 352, 995: 354, 996: 356, 997: 357, 998: 360, 999: 362, 1000: 363, 1088: 0, 1089: 1, 1090: 3, 1091: 8, 1092: 10, 1093: 13, 1094: 15, 1095: 16, 1096: 30, 1097: 29, 1098: 28, 1099: 26, 1100: 22, 1101: 21, 1102: 20, 1103: 38, 1104: 40, 1105: 41, 1106: 43, 1107: 44, 1108: 45, 1109: 46, 1110: 47, 1111: 51, 1112: 69, 1113: 67, 1114: 66, 1115: 65, 1116: 62, 1117: 55, 1118: 54, 1119: 70, 1120: 71, 1121: 72, 1122: 75, 1123: 78, 1124: 81, 1125: 83, 1126: 84, 1127: 85, 1128: 87, 1129: 99, 1130: 97, 1131: 95, 1132: 92, 1133: 107, 1134: 108, 1135: 111, 1136: 112, 1137: 114, 1138: 115, 1139: 116, 1140: 118, 1141: 122, 1142: 135, 1143: 130, 1144: 128, 1145: 125, 1146: 124, 1147: 123, 1148: 140, 1149: 141, 1150: 143, 1151: 144, 1152: 145, 1153: 147, 1154: 148, 1155: 150, 1156: 151, 1157: 152, 1158: 154, 1159: 168, 1160: 166, 1161: 165, 1162: 162, 1163: 161, 1164: 160, 1165: 159, 1166: 158, 1167: 175, 1168: 177, 1169: 180, 1170: 181, 1171: 183, 1172: 184, 1173: 186, 1174: 187, 1175: 190, 1176: 192, 1177: 206, 1178: 205, 1179: 204, 1180: 202, 1181: 201, 1182: 199, 1183: 195, 1184: 193, 1185: 211, 1186: 213, 1187: 214, 1188: 216, 1189: 217, 1190: 219, 1191: 220, 1192: 222, 1193: 223, 1194: 224, 1195: 225, 1196: 226, 1197: 237, 1198: 234, 1199: 233, 1200: 231, 1201: 229, 1202: 247, 1203: 250, 1204: 251, 1205: 254, 1206: 259, 1207: 261, 1208: 276, 1209: 275, 1210: 271, 1211: 270, 1212: 269, 1213: 268, 1214: 267, 1215: 265, 1216: 264, 1217: 263, 1218: 280, 1219: 281, 1220: 283, 1221: 285, 1222: 286, 1223: 287, 1224: 288, 1225: 291, 1226: 294, 1227: 295, 1228: 297, 1229: 305, 1230: 304, 1231: 303, 1232: 302, 1233: 301, 1234: 300, 1235: 298, 1236: 316, 1237: 317, 1238: 318, 1239: 319, 1240: 322, 1241: 324, 1242: 327, 1243: 344, 1244: 342, 1245: 339, 1246: 337, 1247: 350, 1248: 351, 1249: 353, 1250: 355, 1251: 358, 1252: 359, 1253: 361, 1254: 364, 1255: 365, 1256: 366, 1257: 367 }, + '11-9': { 843: 2, 844: 4, 845: 5, 846: 6, 847: 7, 848: 9, 849: 11, 850: 12, 851: 14, 853: 19, 854: 18, 855: 17, 858: 29, 859: 30, 860: 31, 861: 33, 862: 36, 863: 42, 864: 43, 867: 52, 868: 51, 869: 48, 870: 47, 871: 46, 872: 45, 873: 44, 874: 61, 875: 62, 876: 64, 877: 65, 878: 67, 879: 68, 880: 70, 882: 80, 883: 78, 884: 76, 885: 75, 886: 73, 890: 87, 891: 88, 892: 91, 893: 92, 894: 95, 895: 99, 896: 101, 899: 110, 900: 109, 901: 108, 902: 107, 903: 105, 904: 103, 905: 102, 906: 118, 907: 122, 908: 125, 909: 129, 913: 140, 914: 139, 915: 137, 916: 134, 917: 133, 918: 146, 919: 148, 920: 149, 921: 152, 922: 155, 923: 158, 924: 159, 926: 167, 927: 164, 928: 162, 929: 161, 930: 160, 932: 174, 933: 176, 934: 179, 935: 182, 936: 185, 938: 198, 939: 197, 940: 196, 941: 194, 942: 193, 943: 190, 945: 203, 946: 204, 947: 206, 948: 207, 949: 210, 950: 211, 951: 213, 952: 214, 953: 215, 954: 216, 957: 226, 958: 225, 959: 224, 960: 218, 961: 234, 962: 241, 963: 242, 964: 244, 965: 245, 967: 257, 968: 256, 969: 255, 970: 254, 971: 252, 973: 261, 974: 266, 975: 267, 976: 269, 977: 271, 978: 272, 979: 274, 980: 275, 984: 287, 985: 286, 986: 285, 987: 281, 988: 280, 989: 278, 990: 276, 994: 292, 995: 294, 996: 296, 997: 297, 998: 300, 999: 302, 1000: 303, 1088: 0, 1089: 1, 1090: 3, 1091: 8, 1092: 10, 1093: 13, 1096: 24, 1097: 23, 1098: 22, 1099: 20, 1100: 16, 1101: 15, 1103: 32, 1104: 34, 1105: 35, 1106: 37, 1107: 38, 1108: 39, 1109: 40, 1110: 41, 1112: 57, 1113: 55, 1114: 54, 1115: 53, 1116: 50, 1119: 58, 1120: 59, 1121: 60, 1122: 63, 1123: 66, 1124: 69, 1125: 71, 1126: 72, 1129: 81, 1130: 79, 1131: 77, 1132: 74, 1133: 89, 1134: 90, 1135: 93, 1136: 94, 1137: 96, 1138: 97, 1139: 98, 1140: 100, 1142: 111, 1143: 106, 1144: 104, 1148: 116, 1149: 117, 1150: 119, 1151: 120, 1152: 121, 1153: 123, 1154: 124, 1155: 126, 1156: 127, 1157: 128, 1158: 130, 1159: 138, 1160: 136, 1161: 135, 1162: 132, 1163: 131, 1167: 145, 1168: 147, 1169: 150, 1170: 151, 1171: 153, 1172: 154, 1173: 156, 1174: 157, 1177: 170, 1178: 169, 1179: 168, 1180: 166, 1181: 165, 1182: 163, 1185: 175, 1186: 177, 1187: 178, 1188: 180, 1189: 181, 1190: 183, 1191: 184, 1192: 186, 1193: 187, 1194: 188, 1197: 195, 1198: 192, 1199: 191, 1200: 189, 1202: 205, 1203: 208, 1204: 209, 1205: 212, 1206: 217, 1208: 228, 1209: 227, 1210: 223, 1211: 222, 1212: 221, 1213: 220, 1214: 219, 1218: 232, 1219: 233, 1220: 235, 1221: 237, 1222: 238, 1223: 239, 1224: 240, 1225: 243, 1226: 246, 1229: 251, 1230: 250, 1231: 249, 1232: 248, 1233: 247, 1236: 262, 1237: 263, 1238: 264, 1239: 265, 1240: 268, 1241: 270, 1242: 273, 1243: 284, 1244: 282, 1245: 279, 1246: 277, 1247: 290, 1248: 291, 1249: 293, 1250: 295, 1251: 298, 1252: 299, 1253: 301, 1254: 304 }, + }, +}; + +/** + * Get LED placements for a specific board layout and size. + * Returns a Record mapping placementId to LED position. + */ +export const getLedPlacements = ( + boardName: BoardName, + layoutId: number, + sizeId: number +): Record => { + const key = `${layoutId}-${sizeId}`; + return LED_PLACEMENTS[boardName]?.[key] ?? {}; +}; diff --git a/packages/backend/src/data/product-sizes-data.ts b/packages/backend/src/data/product-sizes-data.ts new file mode 100644 index 00000000..93a35deb --- /dev/null +++ b/packages/backend/src/data/product-sizes-data.ts @@ -0,0 +1,476 @@ +/** + * ⚠️ DO NOT EDIT THIS FILE MANUALLY ⚠️ + * + * This file is auto-generated by running: + * npx tsx scripts/generate-size-edges.ts + * + * Hardcoded board configuration data for each board type. + * These values are static (board configurations don't change) so we hardcode them + * to eliminate database queries. + * + * Includes: product sizes, layouts, sets, image filenames, hole placements. + * LED placements are in a separate file (led-placements-data.ts) for code-splitting. + * + * Generated at: 2025-12-29T01:39:48.090Z + */ + +import type { + BoardName, + BoardDetails, + ImageFileName, + SetIdList, + ProductSizeData, + LayoutData, + SetData, + SizeEdges, + HoldTuple, + HoldRenderData, +} from './types.js'; +import { BOARD_IMAGE_DIMENSIONS } from './board-data.js'; + +// Re-export types for consumers +export type { ProductSizeData, LayoutData, SetData, SizeEdges, HoldTuple }; + +export const PRODUCT_SIZES: Record> = { + kilter: { + 7: { id: 7, name: '12 x 14', description: 'Commerical', edgeLeft: 0, edgeRight: 144, edgeBottom: 0, edgeTop: 180, productId: 1 }, + 8: { id: 8, name: '8 x 12', description: 'Home', edgeLeft: 24, edgeRight: 120, edgeBottom: 0, edgeTop: 156, productId: 1 }, + 10: { id: 10, name: '12 x 12 with kickboard', description: 'Square', edgeLeft: 0, edgeRight: 144, edgeBottom: 0, edgeTop: 156, productId: 1 }, + 11: { id: 11, name: 'Full Wall', description: '', edgeLeft: 0, edgeRight: 210, edgeBottom: 0, edgeTop: 116, productId: 2 }, + 12: { id: 12, name: '5 Holds', description: '4 bolt-ons + 1 screw-on', edgeLeft: -8, edgeRight: 8, edgeBottom: 0, edgeTop: 16, productId: 3 }, + 13: { id: 13, name: '10 x 10', description: '', edgeLeft: -60, edgeRight: 60, edgeBottom: -12, edgeTop: 120, productId: 4 }, + 14: { id: 14, name: '7 x 10', description: 'Small', edgeLeft: 28, edgeRight: 116, edgeBottom: 36, edgeTop: 156, productId: 1 }, + 15: { id: 15, name: 'Spire', description: '', edgeLeft: 0, edgeRight: 128, edgeBottom: -16, edgeTop: 280, productId: 5 }, + 16: { id: 16, name: 'Full', description: '', edgeLeft: 0, edgeRight: 198, edgeBottom: 0, edgeTop: 300, productId: 6 }, + 17: { id: 17, name: '7x10', description: 'Full Ride LED Kit', edgeLeft: -44, edgeRight: 44, edgeBottom: 24, edgeTop: 144, productId: 7 }, + 18: { id: 18, name: '7x10', description: 'Mainline LED Kit', edgeLeft: -44, edgeRight: 44, edgeBottom: 24, edgeTop: 144, productId: 7 }, + 19: { id: 19, name: '7x10', description: 'Auxiliary LED Kit', edgeLeft: -44, edgeRight: 44, edgeBottom: 24, edgeTop: 144, productId: 7 }, + 20: { id: 20, name: '10 x 12', description: '', edgeLeft: -60, edgeRight: 60, edgeBottom: -12, edgeTop: 144, productId: 4 }, + 21: { id: 21, name: '10x10', description: 'Full Ride LED Kit', edgeLeft: -56, edgeRight: 56, edgeBottom: 24, edgeTop: 144, productId: 7 }, + 22: { id: 22, name: '10x10', description: 'Mainline LED Kit', edgeLeft: -56, edgeRight: 56, edgeBottom: 24, edgeTop: 144, productId: 7 }, + 23: { id: 23, name: '8x12', description: 'Full Ride LED Kit', edgeLeft: -44, edgeRight: 44, edgeBottom: -12, edgeTop: 144, productId: 7 }, + 24: { id: 24, name: '8x12', description: 'Mainline LED Kit', edgeLeft: -44, edgeRight: 44, edgeBottom: -12, edgeTop: 144, productId: 7 }, + 25: { id: 25, name: '10x12', description: 'Full Ride LED Kit', edgeLeft: -56, edgeRight: 56, edgeBottom: -12, edgeTop: 144, productId: 7 }, + 26: { id: 26, name: '10x12', description: 'Mainline LED Kit', edgeLeft: -56, edgeRight: 56, edgeBottom: -12, edgeTop: 144, productId: 7 }, + 27: { id: 27, name: '12 x 12 without kickboard', description: 'Square', edgeLeft: 0, edgeRight: 144, edgeBottom: 12, edgeTop: 156, productId: 1 }, + 28: { id: 28, name: '16 x 12', description: 'Super Wide', edgeLeft: -24, edgeRight: 168, edgeBottom: 0, edgeTop: 156, productId: 1 }, + 29: { id: 29, name: '10x10', description: 'Auxiliary LED Kit', edgeLeft: -56, edgeRight: 56, edgeBottom: 24, edgeTop: 144, productId: 7 }, + }, + tension: { + 1: { id: 1, name: 'Full Wall', description: 'Rows: KB1, KB2, 1-18 Columns: A-K', edgeLeft: 0, edgeRight: 96, edgeBottom: 0, edgeTop: 156, productId: 4 }, + 2: { id: 2, name: 'Half Kickboard', description: 'Rows: KB2, 1-18 Columns: A-K', edgeLeft: 0, edgeRight: 96, edgeBottom: 4, edgeTop: 156, productId: 4 }, + 3: { id: 3, name: 'No Kickboard', description: 'Rows: 1-18 Columns: A-K', edgeLeft: 0, edgeRight: 96, edgeBottom: 8, edgeTop: 156, productId: 4 }, + 4: { id: 4, name: 'Short', description: 'Rows: 1-15 Columns: A-K', edgeLeft: 0, edgeRight: 96, edgeBottom: 8, edgeTop: 132, productId: 4 }, + 5: { id: 5, name: 'Short & Narrow', description: 'Rows: 1-15 Columns: B.5-I.5', edgeLeft: 16, edgeRight: 80, edgeBottom: 8, edgeTop: 132, productId: 4 }, + 6: { id: 6, name: '12 high x 12 wide', description: '', edgeLeft: -68, edgeRight: 68, edgeBottom: 0, edgeTop: 144, productId: 5 }, + 7: { id: 7, name: '10 high x 12 wide', description: '', edgeLeft: -68, edgeRight: 68, edgeBottom: 0, edgeTop: 120, productId: 5 }, + 8: { id: 8, name: '12 high x 8 wide', description: '', edgeLeft: -44, edgeRight: 44, edgeBottom: 0, edgeTop: 144, productId: 5 }, + 9: { id: 9, name: '10 high x 8 wide', description: '', edgeLeft: -44, edgeRight: 44, edgeBottom: 0, edgeTop: 120, productId: 5 }, + }, +}; + +export const LAYOUTS: Record> = { + kilter: { + 1: { id: 1, name: 'Kilter Board Original', productId: 1 }, + 8: { id: 8, name: 'Kilter Board Homewall', productId: 7 }, + }, + tension: { + 9: { id: 9, name: 'Original Layout', productId: 4 }, + 10: { id: 10, name: 'Tension Board 2 Mirror', productId: 5 }, + 11: { id: 11, name: 'Tension Board 2 Spray', productId: 5 }, + }, +}; + +// Sets indexed by "layoutId-sizeId" key +export const SETS: Record> = { + kilter: { + '1-7': [{ id: 1, name: 'Bolt Ons' }, { id: 20, name: 'Screw Ons' }], + '1-8': [{ id: 1, name: 'Bolt Ons' }, { id: 20, name: 'Screw Ons' }], + '1-10': [{ id: 1, name: 'Bolt Ons' }, { id: 20, name: 'Screw Ons' }], + '1-14': [{ id: 1, name: 'Bolt Ons' }, { id: 20, name: 'Screw Ons' }], + '1-27': [{ id: 1, name: 'Bolt Ons' }, { id: 20, name: 'Screw Ons' }], + '1-28': [{ id: 1, name: 'Bolt Ons' }, { id: 20, name: 'Screw Ons' }], + '2-11': [{ id: 21, name: 'JUUL All' }], + '3-12': [{ id: 22, name: 'Demo Holds' }], + '4-13': [{ id: 23, name: 'BKB All' }], + '4-20': [{ id: 23, name: 'BKB All' }], + '5-15': [{ id: 24, name: 'Spire All' }], + '6-16': [{ id: 25, name: 'Orbit' }], + '7-16': [{ id: 25, name: 'Orbit' }], + '8-17': [{ id: 26, name: 'Mainline' }, { id: 27, name: 'Auxiliary' }], + '8-18': [{ id: 26, name: 'Mainline' }], + '8-19': [{ id: 27, name: 'Auxiliary' }], + '8-21': [{ id: 26, name: 'Mainline' }, { id: 27, name: 'Auxiliary' }], + '8-22': [{ id: 26, name: 'Mainline' }], + '8-23': [{ id: 26, name: 'Mainline' }, { id: 27, name: 'Auxiliary' }, { id: 28, name: 'Mainline Kickboard' }, { id: 29, name: 'Auxiliary Kickboard' }], + '8-24': [{ id: 26, name: 'Mainline' }, { id: 28, name: 'Mainline Kickboard' }, { id: 29, name: 'Auxiliary Kickboard' }], + '8-25': [{ id: 26, name: 'Mainline' }, { id: 27, name: 'Auxiliary' }, { id: 28, name: 'Mainline Kickboard' }, { id: 29, name: 'Auxiliary Kickboard' }], + '8-26': [{ id: 26, name: 'Mainline' }, { id: 28, name: 'Mainline Kickboard' }, { id: 29, name: 'Auxiliary Kickboard' }], + '8-29': [{ id: 27, name: 'Auxiliary' }], + }, + tension: { + '9-1': [{ id: 8, name: 'Set A' }, { id: 9, name: 'Set B' }, { id: 10, name: 'Set C' }, { id: 11, name: 'Foot Set' }], + '9-2': [{ id: 8, name: 'Set A' }, { id: 9, name: 'Set B' }, { id: 10, name: 'Set C' }, { id: 11, name: 'Foot Set' }], + '9-3': [{ id: 8, name: 'Set A' }, { id: 9, name: 'Set B' }, { id: 10, name: 'Set C' }, { id: 11, name: 'Foot Set' }], + '9-4': [{ id: 8, name: 'Set A' }, { id: 9, name: 'Set B' }, { id: 10, name: 'Set C' }, { id: 11, name: 'Foot Set' }], + '9-5': [{ id: 8, name: 'Set A' }, { id: 9, name: 'Set B' }, { id: 10, name: 'Set C' }, { id: 11, name: 'Foot Set' }], + '10-6': [{ id: 12, name: 'Wood' }, { id: 13, name: 'Plastic' }], + '10-7': [{ id: 12, name: 'Wood' }, { id: 13, name: 'Plastic' }], + '10-8': [{ id: 12, name: 'Wood' }, { id: 13, name: 'Plastic' }], + '10-9': [{ id: 12, name: 'Wood' }, { id: 13, name: 'Plastic' }], + '11-6': [{ id: 12, name: 'Wood' }, { id: 13, name: 'Plastic' }], + '11-7': [{ id: 12, name: 'Wood' }, { id: 13, name: 'Plastic' }], + '11-8': [{ id: 12, name: 'Wood' }, { id: 13, name: 'Plastic' }], + '11-9': [{ id: 12, name: 'Wood' }, { id: 13, name: 'Plastic' }], + }, +}; + +// Image filenames indexed by "layoutId-sizeId-setId" key +export const IMAGE_FILENAMES: Record> = { + kilter: { + '1-7-1': 'product_sizes_layouts_sets/36-1.png', + '1-7-20': 'product_sizes_layouts_sets/38-1.png', + '1-8-1': 'product_sizes_layouts_sets/39-1.png', + '1-8-20': 'product_sizes_layouts_sets/41-1.png', + '1-10-1': 'product_sizes_layouts_sets/45-1.png', + '1-10-20': 'product_sizes_layouts_sets/46-1.png', + '1-14-1': 'product_sizes_layouts_sets/50-1.png', + '1-14-20': 'product_sizes_layouts_sets/51-1.png', + '1-27-1': 'product_sizes_layouts_sets/77-1.png', + '1-27-20': 'product_sizes_layouts_sets/78-1.png', + '1-28-1': 'product_sizes_layouts_sets/original-16x12-bolt-ons-v2.png', + '1-28-20': 'product_sizes_layouts_sets/original-16x12-screw-ons-v2.png', + '2-11-21': 'product_sizes_layouts_sets/47.png', + '3-12-22': 'product_sizes_layouts_sets/48.png', + '4-13-23': 'product_sizes_layouts_sets/49.png', + '4-20-23': 'product_sizes_layouts_sets/59.png', + '5-15-24': 'product_sizes_layouts_sets/15_5_24.png', + '6-16-25': 'product_sizes_layouts_sets/53.png', + '7-16-25': 'product_sizes_layouts_sets/54.png', + '8-17-26': 'product_sizes_layouts_sets/55-v2.png', + '8-17-27': 'product_sizes_layouts_sets/56-v3.png', + '8-18-26': 'product_sizes_layouts_sets/55-v2.png', + '8-19-27': 'product_sizes_layouts_sets/56-v3.png', + '8-21-26': 'product_sizes_layouts_sets/60-v3.png', + '8-21-27': 'product_sizes_layouts_sets/61-v3.png', + '8-22-26': 'product_sizes_layouts_sets/60-v3.png', + '8-23-26': 'product_sizes_layouts_sets/63-v3.png', + '8-23-27': 'product_sizes_layouts_sets/64-v3.png', + '8-23-28': 'product_sizes_layouts_sets/65-v2.png', + '8-23-29': 'product_sizes_layouts_sets/66-v2.png', + '8-24-26': 'product_sizes_layouts_sets/63-v3.png', + '8-24-28': 'product_sizes_layouts_sets/65-v2.png', + '8-24-29': 'product_sizes_layouts_sets/66-v2.png', + '8-25-26': 'product_sizes_layouts_sets/70-v2.png', + '8-25-27': 'product_sizes_layouts_sets/71-v3.png', + '8-25-28': 'product_sizes_layouts_sets/72.png', + '8-25-29': 'product_sizes_layouts_sets/73.png', + '8-26-26': 'product_sizes_layouts_sets/70-v2.png', + '8-26-28': 'product_sizes_layouts_sets/72.png', + '8-26-29': 'product_sizes_layouts_sets/73.png', + '8-29-27': 'product_sizes_layouts_sets/61-v3.png', + }, + tension: { + '9-1-8': 'product_sizes_layouts_sets/1.png', + '9-1-9': 'product_sizes_layouts_sets/2.png', + '9-1-10': 'product_sizes_layouts_sets/3.png', + '9-1-11': 'product_sizes_layouts_sets/4.png', + '9-2-8': 'product_sizes_layouts_sets/5.png', + '9-2-9': 'product_sizes_layouts_sets/6.png', + '9-2-10': 'product_sizes_layouts_sets/7.png', + '9-2-11': 'product_sizes_layouts_sets/8.png', + '9-3-8': 'product_sizes_layouts_sets/9.png', + '9-3-9': 'product_sizes_layouts_sets/10.png', + '9-3-10': 'product_sizes_layouts_sets/11.png', + '9-3-11': 'product_sizes_layouts_sets/12.png', + '9-4-8': 'product_sizes_layouts_sets/13.png', + '9-4-9': 'product_sizes_layouts_sets/14.png', + '9-4-10': 'product_sizes_layouts_sets/15.png', + '9-4-11': 'product_sizes_layouts_sets/16.png', + '9-5-8': 'product_sizes_layouts_sets/17.png', + '9-5-9': 'product_sizes_layouts_sets/18.png', + '9-5-10': 'product_sizes_layouts_sets/19.png', + '9-5-11': 'product_sizes_layouts_sets/20.png', + '10-6-12': 'product_sizes_layouts_sets/21-2.png', + '10-6-13': 'product_sizes_layouts_sets/22-2.png', + '10-7-12': 'product_sizes_layouts_sets/23.png', + '10-7-13': 'product_sizes_layouts_sets/24-2.png', + '10-8-12': 'product_sizes_layouts_sets/25.png', + '10-8-13': 'product_sizes_layouts_sets/26.png', + '10-9-12': 'product_sizes_layouts_sets/27.png', + '10-9-13': 'product_sizes_layouts_sets/28.png', + '11-6-12': 'product_sizes_layouts_sets/12x12-tb2-wood.png', + '11-6-13': 'product_sizes_layouts_sets/12x12-tb2-plastic.png', + '11-7-12': 'product_sizes_layouts_sets/12x10-tb2-wood.png', + '11-7-13': 'product_sizes_layouts_sets/12x10-tb2-plastic.png', + '11-8-12': 'product_sizes_layouts_sets/8x12-tb2-wood.png', + '11-8-13': 'product_sizes_layouts_sets/8x12-tb2-plastic.png', + '11-9-12': 'product_sizes_layouts_sets/8x10-tb2-wood.png', + '11-9-13': 'product_sizes_layouts_sets/8x10-tb2-plastic.png', + }, +}; + +// Hole placements indexed by "layoutId-setId" key, value is array of HoldTuples +export const HOLE_PLACEMENTS: Record> = { + kilter: { + '1-1': [[1073, null, 136, 8], [1074, null, 128, 8], [1075, null, 120, 8], [1076, null, 112, 8], [1077, null, 104, 8], [1078, null, 96, 8], [1079, null, 88, 8], [1080, null, 80, 8], [1081, null, 72, 8], [1082, null, 64, 8], [1083, null, 56, 8], [1084, null, 48, 8], [1085, null, 40, 8], [1086, null, 32, 8], [1087, null, 24, 8], [1088, null, 16, 8], [1089, null, 8, 8], [1090, null, 8, 16], [1091, null, 16, 16], [1092, null, 24, 16], [1093, null, 32, 16], [1094, null, 40, 16], [1095, null, 48, 16], [1096, null, 56, 16], [1097, null, 64, 16], [1098, null, 72, 16], [1099, null, 80, 16], [1100, null, 88, 16], [1101, null, 96, 16], [1102, null, 104, 16], [1103, null, 112, 16], [1104, null, 120, 16], [1105, null, 128, 16], [1106, null, 136, 16], [1107, null, 8, 24], [1108, null, 16, 24], [1109, null, 24, 24], [1110, null, 32, 24], [1111, null, 40, 24], [1112, null, 48, 24], [1113, null, 56, 24], [1114, null, 64, 24], [1115, null, 72, 24], [1116, null, 80, 24], [1117, null, 88, 24], [1118, null, 96, 24], [1119, null, 104, 24], [1120, null, 112, 24], [1121, null, 120, 24], [1122, null, 128, 24], [1123, null, 136, 24], [1124, null, 8, 32], [1125, null, 16, 32], [1126, null, 24, 32], [1127, null, 32, 32], [1128, null, 40, 32], [1129, null, 48, 32], [1130, null, 56, 32], [1131, null, 64, 32], [1132, null, 72, 32], [1133, null, 80, 32], [1134, null, 88, 32], [1135, null, 96, 32], [1136, null, 104, 32], [1137, null, 112, 32], [1138, null, 120, 32], [1139, null, 128, 32], [1140, null, 136, 32], [1141, null, 8, 40], [1142, null, 16, 40], [1143, null, 24, 40], [1144, null, 32, 40], [1145, null, 40, 40], [1146, null, 48, 40], [1147, null, 56, 40], [1148, null, 64, 40], [1149, null, 72, 40], [1150, null, 80, 40], [1151, null, 88, 40], [1152, null, 96, 40], [1153, null, 104, 40], [1154, null, 112, 40], [1155, null, 120, 40], [1156, null, 128, 40], [1157, null, 136, 40], [1158, null, 8, 48], [1159, null, 16, 48], [1160, null, 24, 48], [1161, null, 32, 48], [1162, null, 40, 48], [1163, null, 48, 48], [1164, null, 56, 48], [1165, null, 64, 48], [1166, null, 72, 48], [1167, null, 80, 48], [1168, null, 88, 48], [1169, null, 96, 48], [1170, null, 104, 48], [1171, null, 112, 48], [1172, null, 120, 48], [1173, null, 128, 48], [1174, null, 136, 48], [1175, null, 8, 56], [1176, null, 16, 56], [1177, null, 24, 56], [1178, null, 32, 56], [1179, null, 40, 56], [1180, null, 48, 56], [1181, null, 56, 56], [1182, null, 64, 56], [1183, null, 72, 56], [1184, null, 80, 56], [1185, null, 88, 56], [1186, null, 96, 56], [1187, null, 104, 56], [1188, null, 112, 56], [1189, null, 120, 56], [1190, null, 128, 56], [1191, null, 136, 56], [1192, null, 8, 64], [1193, null, 16, 64], [1194, null, 24, 64], [1195, null, 32, 64], [1196, null, 40, 64], [1197, null, 48, 64], [1198, null, 56, 64], [1199, null, 64, 64], [1200, null, 72, 64], [1201, null, 80, 64], [1202, null, 88, 64], [1203, null, 96, 64], [1204, null, 104, 64], [1205, null, 112, 64], [1206, null, 120, 64], [1207, null, 128, 64], [1208, null, 136, 64], [1209, null, 8, 72], [1210, null, 16, 72], [1211, null, 24, 72], [1212, null, 32, 72], [1213, null, 40, 72], [1214, null, 48, 72], [1215, null, 56, 72], [1216, null, 64, 72], [1217, null, 72, 72], [1218, null, 80, 72], [1219, null, 88, 72], [1220, null, 96, 72], [1221, null, 104, 72], [1222, null, 112, 72], [1223, null, 120, 72], [1224, null, 128, 72], [1225, null, 136, 72], [1226, null, 8, 80], [1227, null, 16, 80], [1228, null, 24, 80], [1229, null, 32, 80], [1230, null, 40, 80], [1231, null, 48, 80], [1232, null, 56, 80], [1233, null, 64, 80], [1234, null, 72, 80], [1235, null, 80, 80], [1236, null, 88, 80], [1237, null, 96, 80], [1238, null, 104, 80], [1239, null, 112, 80], [1240, null, 120, 80], [1241, null, 128, 80], [1242, null, 136, 80], [1243, null, 8, 88], [1244, null, 16, 88], [1245, null, 24, 88], [1246, null, 32, 88], [1247, null, 40, 88], [1248, null, 48, 88], [1249, null, 56, 88], [1250, null, 64, 88], [1251, null, 72, 88], [1252, null, 80, 88], [1253, null, 88, 88], [1254, null, 96, 88], [1255, null, 104, 88], [1256, null, 112, 88], [1257, null, 120, 88], [1258, null, 128, 88], [1259, null, 136, 88], [1260, null, 8, 96], [1261, null, 16, 96], [1262, null, 24, 96], [1263, null, 32, 96], [1264, null, 40, 96], [1265, null, 48, 96], [1266, null, 56, 96], [1267, null, 64, 96], [1268, null, 72, 96], [1269, null, 80, 96], [1270, null, 88, 96], [1271, null, 96, 96], [1272, null, 104, 96], [1273, null, 112, 96], [1274, null, 120, 96], [1275, null, 128, 96], [1276, null, 136, 96], [1277, null, 8, 104], [1278, null, 16, 104], [1279, null, 24, 104], [1280, null, 32, 104], [1281, null, 40, 104], [1282, null, 48, 104], [1283, null, 56, 104], [1284, null, 64, 104], [1285, null, 72, 104], [1286, null, 80, 104], [1287, null, 88, 104], [1288, null, 96, 104], [1289, null, 104, 104], [1290, null, 112, 104], [1291, null, 120, 104], [1292, null, 128, 104], [1293, null, 136, 104], [1294, null, 8, 112], [1295, null, 16, 112], [1296, null, 24, 112], [1297, null, 32, 112], [1298, null, 40, 112], [1299, null, 48, 112], [1300, null, 56, 112], [1301, null, 64, 112], [1302, null, 72, 112], [1303, null, 80, 112], [1304, null, 88, 112], [1305, null, 96, 112], [1306, null, 104, 112], [1307, null, 112, 112], [1308, null, 120, 112], [1309, null, 128, 112], [1310, null, 136, 112], [1311, null, 8, 120], [1312, null, 16, 120], [1313, null, 24, 120], [1314, null, 32, 120], [1315, null, 40, 120], [1316, null, 48, 120], [1317, null, 56, 120], [1318, null, 64, 120], [1319, null, 72, 120], [1320, null, 80, 120], [1321, null, 88, 120], [1322, null, 96, 120], [1323, null, 104, 120], [1324, null, 112, 120], [1325, null, 120, 120], [1326, null, 128, 120], [1327, null, 136, 120], [1328, null, 8, 128], [1329, null, 16, 128], [1330, null, 24, 128], [1331, null, 32, 128], [1332, null, 40, 128], [1333, null, 48, 128], [1334, null, 56, 128], [1335, null, 64, 128], [1336, null, 72, 128], [1337, null, 80, 128], [1338, null, 88, 128], [1339, null, 96, 128], [1340, null, 104, 128], [1341, null, 112, 128], [1342, null, 120, 128], [1343, null, 128, 128], [1344, null, 136, 128], [1345, null, 8, 136], [1346, null, 16, 136], [1347, null, 24, 136], [1348, null, 32, 136], [1349, null, 40, 136], [1350, null, 48, 136], [1351, null, 56, 136], [1352, null, 64, 136], [1353, null, 72, 136], [1354, null, 80, 136], [1355, null, 88, 136], [1356, null, 96, 136], [1357, null, 104, 136], [1358, null, 112, 136], [1359, null, 120, 136], [1360, null, 128, 136], [1361, null, 136, 136], [1362, null, 8, 144], [1363, null, 16, 144], [1364, null, 24, 144], [1365, null, 32, 144], [1366, null, 40, 144], [1367, null, 48, 144], [1368, null, 56, 144], [1369, null, 64, 144], [1370, null, 72, 144], [1371, null, 80, 144], [1372, null, 88, 144], [1373, null, 96, 144], [1374, null, 104, 144], [1375, null, 112, 144], [1376, null, 120, 144], [1377, null, 128, 144], [1378, null, 136, 144], [1379, null, 8, 152], [1380, null, 16, 152], [1381, null, 24, 152], [1382, null, 32, 152], [1383, null, 40, 152], [1384, null, 48, 152], [1385, null, 56, 152], [1386, null, 64, 152], [1387, null, 72, 152], [1388, null, 80, 152], [1389, null, 88, 152], [1390, null, 96, 152], [1391, null, 104, 152], [1392, null, 112, 152], [1393, null, 120, 152], [1394, null, 128, 152], [1395, null, 136, 152], [1396, null, 8, 160], [1397, null, 16, 160], [1398, null, 24, 160], [1399, null, 32, 160], [1400, null, 40, 160], [1401, null, 48, 160], [1402, null, 56, 160], [1403, null, 64, 160], [1404, null, 72, 160], [1405, null, 80, 160], [1406, null, 88, 160], [1407, null, 96, 160], [1408, null, 104, 160], [1409, null, 112, 160], [1410, null, 120, 160], [1411, null, 128, 160], [1412, null, 136, 160], [1413, null, 8, 168], [1414, null, 16, 168], [1415, null, 24, 168], [1416, null, 32, 168], [1417, null, 40, 168], [1418, null, 48, 168], [1419, null, 56, 168], [1420, null, 64, 168], [1421, null, 72, 168], [1422, null, 80, 168], [1423, null, 88, 168], [1424, null, 96, 168], [1425, null, 104, 168], [1426, null, 112, 168], [1427, null, 120, 168], [1428, null, 128, 168], [1429, null, 136, 168], [1430, null, 8, 176], [1431, null, 16, 176], [1432, null, 24, 176], [1433, null, 32, 176], [1434, null, 40, 176], [1435, null, 48, 176], [1436, null, 56, 176], [1437, null, 64, 176], [1438, null, 72, 176], [1439, null, 80, 176], [1440, null, 88, 176], [1441, null, 96, 176], [1442, null, 104, 176], [1443, null, 112, 176], [1444, null, 120, 176], [1445, null, 128, 176], [1446, null, 136, 176], [4681, null, 0, 8], [4682, null, 0, 16], [4683, null, 0, 24], [4684, null, 0, 32], [4685, null, 0, 40], [4686, null, 0, 48], [4687, null, 0, 56], [4688, null, 0, 64], [4689, null, 0, 72], [4690, null, 0, 80], [4691, null, 0, 88], [4692, null, 0, 96], [4693, null, 0, 104], [4694, null, 0, 112], [4695, null, 0, 120], [4696, null, 0, 128], [4697, null, 0, 136], [4698, null, 0, 144], [4699, null, 0, 152], [4700, null, -8, 8], [4701, null, -8, 16], [4702, null, -8, 24], [4703, null, -8, 32], [4704, null, -8, 40], [4705, null, -8, 48], [4706, null, -8, 56], [4707, null, -8, 64], [4708, null, -8, 72], [4709, null, -8, 80], [4710, null, -8, 88], [4711, null, -8, 96], [4712, null, -8, 104], [4713, null, -8, 112], [4714, null, -8, 120], [4715, null, -8, 128], [4716, null, -8, 136], [4717, null, -8, 144], [4718, null, -8, 152], [4719, null, -16, 8], [4720, null, -16, 16], [4721, null, -16, 24], [4722, null, -16, 32], [4723, null, -16, 40], [4724, null, -16, 48], [4725, null, -16, 56], [4726, null, -16, 64], [4727, null, -16, 72], [4728, null, -16, 80], [4729, null, -16, 88], [4730, null, -16, 96], [4731, null, -16, 104], [4732, null, -16, 112], [4733, null, -16, 120], [4734, null, -16, 128], [4735, null, -16, 136], [4736, null, -16, 144], [4737, null, -16, 152], [4738, null, 144, 8], [4739, null, 144, 16], [4740, null, 144, 24], [4741, null, 144, 32], [4742, null, 144, 40], [4743, null, 144, 48], [4744, null, 144, 56], [4745, null, 144, 64], [4746, null, 144, 72], [4747, null, 144, 80], [4748, null, 144, 88], [4749, null, 144, 96], [4750, null, 144, 104], [4751, null, 144, 112], [4752, null, 144, 120], [4753, null, 144, 128], [4754, null, 144, 136], [4755, null, 144, 144], [4756, null, 144, 152], [4757, null, 152, 8], [4758, null, 152, 16], [4759, null, 152, 24], [4760, null, 152, 32], [4761, null, 152, 40], [4762, null, 152, 48], [4763, null, 152, 56], [4764, null, 152, 64], [4765, null, 152, 72], [4766, null, 152, 80], [4767, null, 152, 88], [4768, null, 152, 96], [4769, null, 152, 104], [4770, null, 152, 112], [4771, null, 152, 120], [4772, null, 152, 128], [4773, null, 152, 136], [4774, null, 152, 144], [4775, null, 152, 152], [4776, null, 160, 8], [4777, null, 160, 16], [4778, null, 160, 24], [4779, null, 160, 32], [4780, null, 160, 40], [4781, null, 160, 48], [4782, null, 160, 56], [4783, null, 160, 64], [4784, null, 160, 72], [4785, null, 160, 80], [4786, null, 160, 88], [4787, null, 160, 96], [4788, null, 160, 104], [4789, null, 160, 112], [4790, null, 160, 120], [4791, null, 160, 128], [4792, null, 160, 136], [4793, null, 160, 144], [4794, null, 160, 152]], + '1-20': [[1447, null, 140, 4], [1448, null, 132, 4], [1449, null, 124, 4], [1450, null, 116, 4], [1451, null, 108, 4], [1452, null, 100, 4], [1453, null, 92, 4], [1454, null, 84, 4], [1455, null, 76, 4], [1456, null, 68, 4], [1457, null, 60, 4], [1458, null, 52, 4], [1459, null, 44, 4], [1460, null, 36, 4], [1461, null, 28, 4], [1462, null, 20, 4], [1463, null, 12, 4], [1464, null, 4, 4], [1465, null, 4, 20], [1466, null, 20, 20], [1467, null, 36, 20], [1468, null, 52, 20], [1469, null, 68, 20], [1470, null, 84, 20], [1471, null, 100, 20], [1472, null, 116, 20], [1473, null, 132, 20], [1474, null, 12, 28], [1475, null, 28, 28], [1476, null, 44, 28], [1477, null, 60, 28], [1478, null, 76, 28], [1479, null, 92, 28], [1480, null, 108, 28], [1481, null, 124, 28], [1482, null, 140, 28], [1483, null, 4, 36], [1484, null, 20, 36], [1485, null, 36, 36], [1486, null, 52, 36], [1487, null, 68, 36], [1488, null, 84, 36], [1489, null, 100, 36], [1490, null, 116, 36], [1491, null, 132, 36], [1492, null, 12, 44], [1493, null, 28, 44], [1494, null, 44, 44], [1495, null, 60, 44], [1496, null, 76, 44], [1497, null, 92, 44], [1498, null, 108, 44], [1499, null, 124, 44], [1500, null, 140, 44], [1501, null, 4, 52], [1502, null, 20, 52], [1503, null, 36, 52], [1504, null, 52, 52], [1505, null, 68, 52], [1506, null, 84, 52], [1507, null, 100, 52], [1508, null, 116, 52], [1509, null, 132, 52], [1510, null, 12, 60], [1511, null, 28, 60], [1512, null, 44, 60], [1513, null, 60, 60], [1514, null, 76, 60], [1515, null, 92, 60], [1516, null, 108, 60], [1517, null, 124, 60], [1518, null, 140, 60], [1519, null, 4, 68], [1520, null, 20, 68], [1521, null, 36, 68], [1522, null, 52, 68], [1523, null, 68, 68], [1524, null, 84, 68], [1525, null, 100, 68], [1526, null, 116, 68], [1527, null, 132, 68], [1528, null, 12, 76], [1529, null, 28, 76], [1530, null, 44, 76], [1531, null, 60, 76], [1532, null, 76, 76], [1533, null, 92, 76], [1534, null, 108, 76], [1535, null, 124, 76], [1536, null, 140, 76], [1537, null, 4, 84], [1538, null, 20, 84], [1539, null, 36, 84], [1540, null, 52, 84], [1541, null, 68, 84], [1542, null, 84, 84], [1543, null, 100, 84], [1544, null, 116, 84], [1545, null, 132, 84], [1546, null, 12, 92], [1547, null, 28, 92], [1548, null, 44, 92], [1549, null, 60, 92], [1550, null, 76, 92], [1551, null, 92, 92], [1552, null, 108, 92], [1553, null, 124, 92], [1554, null, 140, 92], [1555, null, 4, 100], [1556, null, 20, 100], [1557, null, 36, 100], [1558, null, 52, 100], [1559, null, 68, 100], [1560, null, 84, 100], [1561, null, 100, 100], [1562, null, 116, 100], [1563, null, 132, 100], [1564, null, 12, 108], [1565, null, 28, 108], [1566, null, 44, 108], [1567, null, 60, 108], [1568, null, 76, 108], [1569, null, 92, 108], [1570, null, 108, 108], [1571, null, 124, 108], [1572, null, 140, 108], [1573, null, 4, 116], [1574, null, 20, 116], [1575, null, 36, 116], [1576, null, 52, 116], [1577, null, 68, 116], [1578, null, 84, 116], [1579, null, 100, 116], [1580, null, 116, 116], [1581, null, 132, 116], [1582, null, 12, 124], [1583, null, 28, 124], [1584, null, 44, 124], [1585, null, 60, 124], [1586, null, 76, 124], [1587, null, 92, 124], [1588, null, 108, 124], [1589, null, 124, 124], [1590, null, 140, 124], [1591, null, 4, 132], [1592, null, 20, 132], [1593, null, 36, 132], [1594, null, 52, 132], [1595, null, 68, 132], [1596, null, 84, 132], [1597, null, 100, 132], [1598, null, 116, 132], [1599, null, 132, 132], [4795, null, -4, 4], [4796, null, -12, 4], [4797, null, -20, 4], [4798, null, 148, 4], [4799, null, 156, 4], [4800, null, 164, 4], [4801, null, -12, 20], [4802, null, -20, 28], [4803, null, -4, 28], [4804, null, -12, 36], [4805, null, -20, 44], [4806, null, -4, 44], [4807, null, -12, 52], [4808, null, -20, 60], [4809, null, -4, 60], [4810, null, -12, 68], [4811, null, -20, 76], [4812, null, -4, 76], [4813, null, -12, 84], [4814, null, -20, 92], [4815, null, -4, 92], [4816, null, -12, 100], [4817, null, -20, 108], [4818, null, -4, 108], [4819, null, -12, 116], [4820, null, -20, 124], [4821, null, -4, 124], [4822, null, -12, 132], [4823, null, 148, 20], [4824, null, 164, 20], [4825, null, 156, 28], [4826, null, 148, 36], [4827, null, 164, 36], [4828, null, 156, 44], [4829, null, 148, 52], [4830, null, 164, 52], [4831, null, 156, 60], [4832, null, 148, 68], [4833, null, 164, 68], [4834, null, 156, 76], [4835, null, 148, 84], [4836, null, 164, 84], [4837, null, 156, 92], [4838, null, 148, 100], [4839, null, 164, 100], [4840, null, 156, 108], [4841, null, 148, 116], [4842, null, 164, 116], [4843, null, 156, 124], [4844, null, 148, 132], [4845, null, 164, 132]], + '2-21': [[1600, null, 6, 104], [1601, null, 6, 96], [1602, null, 10, 92], [1603, null, 6, 88], [1604, null, 10, 84], [1605, null, 6, 80], [1606, null, 10, 76], [1607, null, 6, 72], [1608, null, 10, 67], [1609, null, 13, 62], [1610, null, 7, 63], [1611, null, 10, 58], [1612, null, 16, 58], [1613, null, 13, 54], [1614, null, 7, 54], [1615, null, 10, 49], [1616, null, 16, 50], [1617, null, 13, 45], [1618, null, 7, 44], [1619, null, 10, 39], [1620, null, 16, 41], [1621, null, 13, 34], [1622, null, 7, 32], [1623, null, 10, 28], [1624, null, 16, 30], [1625, null, 19, 26], [1626, null, 13, 24], [1627, null, 7, 22], [1628, null, 10, 18], [1629, null, 16, 20], [1630, null, 22, 22], [1631, null, 19, 16], [1632, null, 13, 14], [1633, null, 7, 12], [1634, null, 10, 8], [1635, null, 16, 10], [1636, null, 22, 12], [1637, null, 29, 13], [1638, null, 37, 13], [1639, null, 45, 13], [1640, null, 53, 13], [1641, null, 61, 13], [1642, null, 69, 13], [1643, null, 77, 13], [1644, null, 85, 13], [1645, null, 93, 13], [1646, null, 101, 13], [1647, null, 109, 13], [1648, null, 117, 13], [1649, null, 125, 13], [1650, null, 133, 13], [1651, null, 141, 13], [1652, null, 149, 13], [1653, null, 157, 13], [1654, null, 165, 13], [1655, null, 173, 13], [1656, null, 181, 13], [1657, null, 177, 17], [1658, null, 169, 17], [1659, null, 161, 17], [1660, null, 153, 17], [1661, null, 145, 17], [1662, null, 137, 17], [1663, null, 129, 17], [1664, null, 121, 17], [1665, null, 113, 17], [1666, null, 105, 17], [1667, null, 97, 17], [1668, null, 89, 17], [1669, null, 81, 17], [1670, null, 73, 17], [1671, null, 65, 17], [1672, null, 57, 17], [1673, null, 49, 17], [1674, null, 41, 17], [1675, null, 33, 17], [1676, null, 29, 25], [1677, null, 37, 25], [1678, null, 45, 25], [1679, null, 53, 25], [1680, null, 61, 25], [1681, null, 69, 25], [1682, null, 77, 25], [1683, null, 85, 25], [1684, null, 93, 25], [1685, null, 101, 25], [1686, null, 105, 29], [1687, null, 97, 29], [1688, null, 89, 29], [1689, null, 81, 29], [1690, null, 73, 29], [1691, null, 65, 29], [1692, null, 57, 29], [1693, null, 49, 29], [1694, null, 41, 29], [1695, null, 33, 29], [1696, null, 29, 33], [1697, null, 37, 33], [1698, null, 45, 33], [1699, null, 53, 33], [1700, null, 61, 33], [1701, null, 69, 33], [1702, null, 65, 37], [1703, null, 57, 37], [1704, null, 49, 37], [1705, null, 41, 37], [1706, null, 33, 37], [1707, null, 29, 41], [1708, null, 37, 41], [1709, null, 45, 41], [1710, null, 53, 41], [1711, null, 61, 41], [1712, null, 69, 41], [1713, null, 65, 45], [1714, null, 57, 45], [1715, null, 49, 45], [1716, null, 41, 45], [1717, null, 33, 45], [1718, null, 29, 49], [1719, null, 37, 49], [1720, null, 45, 49], [1721, null, 53, 49], [1722, null, 61, 49], [1723, null, 69, 49], [1724, null, 65, 53], [1725, null, 57, 53], [1726, null, 49, 53], [1727, null, 41, 53], [1728, null, 33, 53], [1729, null, 29, 57], [1730, null, 37, 57], [1731, null, 45, 57], [1732, null, 53, 57], [1733, null, 61, 57], [1734, null, 65, 61], [1735, null, 57, 61], [1736, null, 49, 61], [1737, null, 41, 61], [1738, null, 33, 61], [1739, null, 29, 65], [1740, null, 37, 65], [1741, null, 45, 65], [1742, null, 53, 65], [1743, null, 61, 65], [1744, null, 57, 69], [1745, null, 49, 69], [1746, null, 41, 69], [1747, null, 33, 69], [1748, null, 29, 73], [1749, null, 37, 73], [1750, null, 45, 73], [1751, null, 53, 73], [1752, null, 61, 73], [1753, null, 57, 77], [1754, null, 49, 77], [1755, null, 41, 77], [1756, null, 33, 77], [1757, null, 29, 81], [1758, null, 37, 81], [1759, null, 45, 81], [1760, null, 53, 81], [1761, null, 57, 85], [1762, null, 49, 85], [1763, null, 41, 85], [1764, null, 33, 85], [1765, null, 29, 89], [1766, null, 37, 89], [1767, null, 45, 89], [1768, null, 53, 89], [1769, null, 57, 93], [1770, null, 49, 93], [1771, null, 41, 93], [1772, null, 33, 93], [1773, null, 33, 101], [1774, null, 41, 101], [1775, null, 49, 101], [1776, null, 62, 102], [1777, null, 67, 104], [1778, null, 72, 106], [1779, null, 74, 98], [1780, null, 69, 96], [1781, null, 64, 94], [1782, null, 68, 91], [1783, null, 73, 93], [1784, null, 71, 88], [1785, null, 66, 86], [1786, null, 70, 83], [1787, null, 75, 85], [1788, null, 73, 80], [1789, null, 68, 78], [1790, null, 72, 75], [1791, null, 70, 71], [1792, null, 74, 68], [1793, null, 72, 63], [1794, null, 75, 59], [1795, null, 75, 54], [1796, null, 76, 48], [1797, null, 85, 36], [1798, null, 93, 36], [1799, null, 101, 36], [1800, null, 109, 36], [1801, null, 117, 36], [1802, null, 125, 36], [1803, null, 129, 40], [1804, null, 121, 40], [1805, null, 113, 40], [1806, null, 105, 40], [1807, null, 97, 40], [1808, null, 89, 40], [1809, null, 81, 40], [1810, null, 85, 44], [1811, null, 93, 44], [1812, null, 101, 44], [1813, null, 109, 44], [1814, null, 117, 44], [1815, null, 125, 44], [1816, null, 129, 48], [1817, null, 121, 48], [1818, null, 113, 48], [1819, null, 105, 48], [1820, null, 97, 48], [1821, null, 89, 48], [1822, null, 81, 48], [1823, null, 85, 52], [1824, null, 93, 52], [1825, null, 101, 52], [1826, null, 109, 52], [1827, null, 117, 52], [1828, null, 125, 52], [1829, null, 129, 56], [1830, null, 121, 56], [1831, null, 113, 56], [1832, null, 105, 56], [1833, null, 97, 56], [1834, null, 89, 56], [1835, null, 81, 56], [1836, null, 85, 60], [1837, null, 93, 60], [1838, null, 101, 60], [1839, null, 109, 60], [1840, null, 117, 60], [1841, null, 125, 60], [1842, null, 129, 64], [1843, null, 121, 64], [1844, null, 113, 64], [1845, null, 105, 64], [1846, null, 97, 64], [1847, null, 89, 64], [1848, null, 81, 64], [1849, null, 85, 68], [1850, null, 93, 68], [1851, null, 101, 68], [1852, null, 109, 68], [1853, null, 117, 68], [1854, null, 125, 68], [1855, null, 129, 72], [1856, null, 121, 72], [1857, null, 113, 72], [1858, null, 105, 72], [1859, null, 97, 72], [1860, null, 89, 72], [1861, null, 81, 72], [1862, null, 85, 76], [1863, null, 93, 76], [1864, null, 101, 76], [1865, null, 109, 76], [1866, null, 117, 76], [1867, null, 125, 76], [1868, null, 129, 80], [1869, null, 121, 80], [1870, null, 113, 80], [1871, null, 105, 80], [1872, null, 97, 80], [1873, null, 89, 80], [1874, null, 81, 80], [1875, null, 85, 84], [1876, null, 93, 84], [1877, null, 101, 84], [1878, null, 109, 84], [1879, null, 117, 84], [1880, null, 125, 84], [1881, null, 129, 88], [1882, null, 121, 88], [1883, null, 113, 88], [1884, null, 105, 88], [1885, null, 97, 88], [1886, null, 89, 88], [1887, null, 81, 88], [1888, null, 85, 92], [1889, null, 93, 92], [1890, null, 101, 92], [1891, null, 109, 92], [1892, null, 117, 92], [1893, null, 125, 92], [1894, null, 129, 96], [1895, null, 121, 96], [1896, null, 113, 96], [1897, null, 105, 96], [1898, null, 97, 96], [1899, null, 89, 96], [1900, null, 81, 96], [1901, null, 81, 104], [1902, null, 81, 110], [1903, null, 89, 110], [1904, null, 89, 104], [1905, null, 97, 104], [1906, null, 97, 110], [1907, null, 105, 110], [1908, null, 105, 104], [1909, null, 113, 104], [1910, null, 113, 110], [1911, null, 121, 110], [1912, null, 121, 104], [1913, null, 129, 104], [1914, null, 129, 110], [1915, null, 138, 106], [1916, null, 143, 104], [1917, null, 141, 96], [1918, null, 136, 98], [1919, null, 137, 93], [1920, null, 142, 91], [1921, null, 139, 88], [1922, null, 135, 85], [1923, null, 140, 83], [1924, null, 137, 80], [1925, null, 138, 75], [1926, null, 136, 68], [1927, null, 135, 59], [1928, null, 134, 48], [1929, null, 135, 54], [1930, null, 138, 63], [1931, null, 140, 71], [1932, null, 142, 78], [1933, null, 144, 86], [1934, null, 146, 94], [1935, null, 148, 102], [1936, null, 161, 101], [1937, null, 169, 101], [1938, null, 177, 101], [1939, null, 177, 93], [1940, null, 169, 93], [1941, null, 161, 93], [1942, null, 153, 93], [1943, null, 157, 89], [1944, null, 165, 89], [1945, null, 173, 89], [1946, null, 181, 89], [1947, null, 177, 85], [1948, null, 169, 85], [1949, null, 161, 85], [1950, null, 153, 85], [1951, null, 157, 81], [1952, null, 165, 81], [1953, null, 173, 81], [1954, null, 181, 81], [1955, null, 177, 77], [1956, null, 169, 77], [1957, null, 161, 77], [1958, null, 153, 77], [1959, null, 149, 73], [1960, null, 157, 73], [1961, null, 165, 73], [1962, null, 173, 73], [1963, null, 181, 73], [1964, null, 177, 69], [1965, null, 169, 69], [1966, null, 161, 69], [1967, null, 153, 69], [1968, null, 149, 65], [1969, null, 157, 65], [1970, null, 165, 65], [1971, null, 173, 65], [1972, null, 181, 65], [1973, null, 177, 61], [1974, null, 169, 61], [1975, null, 161, 61], [1976, null, 153, 61], [1977, null, 145, 61], [1978, null, 149, 57], [1979, null, 157, 57], [1980, null, 165, 57], [1981, null, 173, 57], [1982, null, 181, 57], [1983, null, 177, 53], [1984, null, 169, 53], [1985, null, 161, 53], [1986, null, 153, 53], [1987, null, 145, 53], [1988, null, 141, 49], [1989, null, 149, 49], [1990, null, 157, 49], [1991, null, 165, 49], [1992, null, 173, 49], [1993, null, 181, 49], [1994, null, 177, 45], [1995, null, 169, 45], [1996, null, 161, 45], [1997, null, 153, 45], [1998, null, 145, 45], [1999, null, 141, 41], [2000, null, 149, 41], [2001, null, 157, 41], [2002, null, 165, 41], [2003, null, 173, 41], [2004, null, 181, 41], [2005, null, 177, 37], [2006, null, 169, 37], [2007, null, 161, 37], [2008, null, 153, 37], [2009, null, 145, 37], [2010, null, 141, 33], [2011, null, 149, 33], [2012, null, 157, 33], [2013, null, 165, 33], [2014, null, 173, 33], [2015, null, 181, 33], [2016, null, 177, 29], [2017, null, 169, 29], [2018, null, 161, 29], [2019, null, 153, 29], [2020, null, 145, 29], [2021, null, 137, 29], [2022, null, 129, 29], [2023, null, 121, 29], [2024, null, 113, 29], [2025, null, 109, 25], [2026, null, 117, 25], [2027, null, 125, 25], [2028, null, 133, 25], [2029, null, 141, 25], [2030, null, 149, 25], [2031, null, 157, 25], [2032, null, 165, 25], [2033, null, 173, 25], [2034, null, 181, 25], [2035, null, 188, 12], [2036, null, 194, 10], [2037, null, 200, 8], [2038, null, 203, 12], [2039, null, 197, 14], [2040, null, 191, 16], [2041, null, 188, 22], [2042, null, 194, 20], [2043, null, 200, 18], [2044, null, 203, 22], [2045, null, 197, 24], [2046, null, 191, 26], [2047, null, 194, 30], [2048, null, 200, 28], [2049, null, 203, 32], [2050, null, 197, 34], [2051, null, 194, 41], [2052, null, 200, 39], [2053, null, 203, 44], [2054, null, 197, 45], [2055, null, 194, 50], [2056, null, 200, 49], [2057, null, 203, 54], [2058, null, 197, 54], [2059, null, 194, 58], [2060, null, 200, 58], [2061, null, 203, 63], [2062, null, 197, 62], [2063, null, 200, 67], [2064, null, 204, 72], [2065, null, 200, 76], [2066, null, 204, 80], [2067, null, 200, 84], [2068, null, 204, 88], [2069, null, 200, 92], [2070, null, 204, 96], [2071, null, 204, 104]], + '3-22': [[2072, 2075, -4, 4], [2073, 2076, -4, 12], [2074, 2074, 0, 8], [2075, 2072, 4, 4], [2076, 2073, 4, 12]], + '4-23': [[2077, null, 56, -8], [2078, null, 52, -4], [2079, null, 48, -8], [2080, null, 44, -4], [2081, null, 40, -8], [2082, null, 36, -4], [2083, null, 32, -8], [2084, null, 28, -4], [2085, null, 24, -8], [2086, null, 20, -4], [2087, null, 16, -8], [2088, null, 12, -4], [2089, null, 8, -8], [2090, null, 4, -4], [2091, null, 0, -8], [2092, null, -4, -4], [2093, null, -8, -8], [2094, null, -12, -4], [2095, null, -16, -8], [2096, null, -20, -4], [2097, null, -24, -8], [2098, null, -28, -4], [2099, null, -32, -8], [2100, null, -36, -4], [2101, null, -40, -8], [2102, null, -44, -4], [2103, null, -48, -8], [2104, null, -56, -8], [2105, null, -52, -4], [2106, null, -52, 4], [2107, null, -56, 8], [2108, null, -52, 12], [2109, null, -48, 16], [2110, null, -52, 20], [2111, null, -56, 24], [2112, null, -52, 28], [2113, null, -48, 32], [2114, null, -52, 36], [2115, null, -56, 40], [2116, null, -52, 44], [2117, null, -48, 48], [2118, null, -52, 52], [2119, null, -56, 56], [2120, null, -52, 60], [2121, null, -48, 64], [2122, null, -52, 68], [2123, null, -56, 72], [2124, null, -52, 76], [2125, null, -48, 80], [2126, null, -52, 84], [2127, null, -56, 88], [2128, null, -52, 92], [2129, null, -48, 96], [2130, null, -52, 100], [2131, null, -56, 104], [2132, null, -52, 108], [2133, null, -48, 112], [2134, null, -52, 116], [2135, null, -44, 116], [2136, null, -44, 108], [2137, null, -40, 104], [2138, null, -44, 100], [2139, null, -44, 92], [2140, null, -40, 88], [2141, null, -44, 84], [2142, null, -44, 76], [2143, null, -40, 72], [2144, null, -44, 68], [2145, null, -44, 60], [2146, null, -40, 56], [2147, null, -44, 52], [2148, null, -44, 44], [2149, null, -40, 40], [2150, null, -44, 36], [2151, null, -44, 28], [2152, null, -40, 24], [2153, null, -44, 20], [2154, null, -44, 12], [2155, null, -40, 8], [2156, null, -44, 4], [2157, null, -36, 4], [2158, null, -36, 12], [2159, null, -32, 16], [2160, null, -36, 20], [2161, null, -36, 28], [2162, null, -32, 32], [2163, null, -36, 36], [2164, null, -36, 44], [2165, null, -32, 48], [2166, null, -36, 52], [2167, null, -36, 60], [2168, null, -32, 64], [2169, null, -36, 68], [2170, null, -36, 76], [2171, null, -32, 80], [2172, null, -36, 84], [2173, null, -36, 92], [2174, null, -32, 96], [2175, null, -36, 100], [2176, null, -36, 108], [2177, null, -32, 112], [2178, null, -36, 116], [2179, null, -28, 116], [2180, null, -28, 108], [2181, null, -24, 104], [2182, null, -28, 100], [2183, null, -28, 92], [2184, null, -24, 88], [2185, null, -28, 84], [2186, null, -28, 76], [2187, null, -24, 72], [2188, null, -28, 68], [2189, null, -28, 60], [2190, null, -24, 56], [2191, null, -28, 52], [2192, null, -28, 44], [2193, null, -24, 40], [2194, null, -28, 36], [2195, null, -28, 28], [2196, null, -24, 24], [2197, null, -28, 20], [2198, null, -28, 12], [2199, null, -24, 8], [2200, null, -28, 4], [2201, null, -20, 4], [2202, null, -20, 12], [2203, null, -16, 16], [2204, null, -20, 20], [2205, null, -20, 28], [2206, null, -16, 32], [2207, null, -20, 36], [2208, null, -20, 44], [2209, null, -16, 48], [2210, null, -20, 52], [2211, null, -20, 60], [2212, null, -16, 64], [2213, null, -20, 68], [2214, null, -20, 76], [2215, null, -16, 80], [2216, null, -20, 84], [2217, null, -20, 92], [2218, null, -16, 96], [2219, null, -20, 100], [2220, null, -20, 108], [2221, null, -16, 112], [2222, null, -20, 116], [2223, null, -12, 116], [2224, null, -12, 108], [2225, null, -8, 104], [2226, null, -12, 100], [2227, null, -12, 92], [2228, null, -8, 88], [2229, null, -12, 84], [2230, null, -12, 76], [2231, null, -8, 72], [2232, null, -12, 68], [2233, null, -12, 60], [2234, null, -8, 56], [2235, null, -12, 52], [2236, null, -12, 44], [2237, null, -8, 40], [2238, null, -12, 36], [2239, null, -12, 28], [2240, null, -8, 24], [2241, null, -12, 20], [2242, null, -12, 12], [2243, null, -8, 8], [2244, null, -12, 4], [2245, null, -4, 4], [2246, null, -4, 12], [2247, null, 0, 16], [2248, null, -4, 20], [2249, null, -4, 28], [2250, null, 0, 32], [2251, null, -4, 36], [2252, null, -4, 44], [2253, null, 0, 48], [2254, null, -4, 52], [2255, null, -4, 60], [2256, null, 0, 64], [2257, null, -4, 68], [2258, null, -4, 76], [2259, null, 0, 80], [2260, null, -4, 84], [2261, null, -4, 92], [2262, null, 0, 96], [2263, null, -4, 100], [2264, null, -4, 108], [2265, null, 0, 112], [2266, null, -4, 116], [2267, null, 4, 116], [2268, null, 4, 108], [2269, null, 8, 104], [2270, null, 4, 100], [2271, null, 4, 92], [2272, null, 8, 88], [2273, null, 4, 84], [2274, null, 4, 76], [2275, null, 8, 72], [2276, null, 4, 68], [2277, null, 4, 60], [2278, null, 8, 56], [2279, null, 4, 52], [2280, null, 4, 44], [2281, null, 8, 40], [2282, null, 4, 36], [2283, null, 4, 28], [2284, null, 8, 24], [2285, null, 4, 20], [2286, null, 4, 12], [2287, null, 8, 8], [2288, null, 4, 4], [2289, null, 12, 4], [2290, null, 12, 12], [2291, null, 16, 16], [2292, null, 12, 20], [2293, null, 12, 28], [2294, null, 16, 32], [2295, null, 12, 36], [2296, null, 12, 44], [2297, null, 16, 48], [2298, null, 12, 52], [2299, null, 12, 60], [2300, null, 16, 64], [2301, null, 12, 68], [2302, null, 12, 76], [2303, null, 16, 80], [2304, null, 12, 84], [2305, null, 12, 92], [2306, null, 16, 96], [2307, null, 12, 100], [2308, null, 12, 108], [2309, null, 16, 112], [2310, null, 12, 116], [2311, null, 20, 116], [2312, null, 20, 108], [2313, null, 24, 104], [2314, null, 20, 100], [2315, null, 20, 92], [2316, null, 24, 88], [2317, null, 20, 84], [2318, null, 20, 76], [2319, null, 24, 72], [2320, null, 20, 68], [2321, null, 20, 60], [2322, null, 24, 56], [2323, null, 20, 52], [2324, null, 20, 44], [2325, null, 24, 40], [2326, null, 20, 36], [2327, null, 20, 28], [2328, null, 24, 24], [2329, null, 20, 20], [2330, null, 20, 12], [2331, null, 24, 8], [2332, null, 20, 4], [2333, null, 28, 4], [2334, null, 28, 12], [2335, null, 32, 16], [2336, null, 28, 20], [2337, null, 28, 28], [2338, null, 32, 32], [2339, null, 28, 36], [2340, null, 28, 44], [2341, null, 32, 48], [2342, null, 28, 52], [2343, null, 28, 60], [2344, null, 32, 64], [2345, null, 28, 68], [2346, null, 28, 76], [2347, null, 32, 80], [2348, null, 28, 84], [2349, null, 28, 92], [2350, null, 32, 96], [2351, null, 28, 100], [2352, null, 28, 108], [2353, null, 32, 112], [2354, null, 28, 116], [2355, null, 36, 116], [2356, null, 36, 108], [2357, null, 40, 104], [2358, null, 36, 100], [2359, null, 36, 92], [2360, null, 40, 88], [2361, null, 36, 84], [2362, null, 36, 76], [2363, null, 40, 72], [2364, null, 36, 68], [2365, null, 36, 60], [2366, null, 40, 56], [2367, null, 36, 52], [2368, null, 36, 44], [2369, null, 40, 40], [2370, null, 36, 36], [2371, null, 36, 28], [2372, null, 40, 24], [2373, null, 36, 20], [2374, null, 36, 12], [2375, null, 40, 8], [2376, null, 36, 4], [2377, null, 44, 4], [2378, null, 44, 12], [2379, null, 48, 16], [2380, null, 44, 20], [2381, null, 44, 28], [2382, null, 48, 32], [2383, null, 44, 36], [2384, null, 44, 44], [2385, null, 48, 48], [2386, null, 44, 52], [2387, null, 44, 60], [2388, null, 48, 64], [2389, null, 44, 68], [2390, null, 44, 76], [2391, null, 48, 80], [2392, null, 44, 84], [2393, null, 44, 92], [2394, null, 48, 96], [2395, null, 44, 100], [2396, null, 44, 108], [2397, null, 48, 112], [2398, null, 44, 116], [2399, null, 52, 116], [2400, null, 52, 108], [2401, null, 56, 104], [2402, null, 52, 100], [2403, null, 52, 92], [2404, null, 56, 88], [2405, null, 52, 84], [2406, null, 52, 76], [2407, null, 56, 72], [2408, null, 52, 68], [2409, null, 52, 60], [2410, null, 56, 56], [2411, null, 52, 52], [2412, null, 52, 44], [2413, null, 56, 40], [2414, null, 52, 36], [2415, null, 52, 28], [2416, null, 56, 24], [2417, null, 52, 20], [2418, null, 52, 12], [2419, null, 56, 8], [2420, null, 52, 4], [4422, null, -56, 120], [4423, null, -40, 120], [4424, null, -24, 120], [4425, null, -8, 120], [4426, null, 8, 120], [4427, null, 24, 120], [4428, null, 40, 120], [4429, null, 56, 120], [4430, null, -52, 124], [4431, null, -44, 124], [4432, null, -36, 124], [4433, null, -28, 124], [4434, null, -20, 124], [4435, null, -12, 124], [4436, null, -4, 124], [4437, null, 4, 124], [4438, null, 12, 124], [4439, null, 20, 124], [4440, null, 28, 124], [4441, null, 36, 124], [4442, null, 44, 124], [4443, null, 52, 124], [4444, null, -48, 128], [4445, null, -32, 128], [4446, null, -16, 128], [4447, null, 0, 128], [4448, null, 16, 128], [4449, null, 32, 128], [4450, null, 48, 128], [4451, null, -52, 132], [4452, null, -44, 132], [4453, null, -36, 132], [4454, null, -28, 132], [4455, null, -20, 132], [4456, null, -12, 132], [4457, null, -4, 132], [4458, null, 4, 132], [4459, null, 12, 132], [4460, null, 20, 132], [4461, null, 28, 132], [4462, null, 36, 132], [4463, null, 44, 132], [4464, null, 52, 132], [4465, null, -56, 136], [4466, null, -40, 136], [4467, null, -24, 136], [4468, null, -8, 136], [4469, null, 8, 136], [4470, null, 24, 136], [4471, null, 40, 136], [4472, null, 56, 136], [4473, null, -52, 140], [4474, null, -44, 140], [4475, null, -36, 140], [4476, null, -28, 140], [4477, null, -20, 140], [4478, null, -12, 140], [4479, null, -4, 140], [4480, null, 4, 140], [4481, null, 12, 140], [4482, null, 20, 140], [4483, null, 28, 140], [4484, null, 36, 140], [4485, null, 44, 140], [4486, null, 52, 140]], + '5-24': [[2421, null, 4, 36], [2422, null, 4, 44], [2423, null, 4, 52], [2424, null, 4, 60], [2425, null, 4, 68], [2426, null, 4, 76], [2427, null, 4, 84], [2428, null, 4, 92], [2429, null, 4, 100], [2430, null, 4, 108], [2431, null, 4, 116], [2432, null, 4, 124], [2433, null, 4, 132], [2434, null, 4, 140], [2435, null, 4, 148], [2436, null, 4, 156], [2437, null, 4, 164], [2438, null, 4, 172], [2439, null, 4, 180], [2440, null, 4, 188], [2441, null, 4, 196], [2442, null, 4, 204], [2443, null, 4, 212], [2444, null, 4, 220], [2445, null, 4, 228], [2446, null, 4, 236], [2447, null, 4, 244], [2448, null, 4, 252], [2449, null, 4, 260], [2450, null, 4, 268], [2451, null, 4, 276], [2452, null, 12, 276], [2453, null, 12, 268], [2454, null, 12, 260], [2455, null, 12, 252], [2456, null, 12, 244], [2457, null, 12, 236], [2458, null, 12, 228], [2459, null, 12, 220], [2460, null, 12, 212], [2461, null, 12, 204], [2462, null, 12, 196], [2463, null, 12, 188], [2464, null, 12, 180], [2465, null, 12, 172], [2466, null, 12, 164], [2467, null, 12, 156], [2468, null, 12, 148], [2469, null, 12, 140], [2470, null, 12, 132], [2471, null, 12, 124], [2472, null, 12, 116], [2473, null, 12, 108], [2474, null, 12, 100], [2475, null, 12, 92], [2476, null, 12, 84], [2477, null, 12, 76], [2478, null, 12, 68], [2479, null, 12, 60], [2480, null, 12, 52], [2481, null, 12, 44], [2482, null, 12, 36], [2483, null, 20, 36], [2484, null, 20, 44], [2485, null, 20, 52], [2486, null, 20, 60], [2487, null, 20, 68], [2488, null, 20, 76], [2489, null, 20, 84], [2490, null, 20, 92], [2491, null, 20, 100], [2492, null, 20, 108], [2493, null, 20, 116], [2494, null, 20, 124], [2495, null, 20, 132], [2496, null, 20, 140], [2497, null, 20, 148], [2498, null, 20, 156], [2499, null, 20, 164], [2500, null, 20, 172], [2501, null, 20, 180], [2502, null, 20, 188], [2503, null, 20, 196], [2504, null, 20, 204], [2505, null, 20, 212], [2506, null, 20, 220], [2507, null, 20, 228], [2508, null, 20, 236], [2509, null, 20, 244], [2510, null, 20, 252], [2511, null, 20, 260], [2512, null, 20, 268], [2513, null, 20, 276], [2514, null, 28, 276], [2515, null, 28, 268], [2516, null, 28, 260], [2517, null, 28, 252], [2518, null, 28, 244], [2519, null, 28, 236], [2520, null, 28, 228], [2521, null, 28, 220], [2522, null, 28, 212], [2523, null, 28, 204], [2524, null, 28, 196], [2525, null, 28, 188], [2526, null, 28, 180], [2527, null, 28, 172], [2528, null, 28, 164], [2529, null, 28, 156], [2530, null, 28, 148], [2531, null, 28, 140], [2532, null, 28, 132], [2533, null, 28, 124], [2534, null, 28, 116], [2535, null, 28, 108], [2536, null, 28, 100], [2537, null, 28, 92], [2538, null, 28, 84], [2539, null, 28, 76], [2540, null, 28, 68], [2541, null, 28, 60], [2542, null, 28, 52], [2543, null, 28, 44], [2544, null, 28, 36], [2545, null, 36, 36], [2546, null, 36, 44], [2547, null, 36, 52], [2548, null, 36, 60], [2549, null, 36, 68], [2550, null, 36, 76], [2551, null, 36, 84], [2552, null, 36, 92], [2553, null, 36, 100], [2554, null, 36, 108], [2555, null, 36, 116], [2556, null, 36, 124], [2557, null, 36, 132], [2558, null, 36, 140], [2559, null, 36, 148], [2560, null, 36, 156], [2561, null, 36, 164], [2562, null, 36, 172], [2563, null, 36, 180], [2564, null, 36, 188], [2565, null, 36, 196], [2566, null, 36, 204], [2567, null, 36, 212], [2568, null, 36, 220], [2569, null, 36, 228], [2570, null, 36, 236], [2571, null, 36, 244], [2572, null, 36, 252], [2573, null, 36, 260], [2574, null, 36, 268], [2575, null, 36, 276], [2576, null, 44, 276], [2577, null, 44, 268], [2578, null, 44, 260], [2579, null, 44, 252], [2580, null, 44, 244], [2581, null, 44, 236], [2582, null, 44, 228], [2583, null, 44, 220], [2584, null, 44, 212], [2585, null, 44, 204], [2586, null, 44, 196], [2587, null, 44, 188], [2588, null, 44, 180], [2589, null, 44, 172], [2590, null, 44, 164], [2591, null, 44, 156], [2592, null, 44, 148], [2593, null, 44, 140], [2594, null, 44, 132], [2595, null, 44, 124], [2596, null, 44, 116], [2597, null, 44, 108], [2598, null, 44, 100], [2599, null, 44, 92], [2600, null, 44, 84], [2601, null, 44, 76], [2602, null, 44, 68], [2603, null, 44, 60], [2604, null, 44, 52], [2605, null, 44, 44], [2606, null, 44, 36], [2607, null, 52, 36], [2608, null, 52, 44], [2609, null, 52, 52], [2610, null, 52, 60], [2611, null, 52, 68], [2612, null, 52, 76], [2613, null, 52, 84], [2614, null, 52, 92], [2615, null, 52, 100], [2616, null, 52, 108], [2617, null, 52, 116], [2618, null, 52, 124], [2619, null, 52, 132], [2620, null, 52, 140], [2621, null, 52, 148], [2622, null, 52, 156], [2623, null, 52, 164], [2624, null, 52, 172], [2625, null, 52, 180], [2626, null, 52, 188], [2627, null, 52, 196], [2628, null, 52, 204], [2629, null, 52, 212], [2630, null, 52, 220], [2631, null, 52, 228], [2632, null, 52, 236], [2633, null, 52, 244], [2634, null, 52, 252], [2635, null, 52, 260], [2636, null, 52, 268], [2637, null, 52, 276], [2638, null, 60, 276], [2639, null, 60, 268], [2640, null, 60, 260], [2641, null, 60, 252], [2642, null, 60, 244], [2643, null, 60, 236], [2644, null, 60, 228], [2645, null, 60, 220], [2646, null, 60, 212], [2647, null, 60, 204], [2648, null, 60, 196], [2649, null, 60, 188], [2650, null, 60, 180], [2651, null, 60, 172], [2652, null, 60, 164], [2653, null, 60, 156], [2654, null, 60, 148], [2655, null, 60, 140], [2656, null, 60, 132], [2657, null, 60, 124], [2658, null, 60, 116], [2659, null, 60, 108], [2660, null, 60, 100], [2661, null, 60, 92], [2662, null, 60, 84], [2663, null, 60, 76], [2664, null, 60, 68], [2665, null, 60, 60], [2666, null, 60, 52], [2667, null, 60, 44], [2668, null, 60, 36], [2669, null, 68, 36], [2670, null, 68, 44], [2671, null, 68, 52], [2672, null, 68, 60], [2673, null, 68, 68], [2674, null, 68, 76], [2675, null, 68, 84], [2676, null, 68, 92], [2677, null, 68, 100], [2678, null, 68, 108], [2679, null, 68, 116], [2680, null, 68, 124], [2681, null, 68, 132], [2682, null, 68, 140], [2683, null, 68, 148], [2684, null, 68, 156], [2685, null, 68, 164], [2686, null, 68, 172], [2687, null, 68, 180], [2688, null, 68, 188], [2689, null, 68, 196], [2690, null, 68, 204], [2691, null, 68, 212], [2692, null, 68, 220], [2693, null, 68, 228], [2694, null, 68, 236], [2695, null, 68, 244], [2696, null, 68, 252], [2697, null, 68, 260], [2698, null, 68, 268], [2699, null, 68, 276], [2700, null, 76, 276], [2701, null, 76, 268], [2702, null, 76, 260], [2703, null, 76, 252], [2704, null, 76, 244], [2705, null, 76, 236], [2706, null, 76, 228], [2707, null, 76, 220], [2708, null, 76, 212], [2709, null, 76, 204], [2710, null, 76, 196], [2711, null, 76, 188], [2712, null, 76, 180], [2713, null, 76, 172], [2714, null, 76, 164], [2715, null, 76, 156], [2716, null, 76, 148], [2717, null, 76, 140], [2718, null, 76, 132], [2719, null, 76, 124], [2720, null, 76, 116], [2721, null, 76, 108], [2722, null, 76, 100], [2723, null, 76, 92], [2724, null, 76, 84], [2725, null, 76, 76], [2726, null, 76, 68], [2727, null, 76, 60], [2728, null, 76, 52], [2729, null, 76, 44], [2730, null, 76, 36], [2731, null, 84, 36], [2732, null, 84, 44], [2733, null, 84, 52], [2734, null, 84, 60], [2735, null, 84, 68], [2736, null, 84, 76], [2737, null, 84, 84], [2738, null, 84, 92], [2739, null, 84, 100], [2740, null, 84, 108], [2741, null, 84, 116], [2742, null, 84, 124], [2743, null, 84, 132], [2744, null, 84, 140], [2745, null, 84, 148], [2746, null, 84, 156], [2747, null, 84, 164], [2748, null, 84, 172], [2749, null, 84, 180], [2750, null, 84, 188], [2751, null, 84, 196], [2752, null, 84, 204], [2753, null, 84, 212], [2754, null, 84, 220], [2755, null, 84, 228], [2756, null, 84, 236], [2757, null, 84, 244], [2758, null, 84, 252], [2759, null, 84, 260], [2760, null, 84, 268], [2761, null, 84, 276], [2762, null, 92, 276], [2763, null, 92, 268], [2764, null, 92, 260], [2765, null, 92, 252], [2766, null, 92, 244], [2767, null, 92, 236], [2768, null, 92, 228], [2769, null, 92, 220], [2770, null, 92, 212], [2771, null, 92, 204], [2772, null, 92, 196], [2773, null, 92, 188], [2774, null, 92, 180], [2775, null, 92, 172], [2776, null, 92, 164], [2777, null, 92, 156], [2778, null, 92, 148], [2779, null, 92, 140], [2780, null, 92, 132], [2781, null, 92, 124], [2782, null, 92, 116], [2783, null, 92, 108], [2784, null, 92, 100], [2785, null, 92, 92], [2786, null, 92, 84], [2787, null, 92, 76], [2788, null, 92, 68], [2789, null, 92, 60], [2790, null, 92, 52], [2791, null, 92, 44], [2792, null, 92, 36], [2793, null, 100, 36], [2794, null, 100, 44], [2795, null, 100, 52], [2796, null, 100, 60], [2797, null, 100, 68], [2798, null, 100, 76], [2799, null, 100, 84], [2800, null, 100, 92], [2801, null, 100, 100], [2802, null, 100, 108], [2803, null, 100, 116], [2804, null, 100, 124], [2805, null, 100, 132], [2806, null, 100, 140], [2807, null, 100, 148], [2808, null, 100, 156], [2809, null, 100, 164], [2810, null, 100, 172], [2811, null, 100, 180], [2812, null, 100, 188], [2813, null, 100, 196], [2814, null, 100, 204], [2815, null, 100, 212], [2816, null, 100, 220], [2817, null, 100, 228], [2818, null, 100, 236], [2819, null, 100, 244], [2820, null, 100, 252], [2821, null, 100, 260], [2822, null, 100, 268], [2823, null, 100, 276], [2824, null, 108, 276], [2825, null, 108, 268], [2826, null, 108, 260], [2827, null, 108, 252], [2828, null, 108, 244], [2829, null, 108, 236], [2830, null, 108, 228], [2831, null, 108, 220], [2832, null, 108, 212], [2833, null, 108, 204], [2834, null, 108, 196], [2835, null, 108, 188], [2836, null, 108, 180], [2837, null, 108, 172], [2838, null, 108, 164], [2839, null, 108, 156], [2840, null, 108, 148], [2841, null, 108, 140], [2842, null, 108, 132], [2843, null, 108, 124], [2844, null, 108, 116], [2845, null, 108, 108], [2846, null, 108, 100], [2847, null, 108, 92], [2848, null, 108, 84], [2849, null, 108, 76], [2850, null, 108, 68], [2851, null, 108, 60], [2852, null, 108, 52], [2853, null, 108, 44], [2854, null, 108, 36], [2855, null, 116, 36], [2856, null, 116, 44], [2857, null, 116, 52], [2858, null, 116, 60], [2859, null, 116, 68], [2860, null, 116, 76], [2861, null, 116, 84], [2862, null, 116, 92], [2863, null, 116, 100], [2864, null, 116, 108], [2865, null, 116, 116], [2866, null, 116, 124], [2867, null, 116, 132], [2868, null, 116, 140], [2869, null, 116, 148], [2870, null, 116, 156], [2871, null, 116, 164], [2872, null, 116, 172], [2873, null, 116, 180], [2874, null, 116, 188], [2875, null, 116, 196], [2876, null, 116, 204], [2877, null, 116, 212], [2878, null, 116, 220], [2879, null, 116, 228], [2880, null, 116, 236], [2881, null, 116, 244], [2882, null, 116, 252], [2883, null, 116, 260], [2884, null, 116, 268], [2885, null, 116, 276], [2886, null, 124, 276], [2887, null, 124, 268], [2888, null, 124, 260], [2889, null, 124, 252], [2890, null, 124, 244], [2891, null, 124, 236], [2892, null, 124, 228], [2893, null, 124, 220], [2894, null, 124, 212], [2895, null, 124, 204], [2896, null, 124, 196], [2897, null, 124, 188], [2898, null, 124, 180], [2899, null, 124, 172], [2900, null, 124, 164], [2901, null, 124, 156], [2902, null, 124, 148], [2903, null, 124, 140], [2904, null, 124, 132], [2905, null, 124, 124], [2906, null, 124, 116], [2907, null, 124, 108], [2908, null, 124, 100], [2909, null, 124, 92], [2910, null, 124, 84], [2911, null, 124, 76], [2912, null, 124, 68], [2913, null, 124, 60], [2914, null, 124, 52], [2915, null, 124, 44], [2916, null, 124, 36], [2917, null, 124, 28], [2918, null, 116, 20], [2919, null, 108, 28], [2920, null, 100, 20], [2921, null, 92, 28], [2922, null, 84, 20], [2923, null, 76, 28], [2924, null, 68, 20], [2925, null, 60, 28], [2926, null, 52, 20], [2927, null, 44, 28], [2928, null, 36, 20], [2929, null, 28, 28], [2930, null, 20, 20], [2931, null, 12, 28], [2932, null, 4, 20], [2933, null, 4, 4], [2934, null, 12, 12], [2935, null, 20, 4], [2936, null, 28, 12], [2937, null, 36, 4], [2938, null, 44, 12], [2939, null, 52, 4], [2940, null, 60, 12], [2941, null, 68, 4], [2942, null, 76, 12], [2943, null, 84, 4], [2944, null, 92, 12], [2945, null, 100, 4], [2946, null, 108, 12], [2947, null, 116, 4], [2948, null, 124, 12], [2949, null, 124, -4], [2950, null, 116, -12], [2951, null, 108, -4], [2952, null, 100, -12], [2953, null, 92, -4], [2954, null, 84, -12], [2955, null, 76, -4], [2956, null, 68, -12], [2957, null, 60, -4], [2958, null, 52, -12], [2959, null, 44, -4], [2960, null, 36, -12], [2961, null, 28, -4], [2962, null, 20, -12], [2963, null, 12, -4], [2964, null, 4, -12]], + '6-25': [[2965, null, 73, 48], [2966, null, 70, 51], [2967, null, 67, 46], [2968, null, 64, 49], [2969, null, 61, 44], [2970, null, 58, 47], [2971, null, 55, 42], [2972, null, 52, 45], [2973, null, 49, 40], [2974, null, 46, 43], [2975, null, 43, 38], [2976, null, 40, 41], [2977, null, 37, 36], [2978, null, 34, 39], [2979, null, 31, 34], [2980, null, 28, 37], [2981, null, 25, 32], [2982, null, 22, 35], [2983, null, 19, 30], [2984, null, 16, 33], [2985, null, 13, 28], [2986, null, 7, 26], [2987, null, 10, 32], [2988, null, 10, 40], [2989, null, 13, 44], [2990, null, 10, 48], [2991, null, 7, 52], [2992, null, 10, 56], [2993, null, 13, 60], [2994, null, 10, 64], [2995, null, 7, 68], [2996, null, 10, 72], [2997, null, 13, 76], [2998, null, 10, 80], [2999, null, 7, 84], [3000, null, 10, 88], [3001, null, 13, 92], [3002, null, 10, 96], [3003, null, 7, 100], [3004, null, 10, 104], [3005, null, 13, 108], [3006, null, 10, 112], [3007, null, 7, 116], [3008, null, 10, 120], [3009, null, 13, 124], [3010, null, 10, 128], [3011, null, 7, 132], [3012, null, 10, 136], [3013, null, 13, 140], [3014, null, 10, 144], [3015, null, 7, 148], [3016, null, 10, 152], [3017, null, 13, 156], [3018, null, 10, 160], [3019, null, 10, 168], [3020, null, 10, 176], [3021, null, 16, 178], [3022, null, 16, 170], [3023, null, 16, 162], [3024, null, 16, 154], [3025, null, 19, 150], [3026, null, 16, 146], [3027, null, 16, 138], [3028, null, 19, 134], [3029, null, 16, 130], [3030, null, 16, 122], [3031, null, 19, 118], [3032, null, 16, 114], [3033, null, 16, 106], [3034, null, 19, 102], [3035, null, 16, 98], [3036, null, 16, 90], [3037, null, 19, 86], [3038, null, 16, 82], [3039, null, 16, 74], [3040, null, 19, 70], [3041, null, 16, 66], [3042, null, 16, 58], [3043, null, 19, 54], [3044, null, 16, 50], [3045, null, 16, 42], [3046, null, 22, 44], [3047, null, 25, 48], [3048, null, 22, 52], [3049, null, 22, 60], [3050, null, 25, 64], [3051, null, 22, 68], [3052, null, 22, 76], [3053, null, 25, 80], [3054, null, 22, 84], [3055, null, 22, 92], [3056, null, 25, 96], [3057, null, 22, 100], [3058, null, 22, 108], [3059, null, 25, 112], [3060, null, 22, 116], [3061, null, 22, 124], [3062, null, 25, 128], [3063, null, 22, 132], [3064, null, 22, 140], [3065, null, 25, 144], [3066, null, 22, 148], [3067, null, 22, 156], [3068, null, 25, 160], [3069, null, 22, 164], [3070, null, 22, 172], [3071, null, 22, 180], [3072, null, 28, 182], [3073, null, 28, 174], [3074, null, 28, 166], [3075, null, 28, 158], [3076, null, 31, 154], [3077, null, 28, 150], [3078, null, 28, 142], [3079, null, 31, 138], [3080, null, 28, 134], [3081, null, 28, 126], [3082, null, 31, 122], [3083, null, 28, 118], [3084, null, 28, 110], [3085, null, 31, 106], [3086, null, 28, 102], [3087, null, 28, 94], [3088, null, 31, 90], [3089, null, 28, 86], [3090, null, 28, 78], [3091, null, 31, 74], [3092, null, 28, 70], [3093, null, 28, 62], [3094, null, 31, 58], [3095, null, 28, 54], [3096, null, 28, 46], [3097, null, 34, 48], [3098, null, 37, 52], [3099, null, 34, 56], [3100, null, 34, 64], [3101, null, 37, 68], [3102, null, 34, 72], [3103, null, 34, 80], [3104, null, 37, 84], [3105, null, 34, 88], [3106, null, 34, 96], [3107, null, 37, 100], [3108, null, 34, 104], [3109, null, 34, 112], [3110, null, 37, 116], [3111, null, 34, 120], [3112, null, 34, 128], [3113, null, 37, 132], [3114, null, 34, 136], [3115, null, 34, 144], [3116, null, 37, 148], [3117, null, 34, 152], [3118, null, 34, 160], [3119, null, 37, 164], [3120, null, 34, 168], [3121, null, 34, 176], [3122, null, 34, 184], [3123, null, 40, 186], [3124, null, 40, 178], [3125, null, 40, 170], [3126, null, 40, 162], [3127, null, 43, 158], [3128, null, 40, 154], [3129, null, 40, 146], [3130, null, 43, 142], [3131, null, 40, 138], [3132, null, 40, 130], [3133, null, 43, 126], [3134, null, 40, 122], [3135, null, 40, 114], [3136, null, 43, 110], [3137, null, 40, 106], [3138, null, 40, 98], [3139, null, 43, 94], [3140, null, 40, 90], [3141, null, 40, 82], [3142, null, 43, 78], [3143, null, 40, 74], [3144, null, 40, 66], [3145, null, 43, 62], [3146, null, 40, 58], [3147, null, 40, 50], [3148, null, 46, 52], [3149, null, 49, 56], [3150, null, 46, 60], [3151, null, 46, 68], [3152, null, 49, 72], [3153, null, 46, 76], [3154, null, 46, 84], [3155, null, 49, 88], [3156, null, 46, 92], [3157, null, 46, 100], [3158, null, 49, 104], [3159, null, 46, 108], [3160, null, 46, 116], [3161, null, 49, 120], [3162, null, 46, 124], [3163, null, 46, 132], [3164, null, 49, 136], [3165, null, 46, 140], [3166, null, 46, 148], [3167, null, 49, 152], [3168, null, 46, 156], [3169, null, 46, 164], [3170, null, 49, 168], [3171, null, 46, 172], [3172, null, 46, 180], [3173, null, 46, 188], [3174, null, 52, 190], [3175, null, 52, 182], [3176, null, 52, 174], [3177, null, 52, 166], [3178, null, 55, 162], [3179, null, 52, 158], [3180, null, 52, 150], [3181, null, 55, 146], [3182, null, 52, 142], [3183, null, 52, 134], [3184, null, 55, 130], [3185, null, 52, 126], [3186, null, 52, 118], [3187, null, 55, 114], [3188, null, 52, 110], [3189, null, 52, 102], [3190, null, 55, 98], [3191, null, 52, 94], [3192, null, 52, 86], [3193, null, 55, 82], [3194, null, 52, 78], [3195, null, 52, 70], [3196, null, 55, 66], [3197, null, 52, 62], [3198, null, 52, 54], [3199, null, 58, 56], [3200, null, 61, 60], [3201, null, 58, 64], [3202, null, 58, 72], [3203, null, 61, 76], [3204, null, 58, 80], [3205, null, 58, 88], [3206, null, 61, 92], [3207, null, 58, 96], [3208, null, 58, 104], [3209, null, 61, 108], [3210, null, 58, 112], [3211, null, 58, 120], [3212, null, 61, 124], [3213, null, 58, 128], [3214, null, 58, 136], [3215, null, 61, 140], [3216, null, 58, 144], [3217, null, 58, 152], [3218, null, 61, 156], [3219, null, 58, 160], [3220, null, 58, 168], [3221, null, 61, 172], [3222, null, 58, 176], [3223, null, 58, 184], [3224, null, 58, 192], [3225, null, 64, 194], [3226, null, 64, 186], [3227, null, 64, 178], [3228, null, 64, 170], [3229, null, 67, 166], [3230, null, 64, 162], [3231, null, 64, 154], [3232, null, 67, 150], [3233, null, 64, 146], [3234, null, 64, 138], [3235, null, 67, 134], [3236, null, 64, 130], [3237, null, 64, 122], [3238, null, 67, 118], [3239, null, 64, 114], [3240, null, 64, 106], [3241, null, 67, 102], [3242, null, 64, 98], [3243, null, 64, 90], [3244, null, 67, 86], [3245, null, 64, 82], [3246, null, 64, 74], [3247, null, 67, 70], [3248, null, 64, 66], [3249, null, 64, 58], [3250, null, 70, 60], [3251, null, 73, 64], [3252, null, 70, 68], [3253, null, 70, 76], [3254, null, 73, 80], [3255, null, 70, 84], [3256, null, 70, 92], [3257, null, 73, 96], [3258, null, 70, 100], [3259, null, 70, 108], [3260, null, 73, 112], [3261, null, 70, 116], [3262, null, 70, 124], [3263, null, 73, 128], [3264, null, 70, 132], [3265, null, 70, 140], [3266, null, 73, 144], [3267, null, 70, 148], [3268, null, 70, 156], [3269, null, 73, 160], [3270, null, 70, 164], [3271, null, 70, 172], [3272, null, 73, 176], [3273, null, 70, 180], [3274, null, 70, 188], [3275, null, 70, 196], [3276, null, 82, 50], [3277, null, 81, 60], [3278, null, 80, 70], [3279, null, 82, 79], [3280, null, 81, 88], [3281, null, 82, 99], [3282, null, 81, 109], [3283, null, 83, 120], [3284, null, 82, 128], [3285, null, 83, 139], [3286, null, 82, 148], [3287, null, 83, 159], [3288, null, 82, 169], [3289, null, 84, 179], [3290, null, 83, 188], [3291, null, 82, 198], [3292, null, 83, 209], [3293, null, 77, 214], [3294, null, 74, 218], [3295, null, 69, 211], [3296, null, 65, 217], [3297, null, 64, 227], [3298, null, 62, 236], [3299, null, 62, 246], [3300, null, 58, 255], [3301, null, 56, 264], [3302, null, 54, 273], [3303, null, 55, 284], [3304, null, 188, 200], [3305, null, 185, 207], [3306, null, 186, 217], [3307, null, 180, 223], [3308, null, 179, 233], [3309, null, 176, 241], [3310, null, 173, 249], [3311, null, 172, 258], [3312, null, 165, 256], [3313, null, 165, 248], [3314, null, 167, 242], [3315, null, 168, 234], [3316, null, 170, 228], [3317, null, 171, 220], [3318, null, 175, 212], [3319, null, 178, 206], [3320, null, 176, 197], [3321, null, 178, 190], [3322, null, 184, 185], [3323, null, 182, 175], [3324, null, 189, 172], [3325, null, 187, 163], [3326, null, 188, 154], [3327, null, 187, 145], [3328, null, 190, 138], [3329, null, 190, 130], [3330, null, 191, 122], [3331, null, 192, 112], [3332, null, 191, 101], [3333, null, 192, 94], [3334, null, 190, 86], [3335, null, 191, 77], [3336, null, 189, 66], [3337, null, 190, 58], [3338, null, 189, 49], [3339, null, 190, 42], [3340, null, 189, 32], [3341, null, 189, 22], [3342, null, 188, 12], [3343, null, 179, 14], [3344, null, 177, 22], [3345, null, 178, 33], [3346, null, 176, 44], [3347, null, 175, 54], [3348, null, 179, 59], [3349, null, 177, 70], [3350, null, 180, 79], [3351, null, 180, 89], [3352, null, 182, 99], [3353, null, 177, 108], [3354, null, 182, 113], [3355, null, 175, 116], [3356, null, 171, 110], [3357, null, 172, 99], [3358, null, 170, 89], [3359, null, 166, 82], [3360, null, 161, 74], [3361, null, 162, 64], [3362, null, 167, 53], [3363, null, 168, 42], [3364, null, 161, 37], [3365, null, 165, 26], [3366, null, 167, 18], [3367, null, 158, 19], [3368, null, 154, 25], [3369, null, 146, 27], [3370, null, 149, 36], [3371, null, 147, 47], [3372, null, 151, 55], [3373, null, 150, 65], [3374, null, 151, 74], [3375, null, 152, 83], [3376, null, 160, 83], [3377, null, 161, 89], [3378, null, 164, 96], [3379, null, 163, 106], [3380, null, 164, 114], [3381, null, 167, 121], [3382, null, 165, 130], [3383, null, 173, 127], [3384, null, 180, 120], [3385, null, 182, 127], [3386, null, 178, 136], [3387, null, 180, 141], [3388, null, 178, 147], [3389, null, 175, 157], [3390, null, 171, 167], [3391, null, 172, 175], [3392, null, 168, 184], [3393, null, 169, 190], [3394, null, 167, 197], [3395, null, 166, 206], [3396, null, 160, 214], [3397, null, 161, 220], [3398, null, 159, 228], [3399, null, 159, 233], [3400, null, 155, 240], [3401, null, 157, 247], [3402, null, 156, 256], [3403, null, 149, 260], [3404, null, 148, 251], [3405, null, 149, 243], [3406, null, 148, 237], [3407, null, 151, 227], [3408, null, 148, 222], [3409, null, 151, 213], [3410, null, 156, 204], [3411, null, 153, 200], [3412, null, 157, 190], [3413, null, 162, 179], [3414, null, 163, 171], [3415, null, 165, 161], [3416, null, 164, 155], [3417, null, 165, 147], [3418, null, 163, 142], [3419, null, 158, 140], [3420, null, 156, 134], [3421, null, 158, 125], [3422, null, 154, 119], [3423, null, 155, 110], [3424, null, 152, 104], [3425, null, 148, 96], [3426, null, 146, 86], [3427, null, 143, 76], [3428, null, 141, 68], [3429, null, 143, 58], [3430, null, 139, 52], [3431, null, 139, 42], [3432, null, 135, 36], [3433, null, 128, 41], [3434, null, 130, 50], [3435, null, 130, 61], [3436, null, 134, 66], [3437, null, 133, 75], [3438, null, 138, 81], [3439, null, 136, 91], [3440, null, 134, 101], [3441, null, 136, 110], [3442, null, 144, 113], [3443, null, 145, 122], [3444, null, 150, 129], [3445, null, 148, 140], [3446, null, 149, 147], [3447, null, 150, 156], [3448, null, 152, 162], [3449, null, 152, 169], [3450, null, 152, 175], [3451, null, 148, 183], [3452, null, 148, 188], [3453, null, 147, 197], [3454, null, 146, 206], [3455, null, 143, 213], [3456, null, 140, 224], [3457, null, 137, 233], [3458, null, 140, 239], [3459, null, 142, 246], [3460, null, 140, 256], [3461, null, 136, 267], [3462, null, 130, 269], [3463, null, 132, 260], [3464, null, 133, 250], [3465, null, 132, 245], [3466, null, 130, 238], [3467, null, 128, 232], [3468, null, 135, 225], [3469, null, 137, 216], [3470, null, 135, 212], [3471, null, 137, 202], [3472, null, 138, 196], [3473, null, 140, 187], [3474, null, 139, 181], [3475, null, 142, 173], [3476, null, 140, 169], [3477, null, 134, 169], [3478, null, 132, 164], [3479, null, 134, 154], [3480, null, 133, 146], [3481, null, 135, 136], [3482, null, 131, 130], [3483, null, 135, 124], [3484, null, 133, 116], [3485, null, 129, 108], [3486, null, 128, 100], [3487, null, 129, 89], [3488, null, 127, 81], [3489, null, 122, 78], [3490, null, 118, 71], [3491, null, 123, 64], [3492, null, 119, 57], [3493, null, 120, 48], [3494, null, 120, 40], [3495, null, 113, 41], [3496, null, 108, 48], [3497, null, 113, 55], [3498, null, 111, 65], [3499, null, 109, 74], [3500, null, 112, 81], [3501, null, 117, 87], [3502, null, 117, 97], [3503, null, 118, 104], [3504, null, 121, 111], [3505, null, 123, 120], [3506, null, 119, 130], [3507, null, 125, 134], [3508, null, 126, 142], [3509, null, 121, 151], [3510, null, 123, 160], [3511, null, 124, 168], [3512, null, 119, 176], [3513, null, 122, 180], [3514, null, 129, 179], [3515, null, 131, 184], [3516, null, 129, 192], [3517, null, 130, 199], [3518, null, 127, 207], [3519, null, 129, 212], [3520, null, 129, 221], [3521, null, 123, 231], [3522, null, 123, 239], [3523, null, 124, 247], [3524, null, 125, 253], [3525, null, 124, 263], [3526, null, 124, 272], [3527, null, 118, 278], [3528, null, 119, 271], [3529, null, 117, 265], [3530, null, 119, 255], [3531, null, 118, 247], [3532, null, 116, 240], [3533, null, 118, 231], [3534, null, 116, 226], [3535, null, 121, 215], [3536, null, 119, 210], [3537, null, 123, 202], [3538, null, 122, 194], [3539, null, 119, 190], [3540, null, 115, 187], [3541, null, 112, 182], [3542, null, 110, 175], [3543, null, 116, 165], [3544, null, 115, 158], [3545, null, 108, 156], [3546, null, 109, 148], [3547, null, 112, 139], [3548, null, 111, 132], [3549, null, 115, 121], [3550, null, 112, 111], [3551, null, 103, 42], [3552, null, 101, 48], [3553, null, 100, 57], [3554, null, 103, 67], [3555, null, 100, 77], [3556, null, 101, 84], [3557, null, 104, 89], [3558, null, 105, 96], [3559, null, 106, 104], [3560, null, 102, 113], [3561, null, 103, 120], [3562, null, 106, 128], [3563, null, 102, 138], [3564, null, 103, 147], [3565, null, 100, 157], [3566, null, 103, 163], [3567, null, 99, 172], [3568, null, 97, 180], [3569, null, 104, 188], [3570, null, 106, 194], [3571, null, 111, 196], [3572, null, 112, 201], [3573, null, 114, 207], [3574, null, 111, 213], [3575, null, 107, 224], [3576, null, 103, 233], [3577, null, 106, 236], [3578, null, 108, 243], [3579, null, 106, 252], [3580, null, 108, 258], [3581, null, 106, 265], [3582, null, 108, 274], [3583, null, 106, 284], [3584, null, 97, 288], [3585, null, 88, 282], [3586, null, 94, 274], [3587, null, 97, 266], [3588, null, 92, 261], [3589, null, 94, 253], [3590, null, 89, 248], [3591, null, 91, 241], [3592, null, 97, 232], [3593, null, 101, 220], [3594, null, 95, 227], [3595, null, 90, 234], [3596, null, 86, 243], [3597, null, 82, 250], [3598, null, 83, 256], [3599, null, 82, 263], [3600, null, 77, 269], [3601, null, 78, 274], [3602, null, 80, 280], [3603, null, 83, 288], [3604, null, 73, 290], [3605, null, 63, 291], [3606, null, 66, 286], [3607, null, 69, 279], [3608, null, 67, 272], [3609, null, 68, 266], [3610, null, 73, 257], [3611, null, 75, 249], [3612, null, 81, 242], [3613, null, 82, 234], [3614, null, 88, 226], [3615, null, 94, 220], [3616, null, 100, 217], [3617, null, 105, 210], [3618, null, 102, 206], [3619, null, 96, 205], [3620, null, 98, 196], [3621, null, 94, 190], [3622, null, 92, 185], [3623, null, 92, 176], [3624, null, 94, 166], [3625, null, 93, 156], [3626, null, 94, 145], [3627, null, 92, 138], [3628, null, 93, 130], [3629, null, 92, 121], [3630, null, 94, 113], [3631, null, 94, 104], [3632, null, 91, 96], [3633, null, 90, 86], [3634, null, 92, 74], [3635, null, 90, 65], [3636, null, 94, 55], [3637, null, 91, 46]], + '7-25': [[3638, null, 7, 26], [3639, null, 7, 52], [3640, null, 7, 68], [3641, null, 7, 84], [3642, null, 7, 100], [3643, null, 7, 116], [3644, null, 7, 132], [3645, null, 7, 148], [3646, null, 10, 32], [3647, null, 10, 40], [3648, null, 10, 48], [3649, null, 10, 56], [3650, null, 10, 64], [3651, null, 10, 72], [3652, null, 10, 80], [3653, null, 10, 88], [3654, null, 10, 96], [3655, null, 10, 104], [3656, null, 10, 112], [3657, null, 10, 120], [3658, null, 10, 128], [3659, null, 10, 136], [3660, null, 10, 144], [3661, null, 10, 152], [3662, null, 10, 160], [3663, null, 10, 168], [3664, null, 10, 176], [3665, null, 13, 28], [3666, null, 13, 44], [3667, null, 13, 60], [3668, null, 13, 76], [3669, null, 13, 92], [3670, null, 13, 108], [3671, null, 13, 124], [3672, null, 13, 140], [3673, null, 13, 156], [3674, null, 16, 33], [3675, null, 16, 42], [3676, null, 16, 50], [3677, null, 16, 58], [3678, null, 16, 66], [3679, null, 16, 74], [3680, null, 16, 82], [3681, null, 16, 90], [3682, null, 16, 98], [3683, null, 16, 106], [3684, null, 16, 114], [3685, null, 16, 122], [3686, null, 16, 130], [3687, null, 16, 138], [3688, null, 16, 146], [3689, null, 16, 154], [3690, null, 16, 162], [3691, null, 16, 170], [3692, null, 16, 178], [3693, null, 19, 30], [3694, null, 19, 54], [3695, null, 19, 70], [3696, null, 19, 86], [3697, null, 19, 102], [3698, null, 19, 118], [3699, null, 19, 134], [3700, null, 19, 150], [3701, null, 22, 35], [3702, null, 22, 44], [3703, null, 22, 52], [3704, null, 22, 60], [3705, null, 22, 68], [3706, null, 22, 76], [3707, null, 22, 84], [3708, null, 22, 92], [3709, null, 22, 100], [3710, null, 22, 108], [3711, null, 22, 116], [3712, null, 22, 124], [3713, null, 22, 132], [3714, null, 22, 140], [3715, null, 22, 148], [3716, null, 22, 156], [3717, null, 22, 164], [3718, null, 22, 172], [3719, null, 22, 180], [3720, null, 25, 32], [3721, null, 25, 48], [3722, null, 25, 64], [3723, null, 25, 80], [3724, null, 25, 96], [3725, null, 25, 112], [3726, null, 25, 128], [3727, null, 25, 144], [3728, null, 25, 160], [3729, null, 28, 37], [3730, null, 28, 46], [3731, null, 28, 54], [3732, null, 28, 62], [3733, null, 28, 70], [3734, null, 28, 78], [3735, null, 28, 86], [3736, null, 28, 94], [3737, null, 28, 102], [3738, null, 28, 110], [3739, null, 28, 118], [3740, null, 28, 126], [3741, null, 28, 134], [3742, null, 28, 142], [3743, null, 28, 150], [3744, null, 28, 158], [3745, null, 28, 166], [3746, null, 28, 174], [3747, null, 28, 182], [3748, null, 31, 34], [3749, null, 31, 58], [3750, null, 31, 74], [3751, null, 31, 90], [3752, null, 31, 106], [3753, null, 31, 122], [3754, null, 31, 138], [3755, null, 31, 154], [3756, null, 34, 39], [3757, null, 34, 48], [3758, null, 34, 56], [3759, null, 34, 64], [3760, null, 34, 72], [3761, null, 34, 80], [3762, null, 34, 88], [3763, null, 34, 96], [3764, null, 34, 104], [3765, null, 34, 112], [3766, null, 34, 120], [3767, null, 34, 128], [3768, null, 34, 136], [3769, null, 34, 144], [3770, null, 34, 152], [3771, null, 34, 160], [3772, null, 34, 168], [3773, null, 34, 176], [3774, null, 34, 184], [3775, null, 37, 36], [3776, null, 37, 52], [3777, null, 37, 68], [3778, null, 37, 84], [3779, null, 37, 100], [3780, null, 37, 116], [3781, null, 37, 132], [3782, null, 37, 148], [3783, null, 37, 164], [3784, null, 40, 41], [3785, null, 40, 50], [3786, null, 40, 58], [3787, null, 40, 66], [3788, null, 40, 74], [3789, null, 40, 82], [3790, null, 40, 90], [3791, null, 40, 98], [3792, null, 40, 106], [3793, null, 40, 114], [3794, null, 40, 122], [3795, null, 40, 130], [3796, null, 40, 138], [3797, null, 40, 146], [3798, null, 40, 154], [3799, null, 40, 162], [3800, null, 40, 170], [3801, null, 40, 178], [3802, null, 40, 186], [3803, null, 43, 38], [3804, null, 43, 62], [3805, null, 43, 78], [3806, null, 43, 94], [3807, null, 43, 110], [3808, null, 43, 126], [3809, null, 43, 142], [3810, null, 43, 158], [3811, null, 46, 43], [3812, null, 46, 52], [3813, null, 46, 60], [3814, null, 46, 68], [3815, null, 46, 76], [3816, null, 46, 84], [3817, null, 46, 92], [3818, null, 46, 100], [3819, null, 46, 108], [3820, null, 46, 116], [3821, null, 46, 124], [3822, null, 46, 132], [3823, null, 46, 140], [3824, null, 46, 148], [3825, null, 46, 156], [3826, null, 46, 164], [3827, null, 46, 172], [3828, null, 46, 180], [3829, null, 46, 188], [3830, null, 49, 40], [3831, null, 49, 56], [3832, null, 49, 72], [3833, null, 49, 88], [3834, null, 49, 104], [3835, null, 49, 120], [3836, null, 49, 136], [3837, null, 49, 152], [3838, null, 49, 168], [3839, null, 52, 45], [3840, null, 52, 54], [3841, null, 52, 62], [3842, null, 52, 70], [3843, null, 52, 78], [3844, null, 52, 86], [3845, null, 52, 94], [3846, null, 52, 102], [3847, null, 52, 110], [3848, null, 52, 118], [3849, null, 52, 126], [3850, null, 52, 134], [3851, null, 52, 142], [3852, null, 52, 150], [3853, null, 52, 158], [3854, null, 52, 166], [3855, null, 52, 174], [3856, null, 52, 182], [3857, null, 52, 190], [3858, null, 55, 42], [3859, null, 55, 66], [3860, null, 55, 82], [3861, null, 55, 98], [3862, null, 55, 114], [3863, null, 55, 130], [3864, null, 55, 146], [3865, null, 55, 162], [3866, null, 55, 284], [3867, null, 56, 264], [3868, null, 58, 47], [3869, null, 58, 56], [3870, null, 58, 64], [3871, null, 58, 72], [3872, null, 58, 80], [3873, null, 58, 88], [3874, null, 58, 96], [3875, null, 58, 104], [3876, null, 58, 112], [3877, null, 58, 120], [3878, null, 58, 128], [3879, null, 58, 136], [3880, null, 58, 144], [3881, null, 58, 152], [3882, null, 58, 160], [3883, null, 58, 168], [3884, null, 58, 176], [3885, null, 58, 184], [3886, null, 58, 192], [3887, null, 61, 44], [3888, null, 61, 60], [3889, null, 61, 76], [3890, null, 61, 92], [3891, null, 61, 108], [3892, null, 61, 124], [3893, null, 61, 140], [3894, null, 61, 156], [3895, null, 61, 172], [3896, null, 62, 236], [3897, null, 64, 49], [3898, null, 64, 58], [3899, null, 64, 66], [3900, null, 64, 74], [3901, null, 64, 82], [3902, null, 64, 90], [3903, null, 64, 98], [3904, null, 64, 106], [3905, null, 64, 114], [3906, null, 64, 122], [3907, null, 64, 130], [3908, null, 64, 138], [3909, null, 64, 146], [3910, null, 64, 154], [3911, null, 64, 162], [3912, null, 64, 170], [3913, null, 64, 178], [3914, null, 64, 186], [3915, null, 64, 194], [3916, null, 65, 217], [3917, null, 67, 46], [3918, null, 67, 70], [3919, null, 67, 86], [3920, null, 67, 102], [3921, null, 67, 118], [3922, null, 67, 134], [3923, null, 67, 150], [3924, null, 67, 166], [3925, null, 68, 266], [3926, null, 69, 279], [3927, null, 70, 51], [3928, null, 70, 60], [3929, null, 70, 68], [3930, null, 70, 76], [3931, null, 70, 84], [3932, null, 70, 92], [3933, null, 70, 100], [3934, null, 70, 108], [3935, null, 70, 116], [3936, null, 70, 124], [3937, null, 70, 132], [3938, null, 70, 140], [3939, null, 70, 148], [3940, null, 70, 156], [3941, null, 70, 164], [3942, null, 70, 172], [3943, null, 70, 180], [3944, null, 70, 188], [3945, null, 70, 196], [3946, null, 73, 48], [3947, null, 73, 64], [3948, null, 73, 80], [3949, null, 73, 96], [3950, null, 73, 112], [3951, null, 73, 128], [3952, null, 73, 144], [3953, null, 73, 160], [3954, null, 73, 176], [3955, null, 77, 214], [3956, null, 77, 269], [3957, null, 80, 70], [3958, null, 81, 88], [3959, null, 81, 242], [3960, null, 82, 50], [3961, null, 82, 148], [3962, null, 82, 169], [3963, null, 82, 198], [3964, null, 83, 120], [3965, null, 83, 256], [3966, null, 83, 288], [3967, null, 88, 226], [3968, null, 89, 248], [3969, null, 90, 86], [3970, null, 91, 241], [3971, null, 92, 74], [3972, null, 92, 121], [3973, null, 93, 130], [3974, null, 93, 156], [3975, null, 94, 55], [3976, null, 94, 145], [3977, null, 94, 166], [3978, null, 94, 190], [3979, null, 94, 220], [3980, null, 94, 253], [3981, null, 94, 274], [3982, null, 96, 205], [3983, null, 97, 180], [3984, null, 97, 232], [3985, null, 97, 266], [3986, null, 101, 84], [3987, null, 102, 113], [3988, null, 102, 206], [3989, null, 103, 67], [3990, null, 103, 147], [3991, null, 103, 163], [3992, null, 104, 188], [3993, null, 105, 96], [3994, null, 106, 128], [3995, null, 106, 236], [3996, null, 106, 284], [3997, null, 107, 224], [3998, null, 108, 48], [3999, null, 108, 258], [4000, null, 108, 274], [4001, null, 109, 74], [4002, null, 111, 196], [4003, null, 111, 213], [4004, null, 112, 111], [4005, null, 112, 139], [4006, null, 112, 182], [4007, null, 115, 121], [4008, null, 115, 158], [4009, null, 115, 187], [4010, null, 116, 226], [4011, null, 116, 240], [4012, null, 117, 87], [4013, null, 117, 97], [4014, null, 119, 130], [4015, null, 119, 255], [4016, null, 119, 271], [4017, null, 120, 40], [4018, null, 121, 111], [4019, null, 121, 215], [4020, null, 122, 194], [4021, null, 123, 64], [4022, null, 123, 202], [4023, null, 124, 247], [4024, null, 124, 263], [4025, null, 128, 41], [4026, null, 128, 232], [4027, null, 129, 108], [4028, null, 129, 179], [4029, null, 129, 192], [4030, null, 129, 221], [4031, null, 130, 61], [4032, null, 130, 199], [4033, null, 130, 269], [4034, null, 131, 130], [4035, null, 132, 164], [4036, null, 133, 75], [4037, null, 133, 146], [4038, null, 133, 250], [4039, null, 134, 169], [4040, null, 135, 225], [4041, null, 136, 91], [4042, null, 136, 110], [4043, null, 136, 267], [4044, null, 137, 202], [4045, null, 138, 81], [4046, null, 139, 42], [4047, null, 139, 181], [4048, null, 140, 169], [4049, null, 140, 239], [4050, null, 143, 58], [4051, null, 145, 122], [4052, null, 146, 27], [4053, null, 147, 47], [4054, null, 148, 96], [4055, null, 148, 251], [4056, null, 149, 147], [4057, null, 149, 243], [4058, null, 150, 156], [4059, null, 151, 55], [4060, null, 151, 74], [4061, null, 151, 213], [4062, null, 151, 227], [4063, null, 152, 104], [4064, null, 152, 169], [4065, null, 156, 204], [4066, null, 156, 256], [4067, null, 157, 190], [4068, null, 158, 125], [4069, null, 160, 214], [4070, null, 161, 74], [4071, null, 161, 220], [4072, null, 162, 64], [4073, null, 162, 179], [4074, null, 163, 142], [4075, null, 164, 96], [4076, null, 165, 26], [4077, null, 165, 130], [4078, null, 165, 161], [4079, null, 166, 82], [4080, null, 166, 206], [4081, null, 167, 18], [4082, null, 167, 53], [4083, null, 167, 242], [4084, null, 168, 42], [4085, null, 168, 184], [4086, null, 169, 190], [4087, null, 170, 228], [4088, null, 171, 110], [4089, null, 171, 167], [4090, null, 171, 220], [4091, null, 172, 258], [4092, null, 175, 116], [4093, null, 176, 44], [4094, null, 177, 22], [4095, null, 178, 136], [4096, null, 178, 147], [4097, null, 178, 206], [4098, null, 179, 59], [4099, null, 179, 233], [4100, null, 180, 79], [4101, null, 180, 89], [4102, null, 180, 120], [4103, null, 182, 127], [4104, null, 182, 175], [4105, null, 185, 207], [4106, null, 187, 145], [4107, null, 187, 163], [4108, null, 188, 154], [4109, null, 189, 22], [4110, null, 190, 42], [4111, null, 190, 58], [4112, null, 190, 138], [4113, null, 191, 77], [4114, null, 191, 122], [4115, null, 192, 94], [4116, null, 192, 112]], + '8-26': [[4117, null, -40, 28], [4118, null, -40, 36], [4119, null, -40, 44], [4120, null, -40, 52], [4121, null, -40, 60], [4122, null, -40, 68], [4123, null, -40, 76], [4124, null, -40, 84], [4125, null, -40, 92], [4126, null, -40, 100], [4127, null, -40, 108], [4128, null, -40, 116], [4129, null, -40, 124], [4130, null, -40, 132], [4131, null, -40, 140], [4146, null, -32, 28], [4147, null, -32, 36], [4148, null, -32, 44], [4149, null, -32, 52], [4150, null, -32, 60], [4151, null, -32, 68], [4152, null, -32, 76], [4153, null, -32, 84], [4154, null, -32, 92], [4155, null, -32, 100], [4156, null, -32, 108], [4157, null, -32, 116], [4158, null, -32, 124], [4159, null, -32, 132], [4160, null, -32, 140], [4175, null, -24, 28], [4176, null, -24, 36], [4177, null, -24, 44], [4178, null, -24, 52], [4179, null, -24, 60], [4180, null, -24, 68], [4181, null, -24, 76], [4182, null, -24, 84], [4183, null, -24, 92], [4184, null, -24, 100], [4185, null, -24, 108], [4186, null, -24, 116], [4187, null, -24, 124], [4188, null, -24, 132], [4189, null, -24, 140], [4204, null, -16, 28], [4205, null, -16, 36], [4206, null, -16, 44], [4207, null, -16, 52], [4208, null, -16, 60], [4209, null, -16, 68], [4210, null, -16, 76], [4211, null, -16, 84], [4212, null, -16, 92], [4213, null, -16, 100], [4214, null, -16, 108], [4215, null, -16, 116], [4216, null, -16, 124], [4217, null, -16, 132], [4218, null, -16, 140], [4233, null, -8, 28], [4234, null, -8, 36], [4235, null, -8, 44], [4236, null, -8, 52], [4237, null, -8, 60], [4238, null, -8, 68], [4239, null, -8, 76], [4240, null, -8, 84], [4241, null, -8, 92], [4242, null, -8, 100], [4243, null, -8, 108], [4244, null, -8, 116], [4245, null, -8, 124], [4246, null, -8, 132], [4247, null, -8, 140], [4262, null, 0, 28], [4263, null, 0, 36], [4264, null, 0, 44], [4265, null, 0, 52], [4266, null, 0, 60], [4267, null, 0, 68], [4268, null, 0, 76], [4269, null, 0, 84], [4270, null, 0, 92], [4271, null, 0, 100], [4272, null, 0, 108], [4273, null, 0, 116], [4274, null, 0, 124], [4275, null, 0, 132], [4276, null, 0, 140], [4291, null, 8, 28], [4292, null, 8, 36], [4293, null, 8, 44], [4294, null, 8, 52], [4295, null, 8, 60], [4296, null, 8, 68], [4297, null, 8, 76], [4298, null, 8, 84], [4299, null, 8, 92], [4300, null, 8, 100], [4301, null, 8, 108], [4302, null, 8, 116], [4303, null, 8, 124], [4304, null, 8, 132], [4305, null, 8, 140], [4320, null, 16, 28], [4321, null, 16, 36], [4322, null, 16, 44], [4323, null, 16, 52], [4324, null, 16, 60], [4325, null, 16, 68], [4326, null, 16, 76], [4327, null, 16, 84], [4328, null, 16, 92], [4329, null, 16, 100], [4330, null, 16, 108], [4331, null, 16, 116], [4332, null, 16, 124], [4333, null, 16, 132], [4334, null, 16, 140], [4349, null, 24, 28], [4350, null, 24, 36], [4351, null, 24, 44], [4352, null, 24, 52], [4353, null, 24, 60], [4354, null, 24, 68], [4355, null, 24, 76], [4356, null, 24, 84], [4357, null, 24, 92], [4358, null, 24, 100], [4359, null, 24, 108], [4360, null, 24, 116], [4361, null, 24, 124], [4362, null, 24, 132], [4363, null, 24, 140], [4378, null, 32, 28], [4379, null, 32, 36], [4380, null, 32, 44], [4381, null, 32, 52], [4382, null, 32, 60], [4383, null, 32, 68], [4384, null, 32, 76], [4385, null, 32, 84], [4386, null, 32, 92], [4387, null, 32, 100], [4388, null, 32, 108], [4389, null, 32, 116], [4390, null, 32, 124], [4391, null, 32, 132], [4392, null, 32, 140], [4407, null, 40, 28], [4408, null, 40, 36], [4409, null, 40, 44], [4410, null, 40, 52], [4411, null, 40, 60], [4412, null, 40, 68], [4413, null, 40, 76], [4414, null, 40, 84], [4415, null, 40, 92], [4416, null, 40, 100], [4417, null, 40, 108], [4418, null, 40, 116], [4419, null, 40, 124], [4420, null, 40, 132], [4421, null, 40, 140], [4487, null, -48, 140], [4488, null, -48, 132], [4489, null, -48, 124], [4490, null, -48, 116], [4491, null, -48, 108], [4492, null, -48, 100], [4493, null, -48, 92], [4494, null, -48, 84], [4495, null, -48, 76], [4496, null, -48, 68], [4497, null, -48, 60], [4498, null, -48, 52], [4499, null, -48, 44], [4500, null, -48, 36], [4501, null, -48, 28], [4502, null, 48, 140], [4503, null, 48, 132], [4504, null, 48, 124], [4505, null, 48, 116], [4506, null, 48, 108], [4507, null, 48, 100], [4508, null, 48, 92], [4509, null, 48, 84], [4510, null, 48, 76], [4511, null, 48, 68], [4512, null, 48, 60], [4513, null, 48, 52], [4514, null, 48, 44], [4515, null, 48, 36], [4516, null, 48, 28], [4517, null, -48, 20], [4518, null, -48, 12], [4519, null, -48, 4], [4520, null, -40, 20], [4521, null, -40, 12], [4522, null, -40, 4], [4523, null, -32, 20], [4524, null, -32, 12], [4525, null, -32, 4], [4526, null, -24, 20], [4527, null, -24, 12], [4528, null, -24, 4], [4529, null, -16, 20], [4530, null, -16, 12], [4531, null, -16, 4], [4532, null, -8, 20], [4533, null, -8, 12], [4534, null, -8, 4], [4535, null, 0, 20], [4536, null, 0, 12], [4537, null, 0, 4], [4538, null, 8, 20], [4539, null, 8, 12], [4540, null, 8, 4], [4541, null, 16, 20], [4542, null, 16, 12], [4543, null, 16, 4], [4544, null, 24, 20], [4545, null, 24, 12], [4546, null, 24, 4], [4547, null, 32, 20], [4548, null, 32, 12], [4549, null, 32, 4], [4550, null, 40, 20], [4551, null, 40, 12], [4552, null, 40, 4], [4553, null, 48, 20], [4554, null, 48, 12], [4555, null, 48, 4]], + '8-27': [[4132, null, -36, 136], [4133, null, -36, 128], [4134, null, -36, 120], [4135, null, -36, 112], [4136, null, -36, 104], [4137, null, -36, 96], [4138, null, -36, 88], [4139, null, -36, 80], [4140, null, -36, 72], [4141, null, -36, 64], [4142, null, -36, 56], [4143, null, -36, 48], [4144, null, -36, 40], [4145, null, -36, 32], [4161, null, -28, 136], [4162, null, -28, 128], [4163, null, -28, 120], [4164, null, -28, 112], [4165, null, -28, 104], [4166, null, -28, 96], [4167, null, -28, 88], [4168, null, -28, 80], [4169, null, -28, 72], [4170, null, -28, 64], [4171, null, -28, 56], [4172, null, -28, 48], [4173, null, -28, 40], [4174, null, -28, 32], [4190, null, -20, 136], [4191, null, -20, 128], [4192, null, -20, 120], [4193, null, -20, 112], [4194, null, -20, 104], [4195, null, -20, 96], [4196, null, -20, 88], [4197, null, -20, 80], [4198, null, -20, 72], [4199, null, -20, 64], [4200, null, -20, 56], [4201, null, -20, 48], [4202, null, -20, 40], [4203, null, -20, 32], [4219, null, -12, 136], [4220, null, -12, 128], [4221, null, -12, 120], [4222, null, -12, 112], [4223, null, -12, 104], [4224, null, -12, 96], [4225, null, -12, 88], [4226, null, -12, 80], [4227, null, -12, 72], [4228, null, -12, 64], [4229, null, -12, 56], [4230, null, -12, 48], [4231, null, -12, 40], [4232, null, -12, 32], [4248, null, -4, 136], [4249, null, -4, 128], [4250, null, -4, 120], [4251, null, -4, 112], [4252, null, -4, 104], [4253, null, -4, 96], [4254, null, -4, 88], [4255, null, -4, 80], [4256, null, -4, 72], [4257, null, -4, 64], [4258, null, -4, 56], [4259, null, -4, 48], [4260, null, -4, 40], [4261, null, -4, 32], [4277, null, 4, 136], [4278, null, 4, 128], [4279, null, 4, 120], [4280, null, 4, 112], [4281, null, 4, 104], [4282, null, 4, 96], [4283, null, 4, 88], [4284, null, 4, 80], [4285, null, 4, 72], [4286, null, 4, 64], [4287, null, 4, 56], [4288, null, 4, 48], [4289, null, 4, 40], [4290, null, 4, 32], [4306, null, 12, 136], [4307, null, 12, 128], [4308, null, 12, 120], [4309, null, 12, 112], [4310, null, 12, 104], [4311, null, 12, 96], [4312, null, 12, 88], [4313, null, 12, 80], [4314, null, 12, 72], [4315, null, 12, 64], [4316, null, 12, 56], [4317, null, 12, 48], [4318, null, 12, 40], [4319, null, 12, 32], [4335, null, 20, 136], [4336, null, 20, 128], [4337, null, 20, 120], [4338, null, 20, 112], [4339, null, 20, 104], [4340, null, 20, 96], [4341, null, 20, 88], [4342, null, 20, 80], [4343, null, 20, 72], [4344, null, 20, 64], [4345, null, 20, 56], [4346, null, 20, 48], [4347, null, 20, 40], [4348, null, 20, 32], [4364, null, 28, 136], [4365, null, 28, 128], [4366, null, 28, 120], [4367, null, 28, 112], [4368, null, 28, 104], [4369, null, 28, 96], [4370, null, 28, 88], [4371, null, 28, 80], [4372, null, 28, 72], [4373, null, 28, 64], [4374, null, 28, 56], [4375, null, 28, 48], [4376, null, 28, 40], [4377, null, 28, 32], [4393, null, 36, 136], [4394, null, 36, 128], [4395, null, 36, 120], [4396, null, 36, 112], [4397, null, 36, 104], [4398, null, 36, 96], [4399, null, 36, 88], [4400, null, 36, 80], [4401, null, 36, 72], [4402, null, 36, 64], [4403, null, 36, 56], [4404, null, 36, 48], [4405, null, 36, 40], [4406, null, 36, 32], [4556, null, -52, 32], [4557, null, -52, 40], [4558, null, -52, 48], [4559, null, -52, 56], [4560, null, -52, 64], [4561, null, -52, 72], [4562, null, -52, 80], [4563, null, -52, 88], [4564, null, -52, 96], [4565, null, -52, 104], [4566, null, -52, 112], [4567, null, -52, 120], [4568, null, -52, 128], [4569, null, -52, 136], [4570, null, -44, 32], [4571, null, -44, 40], [4572, null, -44, 48], [4573, null, -44, 56], [4574, null, -44, 64], [4575, null, -44, 72], [4576, null, -44, 80], [4577, null, -44, 88], [4578, null, -44, 96], [4579, null, -44, 104], [4580, null, -44, 112], [4581, null, -44, 120], [4582, null, -44, 128], [4583, null, -44, 136], [4584, null, 44, 32], [4585, null, 44, 40], [4586, null, 44, 48], [4587, null, 44, 56], [4588, null, 44, 64], [4589, null, 44, 72], [4590, null, 44, 80], [4591, null, 44, 88], [4592, null, 44, 96], [4593, null, 44, 104], [4594, null, 44, 112], [4595, null, 44, 120], [4596, null, 44, 128], [4597, null, 44, 136], [4598, null, 52, 32], [4599, null, 52, 40], [4600, null, 52, 48], [4601, null, 52, 56], [4602, null, 52, 64], [4603, null, 52, 72], [4604, null, 52, 80], [4605, null, 52, 88], [4606, null, 52, 96], [4607, null, 52, 104], [4608, null, 52, 112], [4609, null, 52, 120], [4610, null, 52, 128], [4611, null, 52, 136], [4612, null, -52, 8], [4613, null, -52, 16], [4614, null, -52, 24], [4615, null, -44, 8], [4616, null, -44, 16], [4617, null, -44, 24], [4618, null, -36, 8], [4619, null, -36, 16], [4620, null, -36, 24], [4621, null, -28, 8], [4622, null, -28, 16], [4623, null, -28, 24], [4624, null, -20, 8], [4625, null, -20, 16], [4626, null, -20, 24], [4627, null, -12, 8], [4628, null, -12, 16], [4629, null, -12, 24], [4630, null, -4, 8], [4631, null, -4, 16], [4632, null, -4, 24], [4633, null, 4, 8], [4634, null, 4, 16], [4635, null, 4, 24], [4636, null, 12, 8], [4637, null, 12, 16], [4638, null, 12, 24], [4639, null, 20, 8], [4640, null, 20, 16], [4641, null, 20, 24], [4642, null, 28, 8], [4643, null, 28, 16], [4644, null, 28, 24], [4645, null, 36, 8], [4646, null, 36, 16], [4647, null, 36, 24], [4648, null, 44, 8], [4649, null, 44, 16], [4650, null, 44, 24], [4651, null, 52, 8], [4652, null, 52, 16], [4653, null, 52, 24]], + '8-28': [[4654, null, 48, -4], [4655, null, 40, -4], [4656, null, 32, -4], [4657, null, 24, -4], [4658, null, 16, -4], [4659, null, 8, -4], [4660, null, 0, -4], [4661, null, -8, -4], [4662, null, -16, -4], [4663, null, -24, -4], [4664, null, -32, -4], [4665, null, -40, -4], [4666, null, -48, -4]], + '8-29': [[4667, null, -52, -8], [4668, null, 44, -8], [4669, null, 36, -8], [4670, null, 28, -8], [4671, null, 20, -8], [4672, null, 12, -8], [4673, null, 4, -8], [4674, null, -4, -8], [4675, null, -12, -8], [4676, null, -20, -8], [4677, null, -28, -8], [4678, null, -36, -8], [4679, null, -44, -8], [4680, null, 52, -8]], + }, + tension: { + '9-8': [[1, 2, 16, 152], [2, 1, 80, 152], [3, 4, 16, 32], [4, 3, 80, 32], [5, 6, 40, 32], [6, 5, 56, 32], [7, 7, 48, 32], [8, 9, 8, 136], [9, 8, 88, 136], [10, 11, 16, 120], [11, 10, 80, 120], [12, 13, 32, 136], [13, 12, 64, 136], [14, 15, 32, 112], [15, 14, 64, 112], [16, 17, 32, 96], [17, 16, 64, 96], [18, 19, 32, 80], [19, 18, 64, 80], [20, 21, 40, 96], [21, 20, 56, 96], [22, 23, 40, 64], [23, 22, 56, 64], [24, 25, 8, 96], [25, 24, 88, 96], [26, 27, 32, 144], [27, 26, 64, 144], [28, 29, 40, 88], [29, 28, 56, 88], [30, 31, 24, 128], [31, 30, 72, 128], [32, 33, 24, 32], [33, 32, 72, 32], [34, 35, 40, 40], [35, 34, 56, 40], [36, 37, 16, 112], [37, 36, 80, 112], [38, 38, 48, 136], [39, 39, 48, 104], [40, 41, 40, 136], [41, 40, 56, 136], [42, 43, 8, 72], [43, 42, 88, 72], [44, 45, 40, 104], [45, 44, 56, 104], [46, 46, 48, 72], [47, 48, 24, 40], [48, 47, 72, 40], [49, 50, 32, 64], [50, 49, 64, 64], [51, 52, 40, 120], [52, 51, 56, 120], [53, 54, 32, 56], [54, 53, 64, 56], [55, 56, 8, 112], [56, 55, 88, 112], [57, 58, 24, 104], [58, 57, 72, 104], [59, 60, 24, 64], [60, 59, 72, 64], [61, 62, 40, 144], [62, 61, 56, 144], [63, 64, 16, 136], [64, 63, 80, 136], [65, 66, 16, 88], [66, 65, 80, 88], [67, 68, 32, 40], [68, 67, 64, 40], [69, 69, 48, 152], [70, 70, 48, 112], [71, 71, 48, 64], [73, 73, 48, 56], [74, 75, 8, 128], [75, 74, 88, 128], [76, 77, 16, 40], [77, 76, 80, 40], [78, 79, 24, 112], [79, 78, 72, 112], [80, 81, 24, 88], [81, 80, 72, 88], [82, 83, 32, 152], [83, 82, 64, 152]], + '9-9': [[84, 85, 16, 56], [85, 84, 80, 56], [86, 87, 8, 152], [87, 86, 88, 152], [88, 89, 40, 112], [89, 88, 56, 112], [90, 91, 24, 152], [91, 90, 72, 152], [92, 93, 8, 40], [93, 92, 88, 40], [94, 95, 32, 48], [95, 94, 64, 48], [96, 97, 16, 144], [97, 96, 80, 144], [98, 99, 16, 104], [99, 98, 80, 104], [100, 101, 16, 64], [101, 100, 80, 64], [102, 103, 16, 48], [103, 102, 80, 48], [104, 105, 24, 96], [105, 104, 72, 96], [106, 107, 32, 72], [107, 106, 64, 72], [108, 109, 40, 56], [109, 108, 56, 56], [110, 110, 48, 120], [111, 112, 24, 120], [112, 111, 72, 120], [113, 114, 8, 104], [114, 113, 88, 104], [115, 116, 40, 24], [116, 115, 56, 24], [117, 118, 8, 144], [118, 117, 88, 144], [119, 120, 24, 80], [120, 119, 72, 80], [121, 122, 24, 24], [122, 121, 72, 24], [123, 124, 32, 128], [124, 123, 64, 128], [125, 126, 40, 48], [126, 125, 56, 48], [127, 128, 24, 136], [128, 127, 72, 136], [129, 130, 32, 104], [130, 129, 64, 104], [131, 131, 48, 80], [132, 133, 24, 144], [133, 132, 72, 144], [134, 135, 16, 128], [135, 134, 80, 128], [136, 137, 16, 80], [137, 136, 80, 80], [138, 139, 40, 72], [139, 138, 56, 72], [140, 140, 48, 144], [141, 141, 48, 40], [142, 143, 40, 152], [143, 142, 56, 152], [144, 145, 8, 80], [145, 144, 88, 80], [146, 147, 32, 88], [147, 146, 64, 88], [148, 149, 40, 128], [149, 148, 56, 128], [150, 151, 16, 96], [151, 150, 80, 96], [152, 152, 48, 96], [153, 154, 32, 120], [154, 153, 64, 120], [155, 156, 40, 80], [156, 155, 56, 80], [157, 158, 8, 64], [158, 157, 88, 64], [159, 160, 8, 120], [160, 159, 88, 120], [161, 162, 24, 56], [162, 161, 72, 56], [163, 164, 24, 72], [164, 163, 72, 72], [165, 165, 48, 128], [166, 166, 48, 88]], + '9-10': [[167, 168, 20, 132], [168, 167, 76, 132], [169, 170, 20, 76], [170, 169, 76, 76], [171, 172, 36, 36], [172, 171, 60, 36], [173, 174, 44, 116], [174, 173, 52, 116], [175, 176, 44, 100], [176, 175, 52, 100], [177, 178, 44, 60], [178, 177, 52, 60], [179, 180, 12, 92], [180, 179, 84, 92], [181, 182, 12, 52], [182, 181, 84, 52], [183, 184, 20, 116], [184, 183, 76, 116], [185, 186, 36, 100], [186, 185, 60, 100], [187, 188, 44, 132], [188, 187, 52, 132], [189, 190, 44, 92], [190, 189, 52, 92], [191, 192, 44, 76], [192, 191, 52, 76], [193, 194, 44, 44], [194, 193, 52, 44], [195, 196, 12, 84], [196, 195, 84, 84], [197, 198, 28, 116], [198, 197, 68, 116], [199, 200, 36, 132], [200, 199, 60, 132], [201, 202, 36, 92], [202, 201, 60, 92], [203, 204, 12, 76], [204, 203, 84, 76], [205, 206, 12, 44], [206, 205, 84, 44], [207, 208, 20, 108], [208, 207, 76, 108], [209, 210, 20, 84], [210, 209, 76, 84], [211, 212, 36, 60], [212, 211, 60, 60], [213, 214, 36, 44], [214, 213, 60, 44], [215, 216, 44, 68], [216, 215, 52, 68], [217, 218, 20, 124], [218, 217, 76, 124], [219, 220, 20, 100], [220, 219, 76, 100], [221, 222, 20, 68], [222, 221, 76, 68], [223, 224, 20, 36], [224, 223, 76, 36], [225, 226, 28, 60], [226, 225, 68, 60], [227, 228, 36, 124], [228, 227, 60, 124], [229, 230, 36, 108], [230, 229, 60, 108], [231, 232, 44, 140], [232, 231, 52, 140], [233, 234, 44, 108], [234, 233, 52, 108], [235, 236, 44, 84], [236, 235, 52, 84], [237, 238, 44, 52], [238, 237, 52, 52], [239, 240, 44, 36], [240, 239, 52, 36], [241, 242, 12, 68], [242, 241, 84, 68], [243, 244, 12, 36], [244, 243, 84, 36], [245, 246, 28, 100], [246, 245, 68, 100], [247, 248, 28, 44], [248, 247, 68, 44], [249, 250, 36, 76], [250, 249, 60, 76]], + '9-11': [[72, 72, 48, 16], [251, 252, 8, 88], [252, 251, 88, 88], [253, 254, 8, 56], [254, 253, 88, 56], [255, 256, 8, 32], [256, 255, 88, 32], [257, 258, 8, 16], [258, 257, 88, 16], [259, 260, 8, 8], [260, 259, 88, 8], [261, 262, 16, 72], [262, 261, 80, 72], [263, 264, 16, 24], [264, 263, 80, 24], [265, 266, 20, 4], [266, 265, 76, 4], [267, 268, 24, 48], [268, 267, 72, 48], [269, 270, 24, 16], [270, 269, 72, 16], [271, 272, 24, 8], [272, 271, 72, 8], [273, 274, 32, 32], [274, 273, 64, 32], [275, 276, 32, 16], [276, 275, 64, 16], [277, 278, 40, 8], [278, 277, 56, 8], [279, 280, 44, 4], [280, 279, 52, 4], [281, 281, 48, 48], [282, 282, 48, 24], [283, 284, 8, 48], [284, 283, 88, 48], [285, 286, 8, 24], [286, 285, 88, 24], [287, 288, 12, 4], [288, 287, 84, 4], [289, 290, 16, 16], [290, 289, 80, 16], [291, 292, 16, 8], [292, 291, 80, 8], [293, 294, 28, 4], [294, 293, 68, 4], [295, 296, 32, 24], [296, 295, 64, 24], [297, 298, 32, 8], [298, 297, 64, 8], [299, 300, 36, 4], [300, 299, 60, 4], [301, 302, 40, 16], [302, 301, 56, 16], [303, 303, 48, 8]], + '10-12': [[304, 304, 0, 20], [305, 305, 0, 44], [306, 306, 0, 52], [307, 307, 0, 76], [308, 308, 0, 100], [309, 309, 0, 116], [310, 428, -4, 8], [311, 429, -4, 80], [312, 430, -4, 88], [313, 431, -4, 96], [314, 432, -4, 104], [315, 433, -4, 112], [316, 434, -4, 120], [317, 435, -8, 4], [318, 436, -8, 12], [319, 437, -8, 36], [320, 438, -8, 44], [321, 439, -8, 60], [322, 440, -8, 76], [323, 441, -8, 84], [324, 442, -8, 124], [325, 443, -8, 132], [326, 444, -8, 140], [327, 445, -12, 32], [328, 446, -12, 40], [329, 447, -12, 56], [330, 448, -12, 64], [331, 449, -12, 96], [332, 450, -12, 104], [333, 451, -12, 112], [334, 452, -12, 120], [335, 453, -12, 136], [336, 454, -16, 20], [337, 455, -16, 28], [338, 456, -16, 68], [339, 457, -16, 84], [340, 458, -16, 108], [341, 459, -16, 124], [342, 460, -16, 132], [343, 461, -20, 48], [344, 462, -20, 64], [345, 463, -20, 88], [346, 464, -20, 104], [347, 465, -20, 120], [348, 466, -24, 4], [349, 467, -24, 12], [350, 468, -24, 36], [351, 469, -24, 44], [352, 470, -24, 52], [353, 471, -24, 76], [354, 472, -24, 84], [355, 473, -24, 92], [356, 474, -24, 132], [357, 475, -24, 140], [358, 476, -28, 40], [359, 477, -28, 56], [360, 478, -28, 72], [361, 479, -28, 80], [362, 480, -28, 96], [363, 481, -28, 104], [364, 482, -28, 120], [365, 483, -32, 12], [366, 484, -32, 20], [367, 485, -32, 28], [368, 486, -32, 60], [369, 487, -32, 68], [370, 488, -32, 100], [371, 489, -32, 108], [372, 490, -32, 116], [373, 491, -32, 132], [374, 492, -32, 140], [375, 493, -36, 32], [376, 494, -36, 48], [377, 495, -36, 80], [378, 496, -36, 88], [379, 497, -40, 4], [380, 498, -40, 44], [381, 499, -40, 60], [382, 500, -40, 76], [383, 501, -40, 92], [384, 502, -40, 100], [385, 503, -40, 116], [386, 504, -44, 16], [387, 505, -44, 40], [388, 506, -44, 56], [389, 507, -44, 104], [390, 508, -44, 120], [391, 509, -44, 128], [392, 510, -48, 4], [393, 511, -48, 28], [394, 512, -48, 36], [395, 513, -48, 52], [396, 514, -48, 68], [397, 515, -48, 76], [398, 516, -48, 84], [399, 517, -48, 100], [400, 518, -48, 116], [401, 519, -48, 140], [402, 520, -52, 8], [403, 521, -52, 32], [404, 522, -52, 72], [405, 523, -52, 80], [406, 524, -52, 104], [407, 525, -52, 120], [408, 526, -52, 128], [409, 527, -56, 12], [410, 528, -56, 20], [411, 529, -56, 36], [412, 530, -56, 92], [413, 531, -56, 108], [414, 532, -56, 124], [415, 533, -60, 40], [416, 534, -60, 56], [417, 535, -60, 64], [418, 536, -60, 104], [419, 537, -64, 28], [420, 538, -64, 36], [421, 539, -64, 44], [422, 540, -64, 52], [423, 541, -64, 68], [424, 542, -64, 76], [425, 543, -64, 84], [426, 544, -64, 100], [427, 545, -64, 116], [428, 310, 4, 8], [429, 311, 4, 80], [430, 312, 4, 88], [431, 313, 4, 96], [432, 314, 4, 104], [433, 315, 4, 112], [434, 316, 4, 120], [435, 317, 8, 4], [436, 318, 8, 12], [437, 319, 8, 36], [438, 320, 8, 44], [439, 321, 8, 60], [440, 322, 8, 76], [441, 323, 8, 84], [442, 324, 8, 124], [443, 325, 8, 132], [444, 326, 8, 140], [445, 327, 12, 32], [446, 328, 12, 40], [447, 329, 12, 56], [448, 330, 12, 64], [449, 331, 12, 96], [450, 332, 12, 104], [451, 333, 12, 112], [452, 334, 12, 120], [453, 335, 12, 136], [454, 336, 16, 20], [455, 337, 16, 28], [456, 338, 16, 68], [457, 339, 16, 84], [458, 340, 16, 108], [459, 341, 16, 124], [460, 342, 16, 132], [461, 343, 20, 48], [462, 344, 20, 64], [463, 345, 20, 88], [464, 346, 20, 104], [465, 347, 20, 120], [466, 348, 24, 4], [467, 349, 24, 12], [468, 350, 24, 36], [469, 351, 24, 44], [470, 352, 24, 52], [471, 353, 24, 76], [472, 354, 24, 84], [473, 355, 24, 92], [474, 356, 24, 132], [475, 357, 24, 140], [476, 358, 28, 40], [477, 359, 28, 56], [478, 360, 28, 72], [479, 361, 28, 80], [480, 362, 28, 96], [481, 363, 28, 104], [482, 364, 28, 120], [483, 365, 32, 12], [484, 366, 32, 20], [485, 367, 32, 28], [486, 368, 32, 60], [487, 369, 32, 68], [488, 370, 32, 100], [489, 371, 32, 108], [490, 372, 32, 116], [491, 373, 32, 132], [492, 374, 32, 140], [493, 375, 36, 32], [494, 376, 36, 48], [495, 377, 36, 80], [496, 378, 36, 88], [497, 379, 40, 4], [498, 380, 40, 44], [499, 381, 40, 60], [500, 382, 40, 76], [501, 383, 40, 92], [502, 384, 40, 100], [503, 385, 40, 116], [504, 386, 44, 16], [505, 387, 44, 40], [506, 388, 44, 56], [507, 389, 44, 104], [508, 390, 44, 120], [509, 391, 44, 128], [510, 392, 48, 4], [511, 393, 48, 28], [512, 394, 48, 36], [513, 395, 48, 52], [514, 396, 48, 68], [515, 397, 48, 76], [516, 398, 48, 84], [517, 399, 48, 100], [518, 400, 48, 116], [519, 401, 48, 140], [520, 402, 52, 8], [521, 403, 52, 32], [522, 404, 52, 72], [523, 405, 52, 80], [524, 406, 52, 104], [525, 407, 52, 120], [526, 408, 52, 128], [527, 409, 56, 12], [528, 410, 56, 20], [529, 411, 56, 36], [530, 412, 56, 92], [531, 413, 56, 108], [532, 414, 56, 124], [533, 415, 60, 40], [534, 416, 60, 56], [535, 417, 60, 64], [536, 418, 60, 104], [537, 419, 64, 28], [538, 420, 64, 36], [539, 421, 64, 44], [540, 422, 64, 52], [541, 423, 64, 68], [542, 424, 64, 76], [543, 425, 64, 84], [544, 426, 64, 100], [545, 427, 64, 116]], + '10-13': [[546, 546, 0, 4], [547, 547, 0, 12], [548, 548, 0, 28], [549, 549, 0, 36], [550, 550, 0, 60], [551, 551, 0, 68], [552, 552, 0, 84], [553, 553, 0, 92], [554, 554, 0, 108], [555, 555, 0, 124], [556, 556, 0, 132], [557, 557, 0, 140], [558, 680, -4, 32], [559, 681, -4, 40], [560, 682, -4, 48], [561, 683, -4, 56], [562, 684, -4, 64], [563, 685, -4, 72], [564, 686, -4, 128], [565, 687, -4, 136], [566, 688, -8, 20], [567, 689, -8, 28], [568, 690, -8, 52], [569, 691, -8, 68], [570, 692, -8, 92], [571, 693, -8, 100], [572, 694, -8, 108], [573, 695, -8, 116], [574, 696, -12, 48], [575, 697, -12, 72], [576, 698, -12, 80], [577, 699, -12, 88], [578, 700, -12, 128], [579, 701, -16, 4], [580, 702, -16, 12], [581, 703, -16, 36], [582, 704, -16, 44], [583, 705, -16, 52], [584, 706, -16, 60], [585, 707, -16, 76], [586, 708, -16, 92], [587, 709, -16, 100], [588, 710, -16, 116], [589, 711, -16, 140], [590, 712, -20, 24], [591, 713, -20, 56], [592, 714, -20, 72], [593, 715, -20, 80], [594, 716, -20, 96], [595, 717, -20, 112], [596, 718, -20, 128], [597, 719, -20, 136], [598, 720, -24, 28], [599, 721, -24, 60], [600, 722, -24, 68], [601, 723, -24, 100], [602, 724, -24, 108], [603, 725, -24, 116], [604, 726, -24, 124], [605, 727, -28, 16], [606, 728, -28, 64], [607, 729, -28, 88], [608, 730, -28, 112], [609, 731, -28, 128], [610, 732, -28, 136], [611, 733, -32, 4], [612, 734, -32, 36], [613, 735, -32, 44], [614, 736, -32, 52], [615, 737, -32, 76], [616, 738, -32, 84], [617, 739, -32, 92], [618, 740, -32, 124], [619, 741, -36, 56], [620, 742, -36, 64], [621, 743, -36, 96], [622, 744, -36, 104], [623, 745, -36, 112], [624, 746, -36, 120], [625, 747, -36, 136], [626, 748, -40, 12], [627, 749, -40, 20], [628, 750, -40, 28], [629, 751, -40, 36], [630, 752, -40, 52], [631, 753, -40, 68], [632, 754, -40, 84], [633, 755, -40, 108], [634, 756, -40, 124], [635, 757, -40, 132], [636, 758, -40, 140], [637, 759, -44, 24], [638, 760, -44, 32], [639, 761, -44, 48], [640, 762, -44, 72], [641, 763, -44, 80], [642, 764, -44, 96], [643, 765, -44, 112], [644, 766, -48, 60], [645, 767, -48, 92], [646, 768, -48, 108], [647, 769, -48, 124], [648, 770, -48, 132], [649, 771, -52, 16], [650, 772, -52, 24], [651, 773, -52, 40], [652, 774, -52, 48], [653, 775, -52, 56], [654, 776, -52, 64], [655, 777, -52, 88], [656, 778, -56, 4], [657, 779, -56, 60], [658, 780, -56, 68], [659, 781, -56, 76], [660, 782, -56, 84], [661, 783, -56, 100], [662, 784, -56, 116], [663, 785, -56, 132], [664, 786, -56, 140], [665, 787, -60, 32], [666, 788, -60, 48], [667, 789, -60, 80], [668, 790, -60, 88], [669, 791, -60, 96], [670, 792, -60, 120], [671, 793, -60, 128], [672, 794, -64, 4], [673, 795, -64, 20], [674, 796, -64, 60], [675, 797, -64, 92], [676, 798, -64, 108], [677, 799, -64, 124], [678, 800, -64, 132], [679, 801, -64, 140], [680, 558, 4, 32], [681, 559, 4, 40], [682, 560, 4, 48], [683, 561, 4, 56], [684, 562, 4, 64], [685, 563, 4, 72], [686, 564, 4, 128], [687, 565, 4, 136], [688, 566, 8, 20], [689, 567, 8, 28], [690, 568, 8, 52], [691, 569, 8, 68], [692, 570, 8, 92], [693, 571, 8, 100], [694, 572, 8, 108], [695, 573, 8, 116], [696, 574, 12, 48], [697, 575, 12, 72], [698, 576, 12, 80], [699, 577, 12, 88], [700, 578, 12, 128], [701, 579, 16, 4], [702, 580, 16, 12], [703, 581, 16, 36], [704, 582, 16, 44], [705, 583, 16, 52], [706, 584, 16, 60], [707, 585, 16, 76], [708, 586, 16, 92], [709, 587, 16, 100], [710, 588, 16, 116], [711, 589, 16, 140], [712, 590, 20, 24], [713, 591, 20, 56], [714, 592, 20, 72], [715, 593, 20, 80], [716, 594, 20, 96], [717, 595, 20, 112], [718, 596, 20, 128], [719, 597, 20, 136], [720, 598, 24, 28], [721, 599, 24, 60], [722, 600, 24, 68], [723, 601, 24, 100], [724, 602, 24, 108], [725, 603, 24, 116], [726, 604, 24, 124], [727, 605, 28, 16], [728, 606, 28, 64], [729, 607, 28, 88], [730, 608, 28, 112], [731, 609, 28, 128], [732, 610, 28, 136], [733, 611, 32, 4], [734, 612, 32, 36], [735, 613, 32, 44], [736, 614, 32, 52], [737, 615, 32, 76], [738, 616, 32, 84], [739, 617, 32, 92], [740, 618, 32, 124], [741, 619, 36, 56], [742, 620, 36, 64], [743, 621, 36, 96], [744, 622, 36, 104], [745, 623, 36, 112], [746, 624, 36, 120], [747, 625, 36, 136], [748, 626, 40, 12], [749, 627, 40, 20], [750, 628, 40, 28], [751, 629, 40, 36], [752, 630, 40, 52], [753, 631, 40, 68], [754, 632, 40, 84], [755, 633, 40, 108], [756, 634, 40, 124], [757, 635, 40, 132], [758, 636, 40, 140], [759, 637, 44, 24], [760, 638, 44, 32], [761, 639, 44, 48], [762, 640, 44, 72], [763, 641, 44, 80], [764, 642, 44, 96], [765, 643, 44, 112], [766, 644, 48, 60], [767, 645, 48, 92], [768, 646, 48, 108], [769, 647, 48, 124], [770, 648, 48, 132], [771, 649, 52, 16], [772, 650, 52, 24], [773, 651, 52, 40], [774, 652, 52, 48], [775, 653, 52, 56], [776, 654, 52, 64], [777, 655, 52, 88], [778, 656, 56, 4], [779, 657, 56, 60], [780, 658, 56, 68], [781, 659, 56, 76], [782, 660, 56, 84], [783, 661, 56, 100], [784, 662, 56, 116], [785, 663, 56, 132], [786, 664, 56, 140], [787, 665, 60, 32], [788, 666, 60, 48], [789, 667, 60, 80], [790, 668, 60, 88], [791, 669, 60, 96], [792, 670, 60, 120], [793, 671, 60, 128], [794, 672, 64, 4], [795, 673, 64, 20], [796, 674, 64, 60], [797, 675, 64, 92], [798, 676, 64, 108], [799, 677, 64, 124], [800, 678, 64, 132], [801, 679, 64, 140]], + '11-12': [[802, null, -64, 4], [803, 1037, -64, 20], [804, 1039, -64, 36], [805, 1040, -64, 52], [806, null, -64, 76], [807, null, -64, 84], [808, null, -64, 100], [809, null, -64, 132], [810, 1028, -60, 40], [811, 1029, -60, 48], [812, 1031, -60, 64], [813, 1034, -60, 88], [814, null, -60, 96], [815, 1036, -60, 120], [816, null, -60, 128], [817, 1019, -56, 12], [818, null, -56, 20], [819, 1020, -56, 28], [820, null, -56, 52], [821, null, -56, 68], [822, 1021, -56, 76], [823, 1023, -56, 100], [824, null, -56, 140], [825, null, -52, 32], [826, 1016, -52, 64], [827, 1017, -52, 80], [828, null, -52, 104], [829, null, -52, 112], [830, null, -48, 4], [831, 1006, -48, 12], [832, 1008, -48, 36], [833, null, -48, 60], [834, 1011, -48, 92], [835, null, -48, 100], [836, 1012, -48, 108], [837, null, -48, 116], [838, 1013, -48, 124], [839, null, -48, 132], [840, null, -44, 24], [841, 1001, -44, 48], [842, null, -44, 72], [843, 994, -40, 20], [844, 995, -40, 36], [845, null, -40, 44], [846, 996, -40, 52], [847, 997, -40, 60], [848, null, -40, 76], [849, null, -40, 92], [850, 999, -40, 100], [851, null, -40, 116], [852, null, -40, 140], [853, 988, -36, 80], [854, null, -36, 88], [855, 989, -36, 96], [856, 992, -36, 128], [857, 993, -36, 136], [858, 973, -32, 4], [859, null, -32, 12], [860, null, -32, 20], [861, null, -32, 36], [862, null, -32, 60], [863, 979, -32, 108], [864, 980, -32, 116], [865, 981, -32, 124], [866, 983, -32, 140], [867, 969, -28, 48], [868, 970, -28, 56], [869, null, -28, 80], [870, null, -28, 88], [871, null, -28, 96], [872, null, -28, 104], [873, null, -28, 112], [874, null, -24, 28], [875, null, -24, 36], [876, null, -24, 52], [877, null, -24, 60], [878, 962, -24, 76], [879, 963, -24, 84], [880, 964, -24, 100], [881, 966, -24, 132], [882, 958, -20, 56], [883, null, -20, 72], [884, null, -20, 88], [885, null, -20, 96], [886, 960, -20, 112], [887, null, -20, 120], [888, null, -20, 128], [889, null, -20, 136], [890, 945, -16, 4], [891, 946, -16, 12], [892, 948, -16, 36], [893, null, -16, 44], [894, 950, -16, 68], [895, 953, -16, 100], [896, null, -16, 116], [897, 955, -16, 124], [898, null, -16, 132], [899, 939, -12, 48], [900, 940, -12, 56], [901, null, -12, 64], [902, 941, -12, 72], [903, null, -12, 88], [904, 943, -12, 104], [905, null, -12, 112], [906, 933, -8, 20], [907, null, -8, 52], [908, null, -8, 76], [909, null, -8, 108], [910, null, -8, 124], [911, null, -8, 132], [912, 937, -8, 140], [913, null, -4, 40], [914, null, -4, 48], [915, null, -4, 64], [916, null, -4, 88], [917, 928, -4, 96], [918, 918, 0, 12], [919, 919, 0, 28], [920, 920, 0, 36], [921, 921, 0, 60], [922, 922, 0, 84], [923, 923, 0, 108], [924, 924, 0, 116], [925, 925, 0, 132], [926, null, 4, 56], [927, null, 4, 80], [928, 917, 4, 96], [929, null, 4, 104], [930, null, 4, 112], [931, null, 4, 128], [932, null, 8, 4], [933, 906, 8, 20], [934, null, 8, 44], [935, null, 8, 68], [936, null, 8, 92], [937, 912, 8, 140], [938, null, 12, 40], [939, 899, 12, 48], [940, 900, 12, 56], [941, 902, 12, 72], [942, null, 12, 80], [943, 904, 12, 104], [944, null, 12, 120], [945, 890, 16, 4], [946, 891, 16, 12], [947, null, 16, 28], [948, 892, 16, 36], [949, null, 16, 60], [950, 894, 16, 68], [951, null, 16, 84], [952, null, 16, 92], [953, 895, 16, 100], [954, null, 16, 108], [955, 897, 16, 124], [956, null, 16, 140], [957, null, 20, 48], [958, 882, 20, 56], [959, null, 20, 64], [960, 886, 20, 112], [961, null, 24, 20], [962, 878, 24, 76], [963, 879, 24, 84], [964, 880, 24, 100], [965, null, 24, 108], [966, 881, 24, 132], [967, null, 28, 32], [968, null, 28, 40], [969, 867, 28, 48], [970, 868, 28, 56], [971, null, 28, 72], [972, null, 28, 128], [973, 858, 32, 4], [974, null, 32, 44], [975, null, 32, 52], [976, null, 32, 68], [977, null, 32, 84], [978, null, 32, 92], [979, 863, 32, 108], [980, 864, 32, 116], [981, 865, 32, 124], [982, null, 32, 132], [983, 866, 32, 140], [984, null, 36, 24], [985, null, 36, 32], [986, null, 36, 40], [987, null, 36, 72], [988, 853, 36, 80], [989, 855, 36, 96], [990, null, 36, 112], [991, null, 36, 120], [992, 856, 36, 128], [993, 857, 36, 136], [994, 843, 40, 20], [995, 844, 40, 36], [996, 846, 40, 52], [997, 847, 40, 60], [998, null, 40, 84], [999, 850, 40, 100], [1000, null, 40, 108], [1001, 841, 44, 48], [1002, null, 44, 56], [1003, null, 44, 64], [1004, null, 44, 88], [1005, null, 44, 120], [1006, 831, 48, 12], [1007, null, 48, 28], [1008, 832, 48, 36], [1009, null, 48, 52], [1010, null, 48, 76], [1011, 834, 48, 92], [1012, 836, 48, 108], [1013, 838, 48, 124], [1014, null, 48, 140], [1015, null, 52, 24], [1016, 826, 52, 64], [1017, 827, 52, 80], [1018, null, 56, 4], [1019, 817, 56, 12], [1020, 819, 56, 28], [1021, 822, 56, 76], [1022, null, 56, 92], [1023, 823, 56, 100], [1024, null, 56, 108], [1025, null, 56, 116], [1026, null, 56, 124], [1027, null, 56, 132], [1028, 810, 60, 40], [1029, 811, 60, 48], [1030, null, 60, 56], [1031, 812, 60, 64], [1032, null, 60, 72], [1033, null, 60, 80], [1034, 813, 60, 88], [1035, null, 60, 104], [1036, 815, 60, 120], [1037, 803, 64, 20], [1038, null, 64, 28], [1039, 804, 64, 36], [1040, 805, 64, 52], [1041, null, 64, 68], [1042, null, 64, 92], [1043, null, 64, 108]], + '11-13': [[1044, 1291, -64, 12], [1045, null, -64, 28], [1046, 1292, -64, 44], [1047, 1293, -64, 60], [1048, null, -64, 68], [1049, null, -64, 92], [1050, null, -64, 108], [1051, 1297, -64, 116], [1052, null, -64, 124], [1053, 1299, -64, 140], [1054, null, -60, 72], [1055, null, -60, 80], [1056, null, -60, 104], [1057, null, -56, 4], [1058, null, -56, 36], [1059, null, -56, 44], [1060, 1283, -56, 60], [1061, 1285, -56, 84], [1062, null, -56, 92], [1063, null, -56, 108], [1064, null, -56, 116], [1065, null, -56, 124], [1066, null, -56, 132], [1067, 1276, -52, 72], [1068, 1278, -52, 96], [1069, 1279, -52, 120], [1070, 1280, -52, 128], [1071, 1265, -48, 20], [1072, null, -48, 28], [1073, null, -48, 44], [1074, null, -48, 52], [1075, 1267, -48, 68], [1076, null, -48, 76], [1077, 1268, -48, 84], [1078, null, -48, 140], [1079, null, -44, 16], [1080, null, -44, 56], [1081, null, -44, 64], [1082, null, -44, 88], [1083, null, -44, 96], [1084, 1261, -44, 104], [1085, 1262, -44, 112], [1086, null, -44, 120], [1087, 1263, -44, 128], [1088, 1247, -40, 4], [1089, 1248, -40, 12], [1090, 1249, -40, 28], [1091, 1251, -40, 68], [1092, null, -40, 84], [1093, null, -40, 108], [1094, 1255, -40, 124], [1095, 1256, -40, 132], [1096, null, -36, 40], [1097, 1243, -36, 48], [1098, null, -36, 56], [1099, null, -36, 72], [1100, 1246, -36, 104], [1101, null, -36, 112], [1102, null, -36, 120], [1103, 1238, -32, 28], [1104, null, -32, 44], [1105, null, -32, 52], [1106, null, -32, 68], [1107, 1241, -32, 76], [1108, null, -32, 84], [1109, null, -32, 92], [1110, 1242, -32, 100], [1111, null, -32, 132], [1112, null, -28, 8], [1113, null, -28, 24], [1114, null, -28, 32], [1115, null, -28, 40], [1116, null, -28, 64], [1117, 1234, -28, 120], [1118, null, -28, 128], [1119, 1218, -24, 4], [1120, 1219, -24, 12], [1121, null, -24, 20], [1122, 1221, -24, 44], [1123, 1224, -24, 68], [1124, 1225, -24, 92], [1125, null, -24, 108], [1126, 1226, -24, 116], [1127, 1227, -24, 124], [1128, 1228, -24, 140], [1129, null, -20, 48], [1130, null, -20, 64], [1131, 1211, -20, 80], [1132, 1214, -20, 104], [1133, 1202, -16, 20], [1134, null, -16, 28], [1135, 1204, -16, 52], [1136, null, -16, 60], [1137, 1205, -16, 76], [1138, null, -16, 84], [1139, null, -16, 92], [1140, null, -16, 108], [1141, null, -16, 140], [1142, null, -12, 40], [1143, null, -12, 80], [1144, 1199, -12, 96], [1145, null, -12, 120], [1146, 1201, -12, 128], [1147, null, -12, 136], [1148, null, -8, 4], [1149, 1185, -8, 12], [1150, 1186, -8, 28], [1151, 1187, -8, 36], [1152, null, -8, 44], [1153, 1189, -8, 60], [1154, null, -8, 68], [1155, 1191, -8, 84], [1156, null, -8, 92], [1157, 1192, -8, 100], [1158, 1194, -8, 116], [1159, null, -4, 56], [1160, 1181, -4, 72], [1161, null, -4, 80], [1162, null, -4, 104], [1163, null, -4, 112], [1164, 1183, -4, 120], [1165, null, -4, 128], [1166, 1184, -4, 136], [1167, 1167, 0, 4], [1168, 1168, 0, 20], [1169, 1169, 0, 44], [1170, 1170, 0, 52], [1171, 1171, 0, 68], [1172, 1172, 0, 76], [1173, 1173, 0, 92], [1174, 1174, 0, 100], [1175, 1175, 0, 124], [1176, 1176, 0, 140], [1177, null, 4, 32], [1178, null, 4, 40], [1179, null, 4, 48], [1180, null, 4, 64], [1181, 1160, 4, 72], [1182, null, 4, 88], [1183, 1164, 4, 120], [1184, 1166, 4, 136], [1185, 1149, 8, 12], [1186, 1150, 8, 28], [1187, 1151, 8, 36], [1188, null, 8, 52], [1189, 1153, 8, 60], [1190, null, 8, 76], [1191, 1155, 8, 84], [1192, 1157, 8, 100], [1193, null, 8, 108], [1194, 1158, 8, 116], [1195, null, 8, 124], [1196, null, 8, 132], [1197, null, 12, 64], [1198, null, 12, 88], [1199, 1144, 12, 96], [1200, null, 12, 112], [1201, 1146, 12, 128], [1202, 1133, 16, 20], [1203, null, 16, 44], [1204, 1135, 16, 52], [1205, 1137, 16, 76], [1206, null, 16, 116], [1207, null, 16, 132], [1208, null, 20, 32], [1209, null, 20, 40], [1210, null, 20, 72], [1211, 1131, 20, 80], [1212, null, 20, 88], [1213, null, 20, 96], [1214, 1132, 20, 104], [1215, null, 20, 120], [1216, null, 20, 128], [1217, null, 20, 136], [1218, 1119, 24, 4], [1219, 1120, 24, 12], [1220, null, 24, 28], [1221, 1122, 24, 44], [1222, null, 24, 52], [1223, null, 24, 60], [1224, 1123, 24, 68], [1225, 1124, 24, 92], [1226, 1126, 24, 116], [1227, 1127, 24, 124], [1228, 1128, 24, 140], [1229, null, 28, 80], [1230, null, 28, 88], [1231, null, 28, 96], [1232, null, 28, 104], [1233, null, 28, 112], [1234, 1117, 28, 120], [1235, null, 28, 136], [1236, null, 32, 12], [1237, null, 32, 20], [1238, 1103, 32, 28], [1239, null, 32, 36], [1240, null, 32, 60], [1241, 1107, 32, 76], [1242, 1110, 32, 100], [1243, 1097, 36, 48], [1244, null, 36, 64], [1245, null, 36, 88], [1246, 1100, 36, 104], [1247, 1088, 40, 4], [1248, 1089, 40, 12], [1249, 1090, 40, 28], [1250, null, 40, 44], [1251, 1091, 40, 68], [1252, null, 40, 76], [1253, null, 40, 92], [1254, null, 40, 116], [1255, 1094, 40, 124], [1256, 1095, 40, 132], [1257, null, 40, 140], [1258, null, 44, 40], [1259, null, 44, 72], [1260, null, 44, 80], [1261, 1084, 44, 104], [1262, 1085, 44, 112], [1263, 1087, 44, 128], [1264, null, 48, 4], [1265, 1071, 48, 20], [1266, null, 48, 60], [1267, 1075, 48, 68], [1268, 1077, 48, 84], [1269, null, 48, 100], [1270, null, 48, 116], [1271, null, 48, 132], [1272, null, 52, 32], [1273, null, 52, 40], [1274, null, 52, 48], [1275, null, 52, 56], [1276, 1067, 52, 72], [1277, null, 52, 88], [1278, 1068, 52, 96], [1279, 1069, 52, 120], [1280, 1070, 52, 128], [1281, null, 52, 136], [1282, null, 56, 20], [1283, 1060, 56, 60], [1284, null, 56, 68], [1285, 1061, 56, 84], [1286, null, 56, 140], [1287, null, 60, 96], [1288, null, 60, 112], [1289, null, 60, 128], [1290, null, 64, 4], [1291, 1044, 64, 12], [1292, 1046, 64, 44], [1293, 1047, 64, 60], [1294, null, 64, 76], [1295, null, 64, 84], [1296, null, 64, 100], [1297, 1051, 64, 116], [1298, null, 64, 132], [1299, 1053, 64, 140]], + }, +}; + +/** + * Get size edges for a given board and size ID. + * Returns null if the size ID is not found. + */ +export const getSizeEdges = (boardName: BoardName, sizeId: number): SizeEdges | null => { + const size = PRODUCT_SIZES[boardName]?.[sizeId]; + if (!size) return null; + return { + edgeLeft: size.edgeLeft, + edgeRight: size.edgeRight, + edgeBottom: size.edgeBottom, + edgeTop: size.edgeTop, + }; +}; + +/** + * Get full product size data for a given board and size ID. + * Returns null if the size ID is not found. + */ +export const getProductSize = (boardName: BoardName, sizeId: number): ProductSizeData | null => { + return PRODUCT_SIZES[boardName]?.[sizeId] ?? null; +}; + +/** + * Get layout data for a given board and layout ID. + * Returns null if the layout ID is not found. + */ +export const getLayout = (boardName: BoardName, layoutId: number): LayoutData | null => { + return LAYOUTS[boardName]?.[layoutId] ?? null; +}; + +/** + * Get all layouts for a given board. + */ +export const getAllLayouts = (boardName: BoardName): LayoutData[] => { + const layouts = LAYOUTS[boardName]; + if (!layouts) return []; + return Object.values(layouts); +}; + +/** + * Get all sizes for a given board and layout ID. + * Uses the layout's product_id to find matching sizes. + */ +export const getSizesForLayoutId = (boardName: BoardName, layoutId: number): ProductSizeData[] => { + const layout = LAYOUTS[boardName]?.[layoutId]; + if (!layout) return []; + const sizes = PRODUCT_SIZES[boardName]; + if (!sizes) return []; + return Object.values(sizes).filter(size => size.productId === layout.productId); +}; + +/** + * Get all sizes for a given board and product ID. + * Used by the board selector to list available sizes. + */ +export const getSizesForProduct = (boardName: BoardName, productId: number): ProductSizeData[] => { + const sizes = PRODUCT_SIZES[boardName]; + if (!sizes) return []; + return Object.values(sizes).filter(size => size.productId === productId); +}; + +/** + * Get all sets for a given board, layout, and size. + */ +export const getSetsForLayoutAndSize = (boardName: BoardName, layoutId: number, sizeId: number): SetData[] => { + const key = `${layoutId}-${sizeId}`; + return SETS[boardName]?.[key] ?? []; +}; + +/** + * Default size IDs for each layout. + * Used by the setup wizard to pre-select a sensible default. + */ +export const DEFAULT_SIZE_FOR_LAYOUT: Record> = { + kilter: { + 1: 10, // Kilter Board Original -> 12 x 12 with kickboard + 8: 17, // Kilter Board Homewall -> 7x10 Full Ride LED Kit + }, + tension: { + 9: 1, // Original Layout -> Full Wall (first size is fine) + 10: 8, // Tension Board 2 Mirror -> 12 high x 8 wide + 11: 8, // Tension Board 2 Spray -> 12 high x 8 wide + }, +}; + +/** + * Get the default size ID for a given board and layout. + * Falls back to the first available size if no default is defined. + */ +export const getDefaultSizeForLayout = (boardName: BoardName, layoutId: number): number | null => { + const defaultSizeId = DEFAULT_SIZE_FOR_LAYOUT[boardName]?.[layoutId]; + if (defaultSizeId !== undefined) { + return defaultSizeId; + } + // Fall back to first available size + const sizes = getSizesForLayoutId(boardName, layoutId); + return sizes.length > 0 ? sizes[0].id : null; +}; + +/** + * Get all board selector options (layouts, sizes, sets) from hardcoded data. + * This replaces the database query in getAllBoardSelectorOptions. + */ +export const getBoardSelectorOptions = () => { + const boardNames: BoardName[] = ['kilter', 'tension']; + + const layouts: Record = {} as Record; + const sizes: Record = {}; + const sets: Record = {}; + + for (const boardName of boardNames) { + // Get layouts + layouts[boardName] = getAllLayouts(boardName).map(l => ({ id: l.id, name: l.name })); + + // Get sizes for each layout + for (const layout of layouts[boardName]) { + const layoutSizes = getSizesForLayoutId(boardName, layout.id); + const sizeKey = `${boardName}-${layout.id}`; + sizes[sizeKey] = layoutSizes.map(s => ({ id: s.id, name: s.name, description: s.description })); + + // Get sets for each size + for (const size of layoutSizes) { + const setKey = `${boardName}-${layout.id}-${size.id}`; + sets[setKey] = getSetsForLayoutAndSize(boardName, layout.id, size.id); + } + } + } + + return { layouts, sizes, sets }; +}; + +/** + * Get image filename for a specific board configuration. + * Returns null if not found. + */ +export const getImageFilename = ( + boardName: BoardName, + layoutId: number, + sizeId: number, + setId: number +): string | null => { + const key = `${layoutId}-${sizeId}-${setId}`; + return IMAGE_FILENAMES[boardName]?.[key] ?? null; +}; + +/** + * Get hole placements for a specific board layout and set. + * Returns an array of HoldTuples: [placementId, mirroredPlacementId | null, x, y] + */ +export const getHolePlacements = ( + boardName: BoardName, + layoutId: number, + setId: number +): HoldTuple[] => { + const key = `${layoutId}-${setId}`; + return HOLE_PLACEMENTS[boardName]?.[key] ?? []; +}; + +/** + * Get complete board details from hardcoded data. + * This is a fully synchronous function that requires no database queries. + */ +export const getBoardDetails = ({ + board_name, + layout_id, + size_id, + set_ids, +}: { + board_name: BoardName; + layout_id: number; + size_id: number; + set_ids: SetIdList; +}): BoardDetails => { + const sizeData = getProductSize(board_name, size_id); + if (!sizeData) { + throw new Error('Size dimensions not found'); + } + + const layoutData = getLayout(board_name, layout_id); + const setsResult = getSetsForLayoutAndSize(board_name, layout_id, size_id); + + // Build images_to_holds map + const imagesToHolds: Record = {}; + for (const set_id of set_ids) { + const imageFilename = getImageFilename(board_name, layout_id, size_id, set_id); + if (!imageFilename) { + throw new Error(`Could not find image for set_id ${set_id} for layout_id: ${layout_id} and size_id: ${size_id}`); + } + imagesToHolds[imageFilename] = getHolePlacements(board_name, layout_id, set_id); + } + + const { edgeLeft: edge_left, edgeRight: edge_right, edgeBottom: edge_bottom, edgeTop: edge_top } = sizeData; + + const firstImage = Object.keys(imagesToHolds)[0]; + const dimensions = BOARD_IMAGE_DIMENSIONS[board_name][firstImage]; + const boardWidth = dimensions?.width ?? 1080; + const boardHeight = dimensions?.height ?? 1920; + + const xSpacing = boardWidth / (edge_right - edge_left); + const ySpacing = boardHeight / (edge_top - edge_bottom); + + const holdsData: HoldRenderData[] = Object.values(imagesToHolds).flatMap((holds: HoldTuple[]) => + holds + .filter(([, , x, y]) => x > edge_left && x < edge_right && y > edge_bottom && y < edge_top) + .map(([holdId, mirroredHoldId, x, y]) => ({ + id: holdId, + mirroredHoldId, + cx: (x - edge_left) * xSpacing, + cy: boardHeight - (y - edge_bottom) * ySpacing, + r: xSpacing * 4, + })), + ); + + const selectedSets = setsResult.filter((s) => set_ids.includes(s.id)); + + return { + images_to_holds: imagesToHolds, + holdsData, + edge_left, + edge_right, + edge_bottom, + edge_top, + boardHeight, + boardWidth, + board_name, + layout_id, + size_id, + set_ids, + supportsMirroring: board_name === 'tension' && layout_id !== 11, + layout_name: layoutData?.name, + size_name: sizeData.name, + size_description: sizeData.description, + set_names: selectedSets.map((s) => s.name), + }; +}; diff --git a/packages/backend/src/data/types.ts b/packages/backend/src/data/types.ts new file mode 100644 index 00000000..cc2bc203 --- /dev/null +++ b/packages/backend/src/data/types.ts @@ -0,0 +1,71 @@ +/** + * Board configuration types for the backend data module. + * These types mirror the web package types but are self-contained for the backend. + */ + +export type BoardName = 'kilter' | 'tension'; +export type Angle = number; +export type SetIdList = number[]; +export type ImageFileName = string; + +// HoldTuple: [placementId, mirroredPlacementId | null, x, y] +export type HoldTuple = [number, number | null, number, number]; + +export interface HoldRenderData { + id: number; + mirroredHoldId: number | null; + cx: number; + cy: number; + r: number; +} + +export type ImagesToHolds = Record; + +export interface BoardDetails { + images_to_holds: ImagesToHolds; + holdsData: HoldRenderData[]; + edge_left: number; + edge_right: number; + edge_bottom: number; + edge_top: number; + boardHeight: number; + boardWidth: number; + board_name: BoardName; + layout_id: number; + size_id: number; + set_ids: SetIdList; + supportsMirroring?: boolean; + layout_name?: string; + size_name?: string; + size_description?: string; + set_names?: string[]; +} + +export interface ProductSizeData { + id: number; + name: string; + description: string; + edgeLeft: number; + edgeRight: number; + edgeBottom: number; + edgeTop: number; + productId: number; +} + +export interface LayoutData { + id: number; + name: string; + productId: number; +} + +export interface SetData { + id: number; + name: string; +} + +export interface SizeEdges { + edgeLeft: number; + edgeRight: number; + edgeBottom: number; + edgeTop: number; +} diff --git a/packages/backend/src/graphql/resolvers/board/queries.ts b/packages/backend/src/graphql/resolvers/board/queries.ts index eb97a5b2..06c682f5 100644 --- a/packages/backend/src/graphql/resolvers/board/queries.ts +++ b/packages/backend/src/graphql/resolvers/board/queries.ts @@ -4,6 +4,15 @@ import { db } from '../../../db/client.js'; import * as dbSchema from '@boardsesh/db/schema'; import { validateInput } from '../shared/helpers.js'; import { BoardNameSchema } from '../../../validation/schemas.js'; +import { + getAllLayouts, + getSizesForLayoutId, + getSetsForLayoutAndSize, + getBoardDetails, + getBoardSelectorOptions, + type BoardName, +} from '../../../data/index.js'; +import { getLedPlacements } from '../../../data/led-placements-data.js'; export const boardQueries = { /** @@ -56,4 +65,81 @@ export const boardQueries = { const rows = Array.isArray(result) ? result : (result as { rows: { angle: number }[] }).rows; return rows.map(r => ({ angle: r.angle })); }, + + /** + * Get all layouts for a board type + */ + layouts: (_: unknown, { boardName }: { boardName: string }) => { + validateInput(BoardNameSchema, boardName, 'boardName'); + return getAllLayouts(boardName as BoardName); + }, + + /** + * Get all sizes for a layout + */ + sizesForLayout: (_: unknown, { boardName, layoutId }: { boardName: string; layoutId: number }) => { + validateInput(BoardNameSchema, boardName, 'boardName'); + return getSizesForLayoutId(boardName as BoardName, layoutId); + }, + + /** + * Get all sets for a layout and size combination + */ + setsForLayoutAndSize: (_: unknown, { boardName, layoutId, sizeId }: { boardName: string; layoutId: number; sizeId: number }) => { + validateInput(BoardNameSchema, boardName, 'boardName'); + return getSetsForLayoutAndSize(boardName as BoardName, layoutId, sizeId); + }, + + /** + * Get complete board details for rendering + */ + boardDetails: (_: unknown, { boardName, layoutId, sizeId, setIds }: { boardName: string; layoutId: number; sizeId: number; setIds: number[] }) => { + validateInput(BoardNameSchema, boardName, 'boardName'); + try { + const details = getBoardDetails({ + board_name: boardName as BoardName, + layout_id: layoutId, + size_id: sizeId, + set_ids: setIds, + }); + + return { + boardName: details.board_name, + layoutId: details.layout_id, + sizeId: details.size_id, + setIds: details.set_ids, + edgeLeft: details.edge_left, + edgeRight: details.edge_right, + edgeBottom: details.edge_bottom, + edgeTop: details.edge_top, + boardWidth: details.boardWidth, + boardHeight: details.boardHeight, + supportsMirroring: details.supportsMirroring ?? false, + layoutName: details.layout_name, + sizeName: details.size_name, + sizeDescription: details.size_description, + setNames: details.set_names ?? [], + imagesToHolds: details.images_to_holds, + holdsData: details.holdsData, + }; + } catch { + return null; + } + }, + + /** + * Get LED placements for Bluetooth board control + */ + ledPlacements: (_: unknown, { boardName, layoutId, sizeId }: { boardName: string; layoutId: number; sizeId: number }) => { + validateInput(BoardNameSchema, boardName, 'boardName'); + const placements = getLedPlacements(boardName as BoardName, layoutId, sizeId); + return { placements }; + }, + + /** + * Get all board selector options for the setup wizard + */ + boardSelectorOptions: () => { + return getBoardSelectorOptions(); + }, }; diff --git a/packages/backend/tsconfig.json b/packages/backend/tsconfig.json index 9fbc37f8..13a3ad9a 100644 --- a/packages/backend/tsconfig.json +++ b/packages/backend/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "target": "ES2022", + "lib": ["ES2022"], "module": "ESNext", "moduleResolution": "bundler", "esModuleInterop": true, diff --git a/packages/shared-schema/src/schema.ts b/packages/shared-schema/src/schema.ts index 832a16c7..4b5fcfce 100644 --- a/packages/shared-schema/src/schema.ts +++ b/packages/shared-schema/src/schema.ts @@ -129,6 +129,73 @@ export const typeDefs = /* GraphQL */ ` angle: Int! } + type ProductSize { + id: Int! + name: String! + description: String! + edgeLeft: Int! + edgeRight: Int! + edgeBottom: Int! + edgeTop: Int! + productId: Int! + } + + type Layout { + id: Int! + name: String! + productId: Int! + } + + type HoldSet { + id: Int! + name: String! + } + + # Board details for rendering - contains all data needed to display a board + type BoardDetails { + boardName: String! + layoutId: Int! + sizeId: Int! + setIds: [Int!]! + edgeLeft: Int! + edgeRight: Int! + edgeBottom: Int! + edgeTop: Int! + boardWidth: Int! + boardHeight: Int! + supportsMirroring: Boolean! + layoutName: String + sizeName: String + sizeDescription: String + setNames: [String!]! + imagesToHolds: JSON! + holdsData: JSON! + } + + # LED placements for Bluetooth board control + type LedPlacements { + placements: JSON! + } + + # Board selector option for the setup wizard + type BoardLayoutOption { + id: Int! + name: String! + sizes: [BoardSizeOption!]! + } + + type BoardSizeOption { + id: Int! + name: String! + description: String! + sets: [HoldSet!]! + } + + type BoardSelectorOptions { + kilter: [BoardLayoutOption!]! + tension: [BoardLayoutOption!]! + } + # ============================================ # Climb Search Types # ============================================ @@ -356,6 +423,22 @@ export const typeDefs = /* GraphQL */ ` # Get available angles for a board layout angles(boardName: String!, layoutId: Int!): [Angle!]! + # Get all layouts for a board type + layouts(boardName: String!): [Layout!]! + # Get all sizes for a layout + sizesForLayout(boardName: String!, layoutId: Int!): [ProductSize!]! + # Get all sets for a layout and size combination + setsForLayoutAndSize(boardName: String!, layoutId: Int!, sizeId: Int!): [HoldSet!]! + + # Get complete board details for rendering + boardDetails(boardName: String!, layoutId: Int!, sizeId: Int!, setIds: [Int!]!): BoardDetails + + # Get LED placements for Bluetooth control + ledPlacements(boardName: String!, layoutId: Int!, sizeId: Int!): LedPlacements + + # Get all board selector options for the setup wizard + boardSelectorOptions: BoardSelectorOptions! + # ============================================ # Climb Queries # ============================================ diff --git a/packages/shared-schema/src/types.ts b/packages/shared-schema/src/types.ts index 18b34a6c..cbd6b46a 100644 --- a/packages/shared-schema/src/types.ts +++ b/packages/shared-schema/src/types.ts @@ -106,6 +106,84 @@ export type Angle = { angle: number; }; +export type ProductSize = { + id: number; + name: string; + description: string; + edgeLeft: number; + edgeRight: number; + edgeBottom: number; + edgeTop: number; + productId: number; +}; + +export type Layout = { + id: number; + name: string; + productId: number; +}; + +export type HoldSet = { + id: number; + name: string; +}; + +// Hold tuple: [placementId, mirroredPlacementId | null, x, y] +export type HoldTuple = [number, number | null, number, number]; + +export type HoldRenderData = { + id: number; + mirroredHoldId: number | null; + cx: number; + cy: number; + r: number; +}; + +export type ImageFileName = string; +export type ImagesToHolds = Record; + +export type BoardDetails = { + boardName: string; + layoutId: number; + sizeId: number; + setIds: number[]; + edgeLeft: number; + edgeRight: number; + edgeBottom: number; + edgeTop: number; + boardWidth: number; + boardHeight: number; + supportsMirroring: boolean; + layoutName?: string; + sizeName?: string; + sizeDescription?: string; + setNames: string[]; + imagesToHolds: ImagesToHolds; + holdsData: HoldRenderData[]; +}; + +export type LedPlacements = { + placements: Record; +}; + +export type BoardSizeOption = { + id: number; + name: string; + description: string; + sets: HoldSet[]; +}; + +export type BoardLayoutOption = { + id: number; + name: string; + sizes: BoardSizeOption[]; +}; + +export type BoardSelectorOptions = { + kilter: BoardLayoutOption[]; + tension: BoardLayoutOption[]; +}; + // ============================================ // Climb Search Types // ============================================ diff --git a/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx b/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx index e8c8412f..cfdd3f25 100644 --- a/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx +++ b/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx @@ -18,7 +18,7 @@ import { } from './bluetooth'; import { HoldRenderData } from '../board-renderer/types'; import { useWakeLock } from './use-wake-lock'; -import { getLedPlacements } from '@/app/lib/__generated__/led-placements-data'; +import { fetchLedPlacements } from '@/app/lib/graphql/operations/board-config.client'; type SendClimbToBoardButtonProps = { boardDetails: BoardDetails }; @@ -70,6 +70,10 @@ const SendClimbToBoardButton: React.FC = ({ boardDe const bluetoothDeviceRef = useRef(null); const characteristicRef = useRef(null); + // Cache LED placements to avoid refetching on each send + const ledPlacementsRef = useRef | null>(null); + const ledPlacementsKeyRef = useRef(null); + // Handler for device disconnection const handleDisconnection = useCallback(() => { setIsConnected(false); @@ -87,13 +91,42 @@ const SendClimbToBoardButton: React.FC = ({ boardDe [handleDisconnection], ); + // Helper to get LED placements with caching + const getLedPlacementsCached = useCallback(async () => { + const cacheKey = `${boardDetails.board_name}-${boardDetails.layout_id}-${boardDetails.size_id}`; + + // Return cached value if available and matches current board config + if (ledPlacementsRef.current && ledPlacementsKeyRef.current === cacheKey) { + return ledPlacementsRef.current; + } + + // Fetch from API + const placements = await fetchLedPlacements( + boardDetails.board_name, + boardDetails.layout_id, + boardDetails.size_id + ); + + if (placements) { + ledPlacementsRef.current = placements; + ledPlacementsKeyRef.current = cacheKey; + } + + return placements; + }, [boardDetails.board_name, boardDetails.layout_id, boardDetails.size_id]); + // Function to send climb data to the board const sendClimbToBoard = useCallback(async () => { if (!currentClimbQueueItem || !characteristicRef.current) return; let { frames } = currentClimbQueueItem.climb; - const placementPositions = getLedPlacements(boardDetails.board_name, boardDetails.layout_id, boardDetails.size_id); + const placementPositions = await getLedPlacementsCached(); + if (!placementPositions) { + console.error('Failed to get LED placements'); + return; + } + if (currentClimbQueueItem.climb?.mirrored) { frames = convertToMirroredFramesString(frames, boardDetails.holdsData); } @@ -114,7 +147,7 @@ const SendClimbToBoardButton: React.FC = ({ boardDe boardLayout: `${boardDetails.layout_name}`, }); } - }, [currentClimbQueueItem, boardDetails]); + }, [currentClimbQueueItem, boardDetails, getLedPlacementsCached]); // Handle button click to initiate Bluetooth connection const handleClick = useCallback(async () => { @@ -150,16 +183,20 @@ const SendClimbToBoardButton: React.FC = ({ boardDe if (currentClimbQueueItem) { try { let { frames } = currentClimbQueueItem.climb; - const placementPositions = getLedPlacements(boardDetails.board_name, boardDetails.layout_id, boardDetails.size_id); - if (currentClimbQueueItem.climb?.mirrored) { - frames = convertToMirroredFramesString(frames, boardDetails.holdsData); + const placementPositions = await getLedPlacementsCached(); + if (!placementPositions) { + console.error('Failed to get LED placements'); + } else { + if (currentClimbQueueItem.climb?.mirrored) { + frames = convertToMirroredFramesString(frames, boardDetails.holdsData); + } + const bluetoothPacket = getBluetoothPacket(frames, placementPositions, boardDetails.board_name); + await writeCharacteristicSeries(characteristic, splitMessages(bluetoothPacket)); + track('Climb Sent to Board Success', { + climbUuid: currentClimbQueueItem.climb?.uuid, + boardLayout: `${boardDetails.layout_name}`, + }); } - const bluetoothPacket = getBluetoothPacket(frames, placementPositions, boardDetails.board_name); - await writeCharacteristicSeries(characteristic, splitMessages(bluetoothPacket)); - track('Climb Sent to Board Success', { - climbUuid: currentClimbQueueItem.climb?.uuid, - boardLayout: `${boardDetails.layout_name}`, - }); } catch (sendError) { console.error('Error sending climb after connection:', sendError); } @@ -178,7 +215,7 @@ const SendClimbToBoardButton: React.FC = ({ boardDe } finally { setLoading(false); } - }, [cleanupDeviceListeners, handleDisconnection, boardDetails, currentClimbQueueItem]); + }, [cleanupDeviceListeners, handleDisconnection, boardDetails, currentClimbQueueItem, getLedPlacementsCached]); // Clean up on unmount useEffect(() => { diff --git a/packages/web/app/components/board-bluetooth-control/use-board-bluetooth.ts b/packages/web/app/components/board-bluetooth-control/use-board-bluetooth.ts index d72d832d..103091f9 100644 --- a/packages/web/app/components/board-bluetooth-control/use-board-bluetooth.ts +++ b/packages/web/app/components/board-bluetooth-control/use-board-bluetooth.ts @@ -13,7 +13,7 @@ import { } from './bluetooth'; import { HoldRenderData } from '../board-renderer/types'; import { useWakeLock } from './use-wake-lock'; -import { getLedPlacements } from '@/app/lib/__generated__/led-placements-data'; +import { fetchLedPlacements } from '@/app/lib/graphql/operations/board-config.client'; export const convertToMirroredFramesString = (frames: string, holdsData: HoldRenderData[]): string => { // Create a map for quick lookup of mirroredHoldId @@ -57,6 +57,10 @@ export function useBoardBluetooth({ boardDetails, onConnectionChange }: UseBoard const bluetoothDeviceRef = useRef(null); const characteristicRef = useRef(null); + // Cache LED placements to avoid refetching on each send + const ledPlacementsRef = useRef | null>(null); + const ledPlacementsKeyRef = useRef(null); + // Handler for device disconnection const handleDisconnection = useCallback(() => { setIsConnected(false); @@ -74,13 +78,42 @@ export function useBoardBluetooth({ boardDetails, onConnectionChange }: UseBoard [handleDisconnection], ); + // Helper to get LED placements with caching + const getLedPlacementsCached = useCallback(async () => { + const cacheKey = `${boardDetails.board_name}-${boardDetails.layout_id}-${boardDetails.size_id}`; + + // Return cached value if available and matches current board config + if (ledPlacementsRef.current && ledPlacementsKeyRef.current === cacheKey) { + return ledPlacementsRef.current; + } + + // Fetch from API + const placements = await fetchLedPlacements( + boardDetails.board_name, + boardDetails.layout_id, + boardDetails.size_id + ); + + if (placements) { + ledPlacementsRef.current = placements; + ledPlacementsKeyRef.current = cacheKey; + } + + return placements; + }, [boardDetails.board_name, boardDetails.layout_id, boardDetails.size_id]); + // Function to send frames string to the board const sendFramesToBoard = useCallback( async (frames: string, mirrored: boolean = false) => { if (!characteristicRef.current || !frames) return; let framesToSend = frames; - const placementPositions = getLedPlacements(boardDetails.board_name, boardDetails.layout_id, boardDetails.size_id); + const placementPositions = await getLedPlacementsCached(); + + if (!placementPositions) { + console.error('Failed to get LED placements'); + return false; + } if (mirrored) { framesToSend = convertToMirroredFramesString(frames, boardDetails.holdsData); @@ -96,7 +129,7 @@ export function useBoardBluetooth({ boardDetails, onConnectionChange }: UseBoard return false; } }, - [boardDetails], + [boardDetails, getLedPlacementsCached], ); // Handle connection initiation diff --git a/packages/web/app/lib/graphql/operations/board-config.client.ts b/packages/web/app/lib/graphql/operations/board-config.client.ts new file mode 100644 index 00000000..c83280b2 --- /dev/null +++ b/packages/web/app/lib/graphql/operations/board-config.client.ts @@ -0,0 +1,42 @@ +/** + * Client-side board configuration operations. + * These are used for features that must run in the browser, + * such as Bluetooth LED control. + */ + +import { gql } from 'graphql-request'; +import { executeGraphQL } from '../client'; +import type { LedPlacements } from '@boardsesh/shared-schema'; + +const LED_PLACEMENTS_QUERY = gql` + query LedPlacements($boardName: String!, $layoutId: Int!, $sizeId: Int!) { + ledPlacements(boardName: $boardName, layoutId: $layoutId, sizeId: $sizeId) { + placements + } + } +`; + +interface LedPlacementsResponse { + ledPlacements: LedPlacements | null; +} + +/** + * Get LED placements for Bluetooth board control (client-side). + * Used by the Bluetooth module to map holds to LED positions. + */ +export const fetchLedPlacements = async ( + boardName: string, + layoutId: number, + sizeId: number +): Promise | null> => { + try { + const result = await executeGraphQL( + LED_PLACEMENTS_QUERY, + { boardName, layoutId, sizeId } + ); + return result.ledPlacements?.placements ?? null; + } catch (error) { + console.error('[fetchLedPlacements] Error fetching LED placements:', error); + return null; + } +}; diff --git a/packages/web/app/lib/graphql/operations/board-config.ts b/packages/web/app/lib/graphql/operations/board-config.ts new file mode 100644 index 00000000..0abc7ef6 --- /dev/null +++ b/packages/web/app/lib/graphql/operations/board-config.ts @@ -0,0 +1,243 @@ +import 'server-only'; +import { gql } from 'graphql-request'; +import { createCachedGraphQLQuery } from '../server-cached-client'; +import type { + BoardDetails, + Layout, + ProductSize, + HoldSet, + LedPlacements, + BoardSelectorOptions, +} from '@boardsesh/shared-schema'; + +/** + * Cache duration for board configuration data. + * Since this data is static (board configurations don't change), + * we cache for 30 days. + */ +const CACHE_DURATION = 30 * 24 * 60 * 60; // 30 days + +// GraphQL Queries +const LAYOUTS_QUERY = gql` + query Layouts($boardName: String!) { + layouts(boardName: $boardName) { + id + name + productId + } + } +`; + +const SIZES_FOR_LAYOUT_QUERY = gql` + query SizesForLayout($boardName: String!, $layoutId: Int!) { + sizesForLayout(boardName: $boardName, layoutId: $layoutId) { + id + name + description + edgeLeft + edgeRight + edgeBottom + edgeTop + productId + } + } +`; + +const SETS_FOR_LAYOUT_AND_SIZE_QUERY = gql` + query SetsForLayoutAndSize($boardName: String!, $layoutId: Int!, $sizeId: Int!) { + setsForLayoutAndSize(boardName: $boardName, layoutId: $layoutId, sizeId: $sizeId) { + id + name + } + } +`; + +const BOARD_DETAILS_QUERY = gql` + query BoardDetails($boardName: String!, $layoutId: Int!, $sizeId: Int!, $setIds: [Int!]!) { + boardDetails(boardName: $boardName, layoutId: $layoutId, sizeId: $sizeId, setIds: $setIds) { + boardName + layoutId + sizeId + setIds + edgeLeft + edgeRight + edgeBottom + edgeTop + boardWidth + boardHeight + supportsMirroring + layoutName + sizeName + sizeDescription + setNames + imagesToHolds + holdsData + } + } +`; + +const LED_PLACEMENTS_QUERY = gql` + query LedPlacements($boardName: String!, $layoutId: Int!, $sizeId: Int!) { + ledPlacements(boardName: $boardName, layoutId: $layoutId, sizeId: $sizeId) { + placements + } + } +`; + +const BOARD_SELECTOR_OPTIONS_QUERY = gql` + query BoardSelectorOptions { + boardSelectorOptions { + kilter { + id + name + sizes { + id + name + description + sets { + id + name + } + } + } + tension { + id + name + sizes { + id + name + description + sets { + id + name + } + } + } + } + } +`; + +// Response types +interface LayoutsResponse { + layouts: Layout[]; +} + +interface SizesForLayoutResponse { + sizesForLayout: ProductSize[]; +} + +interface SetsForLayoutAndSizeResponse { + setsForLayoutAndSize: HoldSet[]; +} + +interface BoardDetailsResponse { + boardDetails: BoardDetails | null; +} + +interface LedPlacementsResponse { + ledPlacements: LedPlacements | null; +} + +interface BoardSelectorOptionsResponse { + boardSelectorOptions: BoardSelectorOptions; +} + +/** + * Get all layouts for a board type. + * Cached for 30 days since layouts don't change. + */ +export const getLayouts = async (boardName: string): Promise => { + const query = createCachedGraphQLQuery( + LAYOUTS_QUERY, + `layouts-${boardName}`, + CACHE_DURATION + ); + const result = await query({ boardName }); + return result.layouts; +}; + +/** + * Get all sizes for a layout. + * Cached for 30 days since sizes don't change. + */ +export const getSizesForLayout = async ( + boardName: string, + layoutId: number +): Promise => { + const query = createCachedGraphQLQuery( + SIZES_FOR_LAYOUT_QUERY, + `sizes-${boardName}-${layoutId}`, + CACHE_DURATION + ); + const result = await query({ boardName, layoutId }); + return result.sizesForLayout; +}; + +/** + * Get all sets for a layout and size combination. + * Cached for 30 days since sets don't change. + */ +export const getSetsForLayoutAndSize = async ( + boardName: string, + layoutId: number, + sizeId: number +): Promise => { + const query = createCachedGraphQLQuery( + SETS_FOR_LAYOUT_AND_SIZE_QUERY, + `sets-${boardName}-${layoutId}-${sizeId}`, + CACHE_DURATION + ); + const result = await query({ boardName, layoutId, sizeId }); + return result.setsForLayoutAndSize; +}; + +/** + * Get complete board details for rendering. + * Cached for 30 days since board configuration doesn't change. + */ +export const getBoardDetailsFromAPI = async ( + boardName: string, + layoutId: number, + sizeId: number, + setIds: number[] +): Promise => { + const query = createCachedGraphQLQuery( + BOARD_DETAILS_QUERY, + `board-details-${boardName}-${layoutId}-${sizeId}-${setIds.join(',')}`, + CACHE_DURATION + ); + const result = await query({ boardName, layoutId, sizeId, setIds }); + return result.boardDetails; +}; + +/** + * Get LED placements for Bluetooth board control. + * Cached for 30 days since LED mappings don't change. + */ +export const getLedPlacementsFromAPI = async ( + boardName: string, + layoutId: number, + sizeId: number +): Promise => { + const query = createCachedGraphQLQuery( + LED_PLACEMENTS_QUERY, + `led-placements-${boardName}-${layoutId}-${sizeId}`, + CACHE_DURATION + ); + const result = await query({ boardName, layoutId, sizeId }); + return result.ledPlacements; +}; + +/** + * Get all board selector options for the setup wizard. + * Cached for 30 days since board configurations don't change. + */ +export const getBoardSelectorOptionsFromAPI = async (): Promise => { + const query = createCachedGraphQLQuery>( + BOARD_SELECTOR_OPTIONS_QUERY, + 'board-selector-options', + CACHE_DURATION + ); + const result = await query(); + return result.boardSelectorOptions; +}; From b8bcf8e34e20fb2a81043acec161d113a0ba964b Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 30 Dec 2025 12:48:22 +0000 Subject: [PATCH 2/3] refactor: Extract shared Bluetooth utilities and fix empty catch block - Extract duplicated convertToMirroredFramesString to bluetooth-utils.ts - Create shared createLedPlacementsFetcher factory for cached LED fetching - Update use-board-bluetooth.ts and send-climb-to-board-button.tsx to use shared utilities - Add error logging to empty catch block in boardDetails resolver --- .../src/graphql/resolvers/board/queries.ts | 3 +- .../bluetooth-utils.ts | 68 +++++++++++++++++ .../send-climb-to-board-button.tsx | 74 ++++--------------- .../use-board-bluetooth.ts | 66 +++-------------- 4 files changed, 94 insertions(+), 117 deletions(-) create mode 100644 packages/web/app/components/board-bluetooth-control/bluetooth-utils.ts diff --git a/packages/backend/src/graphql/resolvers/board/queries.ts b/packages/backend/src/graphql/resolvers/board/queries.ts index 06c682f5..90f3b319 100644 --- a/packages/backend/src/graphql/resolvers/board/queries.ts +++ b/packages/backend/src/graphql/resolvers/board/queries.ts @@ -122,7 +122,8 @@ export const boardQueries = { imagesToHolds: details.images_to_holds, holdsData: details.holdsData, }; - } catch { + } catch (error) { + console.error('[boardDetails] Error getting board details:', error); return null; } }, diff --git a/packages/web/app/components/board-bluetooth-control/bluetooth-utils.ts b/packages/web/app/components/board-bluetooth-control/bluetooth-utils.ts new file mode 100644 index 00000000..fea3504b --- /dev/null +++ b/packages/web/app/components/board-bluetooth-control/bluetooth-utils.ts @@ -0,0 +1,68 @@ +/** + * Shared utilities for Bluetooth board control. + */ + +import type { HoldRenderData } from '../board-renderer/types'; +import type { BoardName } from '@/app/lib/types'; +import { fetchLedPlacements } from '@/app/lib/graphql/operations/board-config.client'; + +/** + * Convert frames string to use mirrored hold IDs. + */ +export const convertToMirroredFramesString = (frames: string, holdsData: HoldRenderData[]): string => { + // Create a map for quick lookup of mirroredHoldId + const holdIdToMirroredIdMap = new Map(); + holdsData.forEach((hold) => { + if (hold.mirroredHoldId) { + holdIdToMirroredIdMap.set(hold.id, hold.mirroredHoldId); + } + }); + + return frames + .split('p') // Split into hold data entries + .filter((hold) => hold) // Remove empty entries + .map((holdData) => { + const [holdId, stateCode] = holdData.split('r').map((str) => Number(str)); // Split hold data into holdId and stateCode + const mirroredHoldId = holdIdToMirroredIdMap.get(holdId); + + if (mirroredHoldId === undefined) { + throw new Error(`Mirrored hold ID is not defined for hold ID ${holdId}.`); + } + + // Construct the mirrored hold data + return `p${mirroredHoldId}r${stateCode}`; + }) + .join(''); // Reassemble into a single string +}; + +/** + * Create a cached LED placements fetcher. + * Returns a function that fetches LED placements with in-memory caching. + */ +export function createLedPlacementsFetcher() { + let cachedPlacements: Record | null = null; + let cacheKey: string | null = null; + + return async ( + boardName: BoardName, + layoutId: number, + sizeId: number + ): Promise | null> => { + const newCacheKey = `${boardName}-${layoutId}-${sizeId}`; + + // Return cached value if available and matches current board config + if (cachedPlacements && cacheKey === newCacheKey) { + return cachedPlacements; + } + + // Fetch from API + const placements = await fetchLedPlacements(boardName, layoutId, sizeId); + + if (placements) { + cachedPlacements = placements; + cacheKey = newCacheKey; + } + + return placements; + }; +} diff --git a/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx b/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx index cfdd3f25..1f9efc28 100644 --- a/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx +++ b/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx @@ -16,38 +16,11 @@ import { splitMessages, writeCharacteristicSeries, } from './bluetooth'; -import { HoldRenderData } from '../board-renderer/types'; import { useWakeLock } from './use-wake-lock'; -import { fetchLedPlacements } from '@/app/lib/graphql/operations/board-config.client'; +import { convertToMirroredFramesString, createLedPlacementsFetcher } from './bluetooth-utils'; type SendClimbToBoardButtonProps = { boardDetails: BoardDetails }; -export const convertToMirroredFramesString = (frames: string, holdsData: HoldRenderData[]): string => { - // Create a map for quick lookup of mirroredHoldId - const holdIdToMirroredIdMap = new Map(); - holdsData.forEach((hold) => { - if (hold.mirroredHoldId) { - holdIdToMirroredIdMap.set(hold.id, hold.mirroredHoldId); - } - }); - - return frames - .split('p') // Split into hold data entries - .filter((hold) => hold) // Remove empty entries - .map((holdData) => { - const [holdId, stateCode] = holdData.split('r').map((str) => Number(str)); // Split hold data into holdId and stateCode - const mirroredHoldId = holdIdToMirroredIdMap.get(holdId); - - if (mirroredHoldId === undefined) { - throw new Error(`Mirrored hold ID is not defined for hold ID ${holdId}.`); - } - - // Construct the mirrored hold data - return `p${mirroredHoldId}r${stateCode}`; - }) - .join(''); // Reassemble into a single string -}; - // React component const SendClimbToBoardButton: React.FC = ({ boardDetails }) => { const { currentClimbQueueItem } = useQueueContext(); @@ -70,9 +43,8 @@ const SendClimbToBoardButton: React.FC = ({ boardDe const bluetoothDeviceRef = useRef(null); const characteristicRef = useRef(null); - // Cache LED placements to avoid refetching on each send - const ledPlacementsRef = useRef | null>(null); - const ledPlacementsKeyRef = useRef(null); + // Create a cached LED placements fetcher (stable across renders) + const fetchLedPlacementsCached = useRef(createLedPlacementsFetcher()).current; // Handler for device disconnection const handleDisconnection = useCallback(() => { @@ -91,37 +63,17 @@ const SendClimbToBoardButton: React.FC = ({ boardDe [handleDisconnection], ); - // Helper to get LED placements with caching - const getLedPlacementsCached = useCallback(async () => { - const cacheKey = `${boardDetails.board_name}-${boardDetails.layout_id}-${boardDetails.size_id}`; - - // Return cached value if available and matches current board config - if (ledPlacementsRef.current && ledPlacementsKeyRef.current === cacheKey) { - return ledPlacementsRef.current; - } - - // Fetch from API - const placements = await fetchLedPlacements( - boardDetails.board_name, - boardDetails.layout_id, - boardDetails.size_id - ); - - if (placements) { - ledPlacementsRef.current = placements; - ledPlacementsKeyRef.current = cacheKey; - } - - return placements; - }, [boardDetails.board_name, boardDetails.layout_id, boardDetails.size_id]); - // Function to send climb data to the board const sendClimbToBoard = useCallback(async () => { if (!currentClimbQueueItem || !characteristicRef.current) return; let { frames } = currentClimbQueueItem.climb; - const placementPositions = await getLedPlacementsCached(); + const placementPositions = await fetchLedPlacementsCached( + boardDetails.board_name, + boardDetails.layout_id, + boardDetails.size_id + ); if (!placementPositions) { console.error('Failed to get LED placements'); return; @@ -147,7 +99,7 @@ const SendClimbToBoardButton: React.FC = ({ boardDe boardLayout: `${boardDetails.layout_name}`, }); } - }, [currentClimbQueueItem, boardDetails, getLedPlacementsCached]); + }, [currentClimbQueueItem, boardDetails, fetchLedPlacementsCached]); // Handle button click to initiate Bluetooth connection const handleClick = useCallback(async () => { @@ -183,7 +135,11 @@ const SendClimbToBoardButton: React.FC = ({ boardDe if (currentClimbQueueItem) { try { let { frames } = currentClimbQueueItem.climb; - const placementPositions = await getLedPlacementsCached(); + const placementPositions = await fetchLedPlacementsCached( + boardDetails.board_name, + boardDetails.layout_id, + boardDetails.size_id + ); if (!placementPositions) { console.error('Failed to get LED placements'); } else { @@ -215,7 +171,7 @@ const SendClimbToBoardButton: React.FC = ({ boardDe } finally { setLoading(false); } - }, [cleanupDeviceListeners, handleDisconnection, boardDetails, currentClimbQueueItem, getLedPlacementsCached]); + }, [cleanupDeviceListeners, handleDisconnection, boardDetails, currentClimbQueueItem, fetchLedPlacementsCached]); // Clean up on unmount useEffect(() => { diff --git a/packages/web/app/components/board-bluetooth-control/use-board-bluetooth.ts b/packages/web/app/components/board-bluetooth-control/use-board-bluetooth.ts index 103091f9..afcb21d1 100644 --- a/packages/web/app/components/board-bluetooth-control/use-board-bluetooth.ts +++ b/packages/web/app/components/board-bluetooth-control/use-board-bluetooth.ts @@ -11,35 +11,8 @@ import { splitMessages, writeCharacteristicSeries, } from './bluetooth'; -import { HoldRenderData } from '../board-renderer/types'; import { useWakeLock } from './use-wake-lock'; -import { fetchLedPlacements } from '@/app/lib/graphql/operations/board-config.client'; - -export const convertToMirroredFramesString = (frames: string, holdsData: HoldRenderData[]): string => { - // Create a map for quick lookup of mirroredHoldId - const holdIdToMirroredIdMap = new Map(); - holdsData.forEach((hold) => { - if (hold.mirroredHoldId) { - holdIdToMirroredIdMap.set(hold.id, hold.mirroredHoldId); - } - }); - - return frames - .split('p') // Split into hold data entries - .filter((hold) => hold) // Remove empty entries - .map((holdData) => { - const [holdId, stateCode] = holdData.split('r').map((str) => Number(str)); // Split hold data into holdId and stateCode - const mirroredHoldId = holdIdToMirroredIdMap.get(holdId); - - if (mirroredHoldId === undefined) { - throw new Error(`Mirrored hold ID is not defined for hold ID ${holdId}.`); - } - - // Construct the mirrored hold data - return `p${mirroredHoldId}r${stateCode}`; - }) - .join(''); // Reassemble into a single string -}; +import { convertToMirroredFramesString, createLedPlacementsFetcher } from './bluetooth-utils'; interface UseBoardBluetoothOptions { boardDetails: BoardDetails; @@ -57,9 +30,8 @@ export function useBoardBluetooth({ boardDetails, onConnectionChange }: UseBoard const bluetoothDeviceRef = useRef(null); const characteristicRef = useRef(null); - // Cache LED placements to avoid refetching on each send - const ledPlacementsRef = useRef | null>(null); - const ledPlacementsKeyRef = useRef(null); + // Create a cached LED placements fetcher (stable across renders) + const fetchLedPlacementsCached = useRef(createLedPlacementsFetcher()).current; // Handler for device disconnection const handleDisconnection = useCallback(() => { @@ -78,37 +50,17 @@ export function useBoardBluetooth({ boardDetails, onConnectionChange }: UseBoard [handleDisconnection], ); - // Helper to get LED placements with caching - const getLedPlacementsCached = useCallback(async () => { - const cacheKey = `${boardDetails.board_name}-${boardDetails.layout_id}-${boardDetails.size_id}`; - - // Return cached value if available and matches current board config - if (ledPlacementsRef.current && ledPlacementsKeyRef.current === cacheKey) { - return ledPlacementsRef.current; - } - - // Fetch from API - const placements = await fetchLedPlacements( - boardDetails.board_name, - boardDetails.layout_id, - boardDetails.size_id - ); - - if (placements) { - ledPlacementsRef.current = placements; - ledPlacementsKeyRef.current = cacheKey; - } - - return placements; - }, [boardDetails.board_name, boardDetails.layout_id, boardDetails.size_id]); - // Function to send frames string to the board const sendFramesToBoard = useCallback( async (frames: string, mirrored: boolean = false) => { if (!characteristicRef.current || !frames) return; let framesToSend = frames; - const placementPositions = await getLedPlacementsCached(); + const placementPositions = await fetchLedPlacementsCached( + boardDetails.board_name, + boardDetails.layout_id, + boardDetails.size_id + ); if (!placementPositions) { console.error('Failed to get LED placements'); @@ -129,7 +81,7 @@ export function useBoardBluetooth({ boardDetails, onConnectionChange }: UseBoard return false; } }, - [boardDetails, getLedPlacementsCached], + [boardDetails, fetchLedPlacementsCached], ); // Handle connection initiation From 3439bcf286c1c17accb3c6d04c41d6f4e3c7b9c4 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 30 Dec 2025 13:12:31 +0000 Subject: [PATCH 3/3] fix: Address code review feedback for board config refactoring - Deduplicate handleClick to reuse sendClimbToBoard callback - Add user notification (message.error) when LED placements fetch fails - Add comprehensive input validation for GraphQL resolvers: - LayoutIdSchema for layout_id validation - SizeIdSchema for size_id validation - SetIdsArraySchema for set_ids array validation - Import shared types from @boardsesh/shared-schema to reduce duplication - BoardName, HoldTuple, HoldRenderData, ImageFileName, ImagesToHolds --- packages/backend/src/data/types.ts | 29 +++++----- .../src/graphql/resolvers/board/queries.ts | 10 +++- packages/backend/src/validation/schemas.ts | 17 ++++++ .../send-climb-to-board-button.tsx | 55 ++++++------------- 4 files changed, 56 insertions(+), 55 deletions(-) diff --git a/packages/backend/src/data/types.ts b/packages/backend/src/data/types.ts index cc2bc203..029a74ee 100644 --- a/packages/backend/src/data/types.ts +++ b/packages/backend/src/data/types.ts @@ -1,25 +1,22 @@ /** * Board configuration types for the backend data module. - * These types mirror the web package types but are self-contained for the backend. + * + * Shared types are imported from @boardsesh/shared-schema. + * Backend-specific types (using snake_case for internal processing) are defined here. */ -export type BoardName = 'kilter' | 'tension'; +// Re-export shared types used by backend data processing +export type { + BoardName, + HoldTuple, + HoldRenderData, + ImageFileName, + ImagesToHolds, +} from '@boardsesh/shared-schema'; + +// Backend-specific type aliases export type Angle = number; export type SetIdList = number[]; -export type ImageFileName = string; - -// HoldTuple: [placementId, mirroredPlacementId | null, x, y] -export type HoldTuple = [number, number | null, number, number]; - -export interface HoldRenderData { - id: number; - mirroredHoldId: number | null; - cx: number; - cy: number; - r: number; -} - -export type ImagesToHolds = Record; export interface BoardDetails { images_to_holds: ImagesToHolds; diff --git a/packages/backend/src/graphql/resolvers/board/queries.ts b/packages/backend/src/graphql/resolvers/board/queries.ts index 90f3b319..dfdbd26f 100644 --- a/packages/backend/src/graphql/resolvers/board/queries.ts +++ b/packages/backend/src/graphql/resolvers/board/queries.ts @@ -3,7 +3,7 @@ import type { Grade, Angle } from '@boardsesh/shared-schema'; import { db } from '../../../db/client.js'; import * as dbSchema from '@boardsesh/db/schema'; import { validateInput } from '../shared/helpers.js'; -import { BoardNameSchema } from '../../../validation/schemas.js'; +import { BoardNameSchema, LayoutIdSchema, SizeIdSchema, SetIdsArraySchema } from '../../../validation/schemas.js'; import { getAllLayouts, getSizesForLayoutId, @@ -79,6 +79,7 @@ export const boardQueries = { */ sizesForLayout: (_: unknown, { boardName, layoutId }: { boardName: string; layoutId: number }) => { validateInput(BoardNameSchema, boardName, 'boardName'); + validateInput(LayoutIdSchema, layoutId, 'layoutId'); return getSizesForLayoutId(boardName as BoardName, layoutId); }, @@ -87,6 +88,8 @@ export const boardQueries = { */ setsForLayoutAndSize: (_: unknown, { boardName, layoutId, sizeId }: { boardName: string; layoutId: number; sizeId: number }) => { validateInput(BoardNameSchema, boardName, 'boardName'); + validateInput(LayoutIdSchema, layoutId, 'layoutId'); + validateInput(SizeIdSchema, sizeId, 'sizeId'); return getSetsForLayoutAndSize(boardName as BoardName, layoutId, sizeId); }, @@ -95,6 +98,9 @@ export const boardQueries = { */ boardDetails: (_: unknown, { boardName, layoutId, sizeId, setIds }: { boardName: string; layoutId: number; sizeId: number; setIds: number[] }) => { validateInput(BoardNameSchema, boardName, 'boardName'); + validateInput(LayoutIdSchema, layoutId, 'layoutId'); + validateInput(SizeIdSchema, sizeId, 'sizeId'); + validateInput(SetIdsArraySchema, setIds, 'setIds'); try { const details = getBoardDetails({ board_name: boardName as BoardName, @@ -133,6 +139,8 @@ export const boardQueries = { */ ledPlacements: (_: unknown, { boardName, layoutId, sizeId }: { boardName: string; layoutId: number; sizeId: number }) => { validateInput(BoardNameSchema, boardName, 'boardName'); + validateInput(LayoutIdSchema, layoutId, 'layoutId'); + validateInput(SizeIdSchema, sizeId, 'sizeId'); const placements = getLedPlacements(boardName as BoardName, layoutId, sizeId); return { placements }; }, diff --git a/packages/backend/src/validation/schemas.ts b/packages/backend/src/validation/schemas.ts index 09ed9d2b..b469b50e 100644 --- a/packages/backend/src/validation/schemas.ts +++ b/packages/backend/src/validation/schemas.ts @@ -153,6 +153,23 @@ export const BoardNameSchema = z.enum(['kilter', 'tension'], { errorMap: () => ({ message: 'Board name must be kilter or tension' }), }); +/** + * Layout ID validation schema + */ +export const LayoutIdSchema = z.number().int('Layout ID must be an integer').positive('Layout ID must be positive'); + +/** + * Size ID validation schema + */ +export const SizeIdSchema = z.number().int('Size ID must be an integer').positive('Size ID must be positive'); + +/** + * Set IDs array validation schema (for board configuration) + */ +export const SetIdsArraySchema = z.array( + z.number().int('Set ID must be an integer').positive('Set ID must be positive') +).min(1, 'At least one set ID is required').max(50, 'Too many set IDs'); + // ============================================ // Climb Search Schemas // ============================================ diff --git a/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx b/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx index 1f9efc28..dda64c17 100644 --- a/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx +++ b/packages/web/app/components/board-bluetooth-control/send-climb-to-board-button.tsx @@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { BulbOutlined, BulbFilled, AppleOutlined } from '@ant-design/icons'; -import { Button, Modal, Typography } from 'antd'; +import { Button, Modal, Typography, message } from 'antd'; import { track } from '@vercel/analytics'; const { Text, Paragraph } = Typography; @@ -64,8 +64,8 @@ const SendClimbToBoardButton: React.FC = ({ boardDe ); // Function to send climb data to the board - const sendClimbToBoard = useCallback(async () => { - if (!currentClimbQueueItem || !characteristicRef.current) return; + const sendClimbToBoard = useCallback(async (): Promise => { + if (!currentClimbQueueItem || !characteristicRef.current) return false; let { frames } = currentClimbQueueItem.climb; @@ -76,7 +76,8 @@ const SendClimbToBoardButton: React.FC = ({ boardDe ); if (!placementPositions) { console.error('Failed to get LED placements'); - return; + message.error('Failed to load board LED configuration'); + return false; } if (currentClimbQueueItem.climb?.mirrored) { @@ -85,19 +86,19 @@ const SendClimbToBoardButton: React.FC = ({ boardDe const bluetoothPacket = getBluetoothPacket(frames, placementPositions, boardDetails.board_name); try { - if (characteristicRef.current) { - await writeCharacteristicSeries(characteristicRef.current, splitMessages(bluetoothPacket)); - track('Climb Sent to Board Success', { - climbUuid: currentClimbQueueItem.climb?.uuid, - boardLayout: `${boardDetails.layout_name}`, - }); - } + await writeCharacteristicSeries(characteristicRef.current, splitMessages(bluetoothPacket)); + track('Climb Sent to Board Success', { + climbUuid: currentClimbQueueItem.climb?.uuid, + boardLayout: `${boardDetails.layout_name}`, + }); + return true; } catch (error) { console.error('Error sending climb to board:', error); track('Climb Sent to Board Failure', { climbUuid: currentClimbQueueItem.climb?.uuid, boardLayout: `${boardDetails.layout_name}`, }); + return false; } }, [currentClimbQueueItem, boardDetails, fetchLedPlacementsCached]); @@ -130,36 +131,14 @@ const SendClimbToBoardButton: React.FC = ({ boardDe boardLayout: `${boardDetails.layout_name}`, }); + // Set connected state before sending climb + setIsConnected(true); + // Send the current climb immediately after connection is established // Button is disabled when no climb is selected, so currentClimbQueueItem should always exist here if (currentClimbQueueItem) { - try { - let { frames } = currentClimbQueueItem.climb; - const placementPositions = await fetchLedPlacementsCached( - boardDetails.board_name, - boardDetails.layout_id, - boardDetails.size_id - ); - if (!placementPositions) { - console.error('Failed to get LED placements'); - } else { - if (currentClimbQueueItem.climb?.mirrored) { - frames = convertToMirroredFramesString(frames, boardDetails.holdsData); - } - const bluetoothPacket = getBluetoothPacket(frames, placementPositions, boardDetails.board_name); - await writeCharacteristicSeries(characteristic, splitMessages(bluetoothPacket)); - track('Climb Sent to Board Success', { - climbUuid: currentClimbQueueItem.climb?.uuid, - boardLayout: `${boardDetails.layout_name}`, - }); - } - } catch (sendError) { - console.error('Error sending climb after connection:', sendError); - } + await sendClimbToBoard(); } - - // Set connected state after successful send attempt - setIsConnected(true); } } catch (error) { console.error('Error connecting to Bluetooth:', error); @@ -171,7 +150,7 @@ const SendClimbToBoardButton: React.FC = ({ boardDe } finally { setLoading(false); } - }, [cleanupDeviceListeners, handleDisconnection, boardDetails, currentClimbQueueItem, fetchLedPlacementsCached]); + }, [cleanupDeviceListeners, handleDisconnection, boardDetails, currentClimbQueueItem, sendClimbToBoard]); // Clean up on unmount useEffect(() => {