From 9173d29c414ddb8f4bec74e4db3ccbe664c66bf9 Mon Sep 17 00:00:00 2001 From: lucasart Date: Sat, 16 Apr 2016 22:59:39 +0100 Subject: [PATCH] syzygy clean-up + unit test --- src/syzygy/syzygy.epd | 2016 ++++++++++++++++++++++++++++++++ src/syzygy/tbcore.cpp | 2507 +++++++++++++++++++++------------------- src/syzygy/tbcore.h | 187 ++- src/syzygy/tbprobe.cpp | 1368 ++++++++++++---------- 4 files changed, 4181 insertions(+), 1897 deletions(-) create mode 100644 src/syzygy/syzygy.epd diff --git a/src/syzygy/syzygy.epd b/src/syzygy/syzygy.epd new file mode 100644 index 00000000..f48e8418 --- /dev/null +++ b/src/syzygy/syzygy.epd @@ -0,0 +1,2016 @@ +8/5K2/1k1B4/8/8/8/8/8 b - - 45 +K7/8/1q6/8/6k1/8/8/8 w - - 71 +8/K7/8/8/6n1/8/8/3k4 w - - 59 +8/4k3/2Q5/8/8/8/8/K7 b - - 65 +8/r7/8/2k5/8/8/8/5K2 w - - 22 +8/8/5k2/8/8/8/N5K1/8 b - - 92 +1K6/8/8/6R1/8/8/k7/8 w - - 39 +8/5k2/8/8/r7/8/2K5/8 b - - 64 +8/2r5/7k/8/K7/8/8/8 b - - 64 +5K2/8/8/8/3k2n1/8/8/8 b - - 22 +8/8/8/3r2K1/8/8/k7/8 w - - 15 +8/8/8/1K6/8/2kr4/8/8 w - - 90 +8/2n5/7K/8/8/8/3k4/8 b - - 65 +8/2K5/8/8/1q6/8/5k2/8 w - - 50 +b3k3/1K6/8/8/8/8/8/8 w - - 20 +7K/8/8/2R5/8/8/8/k7 w - - 62 +8/8/4K3/8/8/k7/8/3N4 w - - 77 +8/8/4k3/8/8/K7/1P6/8 b - - 78 +8/8/8/8/3K1k2/8/7R/8 w - - 77 +7k/8/8/8/7B/8/K7/8 w - - 13 +8/8/8/8/K7/7k/6P1/8 b - - 11 +8/8/8/8/8/2K5/4P1k1/8 w - - 48 +8/2q2k2/8/3K4/8/8/8/8 b - - 6 +8/2k5/8/8/8/3N4/8/K7 w - - 69 +8/8/1K6/8/2q5/5k2/8/8 b - - 5 +8/3k4/8/8/8/8/KB6/8 w - - 15 +8/8/8/5K2/7n/3k4/8/8 w - - 80 +1k6/8/8/3n2K1/8/8/8/8 w - - 60 +6K1/8/8/8/k2q4/8/8/8 b - - 55 +2b5/8/1k6/7K/8/8/8/8 w - - 49 +8/8/5k1p/7K/8/8/8/8 b - - 94 +8/5K2/8/8/7k/8/R7/8 w - - 33 +8/5K2/1k1B4/8/r7/8/8/8 b - - 87 +8/4k3/2R5/8/8/3B4/8/1K6 b - - 89 +8/2K5/8/8/8/6k1/7B/3N4 b - - 31 +8/1k6/8/K7/7n/4N3/8/8 w - - 22 +8/8/5k2/8/8/8/Np4K1/8 w - - 29 +8/8/6K1/8/r1Q5/8/8/6k1 b - - 64 +8/2r5/5p1k/8/K7/8/8/8 b - - 43 +8/3K4/8/6r1/6k1/8/3R4/8 w - - 86 +8/5b2/8/2n5/8/7k/K7/8 w - - 71 +7K/8/8/8/8/3n4/8/3Qk3 b - - 90 +6n1/8/8/1k6/8/8/5K2/4N3 w - - 96 +8/8/8/8/K5p1/b2k4/8/8 w - - 14 +8/8/4K3/n7/8/8/P7/6k1 b - - 40 +1q6/8/8/8/8/8/1k6/R2K4 w A - 19 +8/7K/8/1R5P/8/8/5k2/8 b - - 82 +8/8/8/8/8/8/4k1K1/2B2B2 b - - 10 +8/8/4b3/8/2K2k2/8/2P5/8 w - - 69 +8/n7/1K6/8/2q5/5k2/8/8 w - - 80 +8/8/3k4/8/7n/8/1K3B2/8 w - - 80 +1k6/8/8/3n2K1/8/8/8/1B6 w - - 75 +2b4b/8/8/8/8/6k1/8/3K4 w - - 97 +8/8/8/qK6/3b4/8/8/k7 w - - 2 +8/8/8/8/B4k2/4b3/4K3/8 b - - 9 +8/8/3r4/5B2/8/2K2k2/8/8 b - - 16 +8/8/6K1/4n3/8/7B/8/3k4 w - - 48 +7K/5r2/7k/r7/8/8/8/8 b - - 27 +8/8/8/8/1n6/3R4/8/1k1K4 b - - 70 +8/1k1n4/8/5K2/8/8/2p5/8 w - - 23 +8/8/K3b3/3k4/4B3/8/8/8 b - - 76 +8/3k4/R7/5N2/8/8/K7/8 b - - 28 +8/8/8/2p2k2/2K5/3Q4/8/8 b - - 6 +7r/3k2K1/8/8/8/7N/8/8 w - - 54 +K7/8/7q/8/8/8/8/3k2N1 w - - 29 +8/5K2/8/5k2/8/8/8/4NB2 w - - 71 +8/7p/8/K7/5k2/8/6P1/8 w - - 35 +8/7k/8/8/5K2/N7/5N2/8 w - - 24 +4kb2/8/7K/8/8/8/8/5R2 w - - 7 +1k6/8/7K/8/8/8/8/3Q2N1 w - - 69 +6r1/8/8/8/8/K5bk/8/8 b - - 14 +8/8/8/5k2/b5q1/8/4K3/8 w - - 48 +8/8/7K/8/7n/3r4/4k3/8 w - - 88 +8/5p2/8/7K/8/8/6B1/1k6 b - - 33 +4k3/1K6/8/8/3R4/8/3B4/8 w - - 8 +6b1/8/3k4/8/n7/8/5K2/8 w - - 8 +8/8/2r1Kp2/8/8/8/8/3k4 w - - 74 +7n/8/8/2K5/k5R1/8/8/8 b - - 5 +8/1K1k4/8/r7/8/8/8/7R w - - 16 +8/8/8/7K/6q1/1R6/6k1/8 w - - 74 +5k2/8/8/8/8/8/1Q2B3/K7 b - - 13 +8/2r4k/K7/8/8/8/8/4N3 w - - 60 +8/8/2k5/8/3K1N2/8/2N5/8 w - - 0 +8/5K2/8/7k/4B3/8/8/3N4 b - - 27 +1K6/8/8/8/8/8/k2p4/2R5 w - - 41 +2k5/8/5K2/8/8/4P3/8/1N6 b - - 37 +2k5/8/1Q6/N7/8/7K/8/8 w - - 93 +7b/1k6/8/8/6b1/8/3K4/8 w - - 76 +8/1k6/8/1r2n3/2K5/8/8/8 w - - 26 +8/n7/2k5/8/8/7K/2P5/8 w - - 94 +8/3K4/n7/4N3/1k6/8/8/8 b - - 58 +1k6/8/8/4B3/8/2R5/6K1/8 b - - 7 +4k3/8/8/6Q1/8/8/4P3/1K6 w - - 14 +1r6/7K/8/8/5p2/8/8/6k1 b - - 35 +8/8/1n6/7n/8/8/2K5/6k1 b - - 93 +8/8/1B6/2n5/1K6/8/3k4/8 w - - 46 +8/2q2K2/1k1B4/8/r7/8/8/8 w - - 44 +8/8/6k1/8/2r5/8/8/3NK2Q w - - 94 +8/r7/8/4B2K/8/3k4/5N2/8 b - - 21 +6K1/8/6R1/6p1/8/8/8/1k5B w - - 45 +8/8/5k2/8/5Q2/5K2/3B4/7R b - - 50 +5k2/8/8/2R5/1b4K1/8/5Q2/8 b - - 33 +8/8/8/8/5k2/2Kn3B/8/3Q4 b - - 90 +6n1/8/8/1k6/8/8/P4K2/4N3 b - - 47 +7k/8/8/4R3/6p1/8/P7/K7 b - - 77 +8/8/N7/8/3K1k1B/8/7R/8 w - - 0 +8/8/6n1/8/kr6/8/5K2/2B5 w - - 99 +8/5K2/4b3/2n5/8/8/1kP5/8 w - - 69 +8/n7/1K6/8/2q5/5k2/1B6/8 w - - 15 +8/8/8/3n1K2/7n/3k4/6P1/8 w - - 80 +2n5/3r4/1K5P/8/8/8/k7/8 w - - 49 +8/8/5k1p/7K/8/5r2/R7/8 w - - 33 +8/8/3k4/8/5R2/8/Q1R5/3K4 b - - 5 +8/6p1/3K4/4n3/8/7B/8/4k3 b - - 48 +3b3K/5r2/7k/r7/8/8/8/8 w - - 78 +7n/4k3/8/8/1n1q4/8/8/3K4 w - - 46 +8/8/3kb3/8/4B3/3K4/Q7/8 w - - 76 +8/3k4/R7/2p2N2/8/8/K7/8 w - - 31 +8/8/8/4q2k/8/8/3R4/4KN2 w - - 78 +k7/2K5/5n2/1R6/8/7q/8/8 b - - 88 +8/3k3r/8/8/8/4n3/8/5RK1 w - - 35 +8/2b4b/8/8/8/8/1k4K1/B7 b - - 53 +1K6/8/1R4k1/8/R7/7p/8/8 b - - 46 +8/8/2n5/8/6kn/1K6/8/4N3 w - - 5 +K7/8/R6k/8/8/1b6/5B2/8 b - - 68 +3r2k1/3K4/B7/8/4n3/8/8/8 w d - 68 +8/8/3R1KP1/8/8/3k2p1/8/8 b - - 86 +2b5/8/1K6/5k1N/8/n7/8/8 w - - 46 +1k5r/8/4n1K1/8/8/8/8/6Q1 b h - 61 +8/8/4K3/7N/1k6/8/3B4/2Q5 b - - 17 +8/8/3k1P2/8/2K2N2/8/8/3N4 w - - 67 +8/8/p4k2/8/1K6/8/5N2/2B5 b - - 15 +2K4n/8/8/4k3/6p1/8/1N6/8 b - - 15 +5q2/p7/4N1k1/4K3/8/8/8/8 b - - 21 +8/1k6/8/2P5/8/5b2/2Q5/1K6 w - - 82 +8/5r2/8/2Q5/8/2K1k3/8/2N5 b - - 94 +4K3/8/4k3/8/P3n3/3B4/8/8 b - - 18 +4n1K1/8/8/6n1/7k/5q2/8/8 b - - 5 +7r/8/1k5n/1n6/K7/8/8/8 w - - 69 +4b2b/2r5/8/8/6K1/3k4/8/8 b - - 98 +8/1rq3K1/8/8/8/k2b4/8/8 w - - 92 +8/8/2k5/8/1B6/4B3/3N4/2K5 w - - 11 +4k1b1/n7/8/2K5/8/8/2N5/8 w - - 70 +n7/8/8/1K6/8/7N/8/1k1B4 w - - 71 +8/8/1Q6/2R2B2/8/2k5/5K2/8 b - - 27 +4r3/8/K7/4R3/8/3R4/8/3k4 b - - 48 +8/2k5/7r/3B4/8/8/N1K5/8 w - - 43 +8/2k5/K7/6B1/7q/8/8/R7 w - - 77 +6K1/8/8/8/n7/k1n5/N7/8 b - - 46 +r2n4/8/r7/3K2k1/8/8/8/8 b - - 7 +8/3p4/8/8/3k4/4b1K1/8/5N2 w - - 99 +8/8/1p6/1B6/8/1B6/6k1/1K6 w - - 56 +8/2K5/8/8/8/1B6/k3NN2/8 b - - 36 +8/8/8/4N3/3Q4/1b6/2K5/5k2 w - - 23 +8/5k2/8/8/6N1/8/1K2R1N1/8 b - - 58 +6r1/6p1/3r4/8/8/2k5/4K3/8 b - - 93 +1k6/7r/8/8/2BK4/Q7/8/8 b - - 80 +8/8/K4R2/5b1B/8/8/8/2k5 b - - 34 +K6r/8/7k/8/1R6/1N6/8/8 w - - 10 +8/8/7Q/5k2/b7/7p/3K4/8 b - - 74 +8/8/5R2/8/1P6/1k3K2/P7/8 b - - 17 +6K1/b4q2/5k2/1p6/8/8/8/8 w - b6 98 +1K2n3/8/8/8/6R1/8/k6P/8 w - - 15 +8/4K3/8/8/2kN4/3R4/1P6/8 w - - 86 +8/8/8/5K2/k7/8/R7/3B2Q1 b - - 76 +8/r1n5/2R5/7K/8/8/k7/8 w - - 23 +3K4/r2b2k1/8/8/8/6q1/8/8 b - - 74 +1b6/8/2qk2K1/8/6b1/8/8/8 w - - 66 +6k1/4q3/8/1p4K1/8/8/2R5/8 w - - 37 +7n/1k6/1b6/7K/8/1Q6/8/8 w - - 18 +8/7n/8/2K5/5k2/8/2B5/4R3 b - - 88 +6k1/7n/1N6/8/8/5b1K/8/8 b - - 99 +1k6/8/3K4/8/2P5/4P3/1R6/8 b - c3 33 +8/8/8/7k/3nB3/8/8/1K5N b - - 24 +8/4n3/8/8/2k2N2/8/6K1/5N2 b - - 99 +3bK3/4n3/5B2/8/8/3k4/8/8 b - - 40 +8/3p3q/8/8/3k4/5P2/6K1/8 w - - 25 +8/8/3k4/5R2/8/8/1NR1K3/8 w - - 59 +8/4q2q/8/8/k7/6K1/8/1B6 b - - 30 +8/3k4/K4b2/8/8/8/B1B5/8 b - - 89 +1b6/8/B2k4/8/8/4K3/8/1N6 b - - 53 +8/8/8/k4N2/1n6/K7/8/R7 w - - 27 +8/8/K7/3k4/1N6/5r2/8/4B3 b - - 73 +8/n7/8/7k/8/8/1P5K/4R3 b - - 73 +8/2b5/2K2R2/8/8/8/2N5/7k b - - 31 +1b5n/2r5/3k4/K7/8/8/8/8 w - - 58 +8/8/k3r3/8/7K/8/8/6QR b - - 47 +8/8/7n/3r4/8/4k3/5N1K/8 w - - 69 +3k1n2/8/8/5n2/7n/1K6/8/8 b - - 50 +2q5/k6K/8/1n6/8/8/3R4/8 w - - 21 +3k4/8/2K5/1R2r3/8/8/1Q6/8 w - - 8 +8/2n2K2/n7/8/k6N/8/8/8 b - - 64 +2k5/4b1p1/8/8/K7/5r2/8/8 w - - 11 +8/8/8/2N5/K4B2/8/P7/4k3 w - - 41 +5k2/7K/8/B7/7p/8/8/2Q5 w - - 32 +4n3/4b3/1k6/8/8/8/1Q6/K7 b - - 4 +1k1b4/6r1/8/4KR2/8/8/8/8 w - - 46 +8/b7/3K4/8/8/1k6/1B6/N7 b - - 27 +8/8/K5B1/8/8/8/5Rp1/2k5 w - - 11 +7k/8/1p6/8/8/8/4K3/1N1Q4 w - - 22 +2K5/8/8/8/1R2q2R/8/8/3k4 w - - 56 +8/8/5k2/8/5N2/8/3p1R2/7K b - - 85 +K3k1b1/8/8/8/8/1p6/8/3N4 b - - 25 +8/4b3/8/5K2/8/4kr2/N7/8 w - - 71 +3K4/8/7R/8/7k/4r3/1P6/8 b - - 55 +8/k7/8/8/3K4/7b/1P6/B7 b - - 24 +8/8/3KN3/3b4/4k3/2P5/8/8 b - - 97 +8/b7/8/5K2/3n4/8/4k3/7N w - - 20 +1K2k3/3b2b1/8/8/B7/8/8/8 b - - 33 +3r1k2/5b1p/8/8/1K6/8/8/8 b d - 32 +6b1/r7/8/8/3K4/8/7R/3k4 w - - 16 +3n4/8/q7/8/3r4/7K/1k6/8 w - - 86 +8/8/8/8/2B4n/8/5R2/K6k w - - 63 +8/8/K3k3/8/8/b7/B2P4/8 b - - 13 +3n4/8/3k1K2/8/8/7R/1R6/8 b - - 52 +8/2r5/1n4k1/8/2B5/8/8/7K b - - 8 +8/8/1r1k1K2/8/2r5/8/1B6/8 w - - 19 +6b1/8/8/2b5/8/7K/6Q1/6k1 b - - 46 +r7/n7/1k6/8/4K3/8/8/2B5 b - - 98 +7n/5k2/6N1/8/8/1B6/7K/8 b - - 88 +1n6/8/8/8/3n4/k6Q/8/4K3 b - - 13 +b7/6k1/8/8/8/8/7K/3N1R2 w - - 55 +8/1r4r1/4K3/5P2/8/5k2/8/8 w - - 60 +K7/8/1N6/8/1k6/6B1/8/1Q6 b - - 5 +8/2q2K2/1k1B4/8/r3b3/8/8/8 w - - 63 +b7/k7/7K/8/2r5/8/7B/3N4 b - - 14 +7K/8/8/8/6R1/4N3/Np6/6k1 b - - 29 +8/2r5/6K1/8/r1Q5/p7/8/6k1 b - - 64 +7n/2k5/8/8/5K2/8/1BP5/4N3 w - - 79 +7K/8/8/2R5/8/5R2/8/k2NR3 b - - 9 +8/8/2N4k/8/4p3/3Q1B2/7K/8 b - - 64 +k6K/8/R7/2B5/5q2/8/6P1/8 b - - 32 +8/8/k3b3/2n5/2K5/8/2P5/5B2 w - - 69 +8/n7/1K6/8/2q5/5k2/1B3B2/8 b - - 85 +7K/8/7P/3n2k1/8/8/6P1/1B6 b - - 78 +8/3b4/8/7k/3K2B1/np6/8/8 b - - 20 +8/5r2/8/3n4/8/3B4/k2p1K2/8 w - - 87 +8/8/3k4/Q4K2/8/1Q1pb3/8/8 b - - 29 +5r2/3n4/8/8/8/8/Q1p5/5K1k w - - 96 +8/8/1k5q/8/5N2/8/N6K/6N1 w - - 29 +8/4K2r/8/8/k7/8/5P2/5BQ1 w - - 35 +5b2/7k/8/8/5K2/N6P/5N2/8 w - - 54 +2n5/k7/8/8/8/4nb2/6P1/5K2 w - - 3 +6k1/8/6N1/4n2K/6q1/7N/8/8 w - - 46 +k2q1Kr1/4n3/8/3b4/8/8/8/8 w - - 83 +K2r1b2/8/3b4/8/4n3/7k/8/8 w - - 47 +8/3b4/8/8/6n1/8/1P6/k2KR3 b E - 97 +8/3r4/1k6/2R5/8/1r6/7K/2R5 b - - 16 +1k6/8/8/8/8/4P3/5N2/1NRK4 b C - 74 +q2n4/8/6R1/4K3/6b1/8/8/1k6 b - - 20 +8/1n6/8/1r6/8/1k5K/2P4R/8 b - - 46 +6n1/3K4/n7/4N3/1k6/2R5/8/8 w - - 84 +8/7k/8/8/R7/8/2K4Q/1R4Q1 b - - 5 +5q2/1n6/1K5k/4r3/5N2/8/8/8 w - - 99 +8/7K/8/3n3N/8/3k1N2/1P6/8 b - - 43 +8/8/1K6/8/1B6/5n2/2BN4/6k1 w - - 96 +6b1/8/2b5/7k/8/2K5/2N5/6B1 b - - 54 +n2k4/7n/8/K1B5/8/8/2N5/8 b - - 71 +8/q4K2/4R3/8/3B4/3kr3/8/8 w - - 96 +4b1b1/8/8/6k1/3NR3/6K1/8/8 w - - 34 +6K1/6r1/1N6/4k2B/4N3/8/8/8 w - - 96 +8/7b/k7/8/7B/K1p5/8/4R3 b - - 56 +1r4k1/2r5/6K1/8/8/8/2N5/1B6 w - - 40 +K7/8/8/1p1B4/8/1b6/1P6/1k6 w - b6 32 +3K4/8/1pk5/1B6/8/1B2b3/8/8 b - - 28 +8/1K4k1/1n6/8/8/2R2N2/4P3/8 w - - 89 +8/1k6/R7/1q6/8/1r4K1/6N1/8 w - - 86 +6r1/4n1p1/8/8/4K1N1/8/3k4/8 b - - 1 +8/3n4/4kr2/8/8/8/3Kp3/Q7 w - - 88 +5r2/6q1/8/8/8/7R/5k2/2KN4 b - - 23 +7r/1k6/Q7/8/1R4K1/8/8/7N b - - 81 +3q4/3q4/4k3/3n4/1K6/8/3Q4/8 w - - 22 +2k4K/8/8/1q4r1/n7/8/P7/8 b - - 17 +8/3n3k/5r2/8/1K6/N7/8/6B1 w - - 35 +8/5b2/b7/8/2b5/1k1K4/8/3N4 w - - 19 +1r2K3/2p3k1/8/8/b7/8/R7/8 w - - 15 +1n5n/8/3P4/8/8/3N4/K4k2/8 b - - 46 +8/3K4/1N6/3r4/8/1n6/1B6/5k2 w - - 67 +1b6/3p2r1/2q5/4k3/8/8/7K/8 b - - 15 +8/4q3/8/1p4R1/8/6K1/2R5/6k1 b - - 15 +8/1q3k2/1q6/8/8/4n3/6N1/4K3 b - - 51 +3b3K/8/5q2/8/6R1/4k3/6P1/8 w - - 98 +5b2/2q1k3/8/8/8/8/4BP2/7K w - - 29 +7K/4n1b1/8/1k6/5N2/8/8/5N2 w - - 99 +3bK3/4n1b1/5B2/8/8/3k4/8/8 b - - 44 +2b1b3/8/8/1k6/8/7b/6K1/4B3 w - - 30 +5k2/8/3q4/8/4P3/n7/3KP3/8 w - - 8 +5n2/2K5/5bp1/6Q1/8/1k6/8/8 b - - 68 +n2r4/8/8/4k3/8/7K/3pP3/8 b - - 6 +K7/5k2/8/3B4/8/5r2/B7/B7 b - - 57 +8/5q2/8/1k3rp1/8/8/8/2B3K1 w - - 18 +7r/2n5/8/2N5/8/5k2/3p4/7K w - - 29 +8/6p1/1K6/8/5kp1/2p5/8/1B6 w - - 8 +3n2k1/8/8/6q1/R7/5r2/2K5/8 w - - 55 +6k1/p7/8/4r3/1K6/6N1/1Q6/8 b - - 66 +K7/p1n1b1p1/8/8/8/8/8/4k3 w - - 94 +2r5/8/8/8/8/8/2B2P1k/2N2K2 w - - 41 +5k2/7K/8/B7/7p/3R4/8/2Q5 w - - 51 +n3n3/4b3/8/3k4/8/NK6/8/8 b - - 78 +8/7r/6k1/8/2K5/8/3P4/1BN5 b - - 8 +1K1r4/8/8/N7/q1p5/7k/8/8 w - - 94 +8/6b1/8/5N2/1Q6/2k5/8/3K1Q2 b - - 57 +3k4/8/n7/8/B2K4/1p6/8/3N4 b - - 33 +2k5/4b3/5r2/8/8/5r1K/N7/8 w - - 71 +2K5/8/6p1/3q4/k5p1/8/2Q5/8 b - - 33 +8/b2p4/5q2/k5K1/8/1Q6/8/8 w - - 45 +8/6b1/5p2/8/7B/8/k3KB2/8 b - - 34 +8/k7/2b5/8/1b6/1R6/6K1/1N6 w - - 33 +3r1k2/5b1p/4p3/8/1K6/8/8/8 b d - 52 +8/r7/6K1/3P4/1k6/3r4/7R/8 w - - 36 +8/8/4r3/4R3/4n3/8/3K1Q2/1k6 w - - 35 +8/n6k/8/8/1R2p3/8/2KP4/8 b - - 40 +8/8/6P1/8/1k6/r5K1/1N6/2R5 w - - 39 +8/8/2b5/1b3b2/2k5/8/3R2K1/8 w - - 74 +8/2n5/4k2R/8/8/5q2/8/2K1B3 b - - 51 +8/1r1r4/7k/8/5N2/8/1B6/6K1 b - - 18 +2k1K3/1q6/8/8/3P4/8/8/2Q2Q2 b - - 46 +6K1/6r1/7n/8/5b1k/3N4/8/8 w - - 96 +4qkb1/1n6/8/8/8/K4r2/8/8 w - - 68 +K7/b1n2b2/8/8/4k3/R7/8/8 w - - 49 +8/3rr3/8/1P6/7n/6K1/8/3k4 b - - 5 +8/2b5/1bb5/1k6/3b4/8/8/K7 w - - 24 +1K6/5b2/2R5/8/8/k2P4/4P3/8 b - - 75 +K7/6rn/3k4/2b5/3n4/8/8/8 b - - 61 +b7/8/8/6kB/8/2K5/8/4NN2 b - - 54 +1n2K1b1/8/8/3k4/4q3/8/8/2R5 w - - 45 +8/8/7n/7B/r6R/2K5/5k2/8 b - - 70 +8/8/5b2/5b2/N7/3K4/3B1k2/8 w - - 12 +8/2K2b2/8/2k5/q2R3R/8/8/8 w - - 38 +7q/k6r/8/8/8/3R4/1N6/6K1 b - - 89 +3K4/k7/7B/4p3/8/3R4/5P2/8 b - - 74 +2n5/8/3K4/N7/8/8/2N2kP1/8 w - - 83 +4k3/8/K2n4/4n3/8/8/8/4N2N b - - 62 +4r3/7k/8/8/8/4n3/3K4/4NR2 w - - 42 +8/2K5/8/3k3p/8/4R3/2B5/7B b - - 9 +5K2/3b1b2/4B3/3k4/8/8/3p4/8 b - - 72 +8/6k1/8/8/B3K3/2R5/8/N3N3 w - - 90 +8/5q2/7k/1B6/8/5K2/8/5R1N w - - 80 +2k5/r5b1/8/4R3/8/6K1/8/6B1 w - - 43 +8/K1r2n2/6N1/1q3k2/8/8/8/8 w - - 45 +8/8/8/6b1/8/1K2k3/B1p5/5R2 w - - 2 +4K3/8/5k2/8/1b4p1/1r6/Q7/8 b - - 65 +1q6/2K5/8/3k4/3r4/5q2/8/1N6 w - - 95 +8/3K4/k5b1/3B4/8/3b4/8/7N w - - 11 +8/8/8/5b2/k7/2B5/8/R4QK1 b - - 74 +4q3/8/8/8/3R3r/8/3K3R/5k2 b - - 89 +8/4pr2/8/5k2/8/8/6R1/R1K5 w - - 82 +8/5p2/2N5/8/8/8/4K1Rk/2Q5 b - - 74 +3k4/7b/1r6/8/8/6K1/5R2/3B4 w - - 3 +8/8/k7/8/6B1/5b2/2KN4/1R6 b - - 12 +3K4/1b3q2/3b4/8/2k5/2P5/8/8 w - - 43 +3n4/1n6/5k2/5b2/8/2K5/p7/8 b - - 2 +3n4/6k1/8/K7/7R/4R2N/8/8 b - - 87 +8/8/4p2K/3p4/8/7B/2Q3k1/8 b - - 52 +8/2Kq1n2/8/8/8/3k4/8/N6B w - - 92 +7n/8/r7/1KQ2P2/8/8/4k3/8 w - - 53 +8/k5n1/6n1/8/r3K3/8/8/6R1 w - - 51 +k7/8/5R1q/8/8/K3b2N/8/8 w - - 65 +1k6/8/8/8/2B5/8/2P1K3/2N1N3 w - - 25 +8/8/8/2k1B2q/8/6p1/7K/4N3 w - - 52 +8/8/3N2p1/5k2/8/3pK3/4R3/8 b - - 53 +8/k3K3/3n1B2/8/8/2N1b3/8/8 w - - 30 +8/7k/8/4N3/2K5/2R5/2N5/2R5 w - - 70 +3r2n1/8/8/5K2/3N2qk/8/8/8 w - - 53 +8/1b5b/8/k7/6K1/P3N3/8/8 w - - 63 +2r3n1/1k6/8/8/3K4/6P1/8/6N1 w - - 26 +5K2/2r5/5k2/5b2/4n3/4b3/8/8 b - - 58 +1b6/8/2b5/8/5q2/8/4k1P1/2K5 w - - 82 +6K1/7b/6R1/1R6/2r5/7k/8/8 w - - 6 +8/8/8/1P2kq2/8/6B1/5NK1/8 b - - 13 +7n/8/N5P1/8/5P2/2k5/8/7K w - - 31 +7b/8/8/3B1k2/3b4/6r1/8/K7 w - - 1 +6k1/8/1R6/4P1b1/7B/8/2K5/8 b - - 73 +8/6pr/5K2/8/3r1k2/8/8/6B1 w - - 36 +8/1r6/6N1/4r3/2K3B1/8/8/3k4 b - - 45 +7K/8/1N6/5nk1/4P3/8/8/3N4 w - - 40 +8/k7/2b2N2/8/2p5/8/4R2K/8 w - - 72 +8/3k1n2/8/1n1qK3/b7/8/8/8 w - - 35 +8/k2b4/8/6n1/6K1/8/2R5/7R w - - 22 +K1kn4/3rn3/8/8/8/8/5p2/8 w - - 25 +8/3r4/2p5/8/3R4/5k2/8/1R2K3 b - - 68 +2K5/8/1p6/3k4/8/4n3/8/1BR5 w - - 8 +8/r1b5/8/3n4/8/1k6/2B5/5K2 b - - 5 +4r3/4b3/8/1k6/1r6/8/P7/2K5 b - - 10 +8/8/2N2Rk1/8/7N/2N5/8/3K4 b - - 0 +6k1/1r6/2rK4/8/2r5/8/8/2B5 w - - 18 +5k2/2p5/3R3q/1K4p1/8/8/8/8 w - - 69 +8/4k3/K7/1Q2n3/6P1/8/3R4/8 w - - 43 +6nr/8/3K4/5b2/8/3k4/8/7R b - - 17 +8/5K2/8/k4R2/1q4P1/8/7P/8 b - g3 75 +8/2n5/1Q6/8/8/3k4/3B1P2/7K w - - 92 +8/8/4N3/6R1/4B3/2k5/4N3/3K4 b - - 67 +8/1r6/8/5R2/6b1/2k5/4R2K/8 w - - 7 +2k4n/1r6/8/5P2/4K3/8/Q7/8 w - - 95 +k2b4/2K5/7p/8/8/1N6/8/4B3 w - - 4 +8/r3b2k/8/K7/7p/8/8/6R1 w - - 71 +7K/8/8/2k5/1Q6/8/5R1P/5N2 b - - 79 +4K3/b7/k7/2P5/8/8/1P6/3B4 b - - 9 +6K1/8/8/1k6/P7/3n4/3p4/1N6 b - a3 37 +8/8/2q4N/5K1k/8/8/4B3/6N1 b - - 28 +8/8/5k2/4b1r1/8/1K5n/B7/8 b - - 69 +1kq5/q2r4/5K2/8/8/8/8/7Q w - - 96 +8/q7/k7/4q3/pQ6/8/2K5/8 w - - 57 +K7/8/3Q2Q1/1B6/8/8/6pk/8 b - - 53 +7r/4n3/1K6/8/8/8/7p/1Q3k2 b - - 85 +7n/8/8/2b2k2/8/K1r5/Q7/8 w - - 23 +r7/8/5k2/8/5R2/8/3K4/1B3R2 b - - 90 +8/8/8/8/Kp6/8/4P3/1R2kR2 b - - 31 +8/8/1N6/8/1K1kn3/3b4/4R3/8 b - - 49 +3K4/8/8/q2pbk2/6p1/8/8/8 w - - 76 +4n3/8/8/1K6/8/7r/kP6/N7 w - - 39 +8/8/1N6/8/4P3/3K1q2/6k1/4R3 w - - 41 +8/8/2P4B/8/8/1nk3b1/5K2/8 w - - 40 +8/8/8/8/1b3b2/k5r1/7K/6N1 b - - 81 +b5q1/8/8/p7/8/8/3Rk2K/8 b - - 90 +8/8/k3K3/8/r7/2NR4/1P6/8 b - - 10 +7n/8/2K1B3/6Q1/8/2R5/2k5/8 b - - 68 +1b3n1n/8/8/8/8/8/6k1/1K2N3 b - - 95 +k7/6b1/4B2R/6B1/8/4K3/8/8 w - - 83 +8/4b3/7p/1k2R3/8/1N6/3K4/8 b - - 25 +2K5/4b3/r7/QN6/8/8/8/2k5 b - - 89 +4K2r/b6q/k7/2n5/8/8/8/8 w - - 20 +8/6n1/3R4/8/3K4/7P/P7/2k5 b - - 78 +8/7b/R5bK/8/8/2k5/6P1/8 w - - 35 +8/8/2Rn4/8/R5K1/b7/8/6k1 w - - 48 +8/8/8/1r5n/3b4/3K4/1Q6/4k3 b - - 63 +8/1n6/7N/5K2/8/4Q3/p4k2/8 b - - 0 +8/8/7B/4k3/3q4/2N5/3Q4/6K1 w - - 58 +8/8/8/2r5/K1k1p1B1/8/5Q2/8 w - - 58 +8/r1n5/3k4/6K1/5qq1/8/8/8 w - - 93 +4k3/K6r/R6b/8/1N6/8/8/8 w - - 7 +5K2/3b1q2/1N5p/2k5/8/8/8/8 w - - 1 +2n5/1r6/8/7K/2k5/6NR/8/8 b - - 93 +8/8/K3R3/5r2/8/6b1/1k6/3N4 b - - 51 +1K6/7n/6B1/R7/8/R2k4/8/8 b - - 51 +8/4n3/8/8/4K3/4n1n1/5k2/7R w - - 15 +8/p7/7q/B7/2Q5/8/5K1k/8 w - - 91 +K6n/8/2Pb4/5b2/7k/8/8/8 w - - 28 +3b4/8/8/8/7k/8/Q4N2/3B2K1 b - - 38 +K6b/6p1/8/2n5/8/6B1/7k/8 b - - 1 +8/4K3/2q1N1n1/2n4k/8/8/8/8 w - - 23 +8/2r5/5K2/6r1/1P1B4/8/2k5/8 w - - 48 +7k/8/8/4b3/8/5K2/2RB4/6B1 b - - 86 +8/p4p2/3k3n/8/8/1K5r/8/8 w - - 81 +8/8/8/8/P6R/3K1N2/5N2/k7 w - - 33 +7n/8/7k/2K5/5p2/1N6/R7/8 b - - 58 +4b3/6r1/8/6K1/1r4b1/8/5k2/8 w - - 26 +3k4/8/8/3N3K/4N3/6B1/8/2R5 w - - 20 +8/3k4/P7/1N6/7K/8/3R4/4N3 b - - 0 +8/8/6P1/2Q5/k7/8/R3P3/K7 b - - 88 +8/7b/8/b5r1/3k4/8/7N/4K3 w - - 74 +8/K1n5/8/3nb2q/8/8/7k/8 w - - 95 +2n5/5pk1/6b1/8/3b4/8/8/6K1 w - - 95 +2n5/1k6/8/6q1/8/2B3K1/8/2R5 w - - 15 +8/1n4k1/8/R3P3/8/8/3K4/7Q b - - 85 +1n1K4/3q4/8/2q5/6q1/1k6/8/8 w - - 63 +8/8/8/1n6/5K2/k1r5/3B4/1N6 b - - 82 +1k4n1/7K/6n1/8/8/4n3/R7/8 b - - 94 +1r6/1k6/n3n3/8/5K2/8/7N/8 w - - 60 +8/7q/k3K3/8/8/7n/5p2/6Q1 w - - 41 +r7/2K2b2/7k/8/8/3n4/8/7R b - - 22 +4K3/8/5q2/2r5/n4k2/8/6Q1/8 w - - 57 +6b1/n1K1b3/8/5b2/8/6k1/8/8 b - - 71 +8/1n5K/2R5/8/8/3B4/8/1B2k3 w - - 32 +4K3/n7/8/5R2/6b1/8/1k4P1/8 b - - 97 +5n2/4b3/1q5R/2k5/8/5K2/8/8 b - - 45 +k4n2/8/1r6/6R1/7K/8/8/6Q1 b - - 7 +8/8/B1KN1k2/8/3r4/8/3N4/8 w - - 18 +8/8/6K1/5b2/4n2r/5R2/7k/8 w - - 58 +8/8/8/5QB1/4b3/8/1k1N4/3K4 w - - 3 +q7/8/8/1k6/8/2B4b/6K1/R7 w - - 24 +8/8/1k5b/8/8/1r6/pN4K1/8 w - - 69 +8/8/2B5/k7/r5K1/6p1/8/R7 w - - 40 +5r2/8/6b1/8/2R5/K7/3k4/6R1 w - - 39 +8/1k6/4P3/8/7Q/8/1BP1K3/8 b - - 71 +8/p6k/8/4n3/8/8/2K5/3R2N1 w - - 68 +8/1r6/k7/8/rK6/4N3/1Q6/8 w - - 74 +6k1/8/8/R7/8/1r1PK3/1B6/8 w - - 16 +5k2/8/8/5B2/5B1K/8/3N1P2/8 w - - 47 +8/8/8/4Q1b1/8/7n/k5N1/5K2 w - - 78 +8/2q2K2/1k1B4/8/r1r1b3/8/8/7Q w - - 10 +b2K4/8/8/8/6Rn/4N3/N6B/k7 b - - 92 +1K6/2r5/5p2/6R1/r1Q5/p7/k7/8 b - - 43 +b2n4/2n5/7K/2r5/1q6/1N6/3k4/8 b - - 83 +8/8/nB6/5p2/8/6N1/1B5P/K5k1 b - - 56 +1b6/6K1/8/r7/8/3p4/6Nk/4R1Q1 b - - 86 +k7/4b3/K7/5N2/8/1r3nn1/8/2N5 b - - 95 +r6b/6b1/r3k3/8/8/8/K5p1/1N6 w - - 75 +2b4b/8/7p/8/7N/5rk1/R7/3K4 w - - 15 +4K3/6p1/3r4/2r2B2/B7/7B/7k/8 b - - 61 +3b1k2/5r2/8/r7/1n6/3RK2b/8/8 b - - 70 +7K/8/8/2k1qN2/6R1/4b3/3R4/5N2 w - - 47 +7r/1r6/1K1P1r2/8/b3q3/8/2k5/8 w - - 26 +8/3r2k1/4Q3/8/R6r/8/4P3/K1Q5 b - - 53 +8/8/R1n4k/1R6/7n/8/5B2/1K2N3 b - - 35 +1n6/2r2b2/8/8/5Qk1/1Q6/3R2K1/8 b - - 12 +8/8/1N1R2Pk/8/8/8/2R1B1K1/1R6 b - - 18 +1b6/5rK1/4N3/7Q/8/5p2/5P2/6k1 w - - 48 +5K2/8/8/3B3N/2k5/3n4/3B4/2Q1N3 b - - 17 +1b6/8/3k1P2/8/2K1BN2/8/3p4/3N4 w - - 9 +1n3q1K/p7/4N3/k7/4b3/8/1N6/8 w - - 12 +3n4/4n3/5K1k/2P5/8/8/1NQ1R3/8 b - - 97 +6b1/8/5P2/4B3/6N1/2k3K1/1R5B/8 b - - 43 +8/7k/4K3/8/4R2r/7r/5p1B/5R2 b - - 60 +8/8/1k6/1p5r/5b2/1q1q4/1K6/2N5 w - - 23 +6n1/4r3/8/8/6q1/4R3/3N1K1R/2k5 w - - 14 +1k6/1bpbr3/8/3B4/4b3/8/3K4/8 b - - 44 +2qK4/3n4/8/8/k7/1pn5/7N/6N1 w - - 77 +8/8/5B2/6K1/8/4k3/B3RB2/1R1R4 b - - 88 +k6n/8/1B3K2/P7/3q4/6Q1/7N/8 w - - 69 +8/8/k7/3p1K2/7N/R7/P5p1/6B1 b - - 99 +3n4/8/1K6/1p1B4/8/3R3k/BP6/8 b - - 21 +8/K3n3/8/8/1kr5/N7/4P1B1/3N4 b - - 56 +3b1kbb/8/8/5N2/1bK5/6N1/8/8 w - - 38 +b4r2/6q1/6N1/k7/2P5/7R/7K/8 w - - 34 +2r5/8/k2K2N1/1Q6/4p3/p7/8/N7 b - - 92 +2q5/3p4/8/8/n1k5/4r2n/3K3R/8 b - - 37 +8/2Kn4/8/8/7N/Nr6/8/k5BR b - - 38 +2K5/8/2Nk4/6p1/4Bp2/1N6/7B/8 w - g6 12 +1n6/r1k3rp/8/8/3q4/6q1/8/7K b - - 47 +8/7b/8/K5B1/3r2b1/3k3Q/8/4B3 b - - 46 +b6r/2k3K1/3q3b/8/4b3/4n3/8/8 w - - 61 +5r2/2n5/7q/1kn5/8/6NN/8/1K6 b - - 68 +2n2K2/2q5/3k3n/8/6R1/8/5P2/6B1 w - - 96 +2bbK3/4n1b1/5B2/8/8/3k4/6p1/8 b - - 48 +4b3/8/2NR4/2r5/7k/8/1N6/4B2K b - - 65 +1k6/8/2p5/6r1/4R3/1K2R3/R7/4B3 w - - 63 +nb6/8/B2k4/5N2/1n6/4K3/8/1N6 b - - 73 +4k1r1/2q2q2/8/3B1r2/8/8/4N3/K7 w g - 5 +7r/2n5/8/2N4n/K7/1b6/3p4/6k1 w - - 37 +1K1n4/8/1k2B3/Q7/q7/r7/Q7/8 b - - 75 +2r3k1/1p1n4/7K/1B4N1/8/1p6/8/8 b c - 97 +8/p3K1b1/1p6/8/7k/8/2BN4/5B2 w - - 2 +6q1/8/b5k1/2N5/5B1K/8/P5N1/8 w - - 38 +8/5b2/2N5/7N/2K5/N2R4/8/4B2k w - - 17 +8/4K3/8/5N2/3k1R2/8/3P3B/1BN5 b - - 8 +1K1r4/7r/3r4/N7/q1p5/7k/8/8 w - - 39 +8/8/1k6/P1B5/6r1/1rR5/2P5/K7 b - - 92 +8/b5q1/5k1p/6b1/1K6/8/8/1B1R4 w - - 33 +2k5/4b3/5r2/8/8/3q1r1K/NP6/8 w - - 59 +8/b2p4/3K1qp1/8/5k2/8/2Q5/6N1 w - - 47 +1K2k3/b7/2r2r2/8/3n4/1P6/8/7N w - - 25 +3r3n/3p4/3n4/1K6/1b2k3/1N6/8/8 w - - 32 +6b1/r7/8/3PB3/3K4/3r4/7R/3k4 w - - 51 +3b4/n7/4r3/4R3/5K2/2k5/8/3NR3 b - - 6 +8/8/5kP1/2B5/8/rK6/1N4p1/2R5 w - - 6 +8/8/1r3B2/8/2r5/5K2/1B3B2/3kB3 w - - 14 +5b1K/4b3/2r5/3Q4/7n/4b3/8/7k b - - 18 +2k1K3/1q6/7R/8/3P4/8/8/2Q1NQ2 b - - 53 +r7/1r6/5K2/5P2/4B3/8/5k2/3N1R2 b - - 61 +8/4r3/1N4K1/8/3k4/6B1/8/BQ1N4 b - - 97 +2k1K3/8/5b2/4N3/8/1B6/p2R4/6Q1 b - - 75 +K7/6rn/N2k4/2b5/3n4/7n/8/8 w - - 86 +8/5r2/Q6K/2r5/8/2P4k/N7/3R4 b - - 46 +8/8/3K3r/8/3r4/2Q5/1B4Pk/1N6 w - - 55 +1b6/5p2/4q3/3r4/3K4/1k6/1pN5/8 w - - 40 +7r/2k3n1/8/8/3N2N1/K5n1/2B5/8 b - - 54 +8/3n4/1B1Q3P/8/R3K2k/8/5P2/8 b - - 34 +8/8/R2P4/8/k4B1K/8/1N3B2/2N5 b - - 28 +1br3K1/8/8/8/3N4/1Bn5/4p3/4k3 w - - 35 +5K2/8/4k3/b1b4B/7B/8/2N5/B7 w - - 39 +8/8/4b1n1/3n4/5N2/K2p4/3R3k/8 b - - 5 +1b6/3r4/rr6/K7/8/8/3k1N2/4R3 w - - 32 +8/4q3/3B4/4R3/K2k4/8/7R/1B4B1 b - - 42 +6k1/6r1/8/5p1r/5n2/2N4K/8/2R5 w - - 87 +1k2n3/8/2P5/8/2R5/1r6/1P2K3/5R2 w - - 4 +4k3/6K1/8/8/r7/5b2/6B1/3Q1B1N w - - 4 +r5k1/b3r3/KQ6/7B/8/8/8/6B1 w - - 68 +8/q7/2k5/4K1q1/1b5P/8/8/5BR1 w - - 23 +8/1p4k1/5n2/2R2b2/4R3/8/8/2BK4 w - - 31 +5b2/7r/K7/8/5bq1/8/1P2Pk2/8 w - - 29 +6r1/1r6/n6k/8/1b2KR2/8/8/5R2 b - - 21 +3k4/2n5/8/7b/8/4K3/B2PR3/3B4 b - - 85 +2n5/5K2/4Q3/8/8/1B3QP1/P7/7k b - - 15 +8/2pq4/3k4/5P2/4K3/1B6/3P1N2/8 b - - 21 +7K/6n1/r5n1/2Q5/8/8/1k6/4N1R1 w - - 69 +8/3br2k/RnK5/8/8/7P/P7/8 w - - 84 +1q1q4/8/7K/8/6B1/2P5/k1B5/3R4 b - - 58 +8/b7/8/4k3/2R1q3/2P1Q3/8/3KQ3 w - - 81 +r7/8/3K4/2Q5/b7/1k2n3/3R2N1/8 w - - 2 +1K6/8/6B1/5pk1/7B/5r2/2N1N3/8 b - - 50 +5b2/k7/4R3/6N1/3R4/n5r1/8/4K3 w - - 70 +8/5rn1/8/6N1/6bK/8/3kR3/3R4 b - - 31 +8/5b2/2R5/nK6/p7/8/5P2/2N4k b - - 35 +8/8/6B1/1K2P1b1/2r5/7k/7R/6B1 b - - 7 +5k2/8/pR2B2K/6q1/8/2n5/2N5/8 w - - 21 +8/5k2/2R5/2B5/6b1/8/KR5B/2Q5 b - - 0 +2K1k2q/4q3/8/3q4/6R1/8/4P2N/8 b - - 61 +3n4/8/1n2b3/2k5/n4R2/8/1K4B1/8 w - - 21 +8/1r1p1k2/r7/8/6P1/8/5N1K/5R2 w - - 67 +3b3n/3K3n/8/3k4/6R1/8/R1P5/8 w - - 99 +8/8/4bk1Q/K7/3b4/b4r2/6N1/8 b - - 87 +7b/5k2/1K6/8/3RN3/5r2/8/1R4B1 w - - 75 +8/1n3b2/8/n7/k6K/6N1/6QN/8 b - - 53 +8/4k3/2N2R1K/5N2/3r3N/2N5/8/8 b - - 58 +8/8/2n4N/7B/1r3P2/2K5/k5R1/8 b - - 59 +8/6n1/2q1R1k1/K7/5P2/8/7p/1R6 b - - 15 +7n/8/2Rq4/8/6kr/2N1K2r/8/8 w - - 67 +8/3b4/k3N3/6R1/4B3/2K5/4N2B/8 b - - 18 +q7/8/B5k1/8/8/3P4/3Q2RR/3K4 b - - 41 +2b5/r3b2k/8/8/4K2p/p7/8/6R1 b - - 81 +8/3n2K1/8/8/6r1/4p3/k6P/4R1N1 w - - 11 +2qn2n1/8/8/4k3/6K1/p7/7R/1N6 w - - 45 +1b6/6q1/1K6/8/8/8/3R3R/4kB1B b - - 99 +7r/1K3r1n/7B/P1kn4/8/8/8/8 w - - 18 +5n1r/5b2/K7/3p2P1/5k1p/8/8/8 w - - 65 +5r2/3b3b/8/8/7K/2r5/5N2/1k5N b - - 68 +5b2/8/3n4/1k3pp1/6Q1/4K3/1p6/8 w - g6 6 +8/8/P2k2N1/3n4/5N2/N7/1p4K1/8 w - - 31 +3b1b2/8/3k3n/7K/8/5p2/8/5BB1 w - - 2 +1b6/2b5/8/8/6K1/5b1r/P4k2/4N3 w - - 39 +8/5r2/1N5B/8/4P3/3K1q2/6k1/4R3 w - - 48 +q7/5r2/6p1/6KQ/8/8/3k4/B2N4 w - - 32 +1nnr4/k2p4/8/8/8/3K4/3N3P/8 w - - 64 +b6K/4b3/8/Qr6/8/1N6/2N5/4k3 b - - 60 +4nk2/3b4/3P4/1K6/3B4/3R4/1p6/8 w - - 72 +8/6nn/3R2b1/b7/4k3/8/6PK/8 w - - 31 +8/8/B2nK3/6R1/R7/3B3k/7Q/8 b - - 61 +8/b4q2/8/1r3k2/3b4/6b1/1Q5K/8 w - - 28 +r7/8/1B6/k5bK/8/q7/P1B5/8 b - - 58 +8/8/8/2r5/K1k1p1B1/3q4/5QN1/8 b - - 58 +8/b2n4/3K1k2/2B4Q/8/8/3N4/5B2 b - - 21 +3K4/3n1b1q/1N6/3k1b2/b7/8/8/8 b - - 98 +8/3n4/8/r1N4K/6n1/4k3/3QB3/8 b - - 46 +6k1/7b/6B1/4pb1K/8/8/6P1/3Q4 w - e6 63 +8/p7/Q1q4q/5b2/2R5/8/8/K2k4 w - - 94 +8/8/8/1B6/4B3/3k4/1Q5K/B2R3R b - - 4 +5K2/1qkr4/4n2n/8/4p3/7R/8/8 w - - 12 +3n4/5p2/8/2k5/K6R/5N1r/5N2/8 w - - 96 +7n/8/2R5/5kn1/5p2/KN6/R7/8 b - - 15 +8/6r1/8/4R1b1/1r2b3/8/2P5/k3K3 w - - 5 +8/3K4/8/1N6/8/6k1/3RR2P/2N1N3 b - - 88 +8/8/8/K1Q5/3B4/8/P3P3/4Q1Rk b - - 83 +5q2/2K5/1R6/8/7P/3k4/1B3p2/5B2 b - h3 37 +7b/2n2k2/3P3n/6B1/3K4/8/8/5B2 w - - 95 +2n5/1k6/8/4P1q1/3q4/2B3K1/8/2R5 w - - 63 +kn1r3K/1n1q4/8/8/p7/8/8/7R w d - 70 +2b5/5Kr1/2q2qp1/5p2/8/8/5k2/8 w - - 54 +1r5r/1K3k2/8/1n6/8/4n3/R7/2Q5 w - - 97 +4knnn/8/8/5b2/b7/6K1/6B1/8 w - - 60 +r7/7q/k1R1K3/8/8/7n/5p2/6Q1 b - - 79 +8/3k4/6r1/8/5K2/2Bn2R1/8/3B3R w - - 20 +8/7k/6b1/6Kr/4nn2/8/3N2p1/8 w - - 99 +4K3/3p4/8/3q4/8/7q/4kR2/1RN5 b - - 98 +8/3p4/5B2/2b2Kpq/8/8/1pk5/8 w - g6 64 +6k1/6q1/4R3/6K1/2Q1n3/3Q4/7R/8 w - - 33 +8/8/8/5bB1/7r/4KQ2/3N4/3N2k1 w - - 62 +6rn/4r3/8/N2k4/6q1/3n4/8/6K1 w - - 69 +4b3/8/7k/8/4Q2K/8/P2N4/6RR w - - 35 +8/5k2/8/1Q4R1/8/4Q3/5PP1/2K4Q w - - 77 +5r2/1b4K1/6b1/8/2R5/8/5N2/k1Q5 b - - 99 +3r4/1k5n/p7/1r6/8/3B2Kp/8/8 b - - 45 +2b2b2/6b1/8/2P5/7K/8/N1k5/R7 b - - 76 +2K5/8/6n1/4kB2/5B1P/8/3N1P2/8 b - - 98 +5b2/b7/n7/6b1/4n2K/5b2/5k2/8 w - - 57 +8/4q3/8/4Q3/3k2K1/3N3n/6R1/N7 b - - 0 +7K/8/B5q1/6B1/5r2/6R1/6p1/3k4 b - - 83 +8/2p5/7k/K1R5/Q5R1/6r1/4Q3/8 b - - 28 +1K6/8/8/Q4k1r/b7/5B2/P1B5/8 b - - 74 +4r3/8/r7/4P2K/B1R5/8/P7/3k4 b - - 94 +n7/6k1/2KB1B1r/8/Q4R2/8/8/8 b - - 68 +8/8/7b/5N2/6k1/5N2/1P3K2/B5B1 b - - 17 +5b2/4nq2/1q3b2/4K3/8/8/8/2Bk4 w - - 13 +1k6/3br3/3K4/8/6rr/8/1B4N1/8 b - - 7 +1n6/8/2R2R2/Q7/6k1/b7/8/K1R5 w C - 14 +2b5/n7/8/8/8/7n/2R2N2/K3kB2 w - - 1 +5r2/8/4q3/2KN3q/4k3/8/2Q5/3N4 b - - 3 +8/2r5/2K5/6B1/4R3/3Q4/1kB5/6R1 w - - 94 +n3k3/n3n3/3r4/4K3/8/8/3B4/1B6 w - - 62 +2b5/r2q4/8/4k3/4R3/7n/1B5K/8 b - - 28 +8/7k/1b3B2/8/8/7b/1NPp4/1K6 w - - 91 +8/8/5Nr1/2p5/8/5NK1/8/1kN2R2 w - c6 63 +3K4/1r6/b7/8/8/5Nq1/2kP3R/8 w - - 41 +8/2n3b1/rK6/8/6p1/2n1N3/8/1k6 w - - 76 +8/1k6/6K1/8/3r2b1/3P4/3N4/R5N1 b - - 19 +8/6Kb/4b3/2B5/b1k5/8/5P2/7N w - - 90 +8/4r3/1k6/3N4/4N3/3N2Q1/7R/7K b - - 83 +5b2/6b1/8/2n5/6Kb/8/2P5/2R1k3 b - - 41 +2K5/5n2/8/2n5/2bk4/7n/3N4/3Q4 b - - 64 +1n3b2/2b5/k5K1/1R6/8/b4n2/8/8 b - - 88 +2r5/2q5/8/3R4/q5P1/k7/6B1/1K6 b - - 59 +1k6/3n4/8/3r4/b4r2/8/3P3K/6B1 b - - 78 +8/r4qn1/8/8/k3b3/8/2PK2R1/8 b - - 20 +7r/1n6/8/5kP1/8/8/NP6/4K1R1 w G - 84 +8/1k4p1/8/1B2b3/5bR1/7K/1N6/8 w - - 54 +k7/3b4/b4r2/8/p5K1/3q4/8/5Q2 w - - 56 +8/8/4N3/5b2/8/8/N4kNK/2R1N3 b - - 61 +6n1/7n/Q2R2N1/7k/8/3K4/7R/8 b - - 75 +2b5/1r6/8/8/3K4/3N4/5Q2/4kNN1 b - - 99 +8/2b5/1N6/2R1P3/1k1B2R1/5K2/8/8 b - - 94 +2rq4/3q4/R7/8/4K3/1N6/8/k4B2 b - - 93 +6k1/2n5/8/6K1/5B2/2B2n2/5P2/7N w - - 58 +7b/3b2b1/8/5r2/8/2K5/1R4Nk/8 w - - 23 +1b6/8/3k4/7b/8/5n1N/7N/2K1Q3 w - - 4 +8/2n5/8/q4R2/3Kn3/8/6p1/Rk6 b - - 42 +8/2p1n3/8/6K1/r3k3/6R1/8/N6N b - - 22 +3b1K2/2p5/k7/8/8/p5n1/8/N1Q5 w - - 14 +6n1/8/8/8/1k6/1n1p1K1N/8/3B3Q w - - 47 +8/3q1kn1/K1r5/8/2R5/2rP4/8/8 w - - 68 +8/1b6/8/1b6/4K2R/8/3PBk1P/8 w - - 69 +5rk1/2n5/8/4r3/4B1r1/8/1P6/6K1 w f - 53 +8/7b/5b2/3q2b1/6n1/8/1k6/2R2K2 b - - 40 +3K4/b2bn3/q7/b7/8/8/3k3N/8 w - - 78 +n4q2/7q/2b4Q/4n3/8/7K/8/2k5 b - - 87 +2n2k1r/2p5/8/3P4/8/3K1Q2/8/R7 b h - 5 +8/3b4/7Q/4B3/1R4b1/8/K5k1/7R b - - 90 +7r/8/8/2n1n3/7n/6r1/2k5/3N2K1 w - - 46 +8/8/p6b/8/6K1/8/2k1B1RB/1B6 b - - 9 +k7/8/Q1N3NK/8/8/8/1PR5/4R3 b - - 55 +1b6/7r/4k1n1/1n6/8/7N/5K2/1B6 b - - 35 +8/2r5/nk6/7P/4N3/7N/7p/5K2 w - - 21 +8/4K3/6B1/3R1b2/8/1R6/1P2k3/5N2 b - - 83 +8/n1p5/3n4/4k3/8/Qn3K2/1B6/8 b - - 61 +5k2/8/5N2/8/4N3/8/RQ2PBK1/8 w - - 15 +1b6/3r4/4p3/K7/7r/2N2k2/1P6/8 b - - 50 +2n5/4n3/k3r3/2R5/8/8/8/1Q4KB w - - 99 +2b4n/5q2/8/7n/k1K5/1R6/4B3/8 w - - 41 +3b4/2nq4/n7/8/p7/8/5K1k/N7 b - - 17 +3b1k2/3b4/K7/8/8/bN6/5N1P/8 w - - 25 +8/8/4k1B1/8/8/4N2N/P1P5/1K1R4 w D - 47 +3r4/6Kp/4k3/5r2/N7/8/P7/7B w - - 94 +k1q5/6rn/8/5R2/8/1N5N/7K/8 b - - 47 +8/1q1K4/n7/1q6/n7/8/kP6/5N2 w - - 29 +1n6/5K2/1p3r2/1q6/8/q7/1N6/1k6 w - - 40 +8/2r5/8/8/3k3B/2R3PK/2p4P/8 w - - 14 +8/4bb2/8/1n6/8/3R3K/kQ6/3N4 b - - 1 +3n4/r7/2q5/8/2k5/3p4/4N3/4K1Q1 w - - 64 +8/1K6/R1B1R3/8/8/8/N1B1p3/k7 b - - 30 +5b2/2nK4/6k1/8/r7/8/1R1B1N2/8 w - - 59 +1Kb5/8/5bRn/5k2/1B6/8/6P1/8 b - - 15 +2qr2K1/1q6/rk6/8/3b4/8/8/6Q1 w - - 28 +4b3/n5b1/8/8/2P5/p6n/1K2k3/8 w - - 59 +1r6/7p/8/3Q1bK1/1b6/1k6/8/6N1 b - - 71 +6K1/5b2/5k2/7B/8/5b2/1N3P1P/8 w - - 54 +8/6r1/5K2/2N4k/Q4B2/8/8/5NB1 b - - 32 +4k2r/8/1Q6/8/8/5KRr/3P4/7N w - - 44 +2b1K3/8/6r1/8/3B4/2R5/4P3/1k2N3 w - - 27 +5K2/8/1b6/5Q2/4k3/8/N2P4/1Q4R1 b - - 39 +5b2/8/B7/8/3K4/8/2B5/N1B2R1k b - - 16 +4k3/5p1p/K4q2/r7/8/8/2BP4/8 w - - 82 +3b4/7b/rbb5/8/K5kN/8/8/8 w - - 5 +7b/3k2n1/1Kb5/8/8/8/7B/2R4R b - - 72 +1r6/1k5n/8/3q1B2/8/8/2B5/K1R5 b - - 77 +n7/7n/8/6p1/8/6p1/4k1KB/4R3 b - - 4 +1k5b/3bp3/8/8/7K/1P6/BR6/8 w - - 67 +8/8/8/8/8/2Bk2qN/K1RN4/3R4 w - - 23 +1b6/8/2B3p1/8/1K2n3/n7/6N1/3k4 b - - 63 +6b1/8/4N3/3k4/6q1/3N1K2/8/B5Q1 w - - 13 +8/5k2/4p3/8/8/3BBKq1/2R5/2Q5 w - - 35 +4r3/1rb1K3/6N1/1R6/8/8/8/kB6 w - - 40 +4K3/8/7N/2rr4/3k2b1/1P6/8/4N3 b - - 58 +6K1/8/8/1P6/6nP/6nk/P3N3/8 b - - 5 +4k3/1p6/8/4K3/6n1/1QN5/R6N/8 w - - 12 +1K2q3/1r6/8/6n1/3N3b/k1p5/8/8 w - - 49 +4K2k/1n6/8/3n4/8/B5B1/2R3N1/8 w - - 80 +3K4/5q2/1P6/8/3k4/3r4/4B3/Q3N3 b - - 25 +8/1p3K2/5N2/3kq3/8/8/5P2/3N3Q b - - 34 +2q3r1/7K/8/4n3/8/1P2n3/4N3/2k5 b - - 50 +7k/5r2/4b3/8/3K4/6b1/2P5/2NQ4 b - - 95 +1r6/8/5r2/7N/b5k1/4bN2/8/K7 w - - 87 +3r4/7r/8/8/8/7k/1Bp2R2/1KR5 w C - 23 +8/b7/2b3n1/k5K1/8/7Q/4B3/7Q w - - 11 +6k1/6r1/K4n2/N4R2/8/8/8/3B2N1 w - - 11 +2k1K2n/1r6/8/Q6B/R7/8/P7/8 w - - 81 +8/r7/8/8/5N2/4qKN1/k1p5/1N6 w - - 93 +k7/8/n7/4K3/4n3/4p3/7R/6RN w - - 90 +6n1/7k/8/8/2r3R1/3K4/5R2/2B3N1 w - - 49 +5bk1/8/1B6/5K2/4b2n/8/N2R4/8 w - - 30 +1n6/3r4/4b3/7k/2K2r2/8/1P6/R7 w - - 37 +n4b2/8/8/8/N1Q3r1/1K1R4/8/1k6 b - - 85 +b7/8/6K1/2k5/1R6/1B6/3R1P2/1R6 w - - 84 +1r6/4n1q1/5k2/4R3/3P4/8/B7/K7 w - - 83 +4k3/8/4R3/1K6/5q2/8/B1P2R1N/8 b - - 60 +8/1r6/4k3/4n3/nn1K1n2/6p1/8/8 w - - 85 +5b2/k1n5/7n/8/8/8/3R2P1/6KN w - - 93 +3q4/1b6/1nk5/7N/8/8/6p1/3K3Q w - - 22 +4b3/3r1p1K/5n2/2b3k1/4B3/8/8/8 w - - 49 +8/7K/6n1/n6N/1P6/3R4/8/4N1k1 b - b3 58 +k7/3n4/8/2r3n1/2P3K1/8/N7/7R w - - 25 +5r2/pK6/8/kr3Q2/3B4/8/4R3/8 w - - 51 +r7/8/7k/7q/4B1K1/3N4/5PP1/8 w - - 23 +nrk5/n7/4q3/8/8/3b4/8/4K1N1 w - - 0 +3n4/2k5/1n6/5b2/q7/8/B2Q4/K7 b - - 63 +b7/1r6/3B3n/8/8/1k6/P7/4RK2 b E - 56 +3K4/p7/3n4/7R/8/8/4N3/2k1RN2 b - - 19 +1b6/1n3n2/4q1K1/3b4/2k1b3/8/8/8 w - - 89 +2kb4/6q1/8/8/2r5/3q4/4B2N/1K6 w - - 85 +8/1b6/5K2/8/1N6/7B/6R1/2B2Bk1 b - - 13 +r7/8/8/K5r1/7k/8/4B2N/2B4R w - - 38 +4K3/2r4k/3N1b2/8/8/N7/1PN5/8 b - - 75 +8/4n3/5P2/8/1Nn5/3k4/3N4/2QK4 b - - 53 +1r6/8/5B2/8/2K2Pk1/N7/8/1N5Q b - - 60 +1b6/8/2k3K1/1n6/5p2/8/3P4/Q1Q5 b - - 5 +4K3/8/8/8/2R5/1PN5/5kP1/2Q2R2 b - - 65 +4q3/3r4/8/n7/8/1k3K2/7B/2R2N2 b - - 16 +5K2/8/8/k3rn2/8/2b5/7B/5R1R w - - 45 +8/k3n3/8/8/K7/8/1B1B2RB/2R5 w - - 79 +1K6/r7/8/8/2B5/8/1R2k3/R1B2R2 b - - 94 +1b6/8/3K4/8/1Q4n1/8/2R5/kB3B2 w - - 68 +2r3r1/2r5/8/r4K2/2n5/7k/B7/8 w - - 84 +8/3r4/2K3k1/1B6/1B2P3/8/5N2/R7 w - - 68 +2b5/2r5/5K2/R7/1N6/7n/4k2N/8 w - - 76 +q1n5/7b/8/6B1/K4n2/8/5P2/4k3 w - - 74 +8/1b6/8/4k3/6N1/6B1/1RN5/RK6 b A - 81 +K7/8/5q1p/6k1/r7/8/6P1/1N1N4 w - - 45 +4n3/3q1n2/8/8/5kpQ/7K/1N6/8 w - - 9 +3b4/3b4/1bQ5/8/4k3/8/1B3NK1/8 b - - 32 +8/n3n3/N7/1p6/8/3k4/4P3/4NK2 b - - 79 +3K4/8/8/4Bn2/3n4/2k2N2/1Q2P3/8 b - - 80 +2r5/1n5K/8/3k4/5b2/4N2n/6R1/8 b - - 14 +3b2n1/8/1r6/5k2/2K5/6R1/3P1B2/8 b - - 78 +4r3/4p3/8/3K4/3r2nB/R7/8/6k1 w - - 38 +8/4p2p/8/r5k1/7N/6K1/1P6/1B6 w - - 23 +b7/8/4q3/3K4/4pk2/5B2/3N4/1B6 w - - 33 +7b/8/8/5bp1/8/5n2/K6B/1Nk5 b - - 80 +6b1/3K2b1/5n1k/8/1N6/5B2/6p1/8 w - - 82 +8/6Kn/q1n5/5Q1k/8/8/2P2B2/8 b - - 23 +5k2/q7/8/2K3b1/2R5/6r1/6Q1/1Q6 w - - 10 +4n3/7K/1B6/2b5/8/8/3BN1k1/3N4 b - - 66 +7b/6K1/3N4/2n5/8/2b1N3/3R4/1k6 w - - 22 +7K/q4b2/8/8/2Q3Q1/8/5B2/B3k3 b - - 6 +2k5/3rb3/3B4/8/2K5/3N4/3P2B1/8 w - - 20 +1q1k3r/5r2/1P6/8/8/8/5N1K/3N4 w - - 38 +8/Kn6/4B3/8/4k3/1b6/1R1Q4/3Q4 w - - 95 +n7/2b4b/8/8/B7/8/2k3N1/4K2N b - - 52 +8/1b6/8/1K2B3/8/7q/2R3R1/1k1N4 w - - 77 +n4r2/1r6/8/8/5b2/5k2/2K2p2/6R1 w - - 15 +3q3r/4n3/3R4/k4K2/5B2/1r6/8/8 w - - 72 +1b5K/8/1P2p3/8/p7/1r6/8/1N1k4 b - - 79 +5k2/5b2/5K2/5RP1/8/7b/4B3/4N3 w - - 49 +8/1n6/1nk5/N7/8/8/P7/1R3B1K b B - 5 +3bnkn1/4b3/8/5n1K/8/3N4/8/8 w - - 29 +r2q4/2n5/4KN2/8/4bR2/8/8/k7 w - - 95 +8/8/5R2/8/1P4bp/1r6/3N4/3K2k1 w - - 38 +k2n3K/8/2r5/6rb/8/4n3/8/6N1 w - - 61 +8/3b4/4K3/8/P7/6R1/Q1N4k/7N w - - 63 +nn5k/3K4/8/2Q5/8/5b2/2P5/4B3 w - - 31 +8/8/2R5/7K/3q4/6k1/1P2P3/1N3R2 w - - 54 +b7/4b3/8/nK6/8/B2k4/3p2B1/8 b - - 92 +1r6/2bb4/rN6/7K/1R6/7k/8/8 w - - 36 +8/p7/4n1r1/3b4/8/K2n1k2/8/1B6 b - - 31 +8/6r1/8/8/B4K2/1RB3Q1/2B2k2/8 b - - 96 +8/6k1/8/1b5K/3P4/4n3/7p/N4B2 w - - 58 +1K6/3q4/k6Q/2N5/2b5/8/8/3B2B1 b - - 78 +4b1r1/5bb1/7k/1R6/8/2q5/8/2K5 w - - 39 +3q4/7n/3bP3/2k5/N5K1/8/1Q6/8 b - - 9 +8/1k6/6Nn/8/8/1b2K2b/3P4/1B6 w - - 59 +8/1q1b4/N7/2n5/4k3/8/3K4/4R1B1 b - - 71 +8/5p2/8/6K1/5p2/4b3/5Pk1/3B3Q b - - 62 +n2r4/7b/8/3R4/8/4K3/6R1/5Rk1 b - - 92 +1k5r/5bb1/1b6/1q5N/8/8/8/6K1 w - - 69 +8/r7/3K4/B2B4/5p2/8/2Q5/1R1k4 b - - 41 +8/1p6/8/2K5/5R2/3Qk2b/2B3N1/8 b - - 4 +2n2rq1/8/4r1r1/4K3/6k1/8/1R6/8 w - - 90 +8/2K5/4k1R1/8/3p4/1N2R1BR/8/8 b - - 94 +5q2/8/1b6/8/1r5k/8/2N5/2BK1B2 b - - 7 +1K2n3/5bq1/8/4B1b1/2k5/8/p7/8 w - - 25 +8/5q2/4R3/2R1Q1n1/7k/8/2K2N2/8 w - - 87 +8/3q4/6P1/8/3k3P/8/1B4KP/6N1 b - - 14 +8/2p2p2/8/8/2Kpn3/6r1/2Q5/2k5 b - - 51 +7q/8/8/3P4/5N1K/4B3/8/2Bk1B2 w - - 78 +8/p7/4K3/n7/1R4k1/4b3/8/R1R5 b - - 30 +8/1b4n1/6n1/8/K1qpk3/8/8/6R1 w - - 21 +5r2/q7/7K/8/6kB/2q5/6N1/4B3 b - - 78 +1q5n/1r6/8/1P1b4/3B4/6K1/2k5/8 w - - 59 +6r1/p7/5Q1R/8/1b6/1K6/8/2k4B b - - 44 +8/8/1B3K1N/8/2N5/3pn1k1/8/6Q1 b - - 63 +4k1b1/8/8/P7/1K3NQ1/8/6P1/N7 w - - 75 +8/1b1r4/8/n7/3p4/1b3B2/4K1k1/8 b - - 23 +1n6/8/8/1K3kB1/4N3/8/N1BR4/8 b - - 40 +1k4K1/3p4/5B2/q2p4/8/8/R7/3N4 b - - 63 +6k1/8/8/8/6rN/7b/4K1Q1/1N1N4 b - - 85 +8/1k6/6Q1/8/4K3/1bn5/4PRp1/8 w - - 48 +2k5/7q/6r1/8/1KpR4/2bb4/8/8 w - - 18 +8/4q2r/8/1B1r4/8/k7/1R4K1/6R1 b - - 51 +8/8/3pp1N1/4r3/3K4/q2B4/8/4k3 b - - 38 +8/5r2/2rP2k1/7Q/8/8/R3P3/3K4 b - - 9 +6b1/1n1p4/8/2k2K2/4R3/3P4/8/4B3 b - - 54 +5q2/1kp5/5B2/BK2N3/8/8/3N4/8 b - - 77 +3b4/8/8/p5r1/8/1N4rK/4k1N1/8 w - - 15 +8/5b2/Q7/4N3/3P4/3q3N/8/4k2K w - - 9 +8/n6n/6Q1/k2r3Q/8/8/3Q4/7K b - - 77 +4K3/b7/3P3k/6Nn/3r4/7N/8/8 w - - 13 +7n/2r5/2K2b2/8/qk4r1/8/4P3/8 w - - 83 +8/1r5r/8/R4k1b/6p1/6N1/3K4/8 b - - 74 +6r1/r4rn1/1K5r/8/k7/8/3N4/8 w - - 1 +4K3/5bbb/7B/q7/8/8/p7/k7 w - - 61 +8/q7/8/4R3/1k6/4R3/1N1Q2Q1/5K2 b - - 69 +5r2/r3bk2/1K2B3/8/8/6r1/8/N7 b - - 72 +2r5/7q/1r1b4/2b2q2/8/6K1/1k6/8 w - - 71 +8/3b3p/8/8/2p1N3/3RP2K/2k5/8 w - - 84 +2b5/8/6bn/8/6k1/1q3n2/1B6/K7 w - - 92 +6b1/b7/2n5/8/1N2k3/3R1RK1/8/8 w - - 99 +2K5/7n/5B2/6q1/8/q7/2k4N/2R5 b - - 62 +3n4/4b3/5r2/k2K4/8/1B6/B7/3N4 b - - 64 +8/4n3/k1NBK3/6R1/7Q/8/2P5/8 w - - 10 +1b6/3r4/8/8/2b2BN1/1k4K1/2Q5/8 b - - 41 +4b3/8/1R1N1K2/5N2/8/2kN4/8/7N w - - 54 +5qb1/4n1r1/r6N/K1k5/8/8/8/8 w - - 64 +2b1k3/8/4R3/8/8/3B4/4R2N/4N1K1 b - - 31 +7q/1b2q3/8/8/8/5N2/6p1/k1K3R1 b G - 56 +8/k2qb3/8/K1P5/7p/B7/8/7R w - - 26 +8/k1r5/8/8/8/3B4/Q4B1R/3NK3 b - - 31 +8/8/8/k6R/4r3/3K4/N1R3Q1/7B b - - 97 +3nK3/6k1/r7/8/N7/3b2B1/8/3N4 b - - 31 +4K3/8/6Bn/2k5/8/7b/R3Q3/3B4 w - - 43 +8/3b4/3KB3/1b1b4/7r/k7/4B3/8 b - - 6 +8/1n5K/6R1/2r5/k1r5/4r3/3N4/8 w - - 13 +8/5b2/1rp3K1/8/P6n/3kp3/8/8 w - - 93 +7q/5nk1/8/1n6/8/5Q2/2PK4/3R4 b - - 78 +2r4k/3rp3/8/8/1rr2K2/8/1p6/8 w c - 43 +8/8/2K5/r3r3/1k1B4/R7/3p4/4B3 b - - 68 +7k/8/4r3/3b3B/7b/5K2/2N4R/8 w - - 28 +8/pp6/k7/6K1/1n6/5N2/2R1B3/8 b - - 22 +4qb2/3b3K/b2p4/8/6n1/8/8/1k6 w - - 88 +b3k3/8/8/5r1P/5B2/6R1/7Q/7K w - - 90 +k1b1r3/8/1K3bP1/8/8/8/7Q/4N3 b - - 41 +b7/8/5R2/4n3/2k3K1/6p1/3P3N/8 w - - 89 +1k6/8/8/5qB1/3K4/n4RB1/P7/8 b - - 48 +8/8/8/8/1n6/5k2/R4R1B/1K2BN2 b - - 44 +8/7r/2N3Q1/5b1R/7K/8/4R3/1k6 w - - 63 +1r6/8/2Nk4/8/K1r5/1rqn4/8/8 w - - 87 +5q2/8/7r/5Q2/8/qQ1K4/7P/4k3 w - - 35 +8/6K1/8/b7/1b1R1B2/8/3k3R/5B2 b - - 7 +6k1/8/8/8/2RB3R/KQ6/4R3/6B1 b - - 12 +8/8/6N1/8/1N2k1r1/2K5/5P2/3B1R2 b - - 18 +8/8/8/3K2b1/2n5/4nr2/2N2R2/6k1 w - - 32 +8/k6r/4Q3/4K3/2P4b/2r5/3P4/8 b - - 81 +4b3/4r3/8/n7/6K1/4k3/7B/B4Q2 b - - 4 +8/4bb2/8/6Q1/6N1/1kb5/8/3K1N2 w - - 58 +8/4k2n/qq6/8/4K2R/8/2pB4/8 w - - 54 +1r6/8/N7/8/6r1/1B2K3/R3p3/7k b - - 81 +b7/r7/4r3/6n1/7K/1P6/3P4/1k6 b - - 43 +3Kr3/1n6/8/2N2k2/2q5/4n3/6N1/8 w - - 34 +4nr2/k7/4B3/7R/7B/6K1/8/1B6 w - - 52 +K7/2n1r1k1/b7/5p2/3q4/N7/8/8 w - f6 71 +1k6/3b4/4b2N/3R4/8/B4N2/4K3/8 b - - 30 +7r/8/2B2k2/5N2/8/K3N3/7N/2R5 b - - 91 +4K3/2b5/8/8/br6/6r1/4k3/1N5N w - - 19 +8/8/8/8/1b1N1R1p/3k4/3P3K/2R5 w - - 33 +b4n2/4b3/8/7k/3B1N2/8/B3K3/8 b - - 27 +8/8/1p6/1K6/4Q3/3b3k/B2N4/1N6 w - - 34 +4n1K1/8/8/8/8/2RN1k1n/3N1R2/8 b - - 2 +1n6/8/8/3r4/2bK2b1/3r2k1/8/4N3 w - - 5 +8/8/2n2K2/1B5q/7p/2N5/8/1B1k4 b - - 24 +3b4/6k1/8/3B4/2Kp4/4r1r1/4R3/8 b - - 20 +b2K3n/8/8/8/4b3/2R5/1kP5/R7 w - - 19 +3r4/3r4/1R6/4k3/8/8/2N2NR1/1K6 w - - 89 +k7/6q1/8/r6n/8/3N2K1/6N1/B7 w - - 61 +8/1b6/7R/8/6r1/5k2/2P5/1QK3R1 w G - 39 +3n4/rr6/8/1k1N4/b7/4b3/6K1/8 b - - 27 +8/1n6/8/7r/1K2N3/4k3/7N/B5N1 w - - 46 +5k2/8/2R5/3P2p1/8/6q1/2P2K2/3B4 w - - 69 +n5k1/1p6/8/R7/8/3bKp2/8/2B5 w - - 62 +8/1p1q4/7R/K2k4/4b3/3p3R/8/8 b - - 32 +8/n7/1b3K2/q7/k7/2NQ4/5Q2/8 b - - 11 +8/K7/2Q5/8/8/2Rk2n1/1B6/3N3N b - - 85 +8/7r/5b2/n7/3b3p/6k1/8/2R1K3 w - - 59 +r2kr3/6q1/8/8/4KB2/3p4/6N1/8 w e - 50 +8/2p1q3/Q7/8/8/n3Rn2/7k/3K4 w - - 97 +6K1/8/2k5/1B6/3B4/Q7/2R3BR/8 b - - 80 +7q/5p2/4n3/K7/5k2/1B6/2Q5/5R2 b - - 54 +2K5/1r6/3B4/4k3/8/5R1r/2Q4p/8 b - - 78 +7r/8/8/7B/1N3bK1/8/2Nk1R2/8 b - - 39 +4q3/7p/5N2/r7/8/7k/8/Q1K3Q1 b - - 34 +8/8/1Q6/2N5/Bk6/8/3p2PR/K7 b - - 35 +r7/4bp2/6Q1/8/5p2/K7/7B/2k5 w - - 53 +2q3K1/6n1/8/8/2P3q1/1Rb5/8/6k1 w - - 16 +2b4k/1b6/3r3p/8/2b2K2/8/N7/8 w - - 68 +7n/3p4/3p4/3k4/5n2/3B4/3Q4/7K w - - 81 +3k4/7n/8/8/1B6/8/PQ5B/2K4R w - - 92 +3b1r2/3n4/8/1n1K3n/8/2n5/8/k7 w - - 68 +4K1n1/1n6/8/8/2B1rb2/8/7k/7N w - - 92 +6K1/5p1p/4R1N1/4k3/8/8/6NN/8 b - - 11 +2q1r3/8/2n5/1N6/1rK5/8/6pk/8 w - - 34 +8/8/5k2/1b5K/8/4bB1b/4B1p1/8 b - - 64 +8/1r6/3k2B1/4N3/8/2K5/N5N1/B7 w - - 93 +8/b5b1/6K1/8/1R3b2/p7/3N4/1k6 b - - 80 +3K4/8/3Rq1B1/2B4B/k7/8/2P5/8 w - - 99 +4b1nK/3q4/8/1b6/8/4n3/R7/1k6 w - - 82 +8/8/8/2R1K3/5Q2/8/5B1Q/kBQ5 b - - 46 +7r/n7/B5q1/7K/1n6/2k5/5N2/8 w - - 79 +6r1/1r6/8/2b5/2NBK3/8/8/2Q1k3 b - - 4 +2b5/8/6K1/8/2Q5/3N1p2/3R3P/4k3 b - - 97 +8/1k6/3B1K2/8/4N2Q/R5N1/p7/8 b - - 21 +8/4b2b/4B1k1/8/8/3p4/2N5/1R1K4 w B - 88 +8/3r3n/8/5k2/8/K7/1N1R3P/4B3 b - - 6 +rK4r1/2r5/8/5B2/8/4b3/3k3P/8 w - - 7 +5k2/2r5/8/6n1/2b3N1/3r3K/4P3/8 w - - 68 +3rK1q1/4n2q/8/5k2/7n/8/P7/8 w - - 12 +7n/8/2Q5/8/1BQ1k3/4q3/5p2/3K4 b - - 3 +8/6r1/8/1pQ5/K5nb/8/8/5k1N w - - 76 +8/2q2K2/1k1B4/8/r1r1b3/8/7B/3N3Q w - - 31 +8/1k6/8/K5R1/r1Q3Rn/4N3/Np6/8 w - - 64 +8/2r2b2/R4p1k/2n3r1/K2b4/8/3R4/8 w - - 71 +5nnK/8/8/4R3/6p1/b2n4/N7/3Qk3 b - - 96 +1k1b4/8/2N5/n7/4qq2/3Q1B2/7p/K7 b - - 10 +K5k1/3r3n/8/8/2B5/B6r/PN6/6R1 b - - 5 +7r/3k4/7P/3n4/7n/8/KB3BP1/1B6 b - - 71 +5b2/3q2n1/3k4/Q4Kn1/8/1Q1pb3/8/8 w - - 87 +6kn/8/4b3/8/2PqB3/8/QKQP4/8 w - - 28 +7r/6r1/7q/2p2k2/2K5/3Q3N/N7/6N1 b - - 29 +6q1/2b2K2/8/5k2/Q4p2/n7/6P1/4NB2 w - - 72 +8/8/R1n4k/1R1R4/7n/1b6/5B2/1K2N3 w - - 7 +2n5/3b4/8/b4n2/6n1/1r6/1P6/k2KR3 w E - 46 +1K6/7p/1n6/r7/8/1b6/1QBNB3/4k3 b - - 10 +q2nn2b/1k6/6R1/1Kr5/6b1/4P3/8/8 w - - 76 +8/nk5n/8/1r2n3/2K5/2B2R2/B1P5/8 w - - 45 +8/5r2/2K3r1/2Q5/P3n3/2bBN3/k7/8 w - - 99 +n6r/8/7n/1n4K1/R7/5q2/7Q/1k2R3 b - - 69 +8/8/1N4kr/3B3B/4B3/3RK3/N1P5/8 b - - 96 +1r6/7b/k7/8/6pB/K1p5/2N5/1B2R3 b - - 33 +3r2q1/r3p2b/8/3k4/2B5/2K5/1N6/6N1 b - - 49 +4n3/4n3/8/2b2k2/2r5/NN4N1/4N1K1/8 b - - 84 +3n3K/2r5/3k1b2/1r3r2/8/3B4/2R5/2B5 w - - 23 +3b4/4q2r/p3K3/8/r1B5/Q7/5N1k/8 w - - 34 +1n1K4/8/8/8/6kr/1p4n1/B1B4P/6B1 b - - 4 +n2b4/8/Q2k4/6p1/2Q5/1n3r2/7K/5N2 b - - 61 +2n5/4b2n/8/8/1N4b1/6kr/B7/2B2K2 b - - 8 +2q5/2qr4/n1N5/4q3/1b3KQ1/8/8/1k6 w - - 82 +5r2/8/1R1n4/K1k1Q3/3nB3/8/6N1/7N b - - 25 +2b4r/4p1bq/2k5/8/8/K1B5/6pN/8 b - - 48 +4b3/8/1PNR1B2/2r5/7k/8/1N6/4B2K b - - 52 +5n2/8/3b2p1/4n1Q1/8/1k3B2/4P3/2QK4 w - - 20 +6n1/n5r1/p6P/8/2kb4/K7/6P1/1N6 b - - 16 +3bK3/k2n4/8/NB3nbq/8/8/3P4/8 w - - 8 +3n3r/2n4k/1K6/2N4n/q7/8/3p4/1N6 w - - 83 +2q2r1n/8/8/1nk2R2/8/8/2NR1p1K/8 b - - 97 +6q1/p3K1b1/1p6/7N/7k/8/2BN4/5B2 b - - 11 +8/8/2Np4/B1N5/K4B1N/8/P7/2Q1k3 b - - 59 +4n3/2nk4/6r1/5K2/2r5/8/4N3/BB5B b - - 72 +k7/b5b1/8/5Nb1/1Q6/8/K2N4/3R1Q2 w - - 53 +4b3/6K1/3bN1p1/3q4/8/7b/2Q5/1N4k1 w - - 4 +6r1/6b1/2b2p2/8/1b5K/1R6/5B2/1N3k2 b - - 33 +3r1k2/5b1p/4pb2/8/1KN2n2/8/8/2B5 b d - 46 +3n4/6k1/q2Kr3/4R3/4p3/2b5/2P2R2/8 w - - 52 +3r3K/8/2k5/1bB5/6Q1/8/3NN3/2N1Q3 w - - 19 +8/1qK5/6q1/1b1Q1bN1/8/1nR5/8/4k3 w - - 90 +5b1K/1q2b3/2r5/8/3P2k1/8/4R3/2Q2Q2 w - - 49 +3nb3/8/7R/3Rq3/k7/r7/5PR1/4K3 w - - 79 +r7/1r4r1/5K2/5P2/4B3/8/5k2/B2N1R2 b - - 89 +8/4r3/1K5k/8/8/1B4B1/p2RN3/1Q1N4 w - - 30 +b5k1/8/2r5/7Q/2p5/7p/4B2K/4NN2 b - - 44 +8/1K6/4r3/R3b3/7r/5n2/1k1RPR2/8 b - - 82 +1b1b3n/5p2/4q3/3r4/4K3/1k6/1pN5/8 w - - 40 +7r/2k3n1/8/4n3/3N2N1/K2b2n1/2B5/8 w - - 65 +q7/3b2n1/3N4/k5K1/n3R3/n7/5R2/8 w - - 60 +6K1/8/3n4/4nq2/4r3/Q1k5/5P2/4N2N b - - 79 +5n2/8/4B3/2k3Kp/P7/4B3/2N2R2/7B b - - 69 +3n2r1/8/6R1/3k4/8/1n2K3/2B2R2/6QR w - - 47 +8/8/1P6/8/5KN1/3r3q/1p4k1/R3NR2 b - - 20 +6qk/2p3nn/6R1/2K5/5B2/N3N3/8/8 w - - 4 +8/6K1/8/1r1B1b2/2p1k3/2B5/8/R4QB1 b - - 10 +5r2/6n1/4B3/1N4b1/4R1N1/8/5K2/3N3k w - - 20 +8/6rb/1rN5/8/8/3k4/5KR1/2QBR3 w - - 3 +8/1b1b1q2/k7/8/6B1/2P2b2/2KN4/1R6 b - - 32 +b6r/8/n1K3B1/8/5n2/2k2n2/5P2/6R1 w - - 48 +8/1bb5/1R6/P3N3/5N2/2k4q/5K2/6Q1 b - - 13 +n7/3b4/2k5/8/8/n5N1/2P1R3/2NK1N2 w - - 34 +7r/4n3/3B3Q/8/6B1/8/1kRP2K1/3R4 b - - 24 +4n2k/b7/3n4/8/2R1q3/2N1Q3/3K4/4Q3 w - - 38 +2k5/5b2/R7/1b4r1/r1n2K2/8/2R5/7R b - - 89 +r7/8/3K4/1RQ3p1/b7/1k2n3/3R2N1/8 b - - 73 +2r5/4k2b/6R1/1R6/3R3K/1b6/2BR4/8 b - - 98 +7n/7n/N5P1/8/3k1P2/6R1/3R4/3R2K1 b - f3 55 +k7/8/1Rq3B1/4P1b1/2r4B/8/6KR/8 w - - 12 +1rk4n/6br/R7/8/3r4/1K6/4P3/6B1 w - - 2 +6r1/8/3Q1BP1/1P4K1/4p3/2k2r2/5N2/8 b - - 16 +8/4qn1K/k7/1n1q4/b5R1/8/4P1B1/8 b - - 44 +3n4/5q2/4K3/R1B5/5R2/B1r5/4P2k/8 w - - 90 +2q5/2kb4/8/1Q3p2/8/5r2/1B1p1K2/3N4 w - f6 10 +8/5k1K/4q2Q/8/1B1RN3/b7/6N1/1R6 b - - 85 +7b/1n6/1p6/8/B6k/4nKN1/2P5/1B6 w - - 58 +8/8/2N2K2/7B/1r1r1R1N/2N5/6k1/2R5 b - - 2 +4k3/2p5/3Rp2q/6p1/1N6/2K5/3B4/6B1 b - - 50 +8/5nn1/2q1R1k1/K7/3b1P2/8/7p/1R6 b - - 11 +8/3b4/2R1N3/6R1/4B3/2N5/4N2K/k1B5 w - - 95 +6bK/br6/6N1/8/5bnB/8/4R3/3k4 b - - 6 +8/7b/6k1/8/1Q5n/3K4/5R1P/3B1NR1 b - - 79 +4K1n1/b7/k7/2P5/P7/3n4/1P1p4/3B4 w - - 45 +8/1K3n2/4n3/3b1N2/5Q1q/k6r/8/1R6 w - - 91 +2q2b2/q7/6k1/8/4P3/3p1r2/7K/2RN4 b - e3 79 +4bb2/3b3b/8/5pp1/7k/8/5N2/2K4N w - - 69 +1bK5/8/P2k2N1/8/5N2/N7/6N1/NB6 b - - 61 +3b1b2/8/7n/B7/3K4/3R1p2/7B/5kB1 b - - 83 +q7/2b5/3N4/3N4/PK2k3/7p/P4N2/8 b - - 55 +q7/5k2/nq6/8/1b3b2/8/7K/1Q4NQ w - - 70 +8/K1n5/8/p5Q1/rk6/2NR4/1P6/4R3 w - - 99 +1n2Kn1n/3n4/8/8/1p6/2R5/3N4/4N2k w - - 64 +5k2/8/B2nQ3/6Rn/R7/3B4/K6Q/8 b - - 5 +8/r2b1q2/1B1k4/8/5K2/r5b1/P7/7B w - - 82 +4q3/2p1p3/7P/6k1/2KN3q/8/2Q3B1/8 w - - 61 +2qk4/4q3/8/3b3n/4Q3/8/BP1Q1K2/8 b - - 14 +5r2/1p1b2k1/1K3p2/5b2/R3q3/8/1R6/8 w - - 86 +8/3n4/8/4pbkR/8/8/3QB1P1/2KQ4 b - - 35 +2K1kn2/4q1np/8/1N1p4/8/6p1/3P4/8 b - - 34 +8/4b3/2R5/2p5/nnk5/8/7P/K2Q3B b - - 52 +8/8/2q5/2n4N/3K4/4nRQ1/5pQ1/2k5 w - - 23 +b5n1/4n3/2P3B1/5R2/8/2r3k1/K7/5R2 b - - 0 +2b3K1/8/b7/3N4/1b6/P1k5/1R1Q4/6N1 b - - 3 +2k5/7b/6n1/3P4/8/P6R/4P2P/1BK5 b - - 10 +8/2nn4/1r3Q2/3r1kB1/8/6K1/1R5N/8 b - - 92 +2n2b2/5p2/3P2k1/6q1/8/2BK4/8/2R3B1 b - - 15 +1n1r4/1n1q2k1/8/R1q1P3/8/8/3K4/7Q w - - 39 +5nnr/8/6n1/kn6/b7/1K2n3/R7/8 w - - 28 +2k3nn/7q/2R5/5b2/8/6Kn/7P/B7 b - - 41 +8/3k2rp/6q1/8/5Bb1/3Q4/7K/3BB3 b - - 37 +4K3/3r4/1R6/3q2n1/2k2n2/7q/6p1/1B6 w - - 38 +3n4/3p4/b7/8/1Rkq1P2/3Q1K2/8/2N5 b - - 25 +q5r1/4n3/8/r1Kb1k2/r7/7q/R7/8 w - - 73 +8/8/B1rN4/2q4Q/3r1k2/5R2/3NK3/8 b - - 12 +8/8/1R3r2/1P4k1/7q/8/1p1QN1K1/1R6 b - - 58 +4b3/3k4/1K5N/8/2Q1Q3/8/P2N4/6RR w - - 31 +7K/5p2/8/1Q4R1/B2P4/k3Q3/5PP1/8 b - - 34 +3r2n1/4b2r/8/1n1N4/8/b7/2k3N1/6K1 b - - 48 +8/p7/4K3/4n3/7k/2q1N3/1PP5/3R2N1 w - - 67 +7n/bb6/5k2/7b/N3B3/3B1b2/4K3/8 w - - 52 +8/4r3/8/8/R7/qb1N4/3kN2K/1B2R3 w - - 45 +8/8/B5q1/6B1/b1q2p1P/k7/8/2K2B2 w - - 6 +8/2r5/7k/5B1b/b3K1R1/5Q2/2B5/3R4 w - - 68 +7r/1b3r2/4q3/4k2B/8/R4K2/p7/7R w - - 85 +2kb4/b3b3/2K1r3/1b2n3/8/8/1P3p2/8 w - - 11 +7b/4b2p/1P4n1/1b2b3/4K3/2kb4/8/8 w - - 26 +2qK4/6nq/2Q5/5kB1/2R5/8/1R5B/8 w - - 53 +8/6pb/7Q/2k5/5N2/7R/1BRB4/5K2 b - - 48 +4n3/5K2/2n5/8/3n2p1/1Q6/3R2B1/1R5k b - - 27 +6K1/3k4/8/b6n/6R1/P3Q2Q/4R3/2R5 b - - 93 +7b/r7/1N6/1K5Q/4k3/7N/5BB1/6R1 b - - 40 +8/8/n1P2K2/8/4N2k/1b1b4/2N3Q1/2B5 b - - 40 +q2b1kq1/q2b4/8/4R3/2p5/7K/5N2/8 w - - 91 +8/8/5Nr1/2p5/8/5NK1/P2P4/1kN2R2 w - c6 5 +8/1rn5/b7/8/8/2nkNNq1/8/1R5K b - - 86 +5k2/8/1R4R1/1BN5/8/8/R1PKp1P1/8 w - - 8 +2k4q/b4Krn/8/8/2n5/8/3RBR2/8 w - - 70 +k7/1p2b3/3r2p1/8/4K1N1/2n5/2N4B/8 w - - 8 +5r2/1p6/8/8/r7/1R3BK1/2PPkB2/8 b - - 41 +3n4/K4n2/5q1p/8/8/1R3P2/3R3k/3N4 b - - 35 +5r1K/8/5B2/2kP1R2/4q3/5p2/4R3/4N3 w - - 94 +3r4/b4b2/1n5p/5n2/3R4/K2k4/8/N7 b - - 18 +3bK3/8/5B2/4N1R1/5N2/8/N6N/k5R1 b - - 2 +7r/8/2k5/4b3/1nN2b2/1K2B3/1P6/5R2 w - - 75 +7b/8/K2R3R/8/r6n/1Pn3k1/3B4/8 w - - 75 +6nK/8/1n2N3/2R4r/8/kr6/8/1R2N3 w - - 33 +8/3q1nq1/8/3r4/2N1K1Q1/7P/4B3/1k6 w - - 80 +K3bkb1/n7/N4Q2/5n2/8/2b5/7P/8 b - - 99 +4n3/2b5/1N6/2R1P3/1k1B2R1/1N3K2/8/8 w - - 43 +1qrq4/3q4/R7/8/5Kr1/8/8/1k3B1N w - - 62 +br2b3/8/5n1k/2K5/8/6qQ/8/2NB4 b - - 89 +3r4/2p5/7P/2R1NKR1/8/8/k2P4/7B b - - 74 +qq5b/8/8/B3q2B/7b/1R6/8/1K2k3 b - - 42 +8/r6q/q7/1R6/5K2/8/3RB3/1B1kN3 b - - 69 +8/3K4/8/8/3kr3/5Nr1/2B2N1Q/1R3Q2 b - - 45 +k7/8/8/1n5K/1p3B2/4RR2/1R6/B5R1 b - - 65 +5b2/8/3B1R2/2N1q3/8/3b4/N4P2/1K3k2 w - - 16 +7k/1p6/1B6/3n4/1P6/3p4/3P4/RK5N b - b3 47 +3q1r2/1K6/8/1nr5/1k6/6r1/1R5Q/3N4 b - - 52 +7K/2rbr3/1n3k2/8/8/2q1P1rb/8/8 b - - 11 +K7/3n4/6nr/8/8/BN3B1p/2k5/7N b - - 60 +1k3q2/7r/1K6/1n1r4/8/7N/3N4/BB6 w - - 65 +8/nb1K4/1p6/1Qr5/8/5k2/8/2B1B2B b - - 26 +2n4K/1qb5/2P5/8/4B3/B5N1/6P1/1k6 b - - 44 +2K5/4p3/P7/Q7/4kPN1/8/Q7/N4R2 b - - 91 +8/2r1pn2/3b4/1RK3p1/b2N4/8/5k2/8 w - - 94 +8/7k/4q3/8/1Kp5/B7/2p1P2N/1R2R3 b - - 89 +1r2r3/6kb/8/6nN/1B6/8/2N5/2K1Q3 b - - 3 +1bb5/8/4b3/8/B1nR1n2/8/K2B4/5k2 w - - 87 +4n3/8/8/1rkB4/8/2P2B2/2p1B3/4R2K w E - 0 +5b2/2n5/R1B5/8/r2n4/4K3/1R1B4/k7 w - - 34 +3r4/7r/4bN2/3k2Q1/3N1N2/8/8/Q4K2 b - - 78 +n7/6n1/6k1/n7/b6b/1n6/3PB3/5K2 w - - 85 +1b6/b7/4q3/3R4/8/k1q5/6K1/B3R2B w - - 52 +3q4/8/B2Q4/6k1/1p1n4/r6K/7B/5R2 w - - 96 +7b/2K5/3B4/pr2n3/3B2N1/8/2B5/1k6 b - - 32 +8/n2K4/1N3N2/b2b1P1Q/8/6k1/8/7R b - - 35 +1r2k3/5n2/8/8/4Kq2/BB2r3/4B3/1B6 w b - 89 +1n6/2n4b/2pB4/R7/kn6/6K1/p7/8 b - - 36 +1r6/k3b3/2Rr4/7b/8/2n1B3/7K/R7 b - - 95 +8/5p1p/2kR4/7n/4q3/5R2/3K2B1/6N1 b - - 56 +3b2r1/1p1K3b/1kr5/8/4P1n1/8/R7/8 w - - 32 +1q6/8/1B1n4/Kn6/2k5/2Qn4/3RN3/8 b - - 59 +2q2k2/8/6q1/1K6/b5R1/8/1P1B2BB/8 w - - 48 +5bn1/7n/6K1/6p1/n7/6n1/4P3/4R2k b - - 46 +8/b1p1q3/8/1P6/3k2B1/4b3/3B1B2/1K6 w - - 30 +8/4b3/2PB1b2/8/K7/8/3k2Q1/NR3Q2 b - - 80 +8/8/1K2p3/8/5Rr1/3BB1qk/2R5/2Q5 w - - 35 +4r3/1rb1K3/6N1/1Rr5/8/8/4B3/kB6 w - - 76 +6n1/4k3/7N/1P1r4/6b1/6r1/1K2N3/4N3 w - - 20 +8/k2r4/1n6/8/b6R/2K5/1BR5/1B2B3 w - - 57 +4q3/k7/4nb2/rB6/1Nq5/8/8/3K2B1 b - - 31 +5n2/5p1k/4n3/8/7R/2N5/NK1B4/B7 b - - 45 +4nb2/6K1/8/8/2R3B1/8/2p3B1/1kN2R2 w - - 9 +8/8/R2B3B/k4nK1/5p2/8/1RP5/4N3 b - - 8 +b7/8/2K3bq/n4k2/3p4/1r5p/2N5/8 w - - 54 +1b4q1/1r6/7p/2K1n2r/8/4R2R/8/4k3 b - - 17 +3b4/2q5/4k3/1n5B/4N2B/5b2/1R6/5K2 b - - 48 +8/2k4r/6Rr/5b2/4n3/5R2/R7/1K4R1 b G - 23 +8/8/6n1/1B4k1/N1pb4/1K3r1n/8/4N3 w - - 29 +2rnr3/4q3/3K3P/6k1/4n3/8/3pN3/8 w - - 26 +b6b/7k/8/p5K1/1r6/4P3/1R6/3BR3 w - - 40 +r7/1q6/6R1/2R5/1k5b/b7/4N1R1/K7 w - - 12 +8/1n6/kB6/8/3n4/K7/1BR1R3/2B2Q2 b - - 90 +4n3/r7/8/8/5N2/4qKN1/k1p5/1N4R1 w - - 72 +8/6q1/n3K2k/8/1n2n1r1/8/2B4R/7N b - - 82 +K7/3r4/2R1b3/8/5rn1/8/RP4k1/R7 b - - 61 +k7/4n3/3P4/8/K4n2/1NR3b1/5P2/3B4 w - - 2 +8/6q1/5k2/6nn/8/1r3P2/P2P4/3K3Q b - - 41 +1q1K4/r7/2r5/Q7/2Q3pk/2N5/8/6N1 w - - 70 +1n6/K7/Q3Q3/2n5/r1bP4/7b/8/6k1 b - d3 68 +1r6/bb1b4/8/7N/3b3k/3K4/5R2/3B4 b - - 27 +8/8/6n1/n1b2N1R/1P6/3R4/1k2K3/4N3 w - - 46 +K7/r1b2n2/8/3p3r/6kp/8/1QP5/8 w - d6 38 +r5r1/2r5/6r1/R2B4/P7/5k1K/3N4/8 b - - 87 +nr6/n3q3/4q3/7K/4B3/3b4/5k2/6N1 w - - 30 +b4n2/8/8/8/6n1/P2B4/P2Kp3/4N1k1 b - - 64 +5b2/4r1qb/2Bp4/5N1R/6K1/1k6/8/8 w - - 44 +r7/2q5/4n1K1/1N6/8/5k2/4B3/R1B4R b - - 5 +r7/1n6/2b4B/4n3/1k5B/8/2K2N2/2B5 b - - 51 +8/2k2p2/5n1R/8/6n1/n1BK4/3B4/5Q2 b - - 0 +7b/8/8/8/p7/KN3B2/6NR/RR3k2 b - - 26 +8/1b3k2/1n3p2/1rb5/5K2/b2q4/1N6/8 w - - 35 +8/3n3p/8/4Kp2/2pN4/8/N2k4/3B1Q2 w - f6 62 +8/r1K5/8/8/2B3p1/1B4R1/1k4N1/R4R2 w - - 78 +8/2b5/6K1/8/2R3B1/8/P2p1NP1/3B2k1 b - - 76 +q1n5/7b/8/6B1/5n2/P1k4K/2N2P2/8 w - - 0 +4n3/8/R7/K3N3/4p3/3B4/k2N3R/3N4 w - - 8 +5n2/1K2r3/N1n5/8/7B/k7/1N3R2/5N2 w - - 32 +1bn5/5q2/2n5/4n3/6RR/8/3N2k1/K7 b - - 89 +b2brk2/3bnq2/8/3N4/6R1/8/8/2K5 w e - 96 +2nb4/8/1qp5/4b2K/2k5/N7/1p6/N7 b - - 52 +8/8/RB6/2b3N1/Kb6/3k4/3BP1Q1/8 b - - 30 +7k/8/8/rpR1B3/8/P5B1/1P6/R3K3 b A - 26 +Knq5/2b2r2/3n4/5p2/8/8/N7/3Rk3 b - - 46 +7n/7r/2N5/2k1p3/5b1b/2K5/B5P1/8 b - - 41 +8/4b3/2n5/8/2B1n2p/7K/kB1B4/6Q1 b - - 2 +8/5b1b/6R1/1q6/4R3/1N6/1B5B/1K4k1 b - - 58 +4qK2/1pr5/5k2/8/2p5/8/1R3N1R/3R4 w - - 26 +2b5/k6n/6rr/8/4rb1b/1K4B1/8/8 w - - 59 +2K4k/3bn3/6R1/8/7N/2q1b3/1B4P1/8 w - - 45 +8/8/1bn5/q1K5/1pb2p2/3q2k1/8/2B5 w - - 51 +3r4/1n6/3r4/1k3pN1/8/7b/P3KN2/8 w - f6 12 +2r5/1r3n2/8/5P2/5rB1/8/k7/1N3KR1 w G - 99 +1K4n1/5p1q/6q1/1r6/4R3/1n3q2/6k1/8 w - - 72 +8/1n1K4/3Q4/5r2/N6N/8/1k4PN/4B3 b - - 9 +8/7r/3b4/5k2/8/4KP2/P1N5/2R3RB b - - 8 +3K2n1/6r1/1q6/5n2/1k2PP2/8/8/3R3R w - - 29 +2r4n/2r1r3/3B1R2/3K4/6bq/1k6/8/8 b - - 76 +3n4/2k5/2r5/6rb/1K3r2/1B2p3/8/6N1 w - - 78 +7k/p7/1r6/4r3/8/4B3/PQ1B4/Q2K4 b - - 21 +7k/r6r/1n4q1/8/4R3/N6n/6N1/2K5 b - - 56 +q7/1b3p2/8/8/6n1/1Q5b/N2N4/k6K w - - 32 +1b4q1/2nbq3/r7/1p4k1/7q/8/7K/8 w - b6 4 +8/8/2P4B/n3Br2/4RB2/5K2/2B5/1k6 b - - 70 +4k3/6r1/8/8/B2P3p/2B1n1Q1/1K6/5B2 b - - 47 +2n5/2rK4/8/3B4/8/b6r/3PR2N/1k6 w - - 97 +8/7b/4q3/2Br2N1/2Kr4/2r5/8/2k2N2 w - - 51 +br1n4/8/4K3/3q4/8/5P2/3BN1kB/8 w - - 64 +3n3r/4q3/4bN2/8/3b3n/5k2/8/KB6 w - - 19 +3r1n1b/8/2Rr2P1/8/8/3k2Q1/K4P2/8 b - - 62 +n2r4/1r2p2b/8/3R4/8/4K3/6R1/5Rk1 b - - 66 +8/1n6/6B1/B2n4/5p2/1br5/3R3K/4k3 w - - 43 +b6K/5k2/6B1/6B1/5R2/7b/2Bp2B1/8 b - - 76 +3K1b2/3n4/1B6/1p3N2/6PR/4R2k/8/8 b - - 26 +7r/8/2k1K3/3bR2n/8/4n3/6B1/4Q1B1 w - - 36 +4k3/6n1/6n1/QK6/2qp4/3B4/1R5P/8 w - - 61 +5k2/q2nn3/6N1/5b1N/8/r2R4/6K1/8 b - - 41 +6r1/p7/5QbR/8/1K1B1pk1/8/1Q6/8 b - - 4 +7k/8/1B1K3N/8/2N2NQ1/1Q2n3/8/6Q1 b - - 46 +Kb6/8/8/8/4B3/2k3bn/PR4Q1/5B2 b - - 41 +2bK4/3p2n1/2N2n2/N2N4/8/5B2/3k4/8 b - - 5 +5n2/qr6/2Pq4/4p3/3k4/K7/2p5/7R w - e6 44 +7n/8/N1R4k/4r3/3B1R2/7Q/7K/3N4 b - - 61 +n3q3/8/7n/1pk3K1/r7/8/2BR3N/8 b - - 38 +2q5/3qr3/8/2N2b2/k1N5/7b/7K/6N1 b - - 22 +5K1r/7r/3k4/4b3/1n2r3/5rB1/8/6R1 w - - 84 +6nn/1k1n4/1b1K4/5n2/4R3/3P4/8/4B3 w - - 14 +1kn1b3/8/7r/3n4/6P1/5N2/1N5K/B7 w - - 54 +3r1b2/5kbp/7b/4Q3/8/4q3/7P/3K4 w - - 57 +8/n6n/5nQ1/7Q/5k2/8/2PQ4/3K1N2 b - - 3 +1n6/5q2/1B5k/6r1/4R1p1/8/1Q4K1/6B1 b - - 90 +r4b2/n4Kb1/7B/8/8/1k5b/p7/4N3 w - - 9 +6b1/1n6/3R2N1/b3k3/8/6n1/8/3KB1B1 b - - 33 +5r2/7q/3k2B1/1Nb5/8/6K1/1NQ3P1/8 b - - 25 +2r5/3b3b/3bk3/5q2/1Kp5/3RP3/8/8 w - - 8 +3k4/8/B7/2nB2N1/N3N3/8/4B3/6RK b G - 43 +2n2n2/2bn3K/6pq/8/3nk3/8/8/7R w - - 57 +2k3b1/4p3/1N2b3/1b3r2/1Q6/8/3K4/Q7 b - - 8 +3k4/8/1K6/3B4/1r3rN1/4N3/2P3P1/4B3 w - - 82 +8/1Kb2b1n/7k/4b3/3q4/3q3p/8/1N6 b - - 79 +8/8/8/1B4P1/4k3/1B1Nb2N/5K2/1B1Q4 w - - 60 +7r/2q1p3/P7/Q5Q1/2k5/8/4N2K/1N6 w - - 72 +3k2q1/2q1r3/8/6n1/b3p3/5R2/P7/7K b - - 96 +5qnk/4q1r1/8/5K2/3q4/q7/B7/3B4 w - - 67 +n7/3r4/8/8/6k1/1N3N2/1P1P2B1/4KR2 w - - 16 +K7/6kr/4nP1R/N7/1Pb5/7N/8/8 b - b3 2 +k7/2r4b/6r1/6B1/3K4/P1n5/6B1/3N4 b - - 5 +3n4/3K2b1/3R4/2R5/8/3k2Q1/B7/2B4B b - - 35 +b7/2b2k2/7b/3B4/4Rp2/1Kb5/4P3/8 b - - 23 +2b4q/5b2/8/2P2n1B/b1k5/8/3K4/3B4 b - - 71 +8/1n6/6R1/1kr5/2r5/4r3/3N1NK1/7Q b - - 22 +n7/5nb1/8/2n5/6N1/7r/1NB1K1k1/8 w - - 24 +8/8/8/6Nk/3b4/8/BPN2K2/1R1N2B1 w - - 6 +4q3/p2b4/b2p2k1/8/6n1/5N2/8/1K5N b - - 40 +b7/6br/B7/8/2r4r/2K5/k7/5NR1 w - - 87 +b1K5/6pp/6P1/4n3/8/5k2/2RB3N/8 b - - 60 +2q3r1/3Kn3/6N1/Q7/2P5/7b/3p4/1k6 w - - 13 +8/b5K1/3k4/1B5b/6b1/6q1/7P/1B2N3 b - - 81 +6b1/8/4B2R/Bb6/2r5/4k1K1/6QN/8 b - - 73 +8/6n1/2k5/8/1n3K2/8/R7/R1RRBN2 b - - 93 +K4k1b/8/2N5/2b2b1N/8/2r5/3PR3/8 w - - 63 +1r6/2b5/2Nk3N/8/K1r5/1rqn4/8/8 w - - 39 +4b1q1/1K6/2N1kP2/2N4b/3R4/8/4N3/8 b - - 4 +2nK4/8/1b6/5Q2/2b5/2nr1b2/5N2/5k2 w - - 35 +8/6K1/8/b7/qb1R1B2/8/3k3R/5BB1 b - - 97 +8/7K/4b3/6Q1/2RB1k2/1Q6/2B1R3/3B4 b - - 80 +5r2/8/4R3/6b1/1N1r4/5K2/1kN2R2/5R2 w - - 32 +8/k1r4r/4Q3/4K3/b1P4b/2r5/3P4/8 b - - 31 +8/1b6/n6k/5p2/1P2RQ2/8/p5K1/4N3 b - - 98 +2q2n2/5p1n/4b3/7p/8/7R/6BK/k7 w - - 35 +1r6/3K4/qq2R3/3k4/6rR/1B6/2p5/8 b - - 33 +8/1r6/4k3/3B3n/1Q6/8/B1P5/3NKN2 b - - 14 +b6r/5K1p/8/8/7B/6k1/B1Q5/R1R5 b - - 12 +8/r5b1/4r2R/3K2n1/8/1P6/4N3/1k1R4 b - - 35 +1k6/2r5/n7/1Q1N4/2nb3K/8/3P2N1/8 b - - 52 +8/2Knr3/b2n4/2n2p2/8/Nb6/3k4/8 w - - 69 +8/2n4r/8/7b/3K2Q1/B3R3/2N1B3/6k1 b - - 34 +8/1K6/1n6/5B2/1b5Q/6rR/3k2p1/2B5 b - - 64 +4qq2/1b2n3/8/3r4/1kN4b/4K3/8/3B4 w - - 65 +1rb5/5rr1/8/3K4/1R6/1p3k2/B7/7B b - - 53 +3r4/3rrK2/P7/7k/8/7r/B2B3B/8 w - - 94 +4n2k/3b4/8/8/K2N4/3r2BN/8/B2R4 w - - 89 +k7/p5q1/8/r6n/8/3N2K1/1N4N1/B7 w - - 10 +6n1/1q6/7R/6K1/5p2/1Bn2R2/2Q5/6k1 b - - 50 +q5b1/3n4/5R2/6R1/8/1P2N3/5k1K/1Q6 b - - 45 +8/8/8/k1K1n2b/8/R4R1n/4BP2/3N4 b - - 45 +K2b4/8/1r6/1k5q/8/8/3PQ3/3N2BB b - - 97 +8/6b1/8/2Nr1p2/K7/4b3/1N1P4/2kQ4 b - - 2 +6n1/2b5/NP6/1k1q4/4K3/8/2Q4P/2Q5 w - - 75 +2r5/7k/3K4/6P1/2NR2B1/5B2/3BQ3/8 b - - 19 +b1b5/k7/4p3/1nR3r1/5r2/6K1/6P1/8 w - - 58 +3r4/q7/1r1RN1n1/8/4B3/8/5P2/2K3k1 b - - 64 +6K1/b3r3/1p6/2r5/5qk1/8/5NN1/4N3 b - - 77 +1r3K2/1n6/8/8/8/b5rp/2Q1R3/5N1k w - - 24 +n5rk/1q6/3K3b/8/7r/r7/1P4R1/8 w - - 23 +2k4q/n7/3q4/2K5/N3q3/2p5/8/2N4R w - - 65 +8/5qr1/4N3/4K3/1n6/7k/2R5/5NRN w - - 85 +7K/7p/3p2Nk/8/3n4/1n2b3/7p/4Q3 b - - 54 +1r6/4n1b1/5b2/P7/1N6/4n2K/2k3R1/8 b - - 67 +1b4r1/6n1/6B1/8/3Q4/KB6/6R1/3Rk3 b - - 58 +n2K4/q7/1Q6/5R2/k1b5/3PbN2/8/8 w - - 54 +3n2nr/1r1pp3/8/4bk2/8/8/8/3K1Q2 b - - 34 +k2b1K2/1n6/6R1/5bB1/8/2n5/8/2Q2Q2 b - - 33 +8/8/2n5/5Q2/5b2/1kb5/1N1P4/RK3R2 w A - 23 +8/7n/5b2/rR2k3/1B6/3QK3/2Q5/7N b - - 9 +6r1/1Kb5/5kB1/8/8/7b/N3B3/B1R5 b - - 93 +8/b5b1/6K1/8/1R3b2/p3N3/3N2P1/1k6 b - - 14 +8/8/q3q3/1bK4N/5k2/4n3/R3Q3/7Q b - - 67 +6n1/1k1q4/4K3/2R5/5Q2/8/5B2/1BQ1N3 w - - 47 +7r/n6n/B5q1/7Q/1n5K/8/3k1N2/8 b - - 13 +5n2/3bbKq1/8/8/B2R4/2k1N3/6B1/8 w - - 33 +8/1b2K3/6N1/1B6/2rN3R/8/P1k1R3/8 b - - 4 +2b5/8/6K1/8/2Q4Q/3N1p2/3R3P/4kR2 b - - 38 +8/4b3/3BB3/8/3n4/R3K1N1/p7/1R3k2 b - - 48 +2k5/2n4K/4p3/1b6/6P1/R2p4/2N5/R7 b - - 45 +4k1q1/7q/1b6/8/5K1n/8/R1R5/3R2R1 b - - 65 +7r/r5kn/8/2NR4/r7/7N/2K1Q3/8 w - - 84 +4r3/Kn6/7n/2k2n2/1R6/P3q3/8/7N w - - 36 +1n4K1/5rb1/7Q/8/6nk/4R3/1B3N2/8 b - - 86 +b4r2/1rp5/1K2P3/8/8/BN6/5k2/2Q5 w - - 58 +k7/8/8/4r3/2N4n/7q/4K2N/1B2NB2 w - - 38 +rb6/kq6/8/5KN1/N4q2/8/5R2/5N2 w - - 68 +K2b2q1/8/4b3/p1n5/8/8/k2N4/2B4N w - a6 74 +4K3/5b1b/8/8/k2nr3/1N6/1Q5R/1R6 w - - 22 +K2nnq2/8/4R2Q/3b4/5b2/7r/8/7k w - - 31 +4r1r1/1n3q2/2p3n1/8/5k2/7b/2K5/7B w - - 98 +b7/8/5b2/6b1/1K1B2n1/3b4/2k3RR/8 b - - 76 +5k2/1n6/2n5/8/3Q2R1/3r4/1K4B1/4B1Q1 w - - 55 +8/3Kn1n1/1kn5/3B2q1/1n6/6R1/8/1N6 b - - 19 +5r2/2p5/1N4n1/7P/3K4/8/2k1NP2/7B w - - 6 +1K1rb3/3r4/6Bk/2p5/3P4/5p2/8/3Q4 w - - 36 +1n2n1q1/1n2K3/3q4/P7/3k4/3b4/8/2B5 w - - 67 +4kr2/5bn1/q7/2b5/N1N5/8/7R/K7 w - - 38 +K2n4/6b1/qR6/8/6Rr/8/kN4P1/8 w - - 56 +4n3/r5b1/3B4/b7/k7/b2b4/1Q1K4/8 w - - 26 +3K4/8/8/3B2RR/6r1/2rQ3B/1P6/6k1 b - - 29 +2n3r1/8/2Bp4/1r6/4k3/6r1/R5B1/5K2 b - - 3 +2r5/2r2n2/p7/6k1/6P1/4K2q/8/6NB w - - 59 +8/8/2p3r1/1r5k/4b1np/4N1K1/6p1/8 w - - 26 +5r2/8/1K6/8/r5k1/4N1n1/4B3/2RB3R b - - 13 +8/6br/1N5n/1K6/5k1r/3r4/4N3/1N6 b - - 73 +5n2/2n4p/3n4/8/3N2r1/1K2P3/8/1B5k w - - 96 +3k4/8/4R2n/8/8/5rN1/QR5K/R3N3 w - - 12 +1r2q3/8/k6b/3K1b2/8/4QN2/B3N3/8 w - - 99 +1n3bk1/6n1/8/6n1/6B1/4r3/B4B2/K7 b - - 73 +kb6/4p3/1n1K4/6b1/8/3r4/2RB1N2/8 w - - 71 +1b6/8/8/R3P3/2k5/1B3P2/KP2p3/4R3 b - - 78 +6r1/4K3/1q6/8/4k3/Q1PR1QR1/8/4R3 b - - 77 +3rb3/k6n/8/2r1r3/2K2R2/8/8/1B3R2 w - - 7 +k1q4n/6bp/1R5R/4NK2/8/8/8/4R3 w - - 16 +8/8/2n1B3/5K2/bk6/n7/2N2N1R/3R4 b - - 91 +4bk1r/n7/6n1/4B3/1r1K1n2/4n3/8/8 w - - 13 +1K5b/8/8/3N4/6nk/2Q4N/3B2p1/2N5 w - - 52 +8/4r2b/1K5B/4b3/Q2k4/8/2N1R1N1/8 b - - 17 +2b4q/6rq/5rR1/1k6/5r2/8/3N2K1/8 w - - 30 +4qK2/kr4n1/2B1nB2/8/8/8/4R3/4B3 w - - 44 +4k3/8/8/1pB5/8/2qK3R/3P3P/6BB w - b6 51 +3K4/nb6/8/R7/8/1BB2k2/7P/NB6 b - - 7 +8/6K1/qn1N4/6B1/3k1b2/6BN/7Q/8 b - - 71 +3n4/n3K3/8/7R/8/2b2rrp/2B5/4k3 w - - 22 +4k3/5p2/8/4q2B/1B1n4/8/R7/2B1NK2 b - - 53 +7k/1b3p2/8/4bq2/4B3/1K2b2P/8/6R1 w - - 52 +6r1/8/4Bk2/7B/5R1b/1Kn4R/5Q2/8 b - - 20 +8/4n3/8/4B1B1/2n5/6b1/k6K/2BQ2B1 w - - 26 +6n1/8/1N3N2/5K2/6P1/4NqQ1/3Q4/1k6 w - - 68 +3r4/4r3/8/N1K5/B4n2/4r2k/3NR3/8 b - - 82 +1n6/1n5p/5r2/8/R1q3k1/4r3/3KP3/8 b - - 71 +n7/5r2/2Q5/8/1N3k2/3BQ3/Q2P2K1/8 b - - 5 +3k2q1/8/B5P1/1N6/q3p3/1K6/4R3/1Q6 w - - 64 +K6n/2b5/3R4/2n3R1/1n6/4b3/7p/3k4 b - - 30 +4r3/4k3/8/R3b3/8/1nNKN2q/8/4B3 w - - 71 +1b6/4r3/8/5pk1/3K2R1/4p3/2B5/1B3N2 b - - 30 +2q3k1/4r3/8/1r6/p7/2b1p1R1/K7/6Q1 b - - 79 +2n5/1K3n1q/8/5b1B/2n5/8/2k5/2R4R b - - 71 +K1n3q1/5p2/3k4/8/3q4/r7/4N3/1B5Q w - - 60 +b7/2n5/4bp2/1RK5/3R2R1/4k3/8/N7 b - - 0 +4b1n1/8/8/p6b/3P4/1Q2B1r1/3k4/7K b - - 33 +n1k5/1n6/1Q2pr2/K2Pr3/8/8/7p/8 w - - 49 +3b4/5r2/8/1q2b2K/7r/Q1R5/8/1B3k2 w - - 94 +8/1np5/8/6q1/K4r2/1R1B4/2Nk3N/8 w - - 20 +7n/7n/N7/2K5/2NNBk2/6p1/7Q/8 b - - 6 +8/4rp2/8/1b2k3/8/R7/K2B4/Q1R3N1 b - - 32 +8/3n3K/B7/5nNN/3B3k/8/8/2B1N3 b - - 28 +8/6bb/Q5KB/2BP4/8/8/6k1/N1N5 w - - 40 +4k3/8/1K6/P7/6B1/2n4N/2R3R1/B1B5 b - - 93 +r3qnq1/8/1b3K2/1n2N3/k7/7r/8/8 w - - 29 +1b6/k7/n7/b7/3N4/2b5/2N4Q/K3B3 w - - 33 +b3Kn2/3q4/kb5r/6q1/2R5/5N2/8/8 w - - 34 +2r1n3/1r6/4K3/1N6/1q6/5Q2/5N1B/3k4 b - - 32 +3b4/8/k2NQKB1/8/8/1N6/2p4P/B7 w - - 28 +3rqkr1/8/5b2/6n1/3p2Q1/4n3/8/5K2 w - - 52 +8/5b1r/7B/6N1/1K6/4r1kn/2P5/4B3 b - - 29 +K2b4/8/4n3/8/8/2r5/1kP1N1NN/R7 b - - 27 +8/3rb3/2N1r3/2R1R1K1/8/nkN5/8/8 w - - 92 +8/2b4n/7K/3B4/8/1R1N1k2/3P4/2Q1N3 b - - 77 +4k3/pb6/8/4K3/rpRP1R2/8/8/4N3 b - - 61 +7n/8/b6r/1P6/6KR/2kR2RB/8/8 b - - 16 +8/6pp/1r6/K7/1PN5/3k2bB/7Q/8 w - - 14 +1r6/8/K7/4B1k1/3N1b2/3B4/8/NNN5 w - - 68 +8/8/4P1n1/R7/N3k3/5n2/pp5N/4K3 w - - 99 +8/8/5kR1/n7/1r6/Q5r1/1PR2KN1/8 b - - 11 +7k/2n3p1/4r1r1/6b1/8/2q3K1/Q6P/8 w - - 99 +n3b3/p2K4/1k6/1q6/8/N7/5P2/3R1B2 w - - 22 +2r5/1n6/K4b1N/2q1b2k/8/8/7B/1N6 w - - 40 +8/4n3/n3KN2/8/r7/B1b2P2/2k1B3/8 w - - 37 +8/1r2Kr2/3rn3/4B3/4Q3/8/5k2/3B3R w - - 97 +5n1q/4n3/4k3/K3B3/B3r3/8/6Np/8 b - - 94 +n3k2n/K7/1p6/2r3b1/2R2B2/8/2B5/8 w - - 45 +1n6/rn5K/8/3kn3/5R2/4r3/1R6/R7 w - - 32 +8/8/6N1/n3n2K/3R2P1/8/2k1NP2/3N4 w - - 50 +8/3b4/3n2n1/3RK1k1/6p1/4P1r1/8/6N1 w - - 42 +k1r1K3/r7/8/7n/3Q4/8/1N6/B3N1B1 w c - 50 +3r3K/8/8/2k5/8/5QB1/1RPp2R1/1N6 w - - 34 +4K3/8/N7/3N1n2/3n1n2/2p1Bk2/7P/8 b - - 72 +5n1r/7b/8/8/3b1n2/5N2/3Kp3/2B4k b - - 19 +7n/3b1k2/2Bn4/8/N7/4q2K/7B/1R6 w - - 81 +8/5b2/3b3R/2k5/8/8/1NPR2K1/5RB1 b - - 65 +4r2n/4rr2/6bN/6n1/3K4/8/8/B4k2 b - - 5 +8/8/1n4N1/1B6/1BK5/2b3n1/1R4B1/6k1 w - - 87 +6r1/7n/7n/6k1/1NK2B2/1B6/B2B4/8 b - - 85 +8/b1r2r2/3k4/5R2/5br1/8/K1p5/4Q3 w - - 35 +8/4k1p1/3B2K1/6Q1/3BQ3/5b2/8/1B2N3 b - - 98 +n7/3q4/5K2/8/1k6/3r4/2Q4B/R3B1R1 b - - 3 +7K/8/b2BB3/b3br2/8/2b5/8/4k1B1 w - - 9 +8/k6K/rrn1p3/8/3P4/8/B1P5/5Q2 b - - 13 +8/r4n2/2n5/2b1B2K/4B3/8/2Q1P2k/8 b - - 37 +5b2/Kb4br/3P4/8/6b1/5n2/2N5/7k w - - 42 +k7/5b2/8/1P1N4/4N2r/3K4/7N/4BQ2 b - - 8 +8/4b3/8/kN6/5n2/K4qqP/3p4/2B5 w - - 94 +1rq3k1/8/2n5/n7/4Pn2/p7/R2K4/8 b - e3 7 +8/4b3/1N6/1B3Q2/1B5Q/8/1B6/1R2K2k b - - 56 +4b3/K7/5B2/4Qpk1/8/4NB2/2N1N3/8 b - - 84 +5b2/2p5/Q2kn2r/4r3/1K4P1/8/8/5N2 b - - 24 +1n6/8/8/1R2P1K1/8/6r1/1pkB4/6RN w - - 55 +8/7b/6b1/1bB3R1/8/3B4/4P2K/2k1R3 b - - 89 +8/8/8/3rr2N/4K3/6bp/1N3P1P/6k1 w - - 91 +1r1r3b/8/1K1n4/5rB1/8/1b6/3N4/4k3 w - - 55 +n7/1p2k3/8/1B6/1r6/4n3/5N1B/6KR w H - 9 +1K4n1/1b1q4/8/4b3/8/5nr1/1R3p1k/8 w - - 43 +2b1b3/7b/1B2B3/k7/3B4/6K1/8/B4N2 b - - 18 +n7/7p/3kP3/5BBr/7P/8/2p5/2K5 b - - 49 +8/8/K1kb4/3B1R2/6N1/P1P5/6P1/7N b - - 55 +2b5/8/5B2/5B2/1R2R3/3k4/N1PP1K2/8 b - - 2 +n4k2/4n2q/8/1R6/3B4/4q3/K7/2N3B1 b - - 94 +8/8/q7/5r2/1N3B2/5Kn1/2R1N3/1R4k1 b - - 85 +7n/6r1/4N1r1/2r1k3/4P2R/8/1B6/7K b - e3 57 +4b3/2b5/8/8/1NBK4/2rb4/1k4P1/2N5 w - - 76 +6kb/4b2r/4n3/5Q2/Rq6/8/8/N6K w - - 45 +7r/5r2/4N3/4r1k1/2n2r2/8/5pKB/8 b - - 27 +8/8/7N/3R4/2qk4/1r6/K6Q/2R1NR2 b - - 0 +7q/2k5/8/rK3Bn1/8/2r3nP/N7/8 w - - 16 +4q1r1/2b5/4r3/4RR2/2R5/4r3/2K4k/8 b - - 29 +6K1/8/2B5/1BP3b1/B4n2/8/3k1N2/4R3 b - - 72 +4q3/6r1/1B4B1/5K2/rb5R/8/6Q1/1k6 w - - 41 +8/b3p3/2r5/8/2Q2B2/3k4/K4N2/N4N2 b - - 52 +6K1/8/5k2/Q4r1B/1N4n1/1R6/R1B5/8 b - - 16 +8/1r6/R7/8/7k/2RK4/P4N1P/NQ6 b - - 53 +8/1b6/1nqR4/5KP1/8/5bP1/5Nk1/8 b - - 59 +3k4/4n3/R4R1q/7p/3N4/7K/4R3/5N2 w - - 66 +2k5/4q3/3N4/3Q4/8/2rB4/5P1K/R1R5 b - - 90 +3b3n/4K2q/6n1/6pk/8/3bp3/8/B7 w - - 83 +5r2/2rq2n1/8/8/Q7/B2K4/2BB4/k7 w - - 53 +7K/1b4b1/4NR2/5RRB/r7/2k5/8/8 w - - 97 +8/5qr1/5n2/3k2r1/5nr1/8/R1R5/3K4 b - - 68 +8/K3b1r1/8/1rN4b/3r4/2k1n3/4R3/8 b - - 67 +8/b7/8/8/N5b1/N1nP1pbK/5k2/8 w - - 55 +4r3/K5k1/3n3N/rp6/R4r2/8/1N6/8 w - - 59 +1k6/1b6/1K2q3/8/4Q3/4B3/1R1Q3P/7N w - - 23 +8/8/1b2q1B1/3n4/3kn3/K3N3/QR6/8 b - - 15 +6b1/bp4q1/1p6/3k4/8/r2r4/2P5/4K3 b - - 75 +6b1/5b2/r6K/bbk5/8/3P4/4P3/3R4 w - - 64 +4n3/8/4n3/r4R1Q/4r3/1K5n/5k1P/8 b - - 38 +8/2n1r2k/2P5/5B2/7r/8/K5PB/1N6 b - - 95 +8/2b1r1p1/8/8/1k2K3/8/P3NNQ1/6R1 w - - 6 +7n/3p3k/n6r/K7/3b3r/4P3/5B2/8 w - - 93 +1K4k1/8/1N5P/1q6/7b/B4B2/2Q4R/8 b - - 17 +8/3K3p/7k/8/n7/4NrBP/1B6/5R2 b - - 16 +3k2n1/1n6/n4Kr1/1R6/4q3/8/6R1/N7 w - - 12 +4n3/1nn2k2/8/3Q4/1N1B4/3n4/2K4p/8 b - - 45 +r4b2/1K6/6R1/P7/2N5/7q/1N6/k3N3 w - - 54 +4k1r1/q6b/8/B5N1/6b1/8/2K1B3/7N w g - 16 +2q5/7p/8/8/2b5/6q1/2RKNR2/4Nk2 b - - 4 +2K5/6b1/R2n4/4R3/3N2r1/4R1b1/3k4/8 w - - 85 +8/8/2p5/1rb1B3/1k5P/8/R2KP3/2N5 b - h3 13 +8/q7/6k1/2N5/3K4/8/1RQR3P/1N4Q1 b - - 79 +4k2n/8/8/8/3K3r/4r3/Pp4R1/2R3N1 w - - 86 +2b5/2n1p3/1r6/N2K2P1/8/7p/3k4/7N w - - 88 +6n1/3q2K1/6N1/3n4/1n1P4/8/4P3/1k2N3 w - - 4 +5b1r/b7/8/4k3/8/4r2K/2BB4/3B3B w - - 53 +1n6/k1r5/5B2/8/8/2n5/1K2P3/1RB2B2 w - - 56 +8/4k3/2P5/1K4b1/3P2Qn/8/1R3P2/2B5 w - - 58 +2n2nn1/8/5k1b/B7/8/5n2/8/2RK2B1 w - - 32 +3n4/8/4rB2/7k/K3N3/8/4B1Q1/5BR1 b - - 32 +2k5/8/1r6/4K3/P3P3/4Q3/3Q1Rp1/N7 b - a3 83 +2r3K1/6r1/n3B3/2k5/4Q3/6NB/4P3/8 w - - 64 +7r/8/R2BN1Q1/8/k7/8/K4P2/2QQ4 b - - 82 +6k1/8/N2Nq3/8/6q1/1K6/1R2B2R/2N5 w - - 48 +1n6/8/8/Kp6/5B2/2k1n2r/Q2p4/7B b - - 49 +2n5/2kq4/8/8/3rbp2/3R4/8/2R2BK1 b C - 37 +8/2b5/K7/6R1/k3R1N1/6q1/B3Q3/2N5 b - - 11 +4Kn2/1n6/3b1n2/2b5/8/3r4/4QP2/6k1 w - - 31 +8/5brn/1k3r2/8/2n1K3/8/5pRR/8 w - - 69 +5b1n/2q1q3/r5K1/8/8/6b1/2B3k1/6N1 w - - 77 +8/1np4r/2Q4R/8/1b3KB1/3k2r1/8/8 w - - 18 +r7/1r3b2/K1r5/8/7N/7k/5R2/B4N2 w - - 73 +4r3/6n1/8/8/1r5B/2k1Nb1K/7B/B7 b - - 83 +n1n2r2/4K3/2n1p3/1R6/8/8/2P3k1/6N1 w - - 48 +8/2r5/2n5/3rn3/4b2k/1Kp4P/7p/8 b - - 64 +4k2b/8/1P6/3R2b1/2N5/n1K4r/8/1B6 w - - 55 +b2rk3/3p4/3R1Q2/8/8/1N3QKQ/8/8 b d - 72 +b7/2n5/2k3n1/4Q3/3b4/8/RRK5/R7 w - - 20 +7n/Kb6/2r1R2B/6B1/8/4n1n1/8/1k6 w - - 22 +7q/K5bk/3r4/6N1/B7/7N/8/2N1B3 b - - 38 +1b2nr2/k7/5n1Q/6K1/4r3/4B3/3P4/8 b - - 71 +7r/1n2n3/n7/1q6/4kr2/2r2n2/K7/8 b - - 15 +8/3K4/5q2/5RNb/8/5kBP/3N3Q/8 b - - 4 +7b/7b/4K3/2r1p2r/8/7B/2RB4/4k3 b - - 54 +1k2b3/8/1b5R/2n4P/7b/6K1/RR6/8 w - - 56 +3nb3/2K5/2NR4/4Bb2/8/8/2pk4/B7 b - - 58 +1q3b2/n7/6R1/3Q3k/8/3P3r/4K3/6R1 b - - 71 +8/2p4r/rnn5/8/3k2K1/Q7/4P1R1/8 b - - 83 +8/r4b2/6p1/kb5K/3n3P/6r1/7B/8 w - - 55 +8/6p1/4n3/2b5/8/1p6/4NN2/R3Bk1K b A - 80 +5r2/2q5/5N2/1R3k1B/2Q5/K7/B7/R7 b - - 41 +3r4/8/1K5n/4k2n/8/4B3/8/N4NRB w - - 23 +4b1kb/K7/7B/5B2/2npB3/4P3/8/8 b - - 11 +2q5/1k4r1/8/1b1n2B1/4nP2/2K5/1p6/8 w - - 50 +n5n1/7b/4b3/3k3P/8/5n2/2B5/4N2K w - - 92 +8/n7/1n2N3/1K1N4/8/3n1RQ1/2k5/5N2 w - - 48 +8/1n6/8/1R5B/1N1BBbP1/3k4/K7/8 b - g3 0 +8/5n2/qP4R1/8/3Q4/R1KN1k2/7P/8 w - - 17 +8/4q3/r3r2R/3r1b2/6K1/8/5PB1/6k1 w - - 90 +1b1n4/8/2B2n2/2k5/4q3/1r4b1/PK6/8 w - - 93 +3b4/2nrrk2/b7/3r2K1/p7/8/P7/8 w - - 76 +2k1n3/2r5/1P6/1pQ5/1R4K1/8/8/5R1B w - - 40 +n7/2q2p2/k7/8/8/8/3p2RK/1Q1R2N1 w - - 85 +8/2n5/8/3k4/2R1q3/P4r2/8/N1NK3R w H - 2 +8/1r3rK1/4R3/N7/4r3/1Rn2k2/8/6R1 w - - 98 +4n3/2p1r1r1/6q1/1N2k1n1/8/1B6/8/1K6 w - - 94 +1K6/8/1RN4k/3qQ3/1Q6/4R3/3B2P1/8 w - - 1 +5n2/4n3/8/4N2q/N7/4k2K/5p2/2R3N1 w - - 49 +b7/8/1n1K4/1R6/4B1p1/1r5n/1B2k3/8 w - - 54 +8/q7/1k5N/6K1/8/4B3/P1BB3P/6B1 b - - 31 +3b4/6p1/3Nb3/8/4B3/8/1B6/K1Rk1R2 b C - 44 +8/2b3n1/3B4/8/4P3/P2n3K/4k3/1N1B4 b - - 58 +n7/6q1/6B1/3K3r/4Q3/qb6/B7/3k4 w - - 94 +1b2r3/1r6/7B/4B3/4p3/8/5B1k/3KR3 b E - 50 +1q6/8/8/5K2/nR4r1/4nBN1/2k5/4Q3 w - - 69 +8/4br2/2n4K/8/7b/2k2N2/1B2R3/5B2 b - - 60 +7b/8/6B1/8/8/3r2b1/3N1K1N/k1BB4 w - - 44 +1K6/b4r2/7r/8/R3q1qr/3b2k1/8/8 w - - 6 +8/2p3r1/1b3K2/8/5P2/N7/1N4R1/kB6 b - f3 50 +3K4/2r1n3/2b3n1/8/3B2P1/n7/8/k6B b - g3 42 +2K3r1/3n2r1/8/4b3/bq6/8/2NP4/5k2 w - - 9 +8/3r3b/3Q2k1/K5N1/2B5/8/P1p5/Q7 b - - 47 +1b6/8/5K2/1n1r1R2/7R/5q2/2pQ4/5k2 w - - 65 +3K4/8/8/1n2k3/n1r5/pbr5/3R3B/8 b - - 50 +3r4/7q/3K4/6p1/5r2/8/3PPR2/k1B5 w - - 3 +r7/1n4Kr/5n2/8/1Bnb4/6k1/6B1/8 w - - 15 +5r2/4n3/3k4/b1n4N/8/5K2/P1Q5/7B w - - 44 +4k3/8/3r4/2n3N1/5B1Q/2r3n1/3K4/2B5 w - - 76 +5qK1/3pb2r/8/2k5/4b2N/8/6B1/5N2 w - - 65 +2K5/3nb3/8/8/3b4/1k4r1/2pR4/3Q1N2 w - - 61 +1n6/r7/k4Pn1/8/3QN3/6K1/6R1/6B1 w - - 3 +2nn2K1/4rpb1/5N2/8/8/k7/4N3/B7 b - - 59 +r7/8/2Nbk1n1/n5N1/8/8/2N5/K5R1 b - - 76 +8/6n1/3r4/1b4Rn/3r1k2/1b6/1P3K2/8 w - - 51 +8/5k2/Q7/1Q3R2/5r2/4R1n1/2QN4/2K5 b - - 99 +8/8/3b1r2/5r2/4B3/3P4/1P6/4kNKR b - - 19 +r1n5/K1b5/1Q6/2n4N/3b4/8/1P5k/8 w - - 26 +8/4b3/8/Nn3P2/1K6/8/2NP1k1N/4N3 w - - 26 +1b6/q7/3k2NK/8/8/1Pr5/4N1N1/2N5 b - - 33 +8/8/1n1P4/6Q1/2nk1Q1B/7K/7p/1N6 b - - 28 +4b3/3b2n1/k7/2R2NR1/4K3/8/8/R6B b - - 47 +8/r1k5/7n/3RR1n1/1R1B4/2r5/7K/8 b - - 86 +4q1rr/3b4/3P4/8/7K/8/4p2k/2N3R1 w - - 98 +2n5/5pb1/K1b2p2/4k3/PB6/2R5/8/8 b - a3 43 +3r4/7n/2R2k2/8/8/1R5R/P7/K5RB b - - 36 +n6r/k7/1B4b1/6K1/1n6/7N/N7/3N4 b - - 65 +8/2K5/Q3P2r/4rn2/k7/5R2/R7/5R2 b - - 34 +3n4/8/3NK2Q/8/6r1/N1R5/4P3/4k1B1 w - - 23 +8/3K4/8/2p5/1Q6/B3nP2/2P1k3/BN6 w - c6 55 +b7/8/8/3R4/4bQ1b/2N2R2/7k/5KB1 b - - 46 +7n/8/5b1K/8/2rNb3/3q4/4k3/2Q3N1 b - - 32 +2k5/8/1r1r4/2n4b/6K1/5P2/1p6/3R2Q1 w - - 84 +4q3/2k1b3/n7/7n/P7/8/K1PB1N2/8 w - - 8 +n4kb1/r3b3/8/Bp1K4/8/6b1/8/N7 w - - 65 +8/5r2/4r1r1/1p3b1K/4b3/3k3R/3R4/8 b - - 39 +8/nK5k/n4b1B/8/5p2/B7/8/3B1Q2 b - - 49 +8/8/8/Rn4Q1/5k2/5R2/6PN/2R2K1B b - - 6 +6n1/K7/N2B2B1/4r3/5k2/4n2Q/2R5/8 w - - 24 +3r4/2K3r1/8/4r3/2k3q1/R7/4P1R1/Q7 w - - 30 +2r2q1q/8/8/1n6/1B3n2/8/K2p4/2kQ4 b - - 45 +2n1n3/1K6/R5B1/8/8/1k6/1R2NN2/3N4 b - - 39 +1r5k/4q3/1Q1q4/1r2K3/7r/8/8/1R3Q2 w - - 43 +6r1/8/2N5/k6n/7Q/1K6/5RR1/3NB3 b - - 93 +4K3/r1n5/3k4/5r2/7B/4RR2/2N5/6B1 w - - 20 +1r6/8/8/4b3/5KR1/8/3NR1Np/k6B w - - 55 +4b3/8/1R3b2/3k4/3nn3/1Q5K/7p/5R2 b - - 5 +2r5/3r4/1K4N1/2R5/6N1/6Q1/8/1RR1k3 b - - 91 +8/8/R1KN2P1/6b1/8/1k6/1P2B3/Q5Q1 b - - 1 +3q4/4rn2/3KR3/8/1r6/3R1n2/5k2/3R4 w - - 8 +3rk3/8/P3n3/r7/5N2/8/5QRB/6K1 w - - 7 +4n3/8/1r3q2/R6B/k6Q/8/5B2/5K1B b - - 43 +2nk4/5Kr1/7B/8/6r1/6NB/4RB2/8 w - - 41 +r7/6k1/7R/8/2N1br1K/3b1N2/4R3/8 w - - 49 +r7/3pr3/6K1/2k5/R1N5/3p3P/R7/8 w - - 86 +2nq4/3nn3/7B/8/8/1kBb3b/8/6K1 w - - 10 +8/8/2B1N1n1/b3n3/8/2k3N1/1N4Kp/8 w - - 61 +6k1/3n3b/3R4/1p3R2/6B1/5r2/1R6/1K6 b - - 68 +1n6/2k2r1p/7b/3b4/4R3/5B2/6K1/5B2 b - - 14 +1k6/5p2/8/Q1b5/3B4/8/p5P1/2RNK3 w - - 74 +7K/3b4/7N/8/5k2/1n3B2/PR2N3/2R5 b - - 13 +1b1K2k1/6n1/1n6/2QB4/5n1N/7Q/8/8 b - - 21 +5k2/1n2q3/8/4r3/3Q2n1/8/1B1N4/2R1K3 w C - 81 +8/8/2k1r3/3bK3/r2nR1b1/8/5Q2/7R w - - 19 +1k3n2/1q6/1K6/8/1b6/4r3/p5B1/Q5N1 w - - 52 +5K2/n7/8/4Bq2/1B1p4/2b5/1k3N1R/8 w - - 46 +6q1/8/np6/2N2N2/2b5/3B4/KB3k2/8 w - - 47 +1n6/2n5/7b/R7/1B2n3/8/6B1/K1k4N b - - 34 +6b1/3p1n2/2N5/2Bp4/4B3/3R2k1/8/4K3 b - - 19 +b7/8/3r4/3K1k2/8/4n1b1/7P/R2B3Q w - - 28 +7b/1rK5/8/2r5/7k/NR4n1/B2B4/8 w - - 57 +2Kbr3/b4k2/7N/1RR5/7b/2Q5/8/8 b - - 79 +8/1rn5/2RB4/1N6/4k3/4b3/6K1/1B1R4 b - - 8 +8/2nn1K1q/3N2Bk/7r/1r6/8/7p/8 w - - 78 +6b1/3rK3/1N3b2/1Nk5/2p1B3/8/8/2N5 w - - 21 +8/6p1/7Q/7k/4N3/3K2N1/pB6/2B4N b - - 89 +1b6/8/4K1b1/4b3/8/1k4n1/P5Q1/3N3R b - - 48 +8/3n4/2k2B2/p3n2N/1R4b1/2K5/4p3/8 b - - 31 +3b4/3nk3/4rN2/r7/6N1/8/2R3K1/6R1 b - - 20 +8/r2r4/7R/8/8/5N2/B2R3k/KRR5 b C - 45 +6kn/p7/2B4K/8/1p6/8/2N3P1/5N1B b - - 72 +8/8/4kr2/2r5/8/q2n4/B2Q4/KN2R3 b E - 56 +7n/8/8/Q7/3nQ2K/8/2PR3P/5Nk1 w - - 50 +8/2r1b3/7B/2K5/1R3r2/1RB5/3N4/4k3 w - - 25 +1qK3r1/2n5/n2k4/8/2b5/2B5/8/4Q2Q w - - 88 +7n/8/1B6/1N6/2P5/2k2nNK/8/1BB5 b - - 0 +8/2n1k3/B3n3/8/4N3/5qB1/6BK/B7 w - - 35 +K3q3/8/8/B7/b5N1/N3b2B/k7/3R4 w - - 49 +2n4n/2k5/2p2K1q/2n4B/1N6/7p/8/8 w - - 39 +3b4/8/3b4/6r1/6k1/5P1b/K2P1B2/1N6 b - - 30 +1n2Kq2/2b5/6P1/1r6/8/Br6/6p1/k7 w - - 17 +8/3p2n1/2k5/8/R3K3/6pb/N5B1/6R1 w - - 79 +8/8/Nr6/6P1/4b1B1/7R/1P3K1k/R7 b - - 99 +8/3n4/1B1r4/4k2q/2Q5/2R4p/K7/4Q3 b - - 14 +8/8/5rk1/6q1/8/3bK1bb/2N2PR1/8 w - - 8 +Knb5/4n3/3q4/5b2/q5b1/7r/8/k7 w - - 84 +4k3/1q6/1Nr1B3/Kn6/3q4/6Q1/8/7B b - - 35 +b7/8/2n5/4r2k/1Kr5/8/B1N3RB/8 w - - 82 +1b4n1/1r2qp2/4n3/8/8/2kN2r1/4K3/8 w - - 78 +4b3/1r5n/r7/5n2/K7/7P/1P2N3/7k w - - 52 +2K2k1n/4r3/8/1N5b/6NN/7n/1N6/8 b - - 39 +8/qr6/1N1Nn1NK/8/8/1b3k2/8/2B5 w - - 85 +2r5/7p/b5P1/8/k2R3K/2q5/3B1Q2/8 b - - 74 +8/1b6/1k3B2/1B5N/2r5/8/2pK1B1B/8 b - - 43 +1n4K1/3rr3/1k6/b4p2/2B5/2P5/8/4B3 b - - 92 +1k4q1/8/8/4BK1n/6n1/B7/2RP4/7B b - - 55 +8/K7/8/6B1/B5k1/2q5/1R1NP3/2R1N3 b - - 23 +8/4p3/4P3/7P/N3B3/5N2/4PK1k/6N1 b - - 1 +6K1/2b2p1r/B5nB/8/5p2/2k5/5R2/8 w - - 30 +8/1nb5/K1kN4/8/8/6r1/RR2PB2/8 b - - 24 +1q6/2K2r2/7p/3k1N2/5b2/7n/4NN2/8 w - - 15 +b5b1/3bK3/7n/N1q5/k3n3/8/2P5/8 w - - 62 +4n3/7b/7P/3k3K/3pN3/4q3/6N1/R7 w - - 99 +8/1k1r1r1n/8/8/4K3/b2B4/8/2R1Q2B w - - 28 +b5K1/2b5/3N1P2/N7/8/rk6/8/3R2B1 b - - 15 +3k4/3r4/2p5/2K2p2/1n2N3/8/p3R3/1B6 w - f6 95 +k7/8/2b5/1R5B/8/2N5/2B1R3/Q1QK4 b - - 12 +k7/2b3n1/6B1/8/3B2B1/P6r/R5K1/8 w - - 52 +5r2/1p6/6p1/4P3/rR5B/4k2N/2K5/8 w - - 37 +2nk4/8/7B/6R1/4n3/6q1/5RP1/4NK2 w - - 85 +n7/8/3n4/6K1/6n1/5B2/B5B1/1k1QB3 b - - 67 +3K1n2/3n4/3N1k2/8/p7/2q5/1P5P/5N2 w - - 73 +1K2k3/8/8/q2r4/1n6/1p1N4/3N1B2/7Q b - - 5 +1n6/1p1n1k2/1K1b1r2/8/7B/1n6/p7/8 w - - 27 +8/4K3/kB1R4/8/6p1/1R6/pRp1B3/8 b - - 57 +8/7q/6Rk/7q/5Q2/4n2P/1B6/3RK3 b D - 95 +6k1/4bn2/1Nn2B2/7B/1K6/8/8/2B1B3 w - - 67 +7n/2n4n/2q5/k3B2R/2R2K2/8/7P/8 b - - 63 +1r5k/8/4n3/1QBP1KB1/3b4/8/6P1/8 b b - 67 +8/4b1nK/8/3Rn3/2p1b3/7R/3P4/3k4 w - - 19 +3r4/1n6/1k6/2P5/3R4/3KNr2/1B1R4/8 b - - 26 +5Kn1/3bn3/8/5k2/8/5R1b/2NP4/7B b - - 30 +8/4b3/B7/3NQ3/5K2/P1k5/7N/3Q2B1 b - - 44 +2r5/pr2r3/8/8/N6Q/p2k4/4B1K1/8 b - - 59 +r4nr1/8/7K/1k2q3/6R1/6p1/N7/B7 w - - 42 +4k3/4n3/3N4/1N5r/8/1N6/R1KB4/R7 b - - 29 +8/p2k3K/3r4/3N2r1/8/4N3/8/1N3B1B b - - 1 +8/p3K2p/q5b1/5N2/2Q1N3/8/B4k2/8 b - - 38 +8/1r6/1N3b1r/7k/3p4/3p4/1p6/B5K1 w - - 43 +r3q3/4b3/1R6/8/8/4N3/1k1N4/1B1K3N b - - 83 +2b3b1/2nr2bk/3N4/8/2R3K1/8/8/1N6 b - - 4 +2b5/b1n5/1br1k3/3p2K1/2b4b/8/8/8 w - - 53 +1k1r4/4K3/8/8/8/4PBb1/1B3N2/5R1N w d - 99 +8/3n1b2/3bN3/1k1Kp3/8/8/5N2/4RB2 b - - 62 +5q2/3b3K/8/3rB3/1N3R2/2k5/R2P4/8 b - - 94 +5Kn1/2r5/4k3/N7/6N1/8/2pQ3B/N7 b - - 68 +1r5n/2b5/4K3/2N5/8/4k3/4N3/B2R1R2 w - - 82 +n7/1p6/R3K1r1/2r3p1/7k/2r2n2/8/8 w - - 13 +1r1r4/5K2/5r1Q/7q/3k3n/8/2B5/5Q2 w - - 66 +3K4/r7/4q1b1/8/3B4/kq6/2p3R1/R7 b - - 27 +1K6/6k1/8/8/pbbPR3/2Q5/8/3Q1B2 w - - 86 +1r2q3/8/1b1K2r1/8/3r4/k6B/7P/7R w - - 59 +5n2/6b1/8/7k/1b1R1K1n/4r3/Q2R4/8 b - - 57 +6n1/8/2q5/2N2r2/1K4R1/5k2/7B/4QN2 b - - 63 +8/8/qb1NQ3/5R2/1K2b1b1/8/pk6/8 b - - 26 +8/7k/5rp1/7R/5p1b/2K5/2BQ3B/8 b - - 12 +8/8/4N3/2K3r1/1N1N1q2/8/N7/1k1N1R2 w - - 59 +8/3b4/2q5/r1K5/8/5r2/kBR1NR2/8 w - - 11 +K5n1/5k2/8/5nR1/3r3p/5B2/3R4/1R6 w - - 85 +6r1/4qb2/qR4k1/8/8/3B2N1/QK6/8 b - - 55 +1k6/5b2/r4Pn1/K1R5/4R3/7N/4B3/8 w - - 98 +8/7k/1q6/3qB2q/2K2R2/2P2R2/B7/8 w - - 6 +8/3r4/6N1/k1N3R1/1q1K3b/8/6N1/1B6 w - - 56 +6n1/n3k3/1PB5/5B1N/r4Kn1/8/8/8 w - - 6 +8/b4p1b/2K5/5B1k/8/b4p2/R6R/8 b - - 32 +4k2n/8/5N2/4N3/8/3n3B/1N3PP1/7K b - - 45 +5k2/rb2p3/1P1B4/3r1K2/8/1B6/8/B7 w - - 82 +8/1b4r1/8/8/K2B4/8/1pN4B/k3N1R1 b - - 69 +8/2bk4/2p5/4KnnN/4n2n/8/7B/8 w - - 38 +7r/1K6/5R2/R7/1pB2b2/pk1q4/8/8 b - - 50 +8/b7/2B3K1/8/N1b2N2/8/2k2Q2/1R4N1 b - - 59 +q4K1r/2k1r3/8/1B6/1r6/6q1/4P1B1/8 w - - 64 +8/r5p1/8/1Q6/b4q2/QK2k1n1/8/1B6 w - - 1 +r2r1K2/k2bn3/8/B7/2R5/1P1r4/8/8 w - - 3 +8/2q3p1/2p3K1/8/4BrB1/8/2k3B1/5R2 b - - 9 +n7/7b/n7/5b2/4K2B/k1N5/3p4/4N3 w - - 11 +5q2/6br/1k6/4pR2/7r/Q2Q4/3K4/8 b - - 30 +b2k2qb/8/8/1N6/5bq1/8/3KB3/5R2 w - - 4 +4r3/3K4/7B/1N6/8/1rn5/1P2k3/4BB2 b - - 40 +8/r2n4/8/2P5/1b6/Q3B3/5KQ1/1k4R1 b - - 51 +4k3/8/6r1/5P1r/NQ6/1p2pKB1/8/8 w - - 1 +8/7b/7r/2Q5/5k1N/3r1n1K/4P3/2B5 b - - 24 +5q1b/2k5/1q5r/8/p7/5b2/4K1B1/3Q4 w - - 72 +8/1bq5/2P5/6r1/1k3r2/6K1/4Q2B/6R1 w - - 49 +7k/7n/B7/8/2rrK1B1/n7/5R2/2R5 w - - 98 +bn3k2/8/8/B2r4/8/bb3Q2/6B1/K7 b - - 41 +6b1/2n5/6q1/p2r2k1/8/8/1B1K2B1/N7 w - a6 63 +r3K3/6n1/7n/b2p4/2p2k2/8/1P4p1/8 w - - 77 +8/2K5/2p2Q2/1b2k1bP/8/7R/8/5NB1 b - - 41 +2n5/8/8/4k3/3N4/r5N1/B1R5/3K1R1N w - - 31 +3brr2/8/8/2K1P1R1/2B5/pk6/5N2/8 b - - 29 +4b3/5rn1/7p/8/8/7b/3K1P2/k4B1B w - - 17 +8/2n3k1/b2Q2Q1/4K3/1N6/7b/B1N5/8 b - - 84 +8/8/Pq6/1pk5/5P2/n4Kr1/4B3/R7 w - - 4 +1r6/1pb5/5R2/2q2K1B/4r3/1n5k/8/8 w - - 46 +r7/8/6k1/8/1n5B/4p1b1/1BK5/4B1B1 w - - 94 +rb1r4/8/5R2/2K5/1r5B/5B2/3N4/5k2 b - - 36 +r7/8/6R1/8/6kb/1rB5/2K1P1P1/2B5 b - - 20 +1b6/bb3r2/8/7p/k7/6K1/3NB3/3N4 w - - 88 +nn6/1n6/1n6/1p1K4/1k6/2q5/8/R1B5 w - - 80 +2nn4/8/4b3/4K3/5bP1/3n1n2/8/3N3k w - - 32 +2b5/2n1k2r/8/8/8/8/PP4NP/1R5K b B - 25 +4k3/5b2/b3rK2/1N6/6rB/8/4P2P/8 w - - 26 +7k/2K1r3/8/6N1/p3r3/3b2N1/N7/6B1 w - - 17 +8/1q3n2/8/3n3n/N7/5k2/2pp2p1/6K1 b - - 16 +1n4r1/b4kp1/2n5/3K4/4Rr2/8/8/N7 b - - 65 +n7/5K1b/N4Q2/8/8/N6r/2PB3k/8 w - - 50 +1k1q4/8/N6N/1B6/2rR4/1K1N4/5R2/8 b - - 81 +k7/1b6/8/K7/3r3n/2R2q2/BR5N/8 w - - 79 +8/2n3n1/8/5bk1/2q1K3/n7/8/RB5N w - - 57 +k1K5/q7/4bP2/2Bb4/8/8/P3N2P/8 w - - 60 +7K/5n2/3Nk2B/4n3/8/3B1P1p/5p2/8 w - - 16 +2b3b1/3b4/3k4/8/B3pK2/8/p7/1B4B1 w - - 27 +1Kq2n2/8/1P6/2B4r/7k/7P/6P1/3B4 w - - 34 +8/5p2/6B1/3N1k2/1B6/5K2/p4N2/2R1Q3 b - - 88 +K7/8/RN5R/7P/8/8/3NRR2/3Bk3 b - - 5 +1r6/8/8/k2n4/8/nK6/3P1Qp1/5RB1 w - - 44 +2k3b1/8/4P3/2r5/n7/4n1B1/4P3/1QK5 w - - 35 +8/2b5/Bn5k/3NK3/1B6/5Q1r/1p6/8 w - - 86 +2k5/8/2r3Q1/2rB4/7K/Pb2b3/8/6B1 w - - 76 +1Kb5/2r5/B7/8/5p2/8/5P2/1NkBB3 w - - 55 +4n3/4K3/8/1R1b1br1/2N5/1b6/6k1/3R4 b - - 43 +3q4/1b4bp/5K2/8/p7/2BB1k2/4R3/8 w - - 49 +4K3/br2r3/6N1/4r3/2kp4/3b4/2P5/8 w - - 61 +5b2/2p1n3/2K4q/1r4k1/8/4n2r/8/3B4 w - - 3 +1r6/k3b1br/8/8/1q4KR/1B6/3P4/8 w - - 21 +2n1n3/8/1BkQ4/8/8/2r5/B1p1K3/B7 b - - 95 +4r3/6q1/2r5/4p3/B7/3k4/8/Q2KRR2 b F - 34 +8/8/1NB5/6P1/6Q1/5nN1/3kB2K/7N w - - 38 +8/2b2K2/B2B4/3R1k2/8/n4N2/5p2/B7 b - - 70 +rn6/5K2/k7/B5N1/8/4R3/4B3/5N1Q b - - 3 +1n6/8/b7/6k1/5q2/2KR2r1/8/5QBR b - - 77 +5K2/8/8/Q3n3/4R1N1/B2k4/p1R5/7N w - - 19 +8/2n5/4R3/5qk1/5R2/8/1K4Bp/3N2B1 b - - 2 +2K5/8/8/6P1/2np3q/8/1QN5/2kRB3 b - - 78 +b3r3/2k5/8/8/2N4r/2r2R2/5K2/2N4R w - - 65 +4b3/2rn2Kb/8/3q4/np6/8/5R1k/8 b - - 72 +6q1/3K4/6p1/8/8/1b2r2r/1P3k2/5B1R b - - 17 +2k2n2/r2q4/8/1Q4q1/1r6/1B6/2K5/3N4 w - - 14 +8/8/r2R4/4R3/K5b1/P1N5/1k1P4/R7 w - - 57 +7n/3K2qr/7k/8/2r1P1n1/7n/2N5/8 w - - 24 +3r2b1/p4b2/q7/6q1/3KR3/8/k1B5/8 w - - 44 +1q5q/7b/k2R4/4P3/5b2/2K5/3PR3/8 b - - 99 +8/8/2p5/N3K1NR/7R/8/1R6/k4RN1 b - - 55 +8/3r4/n3Kn2/3Rq1k1/8/8/R1PN4/8 w - - 87 +n7/5r2/8/8/3Knk2/3N2B1/3Q4/Q5B1 b - - 29 +4n3/1nr5/1NQ5/8/4n3/8/5N2/1Bk2K2 b - - 28 +2b5/1r4k1/1pq5/3P4/NR6/8/Q7/7K b - - 94 +1r2r3/2b5/8/4k3/8/3p4/4NR1R/B6K b - - 95 +1n4r1/5r2/6R1/8/3Q4/1B1K4/7N/3k2R1 b - - 86 +8/8/1q4r1/5kB1/8/2R5/N1K3R1/6BR w - - 32 +1k6/3b1b2/4b1n1/8/3NB3/5n2/1Q6/K7 b - - 47 +2n5/k7/8/3Q1n2/Bn2B2K/8/8/6NR w - - 8 +5b2/4p3/4k1Q1/2nq4/2P4K/7R/7P/8 b - - 14 +8/6nr/4p3/1k2K3/5rR1/8/1N3p1p/8 w - - 71 +4r3/b2k4/3N1K2/8/4n1R1/2N5/3Q4/1B6 w - - 67 +2n5/bb4b1/2k5/4p3/8/7b/K1P2Q2/8 b - - 65 +n1r5/5r2/8/3n4/7B/3K4/Bp4k1/N7 b - - 31 +q3b3/8/7k/3P2P1/2K3B1/8/4p3/2RN4 b - - 45 +8/1b6/4B2b/1b6/1k6/3B4/2RK2N1/R7 w - - 87 +6r1/8/1K1R4/5Q2/7k/7Q/PP4QN/8 b - - 60 +8/8/3K4/P7/7k/4q2p/2R5/2RN1NN1 b - - 44 +3b2n1/4p3/8/3Kn3/8/B5B1/5N2/1R2k3 b - - 67 +1nb1b3/8/3K2B1/8/8/2N1n3/1k1p2P1/8 w - - 54 +8/2K5/RnN5/5k1p/4B3/8/1Q6/1BQ5 b - - 11 +1rk3q1/3p4/7n/K7/QN6/4R3/2N5/8 b - - 33 +Kq6/8/1R4Nk/8/5N1N/4p2R/6N1/8 w - - 2 +2r5/1p3q1r/8/8/4rk2/7N/B4Q2/6K1 b - - 67 +7b/2r2p1q/N3N3/1k6/8/8/p7/3NK3 b - - 23 +8/4b3/8/2n1B3/2Kn1B2/8/P1kP2N1/8 b - - 12 +6br/3q2r1/4P3/3p4/3kb3/K7/4R3/8 b - - 11 +3r4/8/Q5kB/8/1B6/6p1/1P1P4/1R2K3 b B - 88 +8/8/8/3R4/1R1p1bBR/2K5/B4kP1/8 w - - 30 +1bb5/n3r3/k7/7n/8/3N2K1/1p6/N7 w - - 81 +2r5/pr6/4bB2/8/r7/2k5/6KP/2N5 b - - 71 +K7/p4k2/2B2N2/8/7q/5B2/4N2R/3N4 w - - 70 +1r6/4r3/R7/1b3q1k/K1nrb3/8/8/8 w - - 48 +8/5K1r/R7/rr6/B3r1B1/8/k7/B7 w - - 64 +8/pr6/8/2k5/1rb1K1R1/8/4B1Pp/8 b - - 78 +3rbb2/8/1Q3K2/8/1N4k1/N7/8/6RB b - - 31 +1b6/8/8/8/PK5P/PN6/2R1kB1P/8 b - - 36 +2b5/8/7R/5n2/3p1b2/8/5p2/2RN1K1k b - - 56 +3b4/4p3/7N/6K1/2b5/nR1nk3/4B3/8 w - - 59 +7K/1p6/6k1/1N3B1R/1r6/3N4/2Q5/R7 b - - 73 +8/2bpb1rp/4pb2/5k2/2b5/8/2K5/8 b - - 81 +6K1/r1k5/8/1r6/2q5/5B2/1B6/3R2NB w - - 91 +b1r5/8/1B6/7b/1K6/1Q3k1B/7P/R7 b - - 52 +7n/n5k1/8/3b4/n4K2/1Qr5/8/2B4R b - - 53 +n7/1r1pb3/8/4k3/7b/4B3/1N3K2/R7 w - - 73 +1n3b2/2k3r1/8/3K2P1/8/8/N4Qp1/3R4 b - - 24 +4r3/8/n7/4B2n/5N2/2k5/P5NK/7N b - - 80 +8/6r1/5NK1/2k2P1Q/3b4/8/4N3/3Q3R w - - 37 +8/8/b4Q2/B7/3k4/3n2Q1/2P5/K2NR3 b E - 65 +1q6/1rb5/Bn5k/8/8/1r4n1/4K3/N7 w - - 19 +5r2/r7/2N4p/1K2n3/4Q1N1/8/2P5/3k4 w - - 21 +2n5/n7/q7/6K1/8/p6k/2N2B2/1BB5 w - - 70 +3k1n2/3n3K/b2R4/8/8/4P1q1/4p3/7R w - - 49 +8/8/4B3/8/3R4/1r3b1k/7B/1Q1RKN2 b - - 24 +3k4/8/8/R7/8/n1N5/R2B1BK1/4N2N w - - 95 +7r/3k4/2R1N3/7r/2n5/5B2/7K/4QB2 w - - 23 +1Kr5/3b1n2/8/5nn1/8/7k/4N2B/6B1 w - - 94 +4b1K1/2b5/1n3R2/2r5/2r5/8/B6R/6k1 b - - 61 +8/1qr5/7Q/1Rk3B1/8/8/2K2P2/5RN1 b - - 85 +6rb/k1n5/8/2n5/1b6/2R2rR1/2K5/8 w - - 60 +5K2/2q2r1q/2B5/2p1b3/3k4/q7/7B/8 w - - 49 +2q3r1/4n3/5K2/2k5/3n4/b5R1/6R1/2R5 b - - 32 +2k5/br6/3Kr2r/5nR1/8/1B6/1R6/8 w - - 61 +5b2/8/n1r3K1/8/1Nk3r1/5R2/1B6/1B6 w - - 29 +1b6/8/1b2k3/3P3p/4p3/8/1P2PN2/1K6 b - - 81 +4b1r1/1k2n2K/8/8/6q1/2n5/R7/2R1N3 w - - 21 +8/p2r1p2/K4p2/8/8/5pN1/7k/B1Q5 b - - 30 +8/2K2b2/7r/4q3/N7/1q1kP3/8/2RB4 w - - 48 +8/8/BN6/1K6/1Q4nk/6B1/5P2/4RB2 b - - 26 +n7/1k4n1/B7/1R2n3/8/2r5/1P6/3KB3 b - - 71 +8/2b1nb2/8/3R4/1KB5/5r2/1N2B3/6k1 w - - 52 +8/r2p4/8/1rB5/k3Q3/4P2b/6R1/4K3 b - - 77 +1b5q/2b5/3r1K1B/7r/3k4/2n5/P7/8 w - - 76 +b7/3r3p/3Rr3/K7/8/1b4n1/4k1P1/8 w - - 39 +2n5/n6k/4Q2r/2K5/5Br1/N7/5R2/8 b - - 58 +8/k7/8/r5r1/3R2r1/8/RpRKP3/8 w - - 46 +8/1p6/5rr1/3K4/8/2r2N2/4PR1k/2R5 b - - 73 +5K2/8/6N1/2k5/7B/2Q3r1/1PNB3R/8 b - - 27 +8/4K3/1B4bn/3b4/1kn3Q1/4n3/8/2B5 w - - 14 +8/4r3/8/1k4B1/7P/8/R2Kp1P1/4N1N1 w - - 8 +K2n4/1n3n2/8/2k5/5N2/1P1q2R1/8/6R1 w - - 98 +8/8/3p4/p7/2bK3B/8/1B5p/1Bk4B b - - 7 +2n5/3r4/5n2/6B1/1k4bq/8/1P2K3/1N6 w - - 33 +5n2/5K2/2N5/Bkb5/8/7n/1B2B3/6B1 b - - 45 +6n1/8/b4b2/8/4r3/B3RK2/5Q2/1B4k1 b - - 35 +1k6/1r5n/8/q7/NK1Nn3/8/1B6/4R3 w - - 24 +1rkr3b/b2r2K1/8/6R1/8/B7/8/3B4 w b - 80 +b5q1/8/2n1r3/1n5r/5b2/8/1K1P1k2/8 w - - 74 +2b5/1n1p4/6K1/3NB3/1B6/2r2k2/8/B7 w - - 27 +1rb4n/8/1NK1q3/8/5q2/7B/8/3Nk3 w - - 22 +7r/1bb5/4B1k1/4R3/nn4K1/5R2/8/8 w - - 0 +n4kn1/6n1/6Qr/5K1n/8/5R2/6P1/8 w - - 72 +8/1r1r4/1B6/2r5/5R2/8/N1Nk3Q/6K1 b - - 86 +kn3r2/1bq5/1n6/8/2K5/5B1B/8/7B w f - 82 +1n6/2k5/1q4b1/B2K4/8/2P3n1/3p1R2/8 w - - 22 +8/rb6/8/6K1/2R1r3/3N4/P2k2N1/2R5 b - - 8 +4K3/1r4n1/pb6/1N6/8/5RR1/1N6/4k3 w - - 47 +q1q5/8/8/7N/Q5N1/8/4BKN1/1R1k4 b - - 38 +5k2/2n5/8/6Kp/3R2B1/1b6/2N2R2/3B4 b - - 9 +8/2n3r1/6k1/1N6/3b4/4P3/1RK1R3/3Q4 b - - 71 +3r3k/2Kb4/6r1/2qQ3N/8/8/P7/3B4 w d - 73 +7r/8/2K5/8/1rr2N1k/1Q5N/1R2p3/8 w - - 48 +1b1r4/3n2p1/8/1K6/N7/5P2/4B3/1B4k1 b - - 44 +4q3/6n1/2BB1R2/N7/2k5/3B4/2K5/R7 b - - 45 +1r6/7k/5K2/8/2n5/4r1pN/4N3/4NB2 w - - 99 +8/8/5k2/Rnr4n/1b3Q2/8/7K/5RQ1 b - - 5 +1b2b3/1K1k4/3N4/2B2R2/7B/7P/3P4/8 b - - 76 +8/7k/5p2/1r3b2/3NRb2/3r4/8/1K2R3 w - - 71 +b7/n7/8/8/5Q1N/1k5R/1R3P2/2K2B2 b - - 70 +1K6/1b6/4Q3/1R1q1r2/5B1k/2r4B/8/8 w - - 91 +8/8/N2N4/2n4K/N7/n3k2B/3P4/6B1 b - - 7 +7n/4b1qK/1B6/8/3r4/2r1Q3/5R2/1k6 w - - 79 +8/p3b3/8/r1b1r2N/8/3K2N1/4p3/4k3 w - - 89 +7n/8/8/RN1r1b2/1K6/2b4k/1N6/7N w - - 12 +3k2q1/8/4K3/8/1R6/8/P4BP1/N1Q1R3 w - - 68 +1b6/3r4/3B4/1p6/7N/3k4/3R3K/1N3R2 b - - 84 +r3n1K1/8/1k6/8/3r4/2r3b1/7R/5NN1 b - - 8 +2n5/3np3/8/p4K1Q/2N5/1R6/1k6/7N b - - 92 +3n4/bnp2n2/3q4/7R/8/k7/8/4K1R1 b - - 63 +8/8/1N6/K5R1/3R4/5PN1/5B2/B5Nk b - - 57 +5n2/3p2r1/2K5/1B3k2/7b/7q/8/1N4N1 w - - 38 +n1k1b2r/8/q4N2/8/4r2K/8/N6N/8 w h - 84 +8/2q5/3bk3/8/2q5/r7/K1Bp3P/5R2 w - - 76 +8/8/6n1/3k4/2R4R/5K2/2P5/2R1BB1N b - - 71 +2n5/1n6/3b4/8/6bb/r1B5/7K/2k2B2 w - - 64 +7q/1pK5/4B3/8/4N3/n5b1/8/1N1kB3 w - - 89 +2b5/2nb1r2/2k5/b7/2N3n1/8/5R2/K7 b - - 12 +8/8/3k3b/8/PB5Q/2R3pR/PK6/8 b - - 56 +1n1r3r/8/2k5/8/8/6nN/BN6/2K2N2 w - - 69 +8/1p2q3/b3k3/2N5/8/5nn1/4N3/1KN5 b - - 6 +3k4/r1n1r3/N2N2q1/5Q2/8/8/7B/6K1 w - - 54 +4r3/8/5r2/3qP3/6N1/1kP5/5KR1/1B6 w - - 86 +6n1/7r/7n/7b/8/7k/8/1KR2NQQ b - - 8 +b3rr1K/4k3/2BR4/6R1/1b6/1b6/8/8 w - - 44 +8/1p4r1/6B1/N2k4/6B1/4b3/3B1PK1/8 b - - 4 +2b5/5bk1/8/q2Q4/K2P4/7R/8/3N1B2 w - - 91 +1rb4k/8/b7/1n6/7r/KQ6/Q6p/8 w - - 48 +8/1nq4b/8/3n2b1/kr6/7K/1N1p4/8 b - - 75 +2nr2n1/6k1/8/2b1K3/8/6pb/2B5/R7 w - - 44 +7n/2r5/4r2b/R7/7N/5K2/kP6/5R2 b - - 67 +8/8/6Nk/3r4/2P5/7B/6RB/3K1RB1 w F - 98 +4r3/8/2N4q/3B4/4kb2/2KR4/P7/1N6 b - - 47 +1r1k4/8/8/2p3N1/3K2p1/8/1R2N2R/4R3 w b - 98 +b1Kn4/1b5n/8/n7/7n/kn6/8/3N4 w - - 86 +1q1q4/1rkp4/4K3/8/1N1B4/4n3/2B5/8 w - - 6 +8/b3n2r/BKrR4/6k1/8/2nN4/8/8 w - - 37 +5b2/b1rk4/3N4/6b1/7K/1b6/7R/5R2 w - - 43 +1rk1K3/8/8/5r2/1RQ1R3/8/7R/2R1R3 b - - 81 +b5K1/5r2/1k4n1/3Q4/b7/1R6/6B1/3N4 b - - 12 +8/3p1b2/5r2/3k3N/4r1n1/8/5N2/2K3B1 w - - 96 +6br/8/Nk2N3/6q1/3R4/6K1/7Q/2Q5 w - - 57 +1k2n1n1/1r6/8/2n5/2q4n/5r2/5p2/K7 b - - 64 +nk6/b7/1B2R3/4Q1nb/8/4K3/8/N7 b - - 5 +2n4q/7b/6P1/K2k4/6p1/3B1q1N/8/8 w - - 69 +4rq2/2b5/2k1n3/8/1R3n2/6b1/1B1K4/8 b - - 26 +3r3k/5b2/n1P5/PK6/4p3/p7/8/7N w d - 32 +8/3b4/r4n2/3k3B/8/8/P2K4/N1Q1B3 w - - 64 +4Kb2/4r1p1/b7/k7/2n3q1/bB6/8/8 w - - 74 +8/2rk4/8/5N2/3nr3/7N/1BK1P3/5R2 w - - 13 +8/3r1k2/2Kbq3/8/1p6/2n3R1/8/R5R1 w - - 69 +2Kb2bn/n7/5N2/3B2R1/8/4k3/8/4B3 w - - 88 +6r1/n7/6q1/5B2/4n3/b2K4/2N5/3k1R2 b - - 28 +6r1/5n2/k4K2/3R4/4b3/1Qr5/3N4/Q7 b - - 67 +8/8/4r2k/5r2/5N2/3b4/3N4/RQ1K3B w - - 61 +r2r2k1/8/3B4/5Kq1/nQ1B4/2p5/8/8 w - - 42 +8/1K4nn/2r5/7B/8/7R/1k1Q3P/3B4 b - - 33 +6k1/4q3/1N5n/8/8/2qr3n/3K4/3R3N w - - 17 +4kn2/5r2/8/4N3/8/1nQ5/6R1/1B1K2B1 w - - 83 +1r6/2K5/n3k1B1/1b6/P7/8/P2P4/2R5 w - - 77 +8/8/2P3N1/4Q3/6Kn/2p5/Q1R5/3kB3 w - - 94 +K3kb2/6bn/8/nN6/8/8/2R5/3N3R b - - 49 +r4k2/b7/7r/Q3K3/8/1qN1q3/N7/8 w - - 70 diff --git a/src/syzygy/tbcore.cpp b/src/syzygy/tbcore.cpp index f45da953..6cf33ec2 100644 --- a/src/syzygy/tbcore.cpp +++ b/src/syzygy/tbcore.cpp @@ -7,12 +7,13 @@ a particular engine, provided the engine is written in C or C++. */ -#include -#include +#include #include #include #include #include +#include +#include "../thread_win32.h" #ifndef _WIN32 #include #include @@ -23,538 +24,556 @@ #define TBMAX_PAWN 256 #define HSHMAX 5 -#define Swap(a,b) {int tmp=a;a=b;b=tmp;} - -#define TB_PAWN 1 -#define TB_KNIGHT 2 -#define TB_BISHOP 3 -#define TB_ROOK 4 -#define TB_QUEEN 5 -#define TB_KING 6 - -#define TB_WPAWN TB_PAWN -#define TB_BPAWN (TB_PAWN | 8) - -static LOCK_T TB_mutex; +static Mutex TB_mutex; static bool initialized = false; -static int num_paths = 0; -static char *path_string = NULL; -static char **paths = NULL; +static std::vector paths; static int TBnum_piece, TBnum_pawn; -static struct TBEntry_piece TB_piece[TBMAX_PIECE]; -static struct TBEntry_pawn TB_pawn[TBMAX_PAWN]; +static TBEntry_piece TB_piece[TBMAX_PIECE]; +static TBEntry_pawn TB_pawn[TBMAX_PAWN]; -static struct TBHashEntry TB_hash[1 << TBHASHBITS][HSHMAX]; +static TBHashEntry TB_hash[1 << TBHASHBITS][HSHMAX]; #define DTZ_ENTRIES 64 -static struct DTZTableEntry DTZ_table[DTZ_ENTRIES]; +static DTZTableEntry DTZ_table[DTZ_ENTRIES]; static void init_indices(void); -static uint64 calc_key_from_pcs(int *pcs, int mirror); -static void free_wdl_entry(struct TBEntry *entry); -static void free_dtz_entry(struct TBEntry *entry); +static uint64_t calc_key_from_pcs(int *pcs, bool mirror); +static void free_wdl_entry(TBEntry *entry); +static void free_dtz_entry(TBEntry *entry); -static FD open_tb(const char *str, const char *suffix) +static FD open_tb(const std::string& str, const std::string& suffix) { - int i; - FD fd; - char file[256]; + FD fd; + std::string file; - for (i = 0; i < num_paths; i++) { - strcpy(file, paths[i]); - strcat(file, "/"); - strcat(file, str); - strcat(file, suffix); + for (auto& path : paths) { + file = path + "/" + str + suffix; #ifndef _WIN32 - fd = open(file, O_RDONLY); + fd = open(file.c_str(), O_RDONLY); #else - fd = CreateFile(file, GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + fd = CreateFile(file.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); #endif - if (fd != FD_ERR) return fd; - } - return FD_ERR; + + if (fd != FD_ERR) + return fd; + } + + return FD_ERR; } static void close_tb(FD fd) { #ifndef _WIN32 - close(fd); + close(fd); #else - CloseHandle(fd); + CloseHandle(fd); #endif } -static char *map_file(const char *name, const char *suffix, uint64 *mapping) +static char *map_file(const std::string& name, const std::string& suffix, uint64_t *mapping) { - FD fd = open_tb(name, suffix); - if (fd == FD_ERR) - return NULL; + FD fd = open_tb(name, suffix); + + if (fd == FD_ERR) + return NULL; + #ifndef _WIN32 - struct stat statbuf; - fstat(fd, &statbuf); - *mapping = statbuf.st_size; - char *data = (char *)mmap(NULL, statbuf.st_size, PROT_READ, + struct stat statbuf; + fstat(fd, &statbuf); + *mapping = statbuf.st_size; + char *data = (char *)mmap(NULL, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0); - if (data == (char *)(-1)) { - printf("Could not mmap() %s.\n", name); - exit(1); - } + + if (data == (char *)(-1)) { + std::cerr << "Could not mmap() " << name << '\n'; + exit(1); + } + #else - DWORD size_low, size_high; - size_low = GetFileSize(fd, &size_high); -// *size = ((uint64)size_high) << 32 | ((uint64)size_low); - HANDLE map = CreateFileMapping(fd, NULL, PAGE_READONLY, size_high, size_low, - NULL); - if (map == NULL) { - printf("CreateFileMapping() failed.\n"); - exit(1); - } - *mapping = (uint64)map; - char *data = (char *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); - if (data == NULL) { - printf("MapViewOfFile() failed, name = %s%s, error = %lu.\n", name, suffix, GetLastError()); - exit(1); - } + DWORD size_low, size_high; + size_low = GetFileSize(fd, &size_high); + HANDLE map = CreateFileMapping(fd, NULL, PAGE_READONLY, size_high, size_low, + NULL); + + if (map == NULL) { + std::cerr << "CreateFileMapping() failed\n"; + exit(1); + } + + *mapping = (uint64_t)map; + char *data = (char *)MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0); + + if (data == NULL) { + std::cerr << "MapViewOfFile() failed, name = " << name << suffix << ", error = " + << GetLastError() << '\n'; + exit(1); + } + #endif - close_tb(fd); - return data; + close_tb(fd); + return data; } #ifndef _WIN32 -static void unmap_file(char *data, uint64 size) +static void unmap_file(char *data, uint64_t size) { - if (!data) return; - munmap(data, size); + if (!data) + return; + + munmap(data, size); } #else -static void unmap_file(char *data, uint64 mapping) +static void unmap_file(char *data, uint64_t mapping) { - if (!data) return; - UnmapViewOfFile(data); - CloseHandle((HANDLE)mapping); + if (!data) + return; + + UnmapViewOfFile(data); + CloseHandle((HANDLE)mapping); } #endif -static void add_to_hash(struct TBEntry *ptr, uint64 key) +static void add_to_hash(TBEntry *ptr, uint64_t key) { - int i, hshidx; + int i, hshidx; - hshidx = key >> (64 - TBHASHBITS); - i = 0; - while (i < HSHMAX && TB_hash[hshidx][i].ptr) - i++; - if (i == HSHMAX) { - printf("HSHMAX too low!\n"); - exit(1); - } else { - TB_hash[hshidx][i].key = key; - TB_hash[hshidx][i].ptr = ptr; - } + hshidx = key >> (64 - TBHASHBITS); + i = 0; + + while (i < HSHMAX && TB_hash[hshidx][i].ptr) + i++; + + if (i == HSHMAX) { + std::cerr << "HSHMAX too low!\n"; + exit(1); + } else { + TB_hash[hshidx][i].key = key; + TB_hash[hshidx][i].ptr = ptr; + } } -static char pchr[] = {'K', 'Q', 'R', 'B', 'N', 'P'}; +static std::string pchr = " PNBRQK"; +static std::string pchr_rev = "KQRBNP "; -static void init_tb(char *str) +static void init_tb(std::string str) { - FD fd; - struct TBEntry *entry; - int i, j, pcs[16]; - uint64 key, key2; - int color; - char *s; + FD fd; + TBEntry *entry; + int i, j, pcs[16]; + uint64_t key, key2; + int color; - fd = open_tb(str, WDLSUFFIX); - if (fd == FD_ERR) return; - close_tb(fd); + fd = open_tb(str, WDLSUFFIX); - for (i = 0; i < 16; i++) - pcs[i] = 0; - color = 0; - for (s = str; *s; s++) - switch (*s) { - case 'P': - pcs[TB_PAWN | color]++; - break; - case 'N': - pcs[TB_KNIGHT | color]++; - break; - case 'B': - pcs[TB_BISHOP | color]++; - break; - case 'R': - pcs[TB_ROOK | color]++; - break; - case 'Q': - pcs[TB_QUEEN | color]++; - break; - case 'K': - pcs[TB_KING | color]++; - break; - case 'v': - color = 0x08; - break; - } - for (i = 0; i < 8; i++) - if (pcs[i] != pcs[i+8]) - break; - key = calc_key_from_pcs(pcs, 0); - key2 = calc_key_from_pcs(pcs, 1); - if (pcs[TB_WPAWN] + pcs[TB_BPAWN] == 0) { - if (TBnum_piece == TBMAX_PIECE) { - printf("TBMAX_PIECE limit too low!\n"); - exit(1); - } - entry = (struct TBEntry *)&TB_piece[TBnum_piece++]; - } else { - if (TBnum_pawn == TBMAX_PAWN) { - printf("TBMAX_PAWN limit too low!\n"); - exit(1); - } - entry = (struct TBEntry *)&TB_pawn[TBnum_pawn++]; - } - entry->key = key; - entry->ready = 0; - entry->num = 0; - for (i = 0; i < 16; i++) - entry->num += (ubyte)pcs[i]; - entry->symmetric = (key == key2); - entry->has_pawns = (pcs[TB_WPAWN] + pcs[TB_BPAWN] > 0); - if (entry->num > Tablebases::MaxCardinality) - Tablebases::MaxCardinality = entry->num; + if (fd == FD_ERR) + return; - if (entry->has_pawns) { - struct TBEntry_pawn *ptr = (struct TBEntry_pawn *)entry; - ptr->pawns[0] = (ubyte)pcs[TB_WPAWN]; - ptr->pawns[1] = (ubyte)pcs[TB_BPAWN]; - if (pcs[TB_BPAWN] > 0 - && (pcs[TB_WPAWN] == 0 || pcs[TB_BPAWN] < pcs[TB_WPAWN])) { - ptr->pawns[0] = (ubyte)pcs[TB_BPAWN]; - ptr->pawns[1] = (ubyte)pcs[TB_WPAWN]; + close_tb(fd); + + for (i = 0; i < 16; i++) + pcs[i] = 0; + + color = 0; + + for (char c : str) { + auto p = pchr.find(c); + + if (p == std::string::npos) { + assert(c == 'v'); + color = 8; + } else + pcs[p | color]++; } - } else { - struct TBEntry_piece *ptr = (struct TBEntry_piece *)entry; - for (i = 0, j = 0; i < 16; i++) - if (pcs[i] == 1) j++; - if (j >= 3) ptr->enc_type = 0; - else if (j == 2) ptr->enc_type = 2; - else { /* only for suicide */ - j = 16; - for (i = 0; i < 16; i++) { - if (pcs[i] < j && pcs[i] > 1) j = pcs[i]; - ptr->enc_type = ubyte(1 + j); - } + + for (i = 0; i < 8; i++) + if (pcs[i] != pcs[i+8]) + break; + + key = calc_key_from_pcs(pcs, 0); + key2 = calc_key_from_pcs(pcs, 1); + + if (pcs[W_PAWN] + pcs[B_PAWN] == 0) { + if (TBnum_piece == TBMAX_PIECE) { + std::cerr << "TBMAX_PIECE limit too low!\n"; + exit(1); + } + + entry = (TBEntry *)&TB_piece[TBnum_piece++]; + } else { + if (TBnum_pawn == TBMAX_PAWN) { + std::cerr << "TBMAX_PAWN limit too low!\n"; + exit(1); + } + + entry = (TBEntry *)&TB_pawn[TBnum_pawn++]; } - } - add_to_hash(entry, key); - if (key2 != key) add_to_hash(entry, key2); + + entry->key = key; + entry->ready = 0; + entry->num = 0; + + for (i = 0; i < 16; i++) + entry->num += (uint8_t)pcs[i]; + + entry->symmetric = (key == key2); + entry->has_pawns = (pcs[W_PAWN] + pcs[B_PAWN] > 0); + + if (entry->num > Tablebases::MaxCardinality) + Tablebases::MaxCardinality = entry->num; + + if (entry->has_pawns) { + TBEntry_pawn *ptr = (TBEntry_pawn *)entry; + ptr->pawns[0] = (uint8_t)pcs[W_PAWN]; + ptr->pawns[1] = (uint8_t)pcs[B_PAWN]; + + if (pcs[B_PAWN] > 0 + && (pcs[W_PAWN] == 0 || pcs[B_PAWN] < pcs[W_PAWN])) { + ptr->pawns[0] = (uint8_t)pcs[B_PAWN]; + ptr->pawns[1] = (uint8_t)pcs[W_PAWN]; + } + } else { + TBEntry_piece *ptr = (TBEntry_piece *)entry; + + for (i = 0, j = 0; i < 16; i++) + if (pcs[i] == 1) j++; + + if (j >= 3) ptr->enc_type = 0; + else if (j == 2) ptr->enc_type = 2; + else { /* only for suicide */ + j = 16; + + for (i = 0; i < 16; i++) { + if (pcs[i] < j && pcs[i] > 1) j = pcs[i]; + + ptr->enc_type = uint8_t(1 + j); + } + } + } + + add_to_hash(entry, key); + + if (key2 != key) add_to_hash(entry, key2); } void Tablebases::init(const std::string& path) { - char str[16]; - int i, j, k, l; + char str[16]; + int i, j, k, l; - if (initialized) { - free(path_string); - free(paths); - struct TBEntry *entry; - for (i = 0; i < TBnum_piece; i++) { - entry = (struct TBEntry *)&TB_piece[i]; - free_wdl_entry(entry); + if (initialized) { + TBEntry *entry; + + for (i = 0; i < TBnum_piece; i++) { + entry = (TBEntry *)&TB_piece[i]; + free_wdl_entry(entry); + } + + for (i = 0; i < TBnum_pawn; i++) { + entry = (TBEntry *)&TB_pawn[i]; + free_wdl_entry(entry); + } + + for (i = 0; i < DTZ_ENTRIES; i++) + if (DTZ_table[i].entry) + free_dtz_entry(DTZ_table[i].entry); + } else { + init_indices(); + initialized = true; } - for (i = 0; i < TBnum_pawn; i++) { - entry = (struct TBEntry *)&TB_pawn[i]; - free_wdl_entry(entry); + + if (path.empty() || path == "") + return; + + // Tokenize path into paths[] using SEP_CHAR delimiter + std::string s(path); + size_t pos = 0; + + while ((pos = s.find(SEP_CHAR)) != std::string::npos) { + paths.push_back(s.substr(0, pos)); + s.erase(0, pos + 1); } + + paths.push_back(s); + + TBnum_piece = TBnum_pawn = 0; + MaxCardinality = 0; + + for (i = 0; i < (1 << TBHASHBITS); i++) + for (j = 0; j < HSHMAX; j++) { + TB_hash[i][j].key = 0ULL; + TB_hash[i][j].ptr = NULL; + } + for (i = 0; i < DTZ_ENTRIES; i++) - if (DTZ_table[i].entry) - free_dtz_entry(DTZ_table[i].entry); - } else { - init_indices(); - initialized = true; - } + DTZ_table[i].entry = NULL; - const char *p = path.c_str(); - if (strlen(p) == 0 || !strcmp(p, "")) return; - path_string = (char *)malloc(strlen(p) + 1); - strcpy(path_string, p); - num_paths = 0; - for (i = 0;; i++) { - if (path_string[i] != SEP_CHAR) - num_paths++; - while (path_string[i] && path_string[i] != SEP_CHAR) - i++; - if (!path_string[i]) break; - path_string[i] = 0; - } - paths = (char **)malloc(num_paths * sizeof(char *)); - for (i = j = 0; i < num_paths; i++) { - while (!path_string[j]) j++; - paths[i] = &path_string[j]; - while (path_string[j]) j++; - } - - LOCK_INIT(TB_mutex); - - TBnum_piece = TBnum_pawn = 0; - MaxCardinality = 0; - - for (i = 0; i < (1 << TBHASHBITS); i++) - for (j = 0; j < HSHMAX; j++) { - TB_hash[i][j].key = 0ULL; - TB_hash[i][j].ptr = NULL; - } - - for (i = 0; i < DTZ_ENTRIES; i++) - DTZ_table[i].entry = NULL; - - for (i = 1; i < 6; i++) { - sprintf(str, "K%cvK", pchr[i]); - init_tb(str); - } - - for (i = 1; i < 6; i++) - for (j = i; j < 6; j++) { - sprintf(str, "K%cvK%c", pchr[i], pchr[j]); - init_tb(str); - } - - for (i = 1; i < 6; i++) - for (j = i; j < 6; j++) { - sprintf(str, "K%c%cvK", pchr[i], pchr[j]); - init_tb(str); - } - - for (i = 1; i < 6; i++) - for (j = i; j < 6; j++) - for (k = 1; k < 6; k++) { - sprintf(str, "K%c%cvK%c", pchr[i], pchr[j], pchr[k]); + for (i = 1; i < 6; i++) { + sprintf(str, "K%cvK", pchr_rev[i]); init_tb(str); - } + } - for (i = 1; i < 6; i++) - for (j = i; j < 6; j++) - for (k = j; k < 6; k++) { - sprintf(str, "K%c%c%cvK", pchr[i], pchr[j], pchr[k]); - init_tb(str); - } - - for (i = 1; i < 6; i++) - for (j = i; j < 6; j++) - for (k = i; k < 6; k++) - for (l = (i == k) ? j : k; l < 6; l++) { - sprintf(str, "K%c%cvK%c%c", pchr[i], pchr[j], pchr[k], pchr[l]); - init_tb(str); + for (i = 1; i < 6; i++) + for (j = i; j < 6; j++) { + sprintf(str, "K%cvK%c", pchr_rev[i], pchr_rev[j]); + init_tb(str); } - for (i = 1; i < 6; i++) - for (j = i; j < 6; j++) - for (k = j; k < 6; k++) - for (l = 1; l < 6; l++) { - sprintf(str, "K%c%c%cvK%c", pchr[i], pchr[j], pchr[k], pchr[l]); - init_tb(str); + for (i = 1; i < 6; i++) + for (j = i; j < 6; j++) { + sprintf(str, "K%c%cvK", pchr_rev[i], pchr_rev[j]); + init_tb(str); } - for (i = 1; i < 6; i++) - for (j = i; j < 6; j++) - for (k = j; k < 6; k++) - for (l = k; l < 6; l++) { - sprintf(str, "K%c%c%c%cvK", pchr[i], pchr[j], pchr[k], pchr[l]); - init_tb(str); - } + for (i = 1; i < 6; i++) + for (j = i; j < 6; j++) + for (k = 1; k < 6; k++) { + sprintf(str, "K%c%cvK%c", pchr_rev[i], pchr_rev[j], pchr_rev[k]); + init_tb(str); + } - printf("info string Found %d tablebases.\n", TBnum_piece + TBnum_pawn); + for (i = 1; i < 6; i++) + for (j = i; j < 6; j++) + for (k = j; k < 6; k++) { + sprintf(str, "K%c%c%cvK", pchr_rev[i], pchr_rev[j], pchr_rev[k]); + init_tb(str); + } + + for (i = 1; i < 6; i++) + for (j = i; j < 6; j++) + for (k = i; k < 6; k++) + for (l = (i == k) ? j : k; l < 6; l++) { + sprintf(str, "K%c%cvK%c%c", pchr_rev[i], pchr_rev[j], pchr_rev[k], pchr_rev[l]); + init_tb(str); + } + + for (i = 1; i < 6; i++) + for (j = i; j < 6; j++) + for (k = j; k < 6; k++) + for (l = 1; l < 6; l++) { + sprintf(str, "K%c%c%cvK%c", pchr_rev[i], pchr_rev[j], pchr_rev[k], pchr_rev[l]); + init_tb(str); + } + + for (i = 1; i < 6; i++) + for (j = i; j < 6; j++) + for (k = j; k < 6; k++) + for (l = k; l < 6; l++) { + sprintf(str, "K%c%c%c%cvK", pchr_rev[i], pchr_rev[j], pchr_rev[k], pchr_rev[l]); + init_tb(str); + } + + std::cerr << "info string Found " << TBnum_piece + TBnum_pawn << " tablebases\n"; } static const signed char offdiag[] = { - 0,-1,-1,-1,-1,-1,-1,-1, - 1, 0,-1,-1,-1,-1,-1,-1, - 1, 1, 0,-1,-1,-1,-1,-1, - 1, 1, 1, 0,-1,-1,-1,-1, - 1, 1, 1, 1, 0,-1,-1,-1, - 1, 1, 1, 1, 1, 0,-1,-1, - 1, 1, 1, 1, 1, 1, 0,-1, - 1, 1, 1, 1, 1, 1, 1, 0 + 0,-1,-1,-1,-1,-1,-1,-1, + 1, 0,-1,-1,-1,-1,-1,-1, + 1, 1, 0,-1,-1,-1,-1,-1, + 1, 1, 1, 0,-1,-1,-1,-1, + 1, 1, 1, 1, 0,-1,-1,-1, + 1, 1, 1, 1, 1, 0,-1,-1, + 1, 1, 1, 1, 1, 1, 0,-1, + 1, 1, 1, 1, 1, 1, 1, 0 }; -static const ubyte triangle[] = { - 6, 0, 1, 2, 2, 1, 0, 6, - 0, 7, 3, 4, 4, 3, 7, 0, - 1, 3, 8, 5, 5, 8, 3, 1, - 2, 4, 5, 9, 9, 5, 4, 2, - 2, 4, 5, 9, 9, 5, 4, 2, - 1, 3, 8, 5, 5, 8, 3, 1, - 0, 7, 3, 4, 4, 3, 7, 0, - 6, 0, 1, 2, 2, 1, 0, 6 +static const uint8_t triangle[] = { + 6, 0, 1, 2, 2, 1, 0, 6, + 0, 7, 3, 4, 4, 3, 7, 0, + 1, 3, 8, 5, 5, 8, 3, 1, + 2, 4, 5, 9, 9, 5, 4, 2, + 2, 4, 5, 9, 9, 5, 4, 2, + 1, 3, 8, 5, 5, 8, 3, 1, + 0, 7, 3, 4, 4, 3, 7, 0, + 6, 0, 1, 2, 2, 1, 0, 6 }; -static const ubyte invtriangle[] = { - 1, 2, 3, 10, 11, 19, 0, 9, 18, 27 +static const uint8_t invtriangle[] = { + 1, 2, 3, 10, 11, 19, 0, 9, 18, 27 }; -static const ubyte invdiag[] = { - 0, 9, 18, 27, 36, 45, 54, 63, - 7, 14, 21, 28, 35, 42, 49, 56 +static const uint8_t invdiag[] = { + 0, 9, 18, 27, 36, 45, 54, 63, + 7, 14, 21, 28, 35, 42, 49, 56 }; -static const ubyte flipdiag[] = { - 0, 8, 16, 24, 32, 40, 48, 56, - 1, 9, 17, 25, 33, 41, 49, 57, - 2, 10, 18, 26, 34, 42, 50, 58, - 3, 11, 19, 27, 35, 43, 51, 59, - 4, 12, 20, 28, 36, 44, 52, 60, - 5, 13, 21, 29, 37, 45, 53, 61, - 6, 14, 22, 30, 38, 46, 54, 62, - 7, 15, 23, 31, 39, 47, 55, 63 +static const uint8_t flipdiag[] = { + 0, 8, 16, 24, 32, 40, 48, 56, + 1, 9, 17, 25, 33, 41, 49, 57, + 2, 10, 18, 26, 34, 42, 50, 58, + 3, 11, 19, 27, 35, 43, 51, 59, + 4, 12, 20, 28, 36, 44, 52, 60, + 5, 13, 21, 29, 37, 45, 53, 61, + 6, 14, 22, 30, 38, 46, 54, 62, + 7, 15, 23, 31, 39, 47, 55, 63 }; -static const ubyte lower[] = { - 28, 0, 1, 2, 3, 4, 5, 6, - 0, 29, 7, 8, 9, 10, 11, 12, - 1, 7, 30, 13, 14, 15, 16, 17, - 2, 8, 13, 31, 18, 19, 20, 21, - 3, 9, 14, 18, 32, 22, 23, 24, - 4, 10, 15, 19, 22, 33, 25, 26, - 5, 11, 16, 20, 23, 25, 34, 27, - 6, 12, 17, 21, 24, 26, 27, 35 +static const uint8_t lower[] = { + 28, 0, 1, 2, 3, 4, 5, 6, + 0, 29, 7, 8, 9, 10, 11, 12, + 1, 7, 30, 13, 14, 15, 16, 17, + 2, 8, 13, 31, 18, 19, 20, 21, + 3, 9, 14, 18, 32, 22, 23, 24, + 4, 10, 15, 19, 22, 33, 25, 26, + 5, 11, 16, 20, 23, 25, 34, 27, + 6, 12, 17, 21, 24, 26, 27, 35 }; -static const ubyte diag[] = { - 0, 0, 0, 0, 0, 0, 0, 8, - 0, 1, 0, 0, 0, 0, 9, 0, - 0, 0, 2, 0, 0, 10, 0, 0, - 0, 0, 0, 3, 11, 0, 0, 0, - 0, 0, 0, 12, 4, 0, 0, 0, - 0, 0, 13, 0, 0, 5, 0, 0, - 0, 14, 0, 0, 0, 0, 6, 0, - 15, 0, 0, 0, 0, 0, 0, 7 +static const uint8_t diag[] = { + 0, 0, 0, 0, 0, 0, 0, 8, + 0, 1, 0, 0, 0, 0, 9, 0, + 0, 0, 2, 0, 0, 10, 0, 0, + 0, 0, 0, 3, 11, 0, 0, 0, + 0, 0, 0, 12, 4, 0, 0, 0, + 0, 0, 13, 0, 0, 5, 0, 0, + 0, 14, 0, 0, 0, 0, 6, 0, + 15, 0, 0, 0, 0, 0, 0, 7 }; -static const ubyte flap[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 6, 12, 18, 18, 12, 6, 0, - 1, 7, 13, 19, 19, 13, 7, 1, - 2, 8, 14, 20, 20, 14, 8, 2, - 3, 9, 15, 21, 21, 15, 9, 3, - 4, 10, 16, 22, 22, 16, 10, 4, - 5, 11, 17, 23, 23, 17, 11, 5, - 0, 0, 0, 0, 0, 0, 0, 0 +static const uint8_t flap[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 12, 18, 18, 12, 6, 0, + 1, 7, 13, 19, 19, 13, 7, 1, + 2, 8, 14, 20, 20, 14, 8, 2, + 3, 9, 15, 21, 21, 15, 9, 3, + 4, 10, 16, 22, 22, 16, 10, 4, + 5, 11, 17, 23, 23, 17, 11, 5, + 0, 0, 0, 0, 0, 0, 0, 0 }; -static const ubyte ptwist[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 47, 35, 23, 11, 10, 22, 34, 46, - 45, 33, 21, 9, 8, 20, 32, 44, - 43, 31, 19, 7, 6, 18, 30, 42, - 41, 29, 17, 5, 4, 16, 28, 40, - 39, 27, 15, 3, 2, 14, 26, 38, - 37, 25, 13, 1, 0, 12, 24, 36, - 0, 0, 0, 0, 0, 0, 0, 0 +static const uint8_t ptwist[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 47, 35, 23, 11, 10, 22, 34, 46, + 45, 33, 21, 9, 8, 20, 32, 44, + 43, 31, 19, 7, 6, 18, 30, 42, + 41, 29, 17, 5, 4, 16, 28, 40, + 39, 27, 15, 3, 2, 14, 26, 38, + 37, 25, 13, 1, 0, 12, 24, 36, + 0, 0, 0, 0, 0, 0, 0, 0 }; -static const ubyte invflap[] = { - 8, 16, 24, 32, 40, 48, - 9, 17, 25, 33, 41, 49, - 10, 18, 26, 34, 42, 50, - 11, 19, 27, 35, 43, 51 +static const uint8_t invflap[] = { + 8, 16, 24, 32, 40, 48, + 9, 17, 25, 33, 41, 49, + 10, 18, 26, 34, 42, 50, + 11, 19, 27, 35, 43, 51 }; -static const ubyte invptwist[] = { - 52, 51, 44, 43, 36, 35, 28, 27, 20, 19, 12, 11, - 53, 50, 45, 42, 37, 34, 29, 26, 21, 18, 13, 10, - 54, 49, 46, 41, 38, 33, 30, 25, 22, 17, 14, 9, - 55, 48, 47, 40, 39, 32, 31, 24, 23, 16, 15, 8 +static const uint8_t invptwist[] = { + 52, 51, 44, 43, 36, 35, 28, 27, 20, 19, 12, 11, + 53, 50, 45, 42, 37, 34, 29, 26, 21, 18, 13, 10, + 54, 49, 46, 41, 38, 33, 30, 25, 22, 17, 14, 9, + 55, 48, 47, 40, 39, 32, 31, 24, 23, 16, 15, 8 }; -static const ubyte file_to_file[] = { - 0, 1, 2, 3, 3, 2, 1, 0 +static const uint8_t file_to_file[] = { + 0, 1, 2, 3, 3, 2, 1, 0 }; static const short KK_idx[10][64] = { - { -1, -1, -1, 0, 1, 2, 3, 4, - -1, -1, -1, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 25, - 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57 }, - { 58, -1, -1, -1, 59, 60, 61, 62, - 63, -1, -1, -1, 64, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, - 92, 93, 94, 95, 96, 97, 98, 99, - 100,101,102,103,104,105,106,107, - 108,109,110,111,112,113,114,115}, - {116,117, -1, -1, -1,118,119,120, - 121,122, -1, -1, -1,123,124,125, - 126,127,128,129,130,131,132,133, - 134,135,136,137,138,139,140,141, - 142,143,144,145,146,147,148,149, - 150,151,152,153,154,155,156,157, - 158,159,160,161,162,163,164,165, - 166,167,168,169,170,171,172,173 }, - {174, -1, -1, -1,175,176,177,178, - 179, -1, -1, -1,180,181,182,183, - 184, -1, -1, -1,185,186,187,188, - 189,190,191,192,193,194,195,196, - 197,198,199,200,201,202,203,204, - 205,206,207,208,209,210,211,212, - 213,214,215,216,217,218,219,220, - 221,222,223,224,225,226,227,228 }, - {229,230, -1, -1, -1,231,232,233, - 234,235, -1, -1, -1,236,237,238, - 239,240, -1, -1, -1,241,242,243, - 244,245,246,247,248,249,250,251, - 252,253,254,255,256,257,258,259, - 260,261,262,263,264,265,266,267, - 268,269,270,271,272,273,274,275, - 276,277,278,279,280,281,282,283 }, - {284,285,286,287,288,289,290,291, - 292,293, -1, -1, -1,294,295,296, - 297,298, -1, -1, -1,299,300,301, - 302,303, -1, -1, -1,304,305,306, - 307,308,309,310,311,312,313,314, - 315,316,317,318,319,320,321,322, - 323,324,325,326,327,328,329,330, - 331,332,333,334,335,336,337,338 }, - { -1, -1,339,340,341,342,343,344, - -1, -1,345,346,347,348,349,350, - -1, -1,441,351,352,353,354,355, - -1, -1, -1,442,356,357,358,359, - -1, -1, -1, -1,443,360,361,362, - -1, -1, -1, -1, -1,444,363,364, - -1, -1, -1, -1, -1, -1,445,365, - -1, -1, -1, -1, -1, -1, -1,446 }, - { -1, -1, -1,366,367,368,369,370, - -1, -1, -1,371,372,373,374,375, - -1, -1, -1,376,377,378,379,380, - -1, -1, -1,447,381,382,383,384, - -1, -1, -1, -1,448,385,386,387, - -1, -1, -1, -1, -1,449,388,389, - -1, -1, -1, -1, -1, -1,450,390, - -1, -1, -1, -1, -1, -1, -1,451 }, - {452,391,392,393,394,395,396,397, - -1, -1, -1, -1,398,399,400,401, - -1, -1, -1, -1,402,403,404,405, - -1, -1, -1, -1,406,407,408,409, - -1, -1, -1, -1,453,410,411,412, - -1, -1, -1, -1, -1,454,413,414, - -1, -1, -1, -1, -1, -1,455,415, - -1, -1, -1, -1, -1, -1, -1,456 }, - {457,416,417,418,419,420,421,422, - -1,458,423,424,425,426,427,428, - -1, -1, -1, -1, -1,429,430,431, - -1, -1, -1, -1, -1,432,433,434, - -1, -1, -1, -1, -1,435,436,437, - -1, -1, -1, -1, -1,459,438,439, - -1, -1, -1, -1, -1, -1,460,440, - -1, -1, -1, -1, -1, -1, -1,461 } + { + -1, -1, -1, 0, 1, 2, 3, 4, + -1, -1, -1, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57 + }, + { + 58, -1, -1, -1, 59, 60, 61, 62, + 63, -1, -1, -1, 64, 65, 66, 67, + 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, + 84, 85, 86, 87, 88, 89, 90, 91, + 92, 93, 94, 95, 96, 97, 98, 99, + 100,101,102,103,104,105,106,107, + 108,109,110,111,112,113,114,115 + }, + { + 116,117, -1, -1, -1,118,119,120, + 121,122, -1, -1, -1,123,124,125, + 126,127,128,129,130,131,132,133, + 134,135,136,137,138,139,140,141, + 142,143,144,145,146,147,148,149, + 150,151,152,153,154,155,156,157, + 158,159,160,161,162,163,164,165, + 166,167,168,169,170,171,172,173 + }, + { + 174, -1, -1, -1,175,176,177,178, + 179, -1, -1, -1,180,181,182,183, + 184, -1, -1, -1,185,186,187,188, + 189,190,191,192,193,194,195,196, + 197,198,199,200,201,202,203,204, + 205,206,207,208,209,210,211,212, + 213,214,215,216,217,218,219,220, + 221,222,223,224,225,226,227,228 + }, + { + 229,230, -1, -1, -1,231,232,233, + 234,235, -1, -1, -1,236,237,238, + 239,240, -1, -1, -1,241,242,243, + 244,245,246,247,248,249,250,251, + 252,253,254,255,256,257,258,259, + 260,261,262,263,264,265,266,267, + 268,269,270,271,272,273,274,275, + 276,277,278,279,280,281,282,283 + }, + { + 284,285,286,287,288,289,290,291, + 292,293, -1, -1, -1,294,295,296, + 297,298, -1, -1, -1,299,300,301, + 302,303, -1, -1, -1,304,305,306, + 307,308,309,310,311,312,313,314, + 315,316,317,318,319,320,321,322, + 323,324,325,326,327,328,329,330, + 331,332,333,334,335,336,337,338 + }, + { + -1, -1,339,340,341,342,343,344, + -1, -1,345,346,347,348,349,350, + -1, -1,441,351,352,353,354,355, + -1, -1, -1,442,356,357,358,359, + -1, -1, -1, -1,443,360,361,362, + -1, -1, -1, -1, -1,444,363,364, + -1, -1, -1, -1, -1, -1,445,365, + -1, -1, -1, -1, -1, -1, -1,446 + }, + { + -1, -1, -1,366,367,368,369,370, + -1, -1, -1,371,372,373,374,375, + -1, -1, -1,376,377,378,379,380, + -1, -1, -1,447,381,382,383,384, + -1, -1, -1, -1,448,385,386,387, + -1, -1, -1, -1, -1,449,388,389, + -1, -1, -1, -1, -1, -1,450,390, + -1, -1, -1, -1, -1, -1, -1,451 + }, + { + 452,391,392,393,394,395,396,397, + -1, -1, -1, -1,398,399,400,401, + -1, -1, -1, -1,402,403,404,405, + -1, -1, -1, -1,406,407,408,409, + -1, -1, -1, -1,453,410,411,412, + -1, -1, -1, -1, -1,454,413,414, + -1, -1, -1, -1, -1, -1,455,415, + -1, -1, -1, -1, -1, -1, -1,456 + }, + { + 457,416,417,418,419,420,421,422, + -1,458,423,424,425,426,427,428, + -1, -1, -1, -1, -1,429,430,431, + -1, -1, -1, -1, -1,432,433,434, + -1, -1, -1, -1, -1,435,436,437, + -1, -1, -1, -1, -1,459,438,439, + -1, -1, -1, -1, -1, -1,460,440, + -1, -1, -1, -1, -1, -1, -1,461 + } }; static int binomial[5][64]; @@ -563,816 +582,936 @@ static int pfactor[5][4]; static void init_indices(void) { - int i, j, k; + int i, j, k; // binomial[k-1][n] = Bin(n, k) - for (i = 0; i < 5; i++) - for (j = 0; j < 64; j++) { - int f = j; - int l = 1; - for (k = 1; k <= i; k++) { - f *= (j - k); - l *= (k + 1); - } - binomial[i][j] = f / l; - } + for (i = 0; i < 5; i++) + for (j = 0; j < 64; j++) { + int f = j; + int l = 1; - for (i = 0; i < 5; i++) { - int s = 0; - for (j = 0; j < 6; j++) { - pawnidx[i][j] = s; - s += (i == 0) ? 1 : binomial[i - 1][ptwist[invflap[j]]]; + for (k = 1; k <= i; k++) { + f *= (j - k); + l *= (k + 1); + } + + binomial[i][j] = f / l; + } + + for (i = 0; i < 5; i++) { + int s = 0; + + for (j = 0; j < 6; j++) { + pawnidx[i][j] = s; + s += (i == 0) ? 1 : binomial[i - 1][ptwist[invflap[j]]]; + } + + pfactor[i][0] = s; + s = 0; + + for (; j < 12; j++) { + pawnidx[i][j] = s; + s += (i == 0) ? 1 : binomial[i - 1][ptwist[invflap[j]]]; + } + + pfactor[i][1] = s; + s = 0; + + for (; j < 18; j++) { + pawnidx[i][j] = s; + s += (i == 0) ? 1 : binomial[i - 1][ptwist[invflap[j]]]; + } + + pfactor[i][2] = s; + s = 0; + + for (; j < 24; j++) { + pawnidx[i][j] = s; + s += (i == 0) ? 1 : binomial[i - 1][ptwist[invflap[j]]]; + } + + pfactor[i][3] = s; } - pfactor[i][0] = s; - s = 0; - for (; j < 12; j++) { - pawnidx[i][j] = s; - s += (i == 0) ? 1 : binomial[i - 1][ptwist[invflap[j]]]; - } - pfactor[i][1] = s; - s = 0; - for (; j < 18; j++) { - pawnidx[i][j] = s; - s += (i == 0) ? 1 : binomial[i - 1][ptwist[invflap[j]]]; - } - pfactor[i][2] = s; - s = 0; - for (; j < 24; j++) { - pawnidx[i][j] = s; - s += (i == 0) ? 1 : binomial[i - 1][ptwist[invflap[j]]]; - } - pfactor[i][3] = s; - } } -static uint64 encode_piece(struct TBEntry_piece *ptr, ubyte *norm, int *pos, int *factor) +static uint64_t encode_piece(TBEntry_piece *ptr, uint8_t *norm, int *pos, int *factor) { - uint64 idx; - int i, j, k, m, l, p; - int n = ptr->num; + uint64_t idx; + int i, j, k, m, l, p; + int n = ptr->num; - if (pos[0] & 0x04) { - for (i = 0; i < n; i++) - pos[i] ^= 0x07; - } - if (pos[0] & 0x20) { - for (i = 0; i < n; i++) - pos[i] ^= 0x38; - } - - for (i = 0; i < n; i++) - if (offdiag[pos[i]]) break; - if (i < (ptr->enc_type == 0 ? 3 : 2) && offdiag[pos[i]] > 0) - for (i = 0; i < n; i++) - pos[i] = flipdiag[pos[i]]; - - switch (ptr->enc_type) { - - case 0: /* 111 */ - i = (pos[1] > pos[0]); - j = (pos[2] > pos[0]) + (pos[2] > pos[1]); - - if (offdiag[pos[0]]) - idx = triangle[pos[0]] * 63*62 + (pos[1] - i) * 62 + (pos[2] - j); - else if (offdiag[pos[1]]) - idx = 6*63*62 + diag[pos[0]] * 28*62 + lower[pos[1]] * 62 + pos[2] - j; - else if (offdiag[pos[2]]) - idx = 6*63*62 + 4*28*62 + (diag[pos[0]]) * 7*28 + (diag[pos[1]] - i) * 28 + lower[pos[2]]; - else - idx = 6*63*62 + 4*28*62 + 4*7*28 + (diag[pos[0]] * 7*6) + (diag[pos[1]] - i) * 6 + (diag[pos[2]] - j); - i = 3; - break; - - case 1: /* K3 */ - j = (pos[2] > pos[0]) + (pos[2] > pos[1]); - - idx = KK_idx[triangle[pos[0]]][pos[1]]; - if (idx < 441) - idx = idx + 441 * (pos[2] - j); - else { - idx = 441*62 + (idx - 441) + 21 * lower[pos[2]]; - if (!offdiag[pos[2]]) - idx -= j * 21; + if (pos[0] & 0x04) { + for (i = 0; i < n; i++) + pos[i] ^= 0x07; } - i = 3; - break; - default: /* K2 */ - idx = KK_idx[triangle[pos[0]]][pos[1]]; - i = 2; - break; - } - idx *= factor[0]; - - for (; i < n;) { - int t = norm[i]; - for (j = i; j < i + t; j++) - for (k = j + 1; k < i + t; k++) - if (pos[j] > pos[k]) Swap(pos[j], pos[k]); - int s = 0; - for (m = i; m < i + t; m++) { - p = pos[m]; - for (l = 0, j = 0; l < i; l++) - j += (p > pos[l]); - s += binomial[m - i][p - j]; + if (pos[0] & 0x20) { + for (i = 0; i < n; i++) + pos[i] ^= 0x38; } - idx += ((uint64)s) * ((uint64)factor[i]); - i += t; - } - return idx; + for (i = 0; i < n; i++) + if (offdiag[pos[i]]) + break; + + if (i < (ptr->enc_type == 0 ? 3 : 2) && offdiag[pos[i]] > 0) + for (i = 0; i < n; i++) + pos[i] = flipdiag[pos[i]]; + + switch (ptr->enc_type) { + + case 0: /* 111 */ + i = (pos[1] > pos[0]); + j = (pos[2] > pos[0]) + (pos[2] > pos[1]); + + if (offdiag[pos[0]]) + idx = triangle[pos[0]] * 63*62 + (pos[1] - i) * 62 + (pos[2] - j); + else if (offdiag[pos[1]]) + idx = 6*63*62 + diag[pos[0]] * 28*62 + lower[pos[1]] * 62 + pos[2] - j; + else if (offdiag[pos[2]]) + idx = 6*63*62 + 4*28*62 + (diag[pos[0]]) * 7*28 + (diag[pos[1]] - i) * 28 + lower[pos[2]]; + else + idx = 6*63*62 + 4*28*62 + 4*7*28 + (diag[pos[0]] * 7*6) + (diag[pos[1]] - i) * 6 + (diag[pos[2]] - j); + + i = 3; + break; + + case 1: /* K3 */ + j = (pos[2] > pos[0]) + (pos[2] > pos[1]); + + idx = KK_idx[triangle[pos[0]]][pos[1]]; + + if (idx < 441) + idx = idx + 441 * (pos[2] - j); + else { + idx = 441*62 + (idx - 441) + 21 * lower[pos[2]]; + + if (!offdiag[pos[2]]) + idx -= j * 21; + } + + i = 3; + break; + + default: /* K2 */ + idx = KK_idx[triangle[pos[0]]][pos[1]]; + i = 2; + break; + } + + idx *= factor[0]; + + for (; i < n;) { + int t = norm[i]; + + for (j = i; j < i + t; j++) + for (k = j + 1; k < i + t; k++) + if (pos[j] > pos[k]) std::swap(pos[j], pos[k]); + + int s = 0; + + for (m = i; m < i + t; m++) { + p = pos[m]; + + for (l = 0, j = 0; l < i; l++) + j += (p > pos[l]); + + s += binomial[m - i][p - j]; + } + + idx += ((uint64_t)s) * ((uint64_t)factor[i]); + i += t; + } + + return idx; } // determine file of leftmost pawn and sort pawns -static int pawn_file(struct TBEntry_pawn *ptr, int *pos) +static int pawn_file(TBEntry_pawn *ptr, int *pos) { - int i; + int i; - for (i = 1; i < ptr->pawns[0]; i++) - if (flap[pos[0]] > flap[pos[i]]) - Swap(pos[0], pos[i]); + for (i = 1; i < ptr->pawns[0]; i++) + if (flap[pos[0]] > flap[pos[i]]) + std::swap(pos[0], pos[i]); - return file_to_file[pos[0] & 0x07]; + return file_to_file[pos[0] & 0x07]; } -static uint64 encode_pawn(struct TBEntry_pawn *ptr, ubyte *norm, int *pos, int *factor) +static uint64_t encode_pawn(TBEntry_pawn *ptr, uint8_t *norm, int *pos, int *factor) { - uint64 idx; - int i, j, k, m, s, t; - int n = ptr->num; + uint64_t idx; + int i, j, k, m, s, t; + int n = ptr->num; - if (pos[0] & 0x04) - for (i = 0; i < n; i++) - pos[i] ^= 0x07; + if (pos[0] & 0x04) + for (i = 0; i < n; i++) + pos[i] ^= 0x07; - for (i = 1; i < ptr->pawns[0]; i++) - for (j = i + 1; j < ptr->pawns[0]; j++) - if (ptwist[pos[i]] < ptwist[pos[j]]) - Swap(pos[i], pos[j]); + for (i = 1; i < ptr->pawns[0]; i++) + for (j = i + 1; j < ptr->pawns[0]; j++) + if (ptwist[pos[i]] < ptwist[pos[j]]) + std::swap(pos[i], pos[j]); - t = ptr->pawns[0] - 1; - idx = pawnidx[t][flap[pos[0]]]; - for (i = t; i > 0; i--) - idx += binomial[t - i][ptwist[pos[i]]]; - idx *= factor[0]; + t = ptr->pawns[0] - 1; + idx = pawnidx[t][flap[pos[0]]]; + + for (i = t; i > 0; i--) + idx += binomial[t - i][ptwist[pos[i]]]; + + idx *= factor[0]; // remaining pawns - i = ptr->pawns[0]; - t = i + ptr->pawns[1]; - if (t > i) { - for (j = i; j < t; j++) - for (k = j + 1; k < t; k++) - if (pos[j] > pos[k]) Swap(pos[j], pos[k]); - s = 0; - for (m = i; m < t; m++) { - int p = pos[m]; - for (k = 0, j = 0; k < i; k++) - j += (p > pos[k]); - s += binomial[m - i][p - j - 8]; - } - idx += ((uint64)s) * ((uint64)factor[i]); - i = t; - } + i = ptr->pawns[0]; + t = i + ptr->pawns[1]; - for (; i < n;) { - t = norm[i]; - for (j = i; j < i + t; j++) - for (k = j + 1; k < i + t; k++) - if (pos[j] > pos[k]) Swap(pos[j], pos[k]); - s = 0; - for (m = i; m < i + t; m++) { - int p = pos[m]; - for (k = 0, j = 0; k < i; k++) - j += (p > pos[k]); - s += binomial[m - i][p - j]; - } - idx += ((uint64)s) * ((uint64)factor[i]); - i += t; - } + if (t > i) { + for (j = i; j < t; j++) + for (k = j + 1; k < t; k++) + if (pos[j] > pos[k]) std::swap(pos[j], pos[k]); - return idx; + s = 0; + + for (m = i; m < t; m++) { + int p = pos[m]; + + for (k = 0, j = 0; k < i; k++) + j += (p > pos[k]); + + s += binomial[m - i][p - j - 8]; + } + + idx += ((uint64_t)s) * ((uint64_t)factor[i]); + i = t; + } + + for (; i < n;) { + t = norm[i]; + + for (j = i; j < i + t; j++) + for (k = j + 1; k < i + t; k++) + if (pos[j] > pos[k]) std::swap(pos[j], pos[k]); + + s = 0; + + for (m = i; m < i + t; m++) { + int p = pos[m]; + + for (k = 0, j = 0; k < i; k++) + j += (p > pos[k]); + + s += binomial[m - i][p - j]; + } + + idx += ((uint64_t)s) * ((uint64_t)factor[i]); + i += t; + } + + return idx; } // place k like pieces on n squares static int subfactor(int k, int n) { - int i, f, l; + int i, f, l; - f = n; - l = 1; - for (i = 1; i < k; i++) { - f *= n - i; - l *= i + 1; - } + f = n; + l = 1; - return f / l; + for (i = 1; i < k; i++) { + f *= n - i; + l *= i + 1; + } + + return f / l; } -static uint64 calc_factors_piece(int *factor, int num, int order, ubyte *norm, ubyte enc_type) +static uint64_t calc_factors_piece(int *factor, int num, int order, uint8_t *norm, uint8_t enc_type) { - int i, k, n; - uint64 f; - static int pivfac[] = { 31332, 28056, 462 }; - - n = 64 - norm[0]; - - f = 1; - for (i = norm[0], k = 0; i < num || k == order; k++) { - if (k == order) { - factor[0] = static_cast(f); - f *= pivfac[enc_type]; - } else { - factor[i] = static_cast(f); - f *= subfactor(norm[i], n); - n -= norm[i]; - i += norm[i]; - } - } - - return f; -} - -static uint64 calc_factors_pawn(int *factor, int num, int order, int order2, ubyte *norm, int file) -{ - int i, k, n; - uint64 f; - - i = norm[0]; - if (order2 < 0x0f) i += norm[i]; - n = 64 - i; - - f = 1; - for (k = 0; i < num || k == order || k == order2; k++) { - if (k == order) { - factor[0] = static_cast(f); - f *= pfactor[norm[0] - 1][file]; - } else if (k == order2) { - factor[norm[0]] = static_cast(f); - f *= subfactor(norm[norm[0]], 48 - norm[0]); - } else { - factor[i] = static_cast(f); - f *= subfactor(norm[i], n); - n -= norm[i]; - i += norm[i]; - } - } - - return f; -} - -static void set_norm_piece(struct TBEntry_piece *ptr, ubyte *norm, ubyte *pieces) -{ - int i, j; - - for (i = 0; i < ptr->num; i++) - norm[i] = 0; - - switch (ptr->enc_type) { - case 0: - norm[0] = 3; - break; - case 2: - norm[0] = 2; - break; - default: - norm[0] = ubyte(ptr->enc_type - 1); - break; - } - - for (i = norm[0]; i < ptr->num; i += norm[i]) - for (j = i; j < ptr->num && pieces[j] == pieces[i]; j++) - norm[i]++; -} - -static void set_norm_pawn(struct TBEntry_pawn *ptr, ubyte *norm, ubyte *pieces) -{ - int i, j; - - for (i = 0; i < ptr->num; i++) - norm[i] = 0; - - norm[0] = ptr->pawns[0]; - if (ptr->pawns[1]) norm[ptr->pawns[0]] = ptr->pawns[1]; - - for (i = ptr->pawns[0] + ptr->pawns[1]; i < ptr->num; i += norm[i]) - for (j = i; j < ptr->num && pieces[j] == pieces[i]; j++) - norm[i]++; -} - -static void setup_pieces_piece(struct TBEntry_piece *ptr, unsigned char *data, uint64 *tb_size) -{ - int i; - int order; - - for (i = 0; i < ptr->num; i++) - ptr->pieces[0][i] = ubyte(data[i + 1] & 0x0f); - order = data[0] & 0x0f; - set_norm_piece(ptr, ptr->norm[0], ptr->pieces[0]); - tb_size[0] = calc_factors_piece(ptr->factor[0], ptr->num, order, ptr->norm[0], ptr->enc_type); - - for (i = 0; i < ptr->num; i++) - ptr->pieces[1][i] = ubyte(data[i + 1] >> 4); - order = data[0] >> 4; - set_norm_piece(ptr, ptr->norm[1], ptr->pieces[1]); - tb_size[1] = calc_factors_piece(ptr->factor[1], ptr->num, order, ptr->norm[1], ptr->enc_type); -} - -static void setup_pieces_piece_dtz(struct DTZEntry_piece *ptr, unsigned char *data, uint64 *tb_size) -{ - int i; - int order; - - for (i = 0; i < ptr->num; i++) - ptr->pieces[i] = ubyte(data[i + 1] & 0x0f); - order = data[0] & 0x0f; - set_norm_piece((struct TBEntry_piece *)ptr, ptr->norm, ptr->pieces); - tb_size[0] = calc_factors_piece(ptr->factor, ptr->num, order, ptr->norm, ptr->enc_type); -} - -static void setup_pieces_pawn(struct TBEntry_pawn *ptr, unsigned char *data, uint64 *tb_size, int f) -{ - int i, j; - int order, order2; - - j = 1 + (ptr->pawns[1] > 0); - order = data[0] & 0x0f; - order2 = ptr->pawns[1] ? (data[1] & 0x0f) : 0x0f; - for (i = 0; i < ptr->num; i++) - ptr->file[f].pieces[0][i] = ubyte(data[i + j] & 0x0f); - set_norm_pawn(ptr, ptr->file[f].norm[0], ptr->file[f].pieces[0]); - tb_size[0] = calc_factors_pawn(ptr->file[f].factor[0], ptr->num, order, order2, ptr->file[f].norm[0], f); - - order = data[0] >> 4; - order2 = ptr->pawns[1] ? (data[1] >> 4) : 0x0f; - for (i = 0; i < ptr->num; i++) - ptr->file[f].pieces[1][i] = ubyte(data[i + j] >> 4); - set_norm_pawn(ptr, ptr->file[f].norm[1], ptr->file[f].pieces[1]); - tb_size[1] = calc_factors_pawn(ptr->file[f].factor[1], ptr->num, order, order2, ptr->file[f].norm[1], f); -} - -static void setup_pieces_pawn_dtz(struct DTZEntry_pawn *ptr, unsigned char *data, uint64 *tb_size, int f) -{ - int i, j; - int order, order2; - - j = 1 + (ptr->pawns[1] > 0); - order = data[0] & 0x0f; - order2 = ptr->pawns[1] ? (data[1] & 0x0f) : 0x0f; - for (i = 0; i < ptr->num; i++) - ptr->file[f].pieces[i] = ubyte(data[i + j] & 0x0f); - set_norm_pawn((struct TBEntry_pawn *)ptr, ptr->file[f].norm, ptr->file[f].pieces); - tb_size[0] = calc_factors_pawn(ptr->file[f].factor, ptr->num, order, order2, ptr->file[f].norm, f); -} - -static void calc_symlen(struct PairsData *d, int s, char *tmp) -{ - int s1, s2; - - ubyte* w = d->sympat + 3 * s; - s2 = (w[2] << 4) | (w[1] >> 4); - if (s2 == 0x0fff) - d->symlen[s] = 0; - else { - s1 = ((w[1] & 0xf) << 8) | w[0]; - if (!tmp[s1]) calc_symlen(d, s1, tmp); - if (!tmp[s2]) calc_symlen(d, s2, tmp); - d->symlen[s] = ubyte(d->symlen[s1] + d->symlen[s2] + 1); - } - tmp[s] = 1; -} - -ushort ReadUshort(ubyte* d) { - return ushort(d[0] | (d[1] << 8)); -} - -uint32 ReadUint32(ubyte* d) { - return d[0] | (d[1] << 8) | (d[2] << 16) | (d[3] << 24); -} - -static struct PairsData *setup_pairs(unsigned char *data, uint64 tb_size, uint64 *size, unsigned char **next, ubyte *flags, int wdl) -{ - struct PairsData *d; - int i; - - *flags = data[0]; - if (data[0] & 0x80) { - d = (struct PairsData *)malloc(sizeof(struct PairsData)); - d->idxbits = 0; - if (wdl) - d->min_len = data[1]; - else - d->min_len = 0; - *next = data + 2; - size[0] = size[1] = size[2] = 0; - return d; - } - - int blocksize = data[1]; - int idxbits = data[2]; - int real_num_blocks = ReadUint32(&data[4]); - int num_blocks = real_num_blocks + *(ubyte *)(&data[3]); - int max_len = data[8]; - int min_len = data[9]; - int h = max_len - min_len + 1; - int num_syms = ReadUshort(&data[10 + 2 * h]); - d = (struct PairsData *)malloc(sizeof(struct PairsData) + (h - 1) * sizeof(base_t) + num_syms); - d->blocksize = blocksize; - d->idxbits = idxbits; - d->offset = (ushort*)(&data[10]); - d->symlen = ((ubyte *)d) + sizeof(struct PairsData) + (h - 1) * sizeof(base_t); - d->sympat = &data[12 + 2 * h]; - d->min_len = min_len; - *next = &data[12 + 2 * h + 3 * num_syms + (num_syms & 1)]; - - uint64 num_indices = (tb_size + (1ULL << idxbits) - 1) >> idxbits; - size[0] = 6ULL * num_indices; - size[1] = 2ULL * num_blocks; - size[2] = (1ULL << blocksize) * real_num_blocks; - - // char tmp[num_syms]; - char tmp[4096]; - for (i = 0; i < num_syms; i++) - tmp[i] = 0; - for (i = 0; i < num_syms; i++) - if (!tmp[i]) - calc_symlen(d, i, tmp); - - d->base[h - 1] = 0; - for (i = h - 2; i >= 0; i--) - d->base[i] = (d->base[i + 1] + ReadUshort((ubyte*)(d->offset + i)) - ReadUshort((ubyte*)(d->offset + i + 1))) / 2; - for (i = 0; i < h; i++) - d->base[i] <<= 64 - (min_len + i); - - d->offset -= d->min_len; - - return d; -} - -static int init_table_wdl(struct TBEntry *entry, char *str) -{ - ubyte *next; - int f, s; - uint64 tb_size[8]; - uint64 size[8 * 3]; - ubyte flags; - - // first mmap the table into memory - - entry->data = map_file(str, WDLSUFFIX, &entry->mapping); - if (!entry->data) { - printf("Could not find %s" WDLSUFFIX, str); - return 0; - } - - ubyte *data = (ubyte *)entry->data; - if (data[0] != WDL_MAGIC[0] || - data[1] != WDL_MAGIC[1] || - data[2] != WDL_MAGIC[2] || - data[3] != WDL_MAGIC[3]) { - printf("Corrupted table.\n"); - unmap_file(entry->data, entry->mapping); - entry->data = 0; - return 0; - } - - int split = data[4] & 0x01; - int files = data[4] & 0x02 ? 4 : 1; - - data += 5; - - if (!entry->has_pawns) { - struct TBEntry_piece *ptr = (struct TBEntry_piece *)entry; - setup_pieces_piece(ptr, data, &tb_size[0]); - data += ptr->num + 1; - data += ((uintptr_t)data) & 0x01; - - ptr->precomp[0] = setup_pairs(data, tb_size[0], &size[0], &next, &flags, 1); - data = next; - if (split) { - ptr->precomp[1] = setup_pairs(data, tb_size[1], &size[3], &next, &flags, 1); - data = next; - } else - ptr->precomp[1] = NULL; - - ptr->precomp[0]->indextable = (char *)data; - data += size[0]; - if (split) { - ptr->precomp[1]->indextable = (char *)data; - data += size[3]; - } - - ptr->precomp[0]->sizetable = (ushort *)data; - data += size[1]; - if (split) { - ptr->precomp[1]->sizetable = (ushort *)data; - data += size[4]; - } - - data = (ubyte *)((((uintptr_t)data) + 0x3f) & ~0x3f); - ptr->precomp[0]->data = data; - data += size[2]; - if (split) { - data = (ubyte *)((((uintptr_t)data) + 0x3f) & ~0x3f); - ptr->precomp[1]->data = data; - } - } else { - struct TBEntry_pawn *ptr = (struct TBEntry_pawn *)entry; - s = 1 + (ptr->pawns[1] > 0); - for (f = 0; f < 4; f++) { - setup_pieces_pawn((struct TBEntry_pawn *)ptr, data, &tb_size[2 * f], f); - data += ptr->num + s; - } - data += ((uintptr_t)data) & 0x01; - - for (f = 0; f < files; f++) { - ptr->file[f].precomp[0] = setup_pairs(data, tb_size[2 * f], &size[6 * f], &next, &flags, 1); - data = next; - if (split) { - ptr->file[f].precomp[1] = setup_pairs(data, tb_size[2 * f + 1], &size[6 * f + 3], &next, &flags, 1); - data = next; - } else - ptr->file[f].precomp[1] = NULL; - } - - for (f = 0; f < files; f++) { - ptr->file[f].precomp[0]->indextable = (char *)data; - data += size[6 * f]; - if (split) { - ptr->file[f].precomp[1]->indextable = (char *)data; - data += size[6 * f + 3]; - } - } - - for (f = 0; f < files; f++) { - ptr->file[f].precomp[0]->sizetable = (ushort *)data; - data += size[6 * f + 1]; - if (split) { - ptr->file[f].precomp[1]->sizetable = (ushort *)data; - data += size[6 * f + 4]; - } - } - - for (f = 0; f < files; f++) { - data = (ubyte *)((((uintptr_t)data) + 0x3f) & ~0x3f); - ptr->file[f].precomp[0]->data = data; - data += size[6 * f + 2]; - if (split) { - data = (ubyte *)((((uintptr_t)data) + 0x3f) & ~0x3f); - ptr->file[f].precomp[1]->data = data; - data += size[6 * f + 5]; - } - } - } - - return 1; -} - -static int init_table_dtz(struct TBEntry *entry) -{ - ubyte *data = (ubyte *)entry->data; - ubyte *next; - int f, s; - uint64 tb_size[4]; - uint64 size[4 * 3]; - - if (!data) - return 0; - - if (data[0] != DTZ_MAGIC[0] || - data[1] != DTZ_MAGIC[1] || - data[2] != DTZ_MAGIC[2] || - data[3] != DTZ_MAGIC[3]) { - printf("Corrupted table.\n"); - return 0; - } - - int files = data[4] & 0x02 ? 4 : 1; - - data += 5; - - if (!entry->has_pawns) { - struct DTZEntry_piece *ptr = (struct DTZEntry_piece *)entry; - setup_pieces_piece_dtz(ptr, data, &tb_size[0]); - data += ptr->num + 1; - data += ((uintptr_t)data) & 0x01; - - ptr->precomp = setup_pairs(data, tb_size[0], &size[0], &next, &(ptr->flags), 0); - data = next; - - ptr->map = data; - if (ptr->flags & 2) { - int i; - for (i = 0; i < 4; i++) { - ptr->map_idx[i] = static_cast(data + 1 - ptr->map); - data += 1 + data[0]; - } - data += ((uintptr_t)data) & 0x01; - } - - ptr->precomp->indextable = (char *)data; - data += size[0]; - - ptr->precomp->sizetable = (ushort *)data; - data += size[1]; - - data = (ubyte *)((((uintptr_t)data) + 0x3f) & ~0x3f); - ptr->precomp->data = data; - data += size[2]; - } else { - struct DTZEntry_pawn *ptr = (struct DTZEntry_pawn *)entry; - s = 1 + (ptr->pawns[1] > 0); - for (f = 0; f < 4; f++) { - setup_pieces_pawn_dtz(ptr, data, &tb_size[f], f); - data += ptr->num + s; - } - data += ((uintptr_t)data) & 0x01; - - for (f = 0; f < files; f++) { - ptr->file[f].precomp = setup_pairs(data, tb_size[f], &size[3 * f], &next, &(ptr->flags[f]), 0); - data = next; - } - - ptr->map = data; - for (f = 0; f < files; f++) { - if (ptr->flags[f] & 2) { - int i; - for (i = 0; i < 4; i++) { - ptr->map_idx[f][i] = static_cast(data + 1 - ptr->map); - data += 1 + data[0]; + int i, k, n; + uint64_t f; + static int pivfac[] = { 31332, 28056, 462 }; + + n = 64 - norm[0]; + + f = 1; + + for (i = norm[0], k = 0; i < num || k == order; k++) { + if (k == order) { + factor[0] = static_cast(f); + f *= pivfac[enc_type]; + } else { + factor[i] = static_cast(f); + f *= subfactor(norm[i], n); + n -= norm[i]; + i += norm[i]; } - } - } - data += ((uintptr_t)data) & 0x01; - - for (f = 0; f < files; f++) { - ptr->file[f].precomp->indextable = (char *)data; - data += size[3 * f]; } - for (f = 0; f < files; f++) { - ptr->file[f].precomp->sizetable = (ushort *)data; - data += size[3 * f + 1]; + return f; +} + +static uint64_t calc_factors_pawn(int *factor, int num, int order, int order2, uint8_t *norm, int file) +{ + int i, k, n; + uint64_t f; + + i = norm[0]; + + if (order2 < 0x0f) i += norm[i]; + + n = 64 - i; + + f = 1; + + for (k = 0; i < num || k == order || k == order2; k++) { + if (k == order) { + factor[0] = static_cast(f); + f *= pfactor[norm[0] - 1][file]; + } else if (k == order2) { + factor[norm[0]] = static_cast(f); + f *= subfactor(norm[norm[0]], 48 - norm[0]); + } else { + factor[i] = static_cast(f); + f *= subfactor(norm[i], n); + n -= norm[i]; + i += norm[i]; + } } - for (f = 0; f < files; f++) { - data = (ubyte *)((((uintptr_t)data) + 0x3f) & ~0x3f); - ptr->file[f].precomp->data = data; - data += size[3 * f + 2]; - } - } + return f; +} - return 1; +static void set_norm_piece(TBEntry_piece *ptr, uint8_t *norm, uint8_t *pieces) +{ + int i, j; + + for (i = 0; i < ptr->num; i++) + norm[i] = 0; + + switch (ptr->enc_type) { + case 0: + norm[0] = 3; + break; + + case 2: + norm[0] = 2; + break; + + default: + norm[0] = uint8_t(ptr->enc_type - 1); + break; + } + + for (i = norm[0]; i < ptr->num; i += norm[i]) + for (j = i; j < ptr->num && pieces[j] == pieces[i]; j++) + norm[i]++; +} + +static void set_norm_pawn(TBEntry_pawn *ptr, uint8_t *norm, uint8_t *pieces) +{ + int i, j; + + for (i = 0; i < ptr->num; i++) + norm[i] = 0; + + norm[0] = ptr->pawns[0]; + + if (ptr->pawns[1]) norm[ptr->pawns[0]] = ptr->pawns[1]; + + for (i = ptr->pawns[0] + ptr->pawns[1]; i < ptr->num; i += norm[i]) + for (j = i; j < ptr->num && pieces[j] == pieces[i]; j++) + norm[i]++; +} + +static void setup_pieces_piece(TBEntry_piece *ptr, unsigned char *data, uint64_t *tb_size) +{ + int i; + int order; + + for (i = 0; i < ptr->num; i++) + ptr->pieces[0][i] = uint8_t(data[i + 1] & 0x0f); + + order = data[0] & 0x0f; + set_norm_piece(ptr, ptr->norm[0], ptr->pieces[0]); + tb_size[0] = calc_factors_piece(ptr->factor[0], ptr->num, order, ptr->norm[0], ptr->enc_type); + + for (i = 0; i < ptr->num; i++) + ptr->pieces[1][i] = uint8_t(data[i + 1] >> 4); + + order = data[0] >> 4; + set_norm_piece(ptr, ptr->norm[1], ptr->pieces[1]); + tb_size[1] = calc_factors_piece(ptr->factor[1], ptr->num, order, ptr->norm[1], ptr->enc_type); +} + +static void setup_pieces_piece_dtz(DTZEntry_piece *ptr, unsigned char *data, uint64_t *tb_size) +{ + int i; + int order; + + for (i = 0; i < ptr->num; i++) + ptr->pieces[i] = uint8_t(data[i + 1] & 0x0f); + + order = data[0] & 0x0f; + set_norm_piece((TBEntry_piece *)ptr, ptr->norm, ptr->pieces); + tb_size[0] = calc_factors_piece(ptr->factor, ptr->num, order, ptr->norm, ptr->enc_type); +} + +static void setup_pieces_pawn(TBEntry_pawn *ptr, unsigned char *data, uint64_t *tb_size, int f) +{ + int i, j; + int order, order2; + + j = 1 + (ptr->pawns[1] > 0); + order = data[0] & 0x0f; + order2 = ptr->pawns[1] ? (data[1] & 0x0f) : 0x0f; + + for (i = 0; i < ptr->num; i++) + ptr->file[f].pieces[0][i] = uint8_t(data[i + j] & 0x0f); + + set_norm_pawn(ptr, ptr->file[f].norm[0], ptr->file[f].pieces[0]); + tb_size[0] = calc_factors_pawn(ptr->file[f].factor[0], ptr->num, order, order2, ptr->file[f].norm[0], f); + + order = data[0] >> 4; + order2 = ptr->pawns[1] ? (data[1] >> 4) : 0x0f; + + for (i = 0; i < ptr->num; i++) + ptr->file[f].pieces[1][i] = uint8_t(data[i + j] >> 4); + + set_norm_pawn(ptr, ptr->file[f].norm[1], ptr->file[f].pieces[1]); + tb_size[1] = calc_factors_pawn(ptr->file[f].factor[1], ptr->num, order, order2, ptr->file[f].norm[1], f); +} + +static void setup_pieces_pawn_dtz(DTZEntry_pawn *ptr, unsigned char *data, uint64_t *tb_size, int f) +{ + int i, j; + int order, order2; + + j = 1 + (ptr->pawns[1] > 0); + order = data[0] & 0x0f; + order2 = ptr->pawns[1] ? (data[1] & 0x0f) : 0x0f; + + for (i = 0; i < ptr->num; i++) + ptr->file[f].pieces[i] = uint8_t(data[i + j] & 0x0f); + + set_norm_pawn((TBEntry_pawn *)ptr, ptr->file[f].norm, ptr->file[f].pieces); + tb_size[0] = calc_factors_pawn(ptr->file[f].factor, ptr->num, order, order2, ptr->file[f].norm, f); +} + +static void calc_symlen(PairsData *d, int s, char *tmp) +{ + int s1, s2; + + uint8_t* w = d->sympat + 3 * s; + s2 = (w[2] << 4) | (w[1] >> 4); + + if (s2 == 0x0fff) + d->symlen[s] = 0; + else { + s1 = ((w[1] & 0xf) << 8) | w[0]; + + if (!tmp[s1]) calc_symlen(d, s1, tmp); + + if (!tmp[s2]) calc_symlen(d, s2, tmp); + + d->symlen[s] = uint8_t(d->symlen[s1] + d->symlen[s2] + 1); + } + + tmp[s] = 1; +} + +uint16_t ReadUshort(uint8_t* d) +{ + return uint16_t(d[0] | (d[1] << 8)); +} + +uint32_t ReadUint32(uint8_t* d) +{ + return d[0] | (d[1] << 8) | (d[2] << 16) | (d[3] << 24); +} + +static PairsData *setup_pairs(unsigned char *data, uint64_t tb_size, uint64_t *size, unsigned char **next, uint8_t *flags, int wdl) +{ + PairsData *d; + int i; + + *flags = data[0]; + + if (data[0] & 0x80) { + d = (PairsData *)malloc(sizeof(PairsData)); + d->idxbits = 0; + + if (wdl) + d->min_len = data[1]; + else + d->min_len = 0; + + *next = data + 2; + size[0] = size[1] = size[2] = 0; + return d; + } + + int blocksize = data[1]; + int idxbits = data[2]; + int real_num_blocks = ReadUint32(&data[4]); + int num_blocks = real_num_blocks + *(uint8_t *)(&data[3]); + int max_len = data[8]; + int min_len = data[9]; + int h = max_len - min_len + 1; + int num_syms = ReadUshort(&data[10 + 2 * h]); + d = (PairsData *)malloc(sizeof(PairsData) + (h - 1) * sizeof(base_t) + num_syms); + d->blocksize = blocksize; + d->idxbits = idxbits; + d->offset = (uint16_t*)(&data[10]); + d->symlen = ((uint8_t *)d) + sizeof(PairsData) + (h - 1) * sizeof(base_t); + d->sympat = &data[12 + 2 * h]; + d->min_len = min_len; + *next = &data[12 + 2 * h + 3 * num_syms + (num_syms & 1)]; + + uint64_t num_indices = (tb_size + (1ULL << idxbits) - 1) >> idxbits; + size[0] = 6ULL * num_indices; + size[1] = 2ULL * num_blocks; + size[2] = (1ULL << blocksize) * real_num_blocks; + + // char tmp[num_syms]; + char tmp[4096]; + + for (i = 0; i < num_syms; i++) + tmp[i] = 0; + + for (i = 0; i < num_syms; i++) + if (!tmp[i]) + calc_symlen(d, i, tmp); + + d->base[h - 1] = 0; + + for (i = h - 2; i >= 0; i--) + d->base[i] = (d->base[i + 1] + ReadUshort((uint8_t*)(d->offset + i)) - ReadUshort((uint8_t*)(d->offset + i + 1))) / 2; + + for (i = 0; i < h; i++) + d->base[i] <<= 64 - (min_len + i); + + d->offset -= d->min_len; + + return d; +} + +static int init_table_wdl(TBEntry *entry, const std::string& str) +{ + uint8_t *next; + int f, s; + uint64_t tb_size[8]; + uint64_t size[8 * 3]; + uint8_t flags; + + // first mmap the table into memory + + entry->data = map_file(str, WDLSUFFIX, &entry->mapping); + + if (!entry->data) { + std::cerr << "Could not find " << str << WDLSUFFIX << '\n'; + return 0; + } + + uint8_t *data = (uint8_t *)entry->data; + + if (data[0] != WDL_MAGIC[0] || + data[1] != WDL_MAGIC[1] || + data[2] != WDL_MAGIC[2] || + data[3] != WDL_MAGIC[3]) { + std::cerr << "Corrupted table\n"; + unmap_file(entry->data, entry->mapping); + entry->data = 0; + return 0; + } + + int split = data[4] & 0x01; + int files = data[4] & 0x02 ? 4 : 1; + + data += 5; + + if (!entry->has_pawns) { + TBEntry_piece *ptr = (TBEntry_piece *)entry; + setup_pieces_piece(ptr, data, &tb_size[0]); + data += ptr->num + 1; + data += ((uintptr_t)data) & 0x01; + + ptr->precomp[0] = setup_pairs(data, tb_size[0], &size[0], &next, &flags, 1); + data = next; + + if (split) { + ptr->precomp[1] = setup_pairs(data, tb_size[1], &size[3], &next, &flags, 1); + data = next; + } else + ptr->precomp[1] = NULL; + + ptr->precomp[0]->indextable = (char *)data; + data += size[0]; + + if (split) { + ptr->precomp[1]->indextable = (char *)data; + data += size[3]; + } + + ptr->precomp[0]->sizetable = (uint16_t *)data; + data += size[1]; + + if (split) { + ptr->precomp[1]->sizetable = (uint16_t *)data; + data += size[4]; + } + + data = (uint8_t *)((((uintptr_t)data) + 0x3f) & ~0x3f); + ptr->precomp[0]->data = data; + data += size[2]; + + if (split) { + data = (uint8_t *)((((uintptr_t)data) + 0x3f) & ~0x3f); + ptr->precomp[1]->data = data; + } + } else { + TBEntry_pawn *ptr = (TBEntry_pawn *)entry; + s = 1 + (ptr->pawns[1] > 0); + + for (f = 0; f < 4; f++) { + setup_pieces_pawn((TBEntry_pawn *)ptr, data, &tb_size[2 * f], f); + data += ptr->num + s; + } + + data += ((uintptr_t)data) & 0x01; + + for (f = 0; f < files; f++) { + ptr->file[f].precomp[0] = setup_pairs(data, tb_size[2 * f], &size[6 * f], &next, &flags, 1); + data = next; + + if (split) { + ptr->file[f].precomp[1] = setup_pairs(data, tb_size[2 * f + 1], &size[6 * f + 3], &next, &flags, 1); + data = next; + } else + ptr->file[f].precomp[1] = NULL; + } + + for (f = 0; f < files; f++) { + ptr->file[f].precomp[0]->indextable = (char *)data; + data += size[6 * f]; + + if (split) { + ptr->file[f].precomp[1]->indextable = (char *)data; + data += size[6 * f + 3]; + } + } + + for (f = 0; f < files; f++) { + ptr->file[f].precomp[0]->sizetable = (uint16_t *)data; + data += size[6 * f + 1]; + + if (split) { + ptr->file[f].precomp[1]->sizetable = (uint16_t *)data; + data += size[6 * f + 4]; + } + } + + for (f = 0; f < files; f++) { + data = (uint8_t *)((((uintptr_t)data) + 0x3f) & ~0x3f); + ptr->file[f].precomp[0]->data = data; + data += size[6 * f + 2]; + + if (split) { + data = (uint8_t *)((((uintptr_t)data) + 0x3f) & ~0x3f); + ptr->file[f].precomp[1]->data = data; + data += size[6 * f + 5]; + } + } + } + + return 1; +} + +static int init_table_dtz(TBEntry *entry) +{ + uint8_t *data = (uint8_t *)entry->data; + uint8_t *next; + int f, s; + uint64_t tb_size[4]; + uint64_t size[4 * 3]; + + if (!data) + return 0; + + if (data[0] != DTZ_MAGIC[0] || + data[1] != DTZ_MAGIC[1] || + data[2] != DTZ_MAGIC[2] || + data[3] != DTZ_MAGIC[3]) { + std::cerr << "Corrupted table\n"; + return 0; + } + + int files = data[4] & 0x02 ? 4 : 1; + + data += 5; + + if (!entry->has_pawns) { + DTZEntry_piece *ptr = (DTZEntry_piece *)entry; + setup_pieces_piece_dtz(ptr, data, &tb_size[0]); + data += ptr->num + 1; + data += ((uintptr_t)data) & 0x01; + + ptr->precomp = setup_pairs(data, tb_size[0], &size[0], &next, &(ptr->flags), 0); + data = next; + + ptr->map = data; + + if (ptr->flags & 2) { + int i; + + for (i = 0; i < 4; i++) { + ptr->map_idx[i] = static_cast(data + 1 - ptr->map); + data += 1 + data[0]; + } + + data += ((uintptr_t)data) & 0x01; + } + + ptr->precomp->indextable = (char *)data; + data += size[0]; + + ptr->precomp->sizetable = (uint16_t *)data; + data += size[1]; + + data = (uint8_t *)((((uintptr_t)data) + 0x3f) & ~0x3f); + ptr->precomp->data = data; + data += size[2]; + } else { + DTZEntry_pawn *ptr = (DTZEntry_pawn *)entry; + s = 1 + (ptr->pawns[1] > 0); + + for (f = 0; f < 4; f++) { + setup_pieces_pawn_dtz(ptr, data, &tb_size[f], f); + data += ptr->num + s; + } + + data += ((uintptr_t)data) & 0x01; + + for (f = 0; f < files; f++) { + ptr->file[f].precomp = setup_pairs(data, tb_size[f], &size[3 * f], &next, &(ptr->flags[f]), 0); + data = next; + } + + ptr->map = data; + + for (f = 0; f < files; f++) { + if (ptr->flags[f] & 2) { + int i; + + for (i = 0; i < 4; i++) { + ptr->map_idx[f][i] = static_cast(data + 1 - ptr->map); + data += 1 + data[0]; + } + } + } + + data += ((uintptr_t)data) & 0x01; + + for (f = 0; f < files; f++) { + ptr->file[f].precomp->indextable = (char *)data; + data += size[3 * f]; + } + + for (f = 0; f < files; f++) { + ptr->file[f].precomp->sizetable = (uint16_t *)data; + data += size[3 * f + 1]; + } + + for (f = 0; f < files; f++) { + data = (uint8_t *)((((uintptr_t)data) + 0x3f) & ~0x3f); + ptr->file[f].precomp->data = data; + data += size[3 * f + 2]; + } + } + + return 1; } template -static ubyte decompress_pairs(struct PairsData *d, uint64 idx) +static uint8_t decompress_pairs(PairsData *d, uint64_t idx) { - if (!d->idxbits) - return ubyte(d->min_len); + if (!d->idxbits) + return uint8_t(d->min_len); - uint32 mainidx = static_cast(idx >> d->idxbits); - int litidx = (idx & ((1ULL << d->idxbits) - 1)) - (1ULL << (d->idxbits - 1)); - uint32 block = *(uint32 *)(d->indextable + 6 * mainidx); - if (!LittleEndian) - block = BSWAP32(block); + uint32_t mainidx = static_cast(idx >> d->idxbits); + int litidx = (idx & ((1ULL << d->idxbits) - 1)) - (1ULL << (d->idxbits - 1)); + uint32_t block = *(uint32_t *)(d->indextable + 6 * mainidx); - ushort idxOffset = *(ushort *)(d->indextable + 6 * mainidx + 4); - if (!LittleEndian) - idxOffset = ushort((idxOffset << 8) | (idxOffset >> 8)); - litidx += idxOffset; - - if (litidx < 0) { - do { - litidx += d->sizetable[--block] + 1; - } while (litidx < 0); - } else { - while (litidx > d->sizetable[block]) - litidx -= d->sizetable[block++] + 1; - } - - uint32 *ptr = (uint32 *)(d->data + (block << d->blocksize)); - - int m = d->min_len; - ushort *offset = d->offset; - base_t *base = d->base - m; - ubyte *symlen = d->symlen; - int sym, bitcnt; - - uint64 code = *((uint64 *)ptr); - if (LittleEndian) - code = BSWAP64(code); - - ptr += 2; - bitcnt = 0; // number of "empty bits" in code - for (;;) { - int l = m; - while (code < base[l]) l++; - sym = offset[l]; if (!LittleEndian) - sym = ((sym & 0xff) << 8) | (sym >> 8); - sym += static_cast((code - base[l]) >> (64 - l)); - if (litidx < (int)symlen[sym] + 1) break; - litidx -= (int)symlen[sym] + 1; - code <<= l; - bitcnt += l; - if (bitcnt >= 32) { - bitcnt -= 32; - uint32 tmp = *ptr++; - if (LittleEndian) - tmp = BSWAP32(tmp); - code |= ((uint64)tmp) << bitcnt; - } - } + block = BSWAP32(block); - ubyte *sympat = d->sympat; - while (symlen[sym] != 0) { - ubyte* w = sympat + (3 * sym); - int s1 = ((w[1] & 0xf) << 8) | w[0]; - if (litidx < (int)symlen[s1] + 1) - sym = s1; - else { - litidx -= (int)symlen[s1] + 1; - sym = (w[2] << 4) | (w[1] >> 4); + uint16_t idxOffset = *(uint16_t *)(d->indextable + 6 * mainidx + 4); + + if (!LittleEndian) + idxOffset = uint16_t((idxOffset << 8) | (idxOffset >> 8)); + + litidx += idxOffset; + + if (litidx < 0) { + do { + litidx += d->sizetable[--block] + 1; + } while (litidx < 0); + } else { + while (litidx > d->sizetable[block]) + litidx -= d->sizetable[block++] + 1; } - } - return sympat[3 * sym]; -} + uint32_t *ptr = (uint32_t *)(d->data + (block << d->blocksize)); -void load_dtz_table(char *str, uint64 key1, uint64 key2) -{ - int i; - struct TBEntry *ptr, *ptr3; - struct TBHashEntry *ptr2; + int m = d->min_len; + uint16_t *offset = d->offset; + base_t *base = d->base - m; + uint8_t *symlen = d->symlen; + int sym, bitcnt; - DTZ_table[0].key1 = key1; - DTZ_table[0].key2 = key2; - DTZ_table[0].entry = NULL; + uint64_t code = *((uint64_t *)ptr); - // find corresponding WDL entry - ptr2 = TB_hash[key1 >> (64 - TBHASHBITS)]; - for (i = 0; i < HSHMAX; i++) - if (ptr2[i].key == key1) break; - if (i == HSHMAX) return; - ptr = ptr2[i].ptr; + if (LittleEndian) + code = BSWAP64(code); - ptr3 = (struct TBEntry *)malloc(ptr->has_pawns - ? sizeof(struct DTZEntry_pawn) - : sizeof(struct DTZEntry_piece)); + ptr += 2; + bitcnt = 0; // number of "empty bits" in code - ptr3->data = map_file(str, DTZSUFFIX, &ptr3->mapping); - ptr3->key = ptr->key; - ptr3->num = ptr->num; - ptr3->symmetric = ptr->symmetric; - ptr3->has_pawns = ptr->has_pawns; - if (ptr3->has_pawns) { - struct DTZEntry_pawn *entry = (struct DTZEntry_pawn *)ptr3; - entry->pawns[0] = ((struct TBEntry_pawn *)ptr)->pawns[0]; - entry->pawns[1] = ((struct TBEntry_pawn *)ptr)->pawns[1]; - } else { - struct DTZEntry_piece *entry = (struct DTZEntry_piece *)ptr3; - entry->enc_type = ((struct TBEntry_piece *)ptr)->enc_type; - } - if (!init_table_dtz(ptr3)) - free(ptr3); - else - DTZ_table[0].entry = ptr3; -} + for (;;) { + int l = m; -static void free_wdl_entry(struct TBEntry *entry) -{ - unmap_file(entry->data, entry->mapping); - if (!entry->has_pawns) { - struct TBEntry_piece *ptr = (struct TBEntry_piece *)entry; - free(ptr->precomp[0]); - if (ptr->precomp[1]) - free(ptr->precomp[1]); - } else { - struct TBEntry_pawn *ptr = (struct TBEntry_pawn *)entry; - int f; - for (f = 0; f < 4; f++) { - free(ptr->file[f].precomp[0]); - if (ptr->file[f].precomp[1]) - free(ptr->file[f].precomp[1]); + while (code < base[l]) l++; + + sym = offset[l]; + + if (!LittleEndian) + sym = ((sym & 0xff) << 8) | (sym >> 8); + + sym += static_cast((code - base[l]) >> (64 - l)); + + if (litidx < (int)symlen[sym] + 1) + break; + + litidx -= (int)symlen[sym] + 1; + code <<= l; + bitcnt += l; + + if (bitcnt >= 32) { + bitcnt -= 32; + uint32_t tmp = *ptr++; + + if (LittleEndian) + tmp = BSWAP32(tmp); + + code |= ((uint64_t)tmp) << bitcnt; + } } - } + + uint8_t *sympat = d->sympat; + + while (symlen[sym] != 0) { + uint8_t* w = sympat + (3 * sym); + int s1 = ((w[1] & 0xf) << 8) | w[0]; + + if (litidx < (int)symlen[s1] + 1) + sym = s1; + else { + litidx -= (int)symlen[s1] + 1; + sym = (w[2] << 4) | (w[1] >> 4); + } + } + + return sympat[3 * sym]; } -static void free_dtz_entry(struct TBEntry *entry) +void load_dtz_table(const std::string& str, uint64_t key1, uint64_t key2) { - unmap_file(entry->data, entry->mapping); - if (!entry->has_pawns) { - struct DTZEntry_piece *ptr = (struct DTZEntry_piece *)entry; - free(ptr->precomp); - } else { - struct DTZEntry_pawn *ptr = (struct DTZEntry_pawn *)entry; - int f; - for (f = 0; f < 4; f++) - free(ptr->file[f].precomp); - } - free(entry); + int i; + TBEntry *ptr, *ptr3; + TBHashEntry *ptr2; + + DTZ_table[0].key1 = key1; + DTZ_table[0].key2 = key2; + DTZ_table[0].entry = NULL; + + // find corresponding WDL entry + ptr2 = TB_hash[key1 >> (64 - TBHASHBITS)]; + + for (i = 0; i < HSHMAX; i++) + if (ptr2[i].key == key1) + break; + + if (i == HSHMAX) + return; + + ptr = ptr2[i].ptr; + + ptr3 = (TBEntry *)malloc(ptr->has_pawns + ? sizeof(DTZEntry_pawn) + : sizeof(DTZEntry_piece)); + + ptr3->data = map_file(str, DTZSUFFIX, &ptr3->mapping); + ptr3->key = ptr->key; + ptr3->num = ptr->num; + ptr3->symmetric = ptr->symmetric; + ptr3->has_pawns = ptr->has_pawns; + + if (ptr3->has_pawns) { + DTZEntry_pawn *entry = (DTZEntry_pawn *)ptr3; + entry->pawns[0] = ((TBEntry_pawn *)ptr)->pawns[0]; + entry->pawns[1] = ((TBEntry_pawn *)ptr)->pawns[1]; + } else { + DTZEntry_piece *entry = (DTZEntry_piece *)ptr3; + entry->enc_type = ((TBEntry_piece *)ptr)->enc_type; + } + + if (!init_table_dtz(ptr3)) + free(ptr3); + else + DTZ_table[0].entry = ptr3; +} + +static void free_wdl_entry(TBEntry *entry) +{ + unmap_file(entry->data, entry->mapping); + + if (!entry->has_pawns) { + TBEntry_piece *ptr = (TBEntry_piece *)entry; + free(ptr->precomp[0]); + + if (ptr->precomp[1]) + free(ptr->precomp[1]); + } else { + TBEntry_pawn *ptr = (TBEntry_pawn *)entry; + int f; + + for (f = 0; f < 4; f++) { + free(ptr->file[f].precomp[0]); + + if (ptr->file[f].precomp[1]) + free(ptr->file[f].precomp[1]); + } + } +} + +static void free_dtz_entry(TBEntry *entry) +{ + unmap_file(entry->data, entry->mapping); + + if (!entry->has_pawns) { + DTZEntry_piece *ptr = (DTZEntry_piece *)entry; + free(ptr->precomp); + } else { + DTZEntry_pawn *ptr = (DTZEntry_pawn *)entry; + int f; + + for (f = 0; f < 4; f++) + free(ptr->file[f].precomp); + } + + free(entry); } static int wdl_to_map[5] = { 1, 3, 0, 2, 0 }; -static ubyte pa_flags[5] = { 8, 0, 0, 0, 4 }; +static uint8_t pa_flags[5] = { 8, 0, 0, 0, 4 }; diff --git a/src/syzygy/tbcore.h b/src/syzygy/tbcore.h index cdaf2aca..4b36a99f 100644 --- a/src/syzygy/tbcore.h +++ b/src/syzygy/tbcore.h @@ -5,30 +5,20 @@ #ifndef TBCORE_H #define TBCORE_H +#include + #ifndef _WIN32 -#include #define SEP_CHAR ':' #define FD int #define FD_ERR -1 #else +#define WIN32_LEAN_AND_MEAN #include #define SEP_CHAR ';' #define FD HANDLE #define FD_ERR INVALID_HANDLE_VALUE #endif -#ifndef _WIN32 -#define LOCK_T pthread_mutex_t -#define LOCK_INIT(x) pthread_mutex_init(&(x), NULL) -#define LOCK(x) pthread_mutex_lock(&(x)) -#define UNLOCK(x) pthread_mutex_unlock(&(x)) -#else -#define LOCK_T HANDLE -#define LOCK_INIT(x) do { x = CreateMutex(NULL, FALSE, NULL); } while (0) -#define LOCK(x) WaitForSingleObject(x, INFINITE) -#define UNLOCK(x) ReleaseMutex(x) -#endif - #ifndef _MSC_VER #define BSWAP32(v) __builtin_bswap32(v) #define BSWAP64(v) __builtin_bswap64(v) @@ -43,41 +33,36 @@ #define DTZDIR "RTBZDIR" #define TBPIECES 6 -typedef unsigned long long uint64; -typedef unsigned int uint32; -typedef unsigned char ubyte; -typedef unsigned short ushort; - -const ubyte WDL_MAGIC[4] = { 0x71, 0xe8, 0x23, 0x5d }; -const ubyte DTZ_MAGIC[4] = { 0xd7, 0x66, 0x0c, 0xa5 }; +const uint8_t WDL_MAGIC[4] = { 0x71, 0xe8, 0x23, 0x5d }; +const uint8_t DTZ_MAGIC[4] = { 0xd7, 0x66, 0x0c, 0xa5 }; #define TBHASHBITS 10 struct TBHashEntry; -typedef uint64 base_t; +typedef uint64_t base_t; struct PairsData { - char *indextable; - ushort *sizetable; - ubyte *data; - ushort *offset; - ubyte *symlen; - ubyte *sympat; - int blocksize; - int idxbits; - int min_len; - base_t base[1]; // C++ complains about base[]... + char *indextable; + uint16_t *sizetable; + uint8_t *data; + uint16_t *offset; + uint8_t *symlen; + uint8_t *sympat; + int blocksize; + int idxbits; + int min_len; + base_t base[1]; // C++ complains about base[]... }; struct TBEntry { - char *data; - uint64 key; - uint64 mapping; - ubyte ready; - ubyte num; - ubyte symmetric; - ubyte has_pawns; + char *data; + uint64_t key; + uint64_t mapping; + uint8_t ready; + uint8_t num; + uint8_t symmetric; + uint8_t has_pawns; } #ifndef _WIN32 __attribute__((__may_alias__)) @@ -85,84 +70,84 @@ __attribute__((__may_alias__)) ; struct TBEntry_piece { - char *data; - uint64 key; - uint64 mapping; - ubyte ready; - ubyte num; - ubyte symmetric; - ubyte has_pawns; - ubyte enc_type; - struct PairsData *precomp[2]; - int factor[2][TBPIECES]; - ubyte pieces[2][TBPIECES]; - ubyte norm[2][TBPIECES]; + char *data; + uint64_t key; + uint64_t mapping; + uint8_t ready; + uint8_t num; + uint8_t symmetric; + uint8_t has_pawns; + uint8_t enc_type; + struct PairsData *precomp[2]; + int factor[2][TBPIECES]; + uint8_t pieces[2][TBPIECES]; + uint8_t norm[2][TBPIECES]; }; struct TBEntry_pawn { - char *data; - uint64 key; - uint64 mapping; - ubyte ready; - ubyte num; - ubyte symmetric; - ubyte has_pawns; - ubyte pawns[2]; - struct { - struct PairsData *precomp[2]; - int factor[2][TBPIECES]; - ubyte pieces[2][TBPIECES]; - ubyte norm[2][TBPIECES]; - } file[4]; + char *data; + uint64_t key; + uint64_t mapping; + uint8_t ready; + uint8_t num; + uint8_t symmetric; + uint8_t has_pawns; + uint8_t pawns[2]; + struct { + struct PairsData *precomp[2]; + int factor[2][TBPIECES]; + uint8_t pieces[2][TBPIECES]; + uint8_t norm[2][TBPIECES]; + } file[4]; }; struct DTZEntry_piece { - char *data; - uint64 key; - uint64 mapping; - ubyte ready; - ubyte num; - ubyte symmetric; - ubyte has_pawns; - ubyte enc_type; - struct PairsData *precomp; - int factor[TBPIECES]; - ubyte pieces[TBPIECES]; - ubyte norm[TBPIECES]; - ubyte flags; // accurate, mapped, side - ushort map_idx[4]; - ubyte *map; + char *data; + uint64_t key; + uint64_t mapping; + uint8_t ready; + uint8_t num; + uint8_t symmetric; + uint8_t has_pawns; + uint8_t enc_type; + struct PairsData *precomp; + int factor[TBPIECES]; + uint8_t pieces[TBPIECES]; + uint8_t norm[TBPIECES]; + uint8_t flags; // accurate, mapped, side + uint16_t map_idx[4]; + uint8_t *map; }; struct DTZEntry_pawn { - char *data; - uint64 key; - uint64 mapping; - ubyte ready; - ubyte num; - ubyte symmetric; - ubyte has_pawns; - ubyte pawns[2]; - struct { - struct PairsData *precomp; - int factor[TBPIECES]; - ubyte pieces[TBPIECES]; - ubyte norm[TBPIECES]; - } file[4]; - ubyte flags[4]; - ushort map_idx[4][4]; - ubyte *map; + char *data; + uint64_t key; + uint64_t mapping; + uint8_t ready; + uint8_t num; + uint8_t symmetric; + uint8_t has_pawns; + uint8_t pawns[2]; + struct { + struct PairsData *precomp; + int factor[TBPIECES]; + uint8_t pieces[TBPIECES]; + uint8_t norm[TBPIECES]; + } file[4]; + uint8_t flags[4]; + uint16_t map_idx[4][4]; + uint8_t *map; }; struct TBHashEntry { - uint64 key; - struct TBEntry *ptr; + uint64_t key; + struct TBEntry *ptr; }; struct DTZTableEntry { - uint64 key1; - uint64 key2; - struct TBEntry *entry; + uint64_t key1; + uint64_t key2; + struct TBEntry *entry; }; #endif diff --git a/src/syzygy/tbprobe.cpp b/src/syzygy/tbprobe.cpp index 14d34e79..4d169eb8 100644 --- a/src/syzygy/tbprobe.cpp +++ b/src/syzygy/tbprobe.cpp @@ -7,8 +7,6 @@ this code to other chess engines. */ -#define NOMINMAX - #include #include "../position.h" @@ -22,374 +20,425 @@ #include "tbcore.cpp" namespace Zobrist { - extern Key psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB]; +extern Key psq[COLOR_NB][PIECE_TYPE_NB][SQUARE_NB]; } int Tablebases::MaxCardinality = 0; // Given a position with 6 or fewer pieces, produce a text string // of the form KQPvKRP, where "KQP" represents the white pieces if -// mirror == 0 and the black pieces if mirror == 1. -static void prt_str(Position& pos, char *str, int mirror) +// mirror == false and the black pieces if mirror == true. +static std::string prt_str(Position& pos, bool mirror) { - Color color; - PieceType pt; - int i; + std::string s; - color = !mirror ? WHITE : BLACK; - for (pt = KING; pt >= PAWN; --pt) - for (i = popcount(pos.pieces(color, pt)); i > 0; i--) - *str++ = pchr[6 - pt]; - *str++ = 'v'; - color = ~color; - for (pt = KING; pt >= PAWN; --pt) - for (i = popcount(pos.pieces(color, pt)); i > 0; i--) - *str++ = pchr[6 - pt]; - *str++ = 0; + for (int i = 0; i <= 1; i++) { + Color color = Color(i ^ mirror); + + for (PieceType pt = KING; pt >= PAWN; --pt) + for (Bitboard b = pos.pieces(color, pt); b; b &= b - 1) + s += pchr[pt]; + + if (i == 0) + s += 'v'; + } + + return s; } // Given a position, produce a 64-bit material signature key. // If the engine supports such a key, it should equal the engine's key. -static uint64 calc_key(Position& pos, int mirror) +static uint64_t calc_key(Position& pos, bool mirror) { - Color color; - PieceType pt; - int i; - uint64 key = 0; + uint64_t key = 0; - color = !mirror ? WHITE : BLACK; - for (pt = PAWN; pt <= KING; ++pt) - for (i = popcount(pos.pieces(color, pt)); i > 0; i--) - key ^= Zobrist::psq[WHITE][pt][i - 1]; - color = ~color; - for (pt = PAWN; pt <= KING; ++pt) - for (i = popcount(pos.pieces(color, pt)); i > 0; i--) - key ^= Zobrist::psq[BLACK][pt][i - 1]; + Color color = mirror ? BLACK: WHITE; - return key; + for (PieceType pt = PAWN; pt <= KING; ++pt) + for (int i = popcount(pos.pieces(color, pt)); i > 0; i--) + key ^= Zobrist::psq[WHITE][pt][i - 1]; + + color = ~color; + + for (PieceType pt = PAWN; pt <= KING; ++pt) + for (int i = popcount(pos.pieces(color, pt)); i > 0; i--) + key ^= Zobrist::psq[BLACK][pt][i - 1]; + + return key; } // Produce a 64-bit material key corresponding to the material combination // defined by pcs[16], where pcs[1], ..., pcs[6] is the number of white // pawns, ..., kings and pcs[9], ..., pcs[14] is the number of black // pawns, ..., kings. -static uint64 calc_key_from_pcs(int *pcs, int mirror) +static uint64_t calc_key_from_pcs(int *pcs, bool mirror) { - int color; - PieceType pt; - int i; - uint64 key = 0; + uint64_t key = 0; - color = !mirror ? 0 : 8; - for (pt = PAWN; pt <= KING; ++pt) - for (i = 0; i < pcs[color + pt]; i++) - key ^= Zobrist::psq[WHITE][pt][i]; - color ^= 8; - for (pt = PAWN; pt <= KING; ++pt) - for (i = 0; i < pcs[color + pt]; i++) - key ^= Zobrist::psq[BLACK][pt][i]; + Color color = mirror ? BLACK : WHITE; - return key; + for (PieceType pt = PAWN; pt <= KING; ++pt) + for (int i = 0; i < pcs[8 * color + pt]; i++) + key ^= Zobrist::psq[WHITE][pt][i]; + + color = ~color; + + for (PieceType pt = PAWN; pt <= KING; ++pt) + for (int i = 0; i < pcs[8 * color + pt]; i++) + key ^= Zobrist::psq[BLACK][pt][i]; + + return key; } -bool is_little_endian() { - union { - int i; - char c[sizeof(int)]; - } x; - x.i = 1; - return x.c[0] == 1; +bool is_little_endian() +{ + union { + int i; + char c[sizeof(int)]; + } x; + x.i = 1; + return x.c[0] == 1; } -static ubyte decompress_pairs(struct PairsData *d, uint64 idx) +static uint8_t decompress_pairs(PairsData *d, uint64_t idx) { - static const bool isLittleEndian = is_little_endian(); - return isLittleEndian ? decompress_pairs(d, idx) - : decompress_pairs(d, idx); + static const bool isLittleEndian = is_little_endian(); + return isLittleEndian ? decompress_pairs(d, idx) + : decompress_pairs(d, idx); } // probe_wdl_table and probe_dtz_table require similar adaptations. static int probe_wdl_table(Position& pos, int *success) { - struct TBEntry *ptr; - struct TBHashEntry *ptr2; - uint64 idx; - uint64 key; - int i; - ubyte res; - int p[TBPIECES]; + TBEntry *ptr; + TBHashEntry *ptr2; + uint64_t idx; + uint64_t key; + int i; + uint8_t res; + int p[TBPIECES]; - // Obtain the position's material signature key. - key = pos.material_key(); + // Obtain the position's material signature key. + key = pos.material_key(); - // Test for KvK. - if (key == (Zobrist::psq[WHITE][KING][0] ^ Zobrist::psq[BLACK][KING][0])) - return 0; - - ptr2 = TB_hash[key >> (64 - TBHASHBITS)]; - for (i = 0; i < HSHMAX; i++) - if (ptr2[i].key == key) break; - if (i == HSHMAX) { - *success = 0; - return 0; - } - - ptr = ptr2[i].ptr; - if (!ptr->ready) { - LOCK(TB_mutex); - if (!ptr->ready) { - char str[16]; - prt_str(pos, str, ptr->key != key); - if (!init_table_wdl(ptr, str)) { - ptr2[i].key = 0ULL; - *success = 0; - UNLOCK(TB_mutex); + // Test for KvK. + if (key == (Zobrist::psq[WHITE][KING][0] ^ Zobrist::psq[BLACK][KING][0])) return 0; - } - // Memory barrier to ensure ptr->ready = 1 is not reordered. + + ptr2 = TB_hash[key >> (64 - TBHASHBITS)]; + + for (i = 0; i < HSHMAX; i++) + if (ptr2[i].key == key) + break; + + if (i == HSHMAX) { + *success = 0; + return 0; + } + + ptr = ptr2[i].ptr; + + if (!ptr->ready) { + TB_mutex.lock(); + + if (!ptr->ready) { + std::string s = prt_str(pos, ptr->key != key); + + if (!init_table_wdl(ptr, s)) { + ptr2[i].key = 0ULL; + *success = 0; + TB_mutex.unlock(); + return 0; + } + + // Memory barrier to ensure ptr->ready = 1 is not reordered. #ifdef _MSC_VER - _ReadWriteBarrier(); + _ReadWriteBarrier(); #else - __asm__ __volatile__ ("" ::: "memory"); + __asm__ __volatile__ ("" ::: "memory"); #endif - ptr->ready = 1; - } - UNLOCK(TB_mutex); - } + ptr->ready = 1; + } - int bside, mirror, cmirror; - if (!ptr->symmetric) { - if (key != ptr->key) { - cmirror = 8; - mirror = 0x38; - bside = (pos.side_to_move() == WHITE); + TB_mutex.unlock(); + } + + int bside, mirror, cmirror; + + if (!ptr->symmetric) { + if (key != ptr->key) { + cmirror = 8; + mirror = 0x38; + bside = (pos.side_to_move() == WHITE); + } else { + cmirror = mirror = 0; + bside = !(pos.side_to_move() == WHITE); + } } else { - cmirror = mirror = 0; - bside = !(pos.side_to_move() == WHITE); + cmirror = pos.side_to_move() == WHITE ? 0 : 8; + mirror = pos.side_to_move() == WHITE ? 0 : 0x38; + bside = 0; } - } else { - cmirror = pos.side_to_move() == WHITE ? 0 : 8; - mirror = pos.side_to_move() == WHITE ? 0 : 0x38; - bside = 0; - } - // p[i] is to contain the square 0-63 (A1-H8) for a piece of type - // pc[i] ^ cmirror, where 1 = white pawn, ..., 14 = black king. - // Pieces of the same type are guaranteed to be consecutive. - if (!ptr->has_pawns) { - struct TBEntry_piece *entry = (struct TBEntry_piece *)ptr; - ubyte *pc = entry->pieces[bside]; - for (i = 0; i < entry->num;) { - Bitboard bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), - (PieceType)(pc[i] & 0x07)); - do { - p[i++] = pop_lsb(&bb); - } while (bb); - } - idx = encode_piece(entry, entry->norm[bside], p, entry->factor[bside]); - res = decompress_pairs(entry->precomp[bside], idx); - } else { - struct TBEntry_pawn *entry = (struct TBEntry_pawn *)ptr; - int k = entry->file[0].pieces[0][0] ^ cmirror; - Bitboard bb = pos.pieces((Color)(k >> 3), (PieceType)(k & 0x07)); - i = 0; - do { - p[i++] = pop_lsb(&bb) ^ mirror; - } while (bb); - int f = pawn_file(entry, p); - ubyte *pc = entry->file[f].pieces[bside]; - for (; i < entry->num;) { - bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), - (PieceType)(pc[i] & 0x07)); - do { - p[i++] = pop_lsb(&bb) ^ mirror; - } while (bb); - } - idx = encode_pawn(entry, entry->file[f].norm[bside], p, entry->file[f].factor[bside]); - res = decompress_pairs(entry->file[f].precomp[bside], idx); - } + // p[i] is to contain the square 0-63 (A1-H8) for a piece of type + // pc[i] ^ cmirror, where 1 = white pawn, ..., 14 = black king. + // Pieces of the same type are guaranteed to be consecutive. + if (!ptr->has_pawns) { + TBEntry_piece *entry = (TBEntry_piece *)ptr; + uint8_t *pc = entry->pieces[bside]; - return ((int)res) - 2; + for (i = 0; i < entry->num;) { + Bitboard bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), + (PieceType)(pc[i] & 0x07)); + + do { + p[i++] = pop_lsb(&bb); + } while (bb); + } + + idx = encode_piece(entry, entry->norm[bside], p, entry->factor[bside]); + res = decompress_pairs(entry->precomp[bside], idx); + } else { + TBEntry_pawn *entry = (TBEntry_pawn *)ptr; + int k = entry->file[0].pieces[0][0] ^ cmirror; + Bitboard bb = pos.pieces((Color)(k >> 3), (PieceType)(k & 0x07)); + i = 0; + + do { + p[i++] = pop_lsb(&bb) ^ mirror; + } while (bb); + + int f = pawn_file(entry, p); + uint8_t *pc = entry->file[f].pieces[bside]; + + for (; i < entry->num;) { + bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), + (PieceType)(pc[i] & 0x07)); + + do { + p[i++] = pop_lsb(&bb) ^ mirror; + } while (bb); + } + + idx = encode_pawn(entry, entry->file[f].norm[bside], p, entry->file[f].factor[bside]); + res = decompress_pairs(entry->file[f].precomp[bside], idx); + } + + return ((int)res) - 2; } static int probe_dtz_table(Position& pos, int wdl, int *success) { - struct TBEntry *ptr; - uint64 idx; - int i, res; - int p[TBPIECES]; + TBEntry *ptr; + uint64_t idx; + int i, res; + int p[TBPIECES]; - // Obtain the position's material signature key. - uint64 key = pos.material_key(); + // Obtain the position's material signature key. + uint64_t key = pos.material_key(); - if (DTZ_table[0].key1 != key && DTZ_table[0].key2 != key) { - for (i = 1; i < DTZ_ENTRIES; i++) - if (DTZ_table[i].key1 == key) break; - if (i < DTZ_ENTRIES) { - struct DTZTableEntry table_entry = DTZ_table[i]; - for (; i > 0; i--) - DTZ_table[i] = DTZ_table[i - 1]; - DTZ_table[0] = table_entry; - } else { - struct TBHashEntry *ptr2 = TB_hash[key >> (64 - TBHASHBITS)]; - for (i = 0; i < HSHMAX; i++) - if (ptr2[i].key == key) break; - if (i == HSHMAX) { + if (DTZ_table[0].key1 != key && DTZ_table[0].key2 != key) { + for (i = 1; i < DTZ_ENTRIES; i++) + if (DTZ_table[i].key1 == key) + break; + + if (i < DTZ_ENTRIES) { + DTZTableEntry table_entry = DTZ_table[i]; + + for (; i > 0; i--) + DTZ_table[i] = DTZ_table[i - 1]; + + DTZ_table[0] = table_entry; + } else { + TBHashEntry *ptr2 = TB_hash[key >> (64 - TBHASHBITS)]; + + for (i = 0; i < HSHMAX; i++) + if (ptr2[i].key == key) + break; + + if (i == HSHMAX) { + *success = 0; + return 0; + } + + ptr = ptr2[i].ptr; + bool mirror = (ptr->key != key); + std::string s = prt_str(pos, mirror); + + if (DTZ_table[DTZ_ENTRIES - 1].entry) + free_dtz_entry(DTZ_table[DTZ_ENTRIES-1].entry); + + for (i = DTZ_ENTRIES - 1; i > 0; i--) + DTZ_table[i] = DTZ_table[i - 1]; + + load_dtz_table(s, calc_key(pos, mirror), calc_key(pos, !mirror)); + } + } + + ptr = DTZ_table[0].entry; + + if (!ptr) { *success = 0; return 0; - } - ptr = ptr2[i].ptr; - char str[16]; - int mirror = (ptr->key != key); - prt_str(pos, str, mirror); - if (DTZ_table[DTZ_ENTRIES - 1].entry) - free_dtz_entry(DTZ_table[DTZ_ENTRIES-1].entry); - for (i = DTZ_ENTRIES - 1; i > 0; i--) - DTZ_table[i] = DTZ_table[i - 1]; - load_dtz_table(str, calc_key(pos, mirror), calc_key(pos, !mirror)); } - } - ptr = DTZ_table[0].entry; - if (!ptr) { - *success = 0; - return 0; - } + int bside, mirror, cmirror; - int bside, mirror, cmirror; - if (!ptr->symmetric) { - if (key != ptr->key) { - cmirror = 8; - mirror = 0x38; - bside = (pos.side_to_move() == WHITE); + if (!ptr->symmetric) { + if (key != ptr->key) { + cmirror = 8; + mirror = 0x38; + bside = (pos.side_to_move() == WHITE); + } else { + cmirror = mirror = 0; + bside = !(pos.side_to_move() == WHITE); + } } else { - cmirror = mirror = 0; - bside = !(pos.side_to_move() == WHITE); + cmirror = pos.side_to_move() == WHITE ? 0 : 8; + mirror = pos.side_to_move() == WHITE ? 0 : 0x38; + bside = 0; } - } else { - cmirror = pos.side_to_move() == WHITE ? 0 : 8; - mirror = pos.side_to_move() == WHITE ? 0 : 0x38; - bside = 0; - } - if (!ptr->has_pawns) { - struct DTZEntry_piece *entry = (struct DTZEntry_piece *)ptr; - if ((entry->flags & 1) != bside && !entry->symmetric) { - *success = -1; - return 0; - } - ubyte *pc = entry->pieces; - for (i = 0; i < entry->num;) { - Bitboard bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), - (PieceType)(pc[i] & 0x07)); - do { - p[i++] = pop_lsb(&bb); - } while (bb); - } - idx = encode_piece((struct TBEntry_piece *)entry, entry->norm, p, entry->factor); - res = decompress_pairs(entry->precomp, idx); + if (!ptr->has_pawns) { + DTZEntry_piece *entry = (DTZEntry_piece *)ptr; - if (entry->flags & 2) - res = entry->map[entry->map_idx[wdl_to_map[wdl + 2]] + res]; + if ((entry->flags & 1) != bside && !entry->symmetric) { + *success = -1; + return 0; + } - if (!(entry->flags & pa_flags[wdl + 2]) || (wdl & 1)) - res *= 2; - } else { - struct DTZEntry_pawn *entry = (struct DTZEntry_pawn *)ptr; - int k = entry->file[0].pieces[0] ^ cmirror; - Bitboard bb = pos.pieces((Color)(k >> 3), (PieceType)(k & 0x07)); - i = 0; - do { - p[i++] = pop_lsb(&bb) ^ mirror; - } while (bb); - int f = pawn_file((struct TBEntry_pawn *)entry, p); - if ((entry->flags[f] & 1) != bside) { - *success = -1; - return 0; - } - ubyte *pc = entry->file[f].pieces; - for (; i < entry->num;) { - bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), + uint8_t *pc = entry->pieces; + + for (i = 0; i < entry->num;) { + Bitboard bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), + (PieceType)(pc[i] & 0x07)); + + do { + p[i++] = pop_lsb(&bb); + } while (bb); + } + + idx = encode_piece((TBEntry_piece *)entry, entry->norm, p, entry->factor); + res = decompress_pairs(entry->precomp, idx); + + if (entry->flags & 2) + res = entry->map[entry->map_idx[wdl_to_map[wdl + 2]] + res]; + + if (!(entry->flags & pa_flags[wdl + 2]) || (wdl & 1)) + res *= 2; + } else { + DTZEntry_pawn *entry = (DTZEntry_pawn *)ptr; + int k = entry->file[0].pieces[0] ^ cmirror; + Bitboard bb = pos.pieces((Color)(k >> 3), (PieceType)(k & 0x07)); + i = 0; + + do { + p[i++] = pop_lsb(&bb) ^ mirror; + } while (bb); + + int f = pawn_file((TBEntry_pawn *)entry, p); + + if ((entry->flags[f] & 1) != bside) { + *success = -1; + return 0; + } + + uint8_t *pc = entry->file[f].pieces; + + for (; i < entry->num;) { + bb = pos.pieces((Color)((pc[i] ^ cmirror) >> 3), (PieceType)(pc[i] & 0x07)); - do { - p[i++] = pop_lsb(&bb) ^ mirror; - } while (bb); + + do { + p[i++] = pop_lsb(&bb) ^ mirror; + } while (bb); + } + + idx = encode_pawn((TBEntry_pawn *)entry, entry->file[f].norm, p, entry->file[f].factor); + res = decompress_pairs(entry->file[f].precomp, idx); + + if (entry->flags[f] & 2) + res = entry->map[entry->map_idx[f][wdl_to_map[wdl + 2]] + res]; + + if (!(entry->flags[f] & pa_flags[wdl + 2]) || (wdl & 1)) + res *= 2; } - idx = encode_pawn((struct TBEntry_pawn *)entry, entry->file[f].norm, p, entry->file[f].factor); - res = decompress_pairs(entry->file[f].precomp, idx); - if (entry->flags[f] & 2) - res = entry->map[entry->map_idx[f][wdl_to_map[wdl + 2]] + res]; - - if (!(entry->flags[f] & pa_flags[wdl + 2]) || (wdl & 1)) - res *= 2; - } - - return res; + return res; } // Add underpromotion captures to list of captures. static ExtMove *add_underprom_caps(Position& pos, ExtMove *stack, ExtMove *end) { - ExtMove *moves, *extra = end; + ExtMove *moves, *extra = end; - for (moves = stack; moves < end; moves++) { - Move move = moves->move; - if (type_of(move) == PROMOTION && !pos.empty(to_sq(move))) { - (*extra++).move = (Move)(move - (1 << 12)); - (*extra++).move = (Move)(move - (2 << 12)); - (*extra++).move = (Move)(move - (3 << 12)); + for (moves = stack; moves < end; moves++) { + Move move = moves->move; + + if (type_of(move) == PROMOTION && !pos.empty(to_sq(move))) { + (*extra++).move = (Move)(move - (1 << 12)); + (*extra++).move = (Move)(move - (2 << 12)); + (*extra++).move = (Move)(move - (3 << 12)); + } } - } - return extra; + return extra; } static int probe_ab(Position& pos, int alpha, int beta, int *success) { - int v; - ExtMove stack[64]; - ExtMove *moves, *end; - StateInfo st; + int v; + ExtMove stack[64]; + ExtMove *moves, *end; + StateInfo st; - // Generate (at least) all legal non-ep captures including (under)promotions. - // It is OK to generate more, as long as they are filtered out below. - if (!pos.checkers()) { - end = generate(pos, stack); - // Since underpromotion captures are not included, we need to add them. - end = add_underprom_caps(pos, stack, end); - } else - end = generate(pos, stack); + // Generate (at least) all legal non-ep captures including (under)promotions. + // It is OK to generate more, as long as they are filtered out below. + if (!pos.checkers()) { + end = generate(pos, stack); + // Since underpromotion captures are not included, we need to add them. + end = add_underprom_caps(pos, stack, end); + } else + end = generate(pos, stack); - CheckInfo ci(pos); + CheckInfo ci(pos); - for (moves = stack; moves < end; moves++) { - Move capture = moves->move; - if (!pos.capture(capture) || type_of(capture) == ENPASSANT - || !pos.legal(capture, ci.pinned)) - continue; - pos.do_move(capture, st, pos.gives_check(capture, ci)); - v = -probe_ab(pos, -beta, -alpha, success); - pos.undo_move(capture); - if (*success == 0) return 0; - if (v > alpha) { - if (v >= beta) { - *success = 2; - return v; - } - alpha = v; + for (moves = stack; moves < end; moves++) { + Move capture = moves->move; + + if (!pos.capture(capture) || type_of(capture) == ENPASSANT + || !pos.legal(capture, ci.pinned)) + continue; + + pos.do_move(capture, st, pos.gives_check(capture, ci)); + v = -probe_ab(pos, -beta, -alpha, success); + pos.undo_move(capture); + + if (*success == 0) + return 0; + + if (v > alpha) { + if (v >= beta) { + *success = 2; + return v; + } + + alpha = v; + } } - } - v = probe_wdl_table(pos, success); - if (*success == 0) return 0; - if (alpha >= v) { - *success = 1 + (alpha > 0); - return alpha; - } else { - *success = 1; - return v; - } + v = probe_wdl_table(pos, success); + + if (*success == 0) + return 0; + + if (alpha >= v) { + *success = 1 + (alpha > 0); + return alpha; + } else { + *success = 1; + return v; + } } // Probe the WDL table for a particular position. @@ -402,160 +451,199 @@ static int probe_ab(Position& pos, int alpha, int beta, int *success) // 2 : win int Tablebases::probe_wdl(Position& pos, int *success) { - int v; + int v; - *success = 1; - v = probe_ab(pos, -2, 2, success); + *success = 1; + v = probe_ab(pos, -2, 2, success); - // If en passant is not possible, we are done. - if (pos.ep_square() == SQ_NONE) - return v; - if (!(*success)) return 0; + // If en passant is not possible, we are done. + if (pos.ep_square() == SQ_NONE) + return v; - // Now handle en passant. - int v1 = -3; - // Generate (at least) all legal en passant captures. - ExtMove stack[192]; - ExtMove *moves, *end; - StateInfo st; + if (*success == 0) + return 0; - if (!pos.checkers()) - end = generate(pos, stack); - else - end = generate(pos, stack); + // Now handle en passant. + int v1 = -3; + // Generate (at least) all legal en passant captures. + ExtMove stack[MAX_MOVES]; + ExtMove *moves, *end; + StateInfo st; - CheckInfo ci(pos); + if (!pos.checkers()) + end = generate(pos, stack); + else + end = generate(pos, stack); - for (moves = stack; moves < end; moves++) { - Move capture = moves->move; - if (type_of(capture) != ENPASSANT - || !pos.legal(capture, ci.pinned)) - continue; - pos.do_move(capture, st, pos.gives_check(capture, ci)); - int v0 = -probe_ab(pos, -2, 2, success); - pos.undo_move(capture); - if (*success == 0) return 0; - if (v0 > v1) v1 = v0; - } - if (v1 > -3) { - if (v1 >= v) v = v1; - else if (v == 0) { - // Check whether there is at least one legal non-ep move. - for (moves = stack; moves < end; moves++) { + CheckInfo ci(pos); + + for (moves = stack; moves < end; moves++) { Move capture = moves->move; - if (type_of(capture) == ENPASSANT) continue; - if (pos.legal(capture, ci.pinned)) break; - } - if (moves == end && !pos.checkers()) { - end = generate(pos, end); - for (; moves < end; moves++) { - Move move = moves->move; - if (pos.legal(move, ci.pinned)) - break; - } - } - // If not, then we are forced to play the losing ep capture. - if (moves == end) - v = v1; - } - } - return v; + if (type_of(capture) != ENPASSANT + || !pos.legal(capture, ci.pinned)) + continue; + + pos.do_move(capture, st, pos.gives_check(capture, ci)); + int v0 = -probe_ab(pos, -2, 2, success); + pos.undo_move(capture); + + if (*success == 0) + return 0; + + if (v0 > v1) v1 = v0; + } + + if (v1 > -3) { + if (v1 >= v) v = v1; + else if (v == 0) { + // Check whether there is at least one legal non-ep move. + for (moves = stack; moves < end; moves++) { + Move capture = moves->move; + + if (type_of(capture) == ENPASSANT) continue; + + if (pos.legal(capture, ci.pinned)) + break; + } + + if (moves == end && !pos.checkers()) { + end = generate(pos, end); + + for (; moves < end; moves++) { + Move move = moves->move; + + if (pos.legal(move, ci.pinned)) + break; + } + } + + // If not, then we are forced to play the losing ep capture. + if (moves == end) + v = v1; + } + } + + return v; } // This routine treats a position with en passant captures as one without. static int probe_dtz_no_ep(Position& pos, int *success) { - int wdl, dtz; + int wdl, dtz; - wdl = probe_ab(pos, -2, 2, success); - if (*success == 0) return 0; + wdl = probe_ab(pos, -2, 2, success); - if (wdl == 0) return 0; + if (*success == 0) return 0; - if (*success == 2) - return wdl == 2 ? 1 : 101; + if (wdl == 0) return 0; - ExtMove stack[192]; - ExtMove *moves, *end = NULL; - StateInfo st; - CheckInfo ci(pos); + if (*success == 2) + return wdl == 2 ? 1 : 101; - if (wdl > 0) { - // Generate at least all legal non-capturing pawn moves - // including non-capturing promotions. - if (!pos.checkers()) - end = generate(pos, stack); - else - end = generate(pos, stack); + ExtMove stack[MAX_MOVES]; + ExtMove *moves, *end = NULL; + StateInfo st; + CheckInfo ci(pos); - for (moves = stack; moves < end; moves++) { - Move move = moves->move; - if (type_of(pos.moved_piece(move)) != PAWN || pos.capture(move) - || !pos.legal(move, ci.pinned)) - continue; - pos.do_move(move, st, pos.gives_check(move, ci)); - int v = -probe_ab(pos, -2, -wdl + 1, success); - pos.undo_move(move); - if (*success == 0) return 0; - if (v == wdl) - return v == 2 ? 1 : 101; - } - } + if (wdl > 0) { + // Generate at least all legal non-capturing pawn moves + // including non-capturing promotions. + if (!pos.checkers()) + end = generate(pos, stack); + else + end = generate(pos, stack); - dtz = 1 + probe_dtz_table(pos, wdl, success); - if (*success >= 0) { - if (wdl & 1) dtz += 100; - return wdl >= 0 ? dtz : -dtz; - } + for (moves = stack; moves < end; moves++) { + Move move = moves->move; - if (wdl > 0) { - int best = 0xffff; - for (moves = stack; moves < end; moves++) { - Move move = moves->move; - if (pos.capture(move) || type_of(pos.moved_piece(move)) == PAWN - || !pos.legal(move, ci.pinned)) - continue; - pos.do_move(move, st, pos.gives_check(move, ci)); - int v = -Tablebases::probe_dtz(pos, success); - pos.undo_move(move); - if (*success == 0) return 0; - if (v > 0 && v + 1 < best) - best = v + 1; - } - return best; - } else { - int best = -1; - if (!pos.checkers()) - end = generate(pos, stack); - else - end = generate(pos, stack); - for (moves = stack; moves < end; moves++) { - int v; - Move move = moves->move; - if (!pos.legal(move, ci.pinned)) - continue; - pos.do_move(move, st, pos.gives_check(move, ci)); - if (st.rule50 == 0) { - if (wdl == -2) v = -1; - else { - v = probe_ab(pos, 1, 2, success); - v = (v == 2) ? 0 : -101; + if (type_of(pos.moved_piece(move)) != PAWN || pos.capture(move) + || !pos.legal(move, ci.pinned)) + continue; + + pos.do_move(move, st, pos.gives_check(move, ci)); + int v = -probe_ab(pos, -2, -wdl + 1, success); + pos.undo_move(move); + + if (*success == 0) return 0; + + if (v == wdl) + return v == 2 ? 1 : 101; } - } else { - v = -Tablebases::probe_dtz(pos, success) - 1; - } - pos.undo_move(move); - if (*success == 0) return 0; - if (v < best) - best = v; } - return best; - } + + dtz = 1 + probe_dtz_table(pos, wdl, success); + + if (*success >= 0) { + if (wdl & 1) dtz += 100; + + return wdl >= 0 ? dtz : -dtz; + } + + if (wdl > 0) { + int best = 0xffff; + + for (moves = stack; moves < end; moves++) { + Move move = moves->move; + + if (pos.capture(move) || type_of(pos.moved_piece(move)) == PAWN + || !pos.legal(move, ci.pinned)) + continue; + + pos.do_move(move, st, pos.gives_check(move, ci)); + int v = -Tablebases::probe_dtz(pos, success); + pos.undo_move(move); + + if (*success == 0) + return 0; + + if (v > 0 && v + 1 < best) + best = v + 1; + } + + return best; + } else { + int best = -1; + + if (!pos.checkers()) + end = generate(pos, stack); + else + end = generate(pos, stack); + + for (moves = stack; moves < end; moves++) { + int v; + Move move = moves->move; + + if (!pos.legal(move, ci.pinned)) + continue; + + pos.do_move(move, st, pos.gives_check(move, ci)); + + if (st.rule50 == 0) { + if (wdl == -2) v = -1; + else { + v = probe_ab(pos, 1, 2, success); + v = (v == 2) ? 0 : -101; + } + } else { + v = -Tablebases::probe_dtz(pos, success) - 1; + } + + pos.undo_move(move); + + if (*success == 0) + return 0; + + if (v < best) + best = v; + } + + return best; + } } static int wdl_to_dtz[] = { - -1, -101, 0, 101, 1 + -1, -101, 0, 101, 1 }; // Probe the DTZ table for a particular position. @@ -586,100 +674,123 @@ static int wdl_to_dtz[] = { // int Tablebases::probe_dtz(Position& pos, int *success) { - *success = 1; - int v = probe_dtz_no_ep(pos, success); + *success = 1; + int v = probe_dtz_no_ep(pos, success); - if (pos.ep_square() == SQ_NONE) - return v; - if (*success == 0) return 0; + if (pos.ep_square() == SQ_NONE) + return v; - // Now handle en passant. - int v1 = -3; + if (*success == 0) + return 0; - ExtMove stack[192]; - ExtMove *moves, *end; - StateInfo st; + // Now handle en passant. + int v1 = -3; - if (!pos.checkers()) - end = generate(pos, stack); - else - end = generate(pos, stack); - CheckInfo ci(pos); + ExtMove stack[MAX_MOVES]; + ExtMove *moves, *end; + StateInfo st; - for (moves = stack; moves < end; moves++) { - Move capture = moves->move; - if (type_of(capture) != ENPASSANT + if (!pos.checkers()) + end = generate(pos, stack); + else + end = generate(pos, stack); + + CheckInfo ci(pos); + + for (moves = stack; moves < end; moves++) { + Move capture = moves->move; + + if (type_of(capture) != ENPASSANT || !pos.legal(capture, ci.pinned)) - continue; - pos.do_move(capture, st, pos.gives_check(capture, ci)); - int v0 = -probe_ab(pos, -2, 2, success); - pos.undo_move(capture); - if (*success == 0) return 0; - if (v0 > v1) v1 = v0; - } - if (v1 > -3) { - v1 = wdl_to_dtz[v1 + 2]; - if (v < -100) { - if (v1 >= 0) - v = v1; - } else if (v < 0) { - if (v1 >= 0 || v1 < -100) - v = v1; - } else if (v > 100) { - if (v1 > 0) - v = v1; - } else if (v > 0) { - if (v1 == 1) - v = v1; - } else if (v1 >= 0) { - v = v1; - } else { - for (moves = stack; moves < end; moves++) { - Move move = moves->move; - if (type_of(move) == ENPASSANT) continue; - if (pos.legal(move, ci.pinned)) break; - } - if (moves == end && !pos.checkers()) { - end = generate(pos, end); - for (; moves < end; moves++) { - Move move = moves->move; - if (pos.legal(move, ci.pinned)) - break; - } - } - if (moves == end) - v = v1; - } - } + continue; - return v; + pos.do_move(capture, st, pos.gives_check(capture, ci)); + int v0 = -probe_ab(pos, -2, 2, success); + pos.undo_move(capture); + + if (*success == 0) + return 0; + + if (v0 > v1) v1 = v0; + } + + if (v1 > -3) { + v1 = wdl_to_dtz[v1 + 2]; + + if (v < -100) { + if (v1 >= 0) + v = v1; + } else if (v < 0) { + if (v1 >= 0 || v1 < -100) + v = v1; + } else if (v > 100) { + if (v1 > 0) + v = v1; + } else if (v > 0) { + if (v1 == 1) + v = v1; + } else if (v1 >= 0) { + v = v1; + } else { + for (moves = stack; moves < end; moves++) { + Move move = moves->move; + + if (type_of(move) == ENPASSANT) continue; + + if (pos.legal(move, ci.pinned)) + break; + } + + if (moves == end && !pos.checkers()) { + end = generate(pos, end); + + for (; moves < end; moves++) { + Move move = moves->move; + + if (pos.legal(move, ci.pinned)) + break; + } + } + + if (moves == end) + v = v1; + } + } + + return v; } // Check whether there has been at least one repetition of positions // since the last capture or pawn move. static int has_repeated(StateInfo *st) { - while (1) { - int i = 4, e = std::min(st->rule50, st->pliesFromNull); - if (e < i) - return 0; - StateInfo *stp = st->previous->previous; - do { - stp = stp->previous->previous; - if (stp->key == st->key) - return 1; - i += 2; - } while (i <= e); - st = st->previous; - } + while (1) { + int i = 4, e = std::min(st->rule50, st->pliesFromNull); + + if (e < i) + return 0; + + StateInfo *stp = st->previous->previous; + + do { + stp = stp->previous->previous; + + if (stp->key == st->key) + return 1; + + i += 2; + } while (i <= e); + + st = st->previous; + } } static Value wdl_to_Value[5] = { - -VALUE_MATE + MAX_PLY + 1, - VALUE_DRAW - 2, - VALUE_DRAW, - VALUE_DRAW + 2, - VALUE_MATE - MAX_PLY - 1 + -VALUE_MATE + MAX_PLY + 1, + VALUE_DRAW - 2, + VALUE_DRAW, + VALUE_DRAW + 2, + VALUE_MATE - MAX_PLY - 1 }; // Use the DTZ tables to filter out moves that don't preserve the win or draw. @@ -690,104 +801,128 @@ static Value wdl_to_Value[5] = { // no moves were filtered out. bool Tablebases::root_probe(Position& pos, Search::RootMoveVector& rootMoves, Value& score) { - int success; + int success; - int dtz = probe_dtz(pos, &success); - if (!success) return false; + int dtz = probe_dtz(pos, &success); - StateInfo st; - CheckInfo ci(pos); + if (!success) + return false; - // Probe each move. - for (size_t i = 0; i < rootMoves.size(); i++) { - Move move = rootMoves[i].pv[0]; - pos.do_move(move, st, pos.gives_check(move, ci)); - int v = 0; - if (pos.checkers() && dtz > 0) { - ExtMove s[192]; - if (generate(pos, s) == s) - v = 1; - } - if (!v) { - if (st.rule50 != 0) { - v = -Tablebases::probe_dtz(pos, &success); - if (v > 0) v++; - else if (v < 0) v--; - } else { - v = -Tablebases::probe_wdl(pos, &success); - v = wdl_to_dtz[v + 2]; - } - } - pos.undo_move(move); - if (!success) return false; - rootMoves[i].score = (Value)v; - } + StateInfo st; + CheckInfo ci(pos); - // Obtain 50-move counter for the root position. - // In Stockfish there seems to be no clean way, so we do it like this: - int cnt50 = st.previous->rule50; - - // Use 50-move counter to determine whether the root position is - // won, lost or drawn. - int wdl = 0; - if (dtz > 0) - wdl = (dtz + cnt50 <= 100) ? 2 : 1; - else if (dtz < 0) - wdl = (-dtz + cnt50 <= 100) ? -2 : -1; - - // Determine the score to report to the user. - score = wdl_to_Value[wdl + 2]; - // If the position is winning or losing, but too few moves left, adjust the - // score to show how close it is to winning or losing. - // NOTE: int(PawnValueEg) is used as scaling factor in score_to_uci(). - if (wdl == 1 && dtz <= 100) - score = (Value)(((200 - dtz - cnt50) * int(PawnValueEg)) / 200); - else if (wdl == -1 && dtz >= -100) - score = -(Value)(((200 + dtz - cnt50) * int(PawnValueEg)) / 200); - - // Now be a bit smart about filtering out moves. - size_t j = 0; - if (dtz > 0) { // winning (or 50-move rule draw) - int best = 0xffff; + // Probe each move. for (size_t i = 0; i < rootMoves.size(); i++) { - int v = rootMoves[i].score; - if (v > 0 && v < best) - best = v; - } - int max = best; - // If the current phase has not seen repetitions, then try all moves - // that stay safely within the 50-move budget, if there are any. - if (!has_repeated(st.previous) && best + cnt50 <= 99) - max = 99 - cnt50; - for (size_t i = 0; i < rootMoves.size(); i++) { - int v = rootMoves[i].score; - if (v > 0 && v <= max) - rootMoves[j++] = rootMoves[i]; - } - } else if (dtz < 0) { // losing (or 50-move rule draw) - int best = 0; - for (size_t i = 0; i < rootMoves.size(); i++) { - int v = rootMoves[i].score; - if (v < best) - best = v; - } - // Try all moves, unless we approach or have a 50-move rule draw. - if (-best * 2 + cnt50 < 100) - return true; - for (size_t i = 0; i < rootMoves.size(); i++) { - if (rootMoves[i].score == best) - rootMoves[j++] = rootMoves[i]; - } - } else { // drawing - // Try all moves that preserve the draw. - for (size_t i = 0; i < rootMoves.size(); i++) { - if (rootMoves[i].score == 0) - rootMoves[j++] = rootMoves[i]; - } - } - rootMoves.resize(j, Search::RootMove(MOVE_NONE)); + Move move = rootMoves[i].pv[0]; + pos.do_move(move, st, pos.gives_check(move, ci)); + int v = 0; - return true; + if (pos.checkers() && dtz > 0) { + ExtMove s[MAX_MOVES]; + + if (generate(pos, s) == s) + v = 1; + } + + if (!v) { + if (st.rule50 != 0) { + v = -Tablebases::probe_dtz(pos, &success); + + if (v > 0) v++; + else if (v < 0) v--; + } else { + v = -Tablebases::probe_wdl(pos, &success); + v = wdl_to_dtz[v + 2]; + } + } + + pos.undo_move(move); + + if (!success) + return false; + + rootMoves[i].score = (Value)v; + } + + // Obtain 50-move counter for the root position. + // In Stockfish there seems to be no clean way, so we do it like this: + int cnt50 = st.previous->rule50; + + // Use 50-move counter to determine whether the root position is + // won, lost or drawn. + int wdl = 0; + + if (dtz > 0) + wdl = (dtz + cnt50 <= 100) ? 2 : 1; + else if (dtz < 0) + wdl = (-dtz + cnt50 <= 100) ? -2 : -1; + + // Determine the score to report to the user. + score = wdl_to_Value[wdl + 2]; + + // If the position is winning or losing, but too few moves left, adjust the + // score to show how close it is to winning or losing. + // NOTE: int(PawnValueEg) is used as scaling factor in score_to_uci(). + if (wdl == 1 && dtz <= 100) + score = (Value)(((200 - dtz - cnt50) * int(PawnValueEg)) / 200); + else if (wdl == -1 && dtz >= -100) + score = -(Value)(((200 + dtz - cnt50) * int(PawnValueEg)) / 200); + + // Now be a bit smart about filtering out moves. + size_t j = 0; + + if (dtz > 0) { // winning (or 50-move rule draw) + int best = 0xffff; + + for (size_t i = 0; i < rootMoves.size(); i++) { + int v = rootMoves[i].score; + + if (v > 0 && v < best) + best = v; + } + + int max = best; + + // If the current phase has not seen repetitions, then try all moves + // that stay safely within the 50-move budget, if there are any. + if (!has_repeated(st.previous) && best + cnt50 <= 99) + max = 99 - cnt50; + + for (size_t i = 0; i < rootMoves.size(); i++) { + int v = rootMoves[i].score; + + if (v > 0 && v <= max) + rootMoves[j++] = rootMoves[i]; + } + } else if (dtz < 0) { // losing (or 50-move rule draw) + int best = 0; + + for (size_t i = 0; i < rootMoves.size(); i++) { + int v = rootMoves[i].score; + + if (v < best) + best = v; + } + + // Try all moves, unless we approach or have a 50-move rule draw. + if (-best * 2 + cnt50 < 100) + return true; + + for (size_t i = 0; i < rootMoves.size(); i++) { + if (rootMoves[i].score == best) + rootMoves[j++] = rootMoves[i]; + } + } else { // drawing + // Try all moves that preserve the draw. + for (size_t i = 0; i < rootMoves.size(); i++) { + if (rootMoves[i].score == 0) + rootMoves[j++] = rootMoves[i]; + } + } + + rootMoves.resize(j, Search::RootMove(MOVE_NONE)); + + return true; } // Use the WDL tables to filter out moves that don't preserve the win or draw. @@ -797,36 +932,45 @@ bool Tablebases::root_probe(Position& pos, Search::RootMoveVector& rootMoves, Va // no moves were filtered out. bool Tablebases::root_probe_wdl(Position& pos, Search::RootMoveVector& rootMoves, Value& score) { - int success; + int success; - int wdl = Tablebases::probe_wdl(pos, &success); - if (!success) return false; - score = wdl_to_Value[wdl + 2]; + int wdl = Tablebases::probe_wdl(pos, &success); - StateInfo st; - CheckInfo ci(pos); + if (!success) + return false; - int best = -2; + score = wdl_to_Value[wdl + 2]; - // Probe each move. - for (size_t i = 0; i < rootMoves.size(); i++) { - Move move = rootMoves[i].pv[0]; - pos.do_move(move, st, pos.gives_check(move, ci)); - int v = -Tablebases::probe_wdl(pos, &success); - pos.undo_move(move); - if (!success) return false; - rootMoves[i].score = (Value)v; - if (v > best) - best = v; - } + StateInfo st; + CheckInfo ci(pos); - size_t j = 0; - for (size_t i = 0; i < rootMoves.size(); i++) { - if (rootMoves[i].score == best) - rootMoves[j++] = rootMoves[i]; - } - rootMoves.resize(j, Search::RootMove(MOVE_NONE)); + int best = -2; - return true; + // Probe each move. + for (size_t i = 0; i < rootMoves.size(); i++) { + Move move = rootMoves[i].pv[0]; + pos.do_move(move, st, pos.gives_check(move, ci)); + int v = -Tablebases::probe_wdl(pos, &success); + pos.undo_move(move); + + if (!success) + return false; + + rootMoves[i].score = (Value)v; + + if (v > best) + best = v; + } + + size_t j = 0; + + for (size_t i = 0; i < rootMoves.size(); i++) { + if (rootMoves[i].score == best) + rootMoves[j++] = rootMoves[i]; + } + + rootMoves.resize(j, Search::RootMove(MOVE_NONE)); + + return true; }