diff --git a/app/AppApi.scala b/app/AppApi.scala index 6480e64c0d..aa11e05f35 100644 --- a/app/AppApi.scala +++ b/app/AppApi.scala @@ -21,7 +21,8 @@ final class AppApi( gameSocket: game.Socket, messenger: Messenger, starter: Starter, - eloUpdater: EloUpdater) { + eloUpdater: EloUpdater, + gameInfo: DbGame ⇒ IO[GameInfo]) { private implicit val timeout = Timeout(300 millis) private implicit val executor = Akka.system.dispatcher @@ -131,6 +132,11 @@ final class AppApi( def gameVersion(gameId: String): Future[Int] = futureVersion(gameId) + def gameInfo(gameId: String): IO[Option[GameInfo]] = for { + gameOption ← gameRepo game gameId + gameInfo ← gameOption.fold(gameInfo(_) map some, io(none)) + } yield gameInfo + def isConnected(gameId: String, colorName: String): Future[Boolean] = Color(colorName).fold( c ⇒ gameSocket.hubMaster ? IsConnectedOnGame(gameId, c) mapTo manifest[Boolean], diff --git a/app/GameInfo.scala b/app/GameInfo.scala new file mode 100644 index 0000000000..805ae8c8cf --- /dev/null +++ b/app/GameInfo.scala @@ -0,0 +1,37 @@ +package lila + +import model.DbGame +import chess.Eco +import chess.format.Forsyth + +import scalaz.effects.IO + +final class GameInfo private ( + val game: DbGame, + val pgn: String, + val fen: String, + val opening: Option[Eco.Opening]) { + + def toMap = Map( + "pgn" -> pgn, + "fen" -> fen, + "opening" -> (opening map { o ⇒ + Map( + "code" -> o.code, + "name" -> o.name + ) + }) + ) +} + +object GameInfo { + + def apply(pgnDump: PgnDump)(game: DbGame): IO[GameInfo] = + pgnDump >> game map { pgn ⇒ + new GameInfo( + game = game, + pgn = pgn, + fen = Forsyth >> game.toChess, + opening = Eco openingOf game.pgn) + } +} diff --git a/app/PgnDump.scala b/app/PgnDump.scala new file mode 100644 index 0000000000..3c4a7289c1 --- /dev/null +++ b/app/PgnDump.scala @@ -0,0 +1,60 @@ +package lila + +import chess.format.Forsyth +import db.{ GameRepo, UserRepo } +import model.{ DbGame, DbPlayer, User } + +import org.joda.time.format.DateTimeFormat +import scalaz.effects._ + +final class PgnDump(gameRepo: GameRepo, userRepo: UserRepo) { + + val dateFormat = DateTimeFormat forPattern "yyyy-MM-dd"; + + def >>(game: DbGame): IO[String] = + header(game) map { headers ⇒ + "%s\n\n%s %s".format(headers, moves(game), result(game)) + } + + def header(game: DbGame): IO[String] = for { + whiteUser ← user(game.whitePlayer) + blackUser ← user(game.blackPlayer) + initialFen ← game.variant.standard.fold(io(none), gameRepo initialFen game.id) + } yield List( + "Event" -> game.rated.fold("Rated game", "Casual game"), + "Site" -> ("http://lichess.org/" + game.id), + "Date" -> game.createdAt.fold(dateFormat.print, "?"), + "White" -> player(game.whitePlayer, whiteUser), + "Black" -> player(game.blackPlayer, blackUser), + "WhiteElo" -> elo(game.whitePlayer), + "BlackElo" -> elo(game.blackPlayer), + "Result" -> result(game), + "PlayCount" -> game.turns, + "Variant" -> game.variant.name + ) ++ game.variant.standard.fold(Map.empty, Map( + "FEN" -> (initialFen | "?"), + "SetUp" -> "1" + )) map { + case (name, value) ⇒ """[%s "%s"]""".format(name, value) + } mkString "\n" + + def elo(p: DbPlayer) = p.elo.fold(_.toString, "?") + + def user(p: DbPlayer): IO[Option[User]] = p.userId.fold( + userRepo.user, + io(none)) + + def player(p: DbPlayer, u: Option[User]) = p.isAi.fold( + "Crafty level " + p.aiLevel, + u.fold(_.username, "Anonymous")) + + def moves(game: DbGame) = (game.pgnList grouped 2).zipWithIndex map { + case (moves, turn) ⇒ "%d. %s".format((turn + 1), moves.mkString(" ")) + } mkString " " + + def result(game: DbGame) = game.finished.fold( + game.winnerColor.fold( + color ⇒ color.white.fold("1-0", "0-1"), + "1/2-1/2"), + "*") +} diff --git a/app/SystemEnv.scala b/app/SystemEnv.scala index 7f6195ec2f..6b23d046ee 100644 --- a/app/SystemEnv.scala +++ b/app/SystemEnv.scala @@ -18,6 +18,12 @@ final class SystemEnv(application: Application) { implicit val app = application val config = app.configuration.underlying + lazy val pgnDump = new PgnDump( + userRepo = userRepo, + gameRepo = gameRepo) + + lazy val gameInfo = GameInfo(pgnDump) _ + lazy val reporting = Akka.system.actorOf( Props(new report.Reporting), name = "reporting") @@ -82,7 +88,8 @@ final class SystemEnv(application: Application) { gameSocket = gameSocket, messenger = messenger, starter = starter, - eloUpdater = eloUpdater) + eloUpdater = eloUpdater, + gameInfo = gameInfo) lazy val lobbyApi = new lobby.Api( hookRepo = hookRepo, diff --git a/app/controllers/AppApiC.scala b/app/controllers/AppApiC.scala index d38d11ba7e..81a760c644 100644 --- a/app/controllers/AppApiC.scala +++ b/app/controllers/AppApiC.scala @@ -46,6 +46,13 @@ object AppApiC extends LilaController { } } + def gameInfo(gameId: String) = Action { + (api gameInfo gameId).unsafePerformIO.fold( + info ⇒ JsonOk(info.toMap), + BadRequest("No such game") + ) + } + def rematchAccept(gameId: String, color: String, newGameId: String) = Action { implicit request ⇒ FormValidIOk[RematchData](rematchForm)(r ⇒ api.rematchAccept(gameId, newGameId, color, r._1, r._2, r._3, r._4)) @@ -59,7 +66,7 @@ object AppApiC extends LilaController { env.captcha.create.unsafePerformIO.fold( err ⇒ BadRequest(err.shows), data ⇒ JsonOk(Map( - "id" -> data._1, + "id" -> data._1, "fen" -> data._2, "color" -> data._3.toString )) diff --git a/app/db/GameRepo.scala b/app/db/GameRepo.scala index 8227b3f860..d970cc449b 100644 --- a/app/db/GameRepo.scala +++ b/app/db/GameRepo.scala @@ -107,6 +107,10 @@ class GameRepo(collection: MongoCollection) ) } + def initialFen(gameId: String): IO[Option[String]] = io { + primitiveProjection[String](DBObject("_id" -> gameId), "initialFen") + } + def cleanupUnplayed: IO[Unit] = io { remove(("turns" $lt 2) ++ ("createdAt" $lt (DateTime.now - 2.day))) } diff --git a/app/model/DbGame.scala b/app/model/DbGame.scala index 7d20958efa..b6e272cd2c 100644 --- a/app/model/DbGame.scala +++ b/app/model/DbGame.scala @@ -4,6 +4,7 @@ package model import chess._ import Pos.{ posAt, piotr } import Role.forsyth +import org.joda.time.DateTime case class DbGame( id: String, @@ -20,7 +21,8 @@ case class DbGame( castles: String = "KQkq", isRated: Boolean = false, variant: Variant = Standard, - lastMoveTime: Option[Int] = None) { + lastMoveTime: Option[Int] = None, + createdAt: Option[DateTime] = None) { val players = List(whitePlayer, blackPlayer) @@ -215,6 +217,8 @@ case class DbGame( def creator = player(creatorColor) def invited = player(!creatorColor) + + def pgnList = pgn.split(' ').toList } object DbGame { diff --git a/app/model/RawDbGame.scala b/app/model/RawDbGame.scala index cc1c5d7496..075ddea48c 100644 --- a/app/model/RawDbGame.scala +++ b/app/model/RawDbGame.scala @@ -6,6 +6,7 @@ import com.novus.salat.annotations._ import chess._ import Pos.{ posAt, piotr } import Role.forsyth +import org.joda.time.DateTime case class RawDbGame( @Key("_id") id: String, @@ -21,7 +22,8 @@ case class RawDbGame( castles: String = "KQkq", isRated: Boolean = false, v: Int = 1, - lmt: Option[Int] = None) { + lmt: Option[Int] = None, + createdAt: Option[DateTime]) { def decode: Option[DbGame] = for { whitePlayer ← players find (_.c == "white") flatMap (_.decode) @@ -46,7 +48,8 @@ case class RawDbGame( castles = castles, isRated = isRated, variant = trueVariant, - lastMoveTime = lmt + lastMoveTime = lmt, + createdAt = createdAt ) } @@ -68,7 +71,8 @@ object RawDbGame { castles = castles, isRated = isRated, v = variant.id, - lmt = lastMoveTime + lmt = lastMoveTime, + createdAt = createdAt ) } } diff --git a/app/model/Variant.scala b/app/model/Variant.scala index 97a5c3b283..a84b3802cf 100644 --- a/app/model/Variant.scala +++ b/app/model/Variant.scala @@ -4,6 +4,8 @@ package model sealed abstract class Variant(val id: Int) { lazy val name = toString.toLowerCase + + def standard = this == Standard } case object Standard extends Variant(1) diff --git a/chess/src/main/scala/Color.scala b/chess/src/main/scala/Color.scala index d9026aa5a8..08ee2e01c8 100644 --- a/chess/src/main/scala/Color.scala +++ b/chess/src/main/scala/Color.scala @@ -20,6 +20,9 @@ sealed trait Color { def queen = this - Queen def king = this - King + def white = this == White + def black = this == Black + override def toString = name } diff --git a/chess/src/main/scala/Eco.scala b/chess/src/main/scala/Eco.scala index 5d991b4638..6459b659cb 100644 --- a/chess/src/main/scala/Eco.scala +++ b/chess/src/main/scala/Eco.scala @@ -3,532 +3,536 @@ package lila.chess object Eco { type Move = String - type Name = String + + case class Opening(code: String, name: String) case class Branch( moves: Map[Move, Branch] = Map.empty, - name: Option[Name] = None) { + opening: Option[Opening] = None) { def get(move: Move) = moves get move def apply(move: Move) = get(move) getOrElse Branch() - def add(moves: List[Move], name: Name): Branch = moves match { + def add(moves: List[Move], opening: Opening): Branch = moves match { case Nil ⇒ this - case move :: Nil ⇒ this.updated(move, apply(move) withName name) - case move :: others ⇒ this.updated(move, apply(move).add(others, name)) + case move :: Nil ⇒ this.updated(move, apply(move) set opening) + case move :: others ⇒ this.updated(move, apply(move).add(others, opening)) } def updated(k: Move, v: Branch) = copy(moves = moves.updated(k, v)) - def withName(n: String) = copy(name = Some(n)) + def set(o: Opening) = copy(opening = Some(o)) } - def nameOf(pgn: String): Option[Name] = (pgn.split(' ').foldLeft(tree) { + def openingOf(pgn: String): Option[Opening] = (pgn.split(' ').foldLeft(tree) { case (branch, move) ⇒ (branch get move) getOrElse branch - }).name + }).opening - val tree: Branch = Map( - "b3" -> "Nimzovich-Larsen Attack", - "f4" -> "Bird's Opening", - "f4 d5" -> "Bird's Opening", - "Nf3" -> "Reti Opening", - "Nf3 Nf6" -> "Reti Opening", - "Nf3 d5" -> "Reti Opening", - "Nf3 d5 g3" -> "King's Indian Attack", - "Nf3 d5 g3 c5 Bg2" -> "King's Indian Attack", - "Nf3 d5 c4" -> "Reti Opening", - "c4" -> "English", - "c4 c6" -> "English, Caro-Kann Defensive System", - "c4 c6 Nf3 d5 b3" -> "English with b3", - "c4 e6" -> "English", - "c4 e6 Nf3 d5 g3 Nf6 Bg2 Be7 O-O" -> "English", - "c4 Nf6" -> "English", - "c4 Nf6 Nc3" -> "English", - "c4 Nf6 Nc3 e6" -> "English", - "c4 Nf6 Nc3 e6 e4" -> "English, Mikenas-Carls", - "c4 Nf6 Nc3 e6 e4 c5" -> "English, Mikenas-Carls, Sicilian Variation", - "c4 e5" -> "English", - "c4 e5 Nc3" -> "English", - "c4 e5 Nc3 Nf6" -> "English", - "c4 e5 Nc3 Nf6 g3 c6" -> "English, Bremen System, Keres Variation", - "c4 e5 Nc3 Nf6 g3 g6" -> "English, Bremen System with ...g6", - "c4 e5 Nc3 Nc6" -> "English", - "c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6" -> "English", - "c4 e5 Nc3 Nc6 Nf3" -> "English, Three Knights System", - "c4 e5 Nc3 Nc6 Nf3 Nf6" -> "English", - "c4 e5 Nc3 Nc6 Nf3 Nf6 g3" -> "English, Four Knights, Kingside Fianchetto", - "c4 c5" -> "English, Symmetrical", - "c4 c5 Nf3 Nf6 d4" -> "English, Symmetrical, Benoni Formation", - "c4 c5 Nf3 Nf6 d4 cxd4 Nxd4 e6" -> "English, Symmetrical Variation", - "c4 c5 Nf3 Nf6 d4 cxd4 Nxd4 e6 Nc3 Nc6" -> "English, Symmetrical", - "c4 c5 Nc3" -> "English, Symmetrical", - "c4 c5 Nc3 Nc6" -> "English, Symmetrical", - "c4 c5 Nc3 Nc6 g3" -> "English", - "c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3" -> "English, Symmetrical", - "c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6" -> "English, Symmetrical", - "c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 O-O O-O d4" -> "English, Symmetrical, Main line with d4", - "d4" -> "Queen's Pawn Game", - "d4 d6" -> "Queen's Pawn Game (with ...d6)", - "d4 d6 c4 g6 Nc3 Bg7 e4" -> "Modern Defense, Averbakh System", - "d4 c5" -> "Old Benoni", - "d4 c5 d5 e5" -> "Old Benoni Defense", - "d4 Nf6" -> "Queen's Pawn Game", - "d4 Nf6 Nf3" -> "Queen's Pawn Game", - "d4 Nf6 Nf3 b6" -> "Queen's Indian", - "d4 Nf6 Nf3 g6" -> "King's Indian", - "d4 Nf6 Nf3 g6 g3" -> "King's Indian, Fianchetto without c4", - "d4 Nf6 c4" -> "Queen's Pawn Game", - "d4 Nf6 c4 e5" -> "Budapest Gambit", - "d4 Nf6 c4 e5 dxe5 Ng4" -> "Budapest Gambit", - "d4 Nf6 c4 d6" -> "Old Indian", - "d4 Nf6 c4 d6 Nc3 e5 Nf3" -> "Old Indian, Ukrainian Variation, 4.Nf3", - "d4 Nf6 c4 d6 Nc3 e5 Nf3 Nbd7 e4" -> "Old Indian, Main line", - "d4 Nf6 c4 c5" -> "Benoni Defense", - "d4 Nf6 c4 c5 d5 b5" -> "Benko Gambit", - "d4 Nf6 c4 c5 d5 b5 cxb5 a6 bxa6" -> "Benko Gambit", - "d4 Nf6 c4 c5 d5 b5 cxb5 a6 bxa6 Bxa6 Nc3 d6 e4" -> "Benko Gambit", - "d4 Nf6 c4 c5 d5 e6" -> "Benoni Defense", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 Nf3 g6" -> "Benoni", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 Nf3 g6 g3 Bg7 Bg2 O-O" -> "Benoni, Fianchetto Variation", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 Nf3 g6 g3 Bg7 Bg2 O-O 9" -> "Benoni, Fianchetto, 9...Nbd7", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 Nf3 g6 g3 Bg7 Bg2 O-O 9" -> "Benoni, Fianchetto, 11...Re8", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4" -> "Benoni, 6.e4", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 f4" -> "Benoni", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 f4 Bg7 Bb5+" -> "Benoni, Taimanov Variation", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 f4 Bg7 Nf3 O-O" -> "Benoni, Four Pawns Attack", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 f4 Bg7 Nf3 O-O 9" -> "Benoni, Four Pawns Attack, Main line", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3" -> "Benoni, Classical with 7.Nf3", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Bg5" -> "Benoni, Classical, 8.Bg5", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O" -> "Benoni, Classical without 9.O-O", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9" -> "Benoni, Classical, 9.O-O", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9" -> "Benoni, Classical, 9...a6, 10.a4", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9" -> "Benoni, Classical with ...a6 and 10...Bg4", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9" -> "Benoni, Classical, 9...Re8", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9" -> "Benoni, Classical, 9...Re8, 10.Nd2", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9" -> "Benoni, Classical with ...Re8 and ...Na6", - "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9" -> "Benoni, Classical, 11.f3", - "d4 f5" -> "Dutch", - "d4 f5 g3" -> "Dutch", - "d4 f5 e4" -> "Dutch, Staunton Gambit", - "d4 f5 e4 fxe4 Nc3 Nf6 Bg5" -> "Dutch, Staunton Gambit", - "d4 f5 c4" -> "Dutch", - "d4 f5 c4 Nf6 Nc3" -> "Dutch, with c4 & Nc3", - "d4 f5 c4 Nf6 g3" -> "Dutch", - "d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3" -> "Dutch, Leningrad, Main Variation", - "d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 O-O O-O d6 Nc3 c6" -> "Dutch, Leningrad, Main Variation with c6", - "d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 O-O O-O d6 Nc3 Nc6" -> "Dutch, Leningrad, Main Variation with Nc6", - "d4 f5 c4 Nf6 g3 e6 Bg2" -> "Dutch", - "d4 f5 c4 Nf6 g3 e6 Bg2 Be7" -> "Dutch Defense", - "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O" -> "Dutch", - "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d5 b3" -> "Dutch, Stonewall, Botvinnik Variation", - "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d5 b3 c6 Ba3" -> "Dutch, Stonewall with Ba3", - "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d5 Nc3 c6" -> "Dutch, Stonewall", - "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d6" -> "Dutch, Classical Variation", - "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d6 Nc3 Qe8" -> "Dutch, Ilyin-Genevsky", - "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d6 Nc3 Qe8 Qc2" -> "Dutch, Ilyin-Genevsky Variation with Qc2", - "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d6 Nc3 Qe8 b3" -> "Dutch, Ilyin-Genevsky Variation with b3", - "e4" -> "Uncommon King's Pawn Opening", - "e4 d5" -> "Scandinavian", - "e4 Nf6" -> "Alekhine's Defense", - "e4 Nf6 e5 Nd5 d4" -> "Alekhine's Defense", - "e4 Nf6 e5 Nd5 d4 d6 Nf3" -> "Alekhine's Defense, Modern", - "e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4" -> "Alekhine's Defense, Modern", - "e4 g6" -> "Robatsch", - "e4 d6 d4 Nf6" -> "Pirc", - "e4 d6 d4 Nf6 Nc3 g6 Nf3" -> "Pirc, Classical", - "e4 d6 d4 Nf6 Nc3 g6 f4" -> "Pirc, Austrian Attack", - "e4 c6" -> "Caro-Kann", - "e4 c6 Nc3 d5 Nf3 Bg4" -> "Caro-Kann, Two Knights, 3...Bg4", - "e4 c6 d4" -> "Caro-Kann Defense", - "e4 c6 d4 d5 exd5 cxd5" -> "Caro-Kann, Exchange", - "e4 c6 d4 d5 exd5 cxd5 c4 Nf6 Nc3 e6" -> "Caro-Kann, Panov-Botvinnik Attack", - "e4 c6 d4 d5 Nc3" -> "Caro-Kann", - "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Nf6 Nxf6+ gxf6" -> "Caro-Kann, Bronstein-Larsen Variation", - "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Nd7" -> "Caro-Kann, Steinitz Variation", - "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Bf5" -> "Caro-Kann, Classical", - "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7" -> "Caro-Kann, Classical", - "e4 c5" -> "Sicilian", - "e4 c5 f4" -> "Sicilian, 2.f4 and 2.d4", - "e4 c5 c3" -> "Sicilian, Alapin", - "e4 c5 Nc3" -> "Sicilian, Closed", - "e4 c5 Nc3 Nc6 g3" -> "Sicilian, Closed", - "e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6" -> "Sicilian, Closed", - "e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 Be3" -> "Sicilian, Closed, 6.Be3", - "e4 c5 Nf3" -> "Sicilian", - "e4 c5 Nf3 a6" -> "Sicilian, O'Kelly Variation", - "e4 c5 Nf3 Nf6" -> "Sicilian, Nimzovich-Rubinstein", - "e4 c5 Nf3 Nc6" -> "Sicilian", - "e4 c5 Nf3 Nc6 Bb5 g6" -> "Sicilian, Rossolimo Variation", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 e5" -> "Sicilian", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4" -> "Sicilian", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 Nxc6" -> "Sicilian, Accelerated Fianchetto", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 Nc3 Bg7 Be3 Nf6 Bc4" -> "Sicilian, Accelerated Fianchetto, Modern Variation with Bc4", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 c4" -> "Sicilian, Accelerated Fianchetto", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 c4 Bg7" -> "Sicilian, Accelerated Fianchetto", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 c4 Bg7 Be3" -> "Sicilian, Accelerated Fianchetto, Maroczy Bind, 6.Be3", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 c4 Bg7 Be3 Nf6 Nc3 Ng4" -> "Sicilian, Accelerated Fianchetto, Breyer Variation", - "e4 c5 Nf3 e6" -> "Sicilian", - "e4 c5 Nf3 e6 d4 cxd4 Nxd4 a6" -> "Sicilian, Kan", - "e4 c5 Nf3 e6 d4 cxd4 Nxd4 a6 Bd3" -> "Sicilian, Kan", - "e4 c5 Nf3 e6 d4 cxd4 Nxd4 a6 Nc3" -> "Sicilian, Kan, 5.Nc3", - "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6" -> "Sicilian", - "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3" -> "Sicilian, Taimanov", - "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 a6" -> "Sicilian, Taimanov Variation", - "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 Qc7" -> "Sicilian, Taimanov (Bastrikov) Variation", - "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 Qc7 Be3" -> "Sicilian, Taimanov Variation", - "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 Qc7 Be3 a6 Be2" -> "Sicilian, Taimanov Variation", - "e4 c5 Nf3 d6" -> "Sicilian", - "e4 c5 Nf3 d6 Bb5+" -> "Sicilian, Canal-Sokolsky (Rossolimo) Attack", - "e4 c5 Nf3 d6 Bb5+ Bd7" -> "Sicilian, Canal-Sokolsky (Rossolimo) Attack", - "e4 c5 Nf3 d6 d4 cxd4 Qxd4" -> "Sicilian", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4" -> "Sicilian", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 f3 e5 Bb5+" -> "Sicilian, Prins Variation, Venice Attack", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3" -> "Sicilian", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bc4" -> "Sicilian", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 Nc3 d6 Be2" -> "Sicilian", - "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 Nc3 d6 Be2 e5 Nb3" -> "Sicilian, Boleslavsky Variation, 7.Nb3", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5" -> "Sicilian, Richter-Rauzer", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 Bd7 Qd2" -> "Sicilian, Richter-Rauzer, Larsen Variation, 7.Qd2", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6" -> "Sicilian, Richter-Rauzer", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2" -> "Sicilian, Richter-Rauzer Attack", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 O-O-O O-O f4" -> "Sicilian, Richter-Rauzer Attack", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 O-O-O O-O f4 Nxd4 10 Qxd4" -> "Sicilian, Richter-Rauzer Attack, 7...Be7 Defense, 9...Nxd4", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6" -> "Sicilian, Richter-Rauzer Attack, 7...a6", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 O-O-O Bd7" -> "Sicilian, Richter-Rauzer Attack, 7...a6 Defense, 8...Bd7", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 O-O-O Bd7 f4 Be7" -> "Sicilian, Richter-Rauzer Attack, 7...a6 Defense, 9...Be7", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 O-O-O Bd7 f4 Be7 10 Nf3 b5 11 Bxf6" -> "Sicilian, Richter-Rauzer Attack, 7...a6 Defense, 11.Bxf6", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6" -> "Sicilian, Dragon Variation", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 f4" -> "Sicilian, Dragon, Levenfish Variation", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3" -> "Sicilian, Dragon", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 O-O" -> "Sicilian, Dragon, Classical", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 O-O O-O Nb3" -> "Sicilian, Dragon, Classical", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3" -> "Sicilian, Dragon, Yugoslav Attack", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3 O-O" -> "Sicilian, Dragon, Yugoslav Attack", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3 O-O Qd2 Nc6 Bc4" -> "Sicilian, Dragon, Yugoslav Attack", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3 O-O Qd2 Nc6 Bc4 Bd7 10 O-O-O" -> "Sicilian, Dragon, Yugoslav Attack, 10.castle long", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3 O-O Qd2 Nc6 Bc4 Bd7 10 O-O-O Qa5 11 Bb3 Rfc8 12 h4" -> "Sicilian, Dragon, Yugoslav Attack, 12.h4", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6" -> "Sicilian, Scheveningen", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 g4" -> "Sicilian, Scheveningen, Keres Attack", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 f4" -> "Sicilian, Scheveningen", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Be2" -> "Sicilian", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Be2 a6" -> "Sicilian, Scheveningen", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Be2 a6 O-O Qc7 f4 Nc6" -> "Sicilian, Scheveningen, Classical", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Bc4" -> "Sicilian, Fischer-Sozin Attack", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Bc4 a6 Bb3 b5" -> "Sicilian, Fischer-Sozin with ...a6 and ...b5", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Bc4 Nc6" -> "Sicilian, Fischer-Sozin Attack", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Bc4 Nc6 Be3" -> "Sicilian", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6" -> "Sicilian, Najdorf", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 g3" -> "Sicilian, Najdorf, Zagreb (Fianchetto) Variation", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Be2" -> "Sicilian, Najdorf, Opocensky Variation", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 f4" -> "Sicilian, Najdorf, 6.f4", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5" -> "Sicilian, Najdorf", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6" -> "Sicilian, Najdorf, 6...e6", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4" -> "Sicilian, Najdorf", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4 Qb6" -> "Sicilian, Najdorf", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7" -> "Sicilian, Najdorf", - "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 Qc7 O-O-O Nbd7" -> "Sicilian, Najdorf, 7...Be7 Main line", - "e4 e6" -> "French Defense", - "e4 e6 d4 d5 exd5 exd5 Nc3 Nf6 Bg5" -> "French, Exchange", - "e4 e6 d4 d5 e5" -> "French, Advance", - "e4 e6 d4 d5 Nd2" -> "French, Tarrasch", - "e4 e6 d4 d5 Nd2 Nc6 Ngf3 Nf6" -> "French, Tarrasch, Guimard Main line", - "e4 e6 d4 d5 Nd2 Nf6" -> "French, Tarrasch", - "e4 e6 d4 d5 Nd2 Nf6 e5 Nfd7 Bd3 c5 c3 Nc6 Ne2 cxd4 cxd4" -> "French, Tarrasch", - "e4 e6 d4 d5 Nd2 c5" -> "French, Tarrasch", - "e4 e6 d4 d5 Nd2 c5 exd5 exd5" -> "French, Tarrasch, Open, 4.ed ed", - "e4 e6 d4 d5 Nd2 c5 exd5 exd5 Ngf3 Nc6" -> "French, Tarrasch, Open Variation, Main line", - "e4 e6 d4 d5 Nc3" -> "French", - "e4 e6 d4 d5 Nc3 Nf6" -> "French", - "e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4" -> "French, McCutcheon", - "e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7" -> "French", - "e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 Nfd7 Bxe7 Qxe7" -> "French, Classical", - "e4 e6 d4 d5 Nc3 Bb4" -> "French, Winawer", - "e4 e6 d4 d5 Nc3 Bb4 e5" -> "French, Winawer", - "e4 e6 d4 d5 Nc3 Bb4 e5 c5" -> "French, Winawer, Advance", - "e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bxc3+ bxc3" -> "French, Winawer", - "e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bxc3+ bxc3 Ne7" -> "French, Winawer, Advance", - "e4 e5" -> "King's Pawn Game", - "e4 e5 d4 exd4" -> "Center Game", - "e4 e5 d4 exd4 Qxd4 Nc6" -> "Center Game", - "e4 e5 Bc4" -> "Bishop's Opening", - "e4 e5 Bc4 Nf6" -> "Bishop's Opening", - "e4 e5 Nc3" -> "Vienna", - "e4 e5 Nc3 Nf6" -> "Vienna", - "e4 e5 Nc3 Nf6 Bc4 Nxe4" -> "Vienna Game", - "e4 e5 Nc3 Nf6 Bc4 Nc6" -> "Vienna Game", - "e4 e5 Nc3 Nf6 f4" -> "Vienna Gambit", - "e4 e5 f4" -> "King's Gambit Declined", - "e4 e5 f4 d5" -> "King's Gambit Declined, Falkbeer Counter Gambit", - "e4 e5 f4 d5 exd5 e4 d3 Nf6" -> "King's Gambit Declined, Falkbeer Counter Gambit", - "e4 e5 f4 exf4" -> "King's Gambit Accepted", - "e4 e5 f4 exf4 Nf3" -> "King's Gambit Accepted", - "e4 e5 f4 exf4 Nf3 Be7" -> "King's Gambit Accepted, Cunningham", - "e4 e5 f4 exf4 Nf3 d5" -> "King's Gambit Accepted, Abbazia Defense", - "e4 e5 f4 exf4 Nf3 g5 Nc3" -> "King's Gambit Accepted", - "e4 e5 f4 exf4 Nf3 g5 Bc4 Bg7" -> "King's Gambit Accepted", - "e4 e5 f4 exf4 Nf3 g5 h4" -> "King's Gambit Accepted", - "e4 e5 Nf3" -> "King's Knight Opening", - "e4 e5 Nf3 d6" -> "Philidor Defense", - "e4 e5 Nf3 Nf6" -> "Petrov Defense", - "e4 e5 Nf3 Nf6 d4 exd4 e5 Ne4 Qxd4" -> "Petrov, Modern Attack", - "e4 e5 Nf3 Nc6" -> "King's Pawn Game", - "e4 e5 Nf3 Nc6 d4 exd4 Nxd4" -> "Scotch Game", - "e4 e5 Nf3 Nc6 Nc3" -> "Three Knights", - "e4 e5 Nf3 Nc6 Nc3 Nf6" -> "Four Knights", - "e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5" -> "Four Knights", - "e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4" -> "Four Knights", - "e4 e5 Nf3 Nc6 Bc4 Bc5" -> "Giuoco Piano", - "e4 e5 Nf3 Nc6 Bc4 Bc5 b4" -> "Evans Gambit", - "e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bxb4 c3 Ba5" -> "Evans Gambit", - "e4 e5 Nf3 Nc6 Bc4 Bc5 c3" -> "Giuoco Piano", - "e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 exd4 cxd4" -> "Giuoco Piano", - "e4 e5 Nf3 Nc6 Bc4 Nf6" -> "Two Knights Defense", - "e4 e5 Nf3 Nc6 Bc4 Nf6 d4 exd4 O-O Nxe4" -> "Two Knights", - "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5" -> "Two Knights", - "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 exd5 Na5" -> "Two Knights", - "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 exd5 Na5 Bb5+ c6 dxc6 bxc6 Be2 h6" -> "Two Knights", - "e4 e5 Nf3 Nc6 Bb5" -> "Ruy Lopez", - "e4 e5 Nf3 Nc6 Bb5 Nd4" -> "Ruy Lopez, Bird's Defense", - "e4 e5 Nf3 Nc6 Bb5 d6" -> "Ruy Lopez, Old Steinitz Defense", - "e4 e5 Nf3 Nc6 Bb5 f5" -> "Ruy Lopez, Schliemann Defense", - "e4 e5 Nf3 Nc6 Bb5 Bc5" -> "Ruy Lopez, Classical", - "e4 e5 Nf3 Nc6 Bb5 Nf6" -> "Ruy Lopez, Berlin Defense", - "e4 e5 Nf3 Nc6 Bb5 Nf6 O-O d6" -> "Ruy Lopez", - "e4 e5 Nf3 Nc6 Bb5 Nf6 O-O Nxe4" -> "Ruy Lopez", - "e4 e5 Nf3 Nc6 Bb5 a6 Bxc6" -> "Ruy Lopez, Exchange", - "e4 e5 Nf3 Nc6 Bb5 a6 Bxc6 dc O-O f6 d4" -> "Ruy Lopez, Exchange, Gligoric Variation, 6.d4", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4" -> "Ruy Lopez", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6" -> "Ruy Lopez", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 O-O" -> "Ruy Lopez, Modern Steinitz Defense, 5.O-O", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Bxc6+ bxc6 d4" -> "Ruy Lopez, Modern Steinitz Defense", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3" -> "Ruy Lopez, Modern Steinitz Defense", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7" -> "Ruy Lopez, Modern Steinitz Defense", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7 d4 g6" -> "Ruy Lopez, Modern Steinitz Defense, Fianchetto Variation", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6" -> "Ruy Lopez", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O" -> "Ruy Lopez", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O d6" -> "Ruy Lopez, Steinitz Defense Deferred", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Nxe4" -> "Ruy Lopez, Open", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Nxe4 d4 b5 Bb3 d5 dxe5 Be6" -> "Ruy Lopez, Open, Howell Attack", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Nxe4 d4 b5 Bb3 d5 dxe5 Be6 c3" -> "Ruy Lopez, Open", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Nxe4 d4 b5 Bb3 d5 dxe5 Be6" -> "Ruy Lopez, Open", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7" -> "Ruy Lopez, Closed", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Bxc6 dxc6" -> "Ruy Lopez, Exchange Variation Doubly Deferred (DERLD)", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Qe2" -> "Ruy Lopez, Worrall Attack", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 d6" -> "Ruy Lopez", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3" -> "Ruy Lopez", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d5" -> "Ruy Lopez, Marshall", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6" -> "Ruy Lopez, Closed", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 d4" -> "Ruy Lopez, Closed", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3" -> "Ruy Lopez, Closed", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 h6" -> "Ruy Lopez, Closed, Smyslov Defense", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Nb8" -> "Ruy Lopez, Closed, Breyer Defense", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Nb8 10 d4" -> "Ruy Lopez, Closed, Breyer", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Na5 10 Bc2" -> "Ruy Lopez, Closed", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Na5 10 Bc2 c5 11 d4 Qc7" -> "Ruy Lopez, Closed, Chigorin", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Na5 10 Bc2 c5 11 d4 Qc7 12 Nbd2 Nc6" -> "Ruy Lopez, Closed, Chigorin", - "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Na5 10 Bc2 c5 11 d4 Qc7 12 Nbd2 cxd4 13 cxd4" -> "Ruy Lopez, Closed, Chigorin, 12...cd", - "d4 d5" -> "Queen's Pawn Game", - "d4 d5 Nc3 Nf6 Bg5" -> "Richter-Veresov Attack", - "d4 d5 Nf3" -> "Queen's Pawn Game", - "d4 d5 Nf3 Nf6 Bg5" -> "Torre Attack (Tartakower Variation)", - "d4 d5 Nf3 Nf6 e3" -> "Queen's Pawn Game", - "d4 d5 Nf3 Nf6 e3 e6" -> "Queen's Pawn Game", - "d4 d5 c4" -> "Queen's Gambit Declined", - "d4 d5 c4 Nc6" -> "Queen's Gambit Declined, Chigorin Defense", - "d4 d5 c4 e5" -> "Queen's Gambit Declined, Albin Counter Gambit", - "d4 d5 c4 e5 dxe5 d4 Nf3 Nc6 g3" -> "Queen's Gambit Declined, Albin Counter Gambit, 5.g3", - "d4 d5 c4 c6" -> "Queen's Gambit Declined Slav", - "d4 d5 c4 c6 Nf3" -> "Queen's Gambit Declined Slav", - "d4 d5 c4 c6 Nf3 Nf6 e3 Bf5" -> "Queen's Gambit Declined Slav", - "d4 d5 c4 c6 Nf3 Nf6 cxd5 cxd5" -> "Queen's Gambit Declined Slav, Exchange Variation", - "d4 d5 c4 c6 Nf3 Nf6 cxd5 cxd5 Nc3 Nc6 Bf4 Bf5" -> "Queen's Gambit Declined Slav, Exchange Variation", - "d4 d5 c4 c6 Nf3 Nf6 Nc3" -> "Queen's Gambit Declined Slav", - "d4 d5 c4 c6 Nf3 Nf6 Nc3 dxc4 a4" -> "Queen's Gambit Declined Slav", - "d4 d5 c4 c6 Nf3 Nf6 Nc3 dxc4 a4 Bf5" -> "Queen's Gambit Declined Slav", - "d4 d5 c4 c6 Nf3 Nf6 Nc3 dxc4 a4 Bf5 e3" -> "Queen's Gambit Declined Slav, Dutch", - "d4 d5 c4 c6 Nf3 Nf6 Nc3 dxc4 a4 Bf5 e3 e6 Bxc4 Bb4 O-O O-O Qe2" -> "Queen's Gambit Declined Slav, Dutch", - "d4 d5 c4 dxc4" -> "Queen's Gambit Accepted", - "d4 d5 c4 dxc4 Nf3" -> "Queen's Gambit Accepted", - "d4 d5 c4 dxc4 Nf3 a6 e3 Bg4 Bxc4 e6 d5" -> "Queen's Gambit Accepted", - "d4 d5 c4 dxc4 Nf3 Nf6" -> "Queen's Gambit Accepted", - "d4 d5 c4 dxc4 Nf3 Nf6 Nc3" -> "Queen's Gambit Accepted", - "d4 d5 c4 dxc4 Nf3 Nf6 e3" -> "Queen's Gambit Accepted", - "d4 d5 c4 dxc4 Nf3 Nf6 e3 e6" -> "Queen's Gambit Accepted", - "d4 d5 c4 dxc4 Nf3 Nf6 e3 e6 Bxc4 c5 O-O a6" -> "Queen's Gambit Accepted, Classical", - "d4 d5 c4 dxc4 Nf3 Nf6 e3 e6 Bxc4 c5 O-O a6 Qe2" -> "Queen's Gambit Accepted, Classical", - "d4 d5 c4 dxc4 Nf3 Nf6 e3 e6 Bxc4 c5 O-O a6 Qe2 b5 Bb3 Bb7" -> "Queen's Gambit Accepted, Classical", - "d4 d5 c4 e6" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3 c5" -> "Queen's Gambit Declined, Tarrasch", - "d4 d5 c4 e6 Nc3 c5 cxd5 exd5 Nf3 Nc6 g3" -> "Queen's Gambit Declined, Tarrasch", - "d4 d5 c4 e6 Nc3 c5 cxd5 exd5 Nf3 Nc6 g3 Nf6 Bg2 Be7" -> "Queen's Gambit Declined, Tarrasch", - "d4 d5 c4 e6 Nc3 Nf6" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3 Nf6 cxd5 exd5 Bg5 c6 Qc2" -> "Queen's Gambit Declined, Exchange, Positional line, 6.Qc2", - "d4 d5 c4 e6 Nc3 Nf6 Nf3" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 Bb4" -> "Queen's Gambit Declined, Ragozin Variation", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 Bb4 Bg5 dxc4" -> "Queen's Gambit Declined, Ragozin, Vienna Variation", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c5" -> "Queen's Gambit Declined, Semi-Tarrasch", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cxd5" -> "Queen's Gambit Declined, Semi-Tarrasch", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cxd5 Nxd5 e3 Nc6 Bd3" -> "Queen's Gambit Declined, Semi-Tarrasch, 7.Bd3", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6" -> "Queen's Gambit Declined Semi-Slav", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dxc4" -> "Queen's Gambit Declined Semi-Slav", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3" -> "Queen's Gambit Declined Semi-Slav", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Nbd7 Bd3" -> "Queen's Gambit Declined Semi-Slav", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Nbd7 Bd3 dxc4 Bxc4" -> "Queen's Gambit Declined Semi-Slav", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Nbd7 Bd3 dxc4 Bxc4 b5 Bd3 a6" -> "Queen's Gambit Declined Semi-Slav, Meran", - "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Nbd7 Bd3 dxc4 Bxc4 b5 Bd3 a6 e4 c5 10 e5 cxd4 11 Nxb5" -> "Queen's Gambit Declined Semi-Slav, Meran", - "d4 d5 c4 e6 Nc3 Nf6 Bg5" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Nbd7" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Nbd7 e3 c6 Nf3" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Rc1" -> "Queen's Gambit Declined, Anti-Neo-Orthodox Variation", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 h6 Bh4" -> "Queen's Gambit Declined", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 h6 Bh4 Ne4 Bxe7 Qxe7" -> "Queen's Gambit Declined, Lasker Defense", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 h6 Bh4 b6" -> "Queen's Gambit Declined, Tartakower (Makagonov-Bondarevsky) System", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 h6 Bh4 b6 cxd5 Nxd5" -> "Queen's Gambit Declined, Tartakower", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7" -> "Queen's Gambit Declined, Orthodox Defense", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Qc2" -> "Queen's Gambit Declined, Orthodox, Rubinstein Attack", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Qc2 c5 cxd5" -> "Queen's Gambit Declined, Orthodox, Rubinstein Attack", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1" -> "Queen's Gambit Declined, Orthodox Defense", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Qc2" -> "Queen's Gambit Declined, Orthodox, Rubinstein Attack", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Qc2 a6 cxd5" -> "Queen's Gambit Declined, Orthodox, Rubinstein Attack, Main line", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Bd3" -> "Queen's Gambit Declined, Orthodox Defense, Bd3 line", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Bd3 dxc4 Bxc4 Nd5" -> "Queen's Gambit Declined, Orthodox Defense, Bd3 line", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Bd3 dxc4" -> "Queen's Gambit Declined, Orthodox Defense, Classical", - "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Bd3 dxc4" -> "Queen's Gambit Declined, Orthodox Defense, Classical, 13.de", - "d4 Nf6 c4 g6 f3 d5" -> "Neo-Grunfeld Defense", - "d4 Nf6 c4 g6 g3 d5" -> "Neo-Grunfeld", - "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 cxd5 Nxd5 e4 Nb6 Ne2" -> "Neo-Grunfeld, 5.cd, Main line", - "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3" -> "Neo-Grunfeld, 5.Nf3", - "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O cxd5 Nxd5 O-O" -> "Neo-Grunfeld, 6.cd Nxd5, 7.O-O", - "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O cxd5 Nxd5 O-O c5 dxc5" -> "Neo-Grunfeld, 6.cd Nxd5, 7.O-O c5, 8.dxc5", - "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O cxd5 Nxd5 O-O Nb6" -> "Neo-Grunfeld, 6.cd Nxd5, 7.O-O Nb6", - "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O O-O" -> "Neo-Grunfeld, 6.O-O", - "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O O-O c6" -> "Neo-Grunfeld, 6.O-O c6", - "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O O-O c6 cxd5 cxd5" -> "Neo-Grunfeld, 6.O-O, Main line", - "d4 Nf6 c4 g6 Nc3 d5" -> "Grunfeld", - "d4 Nf6 c4 g6 Nc3 d5 Qb3" -> "Grunfeld, Russian Variation", - "d4 Nf6 c4 g6 Nc3 d5 Bf4" -> "Grunfeld, 4.Bf4", - "d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 O-O" -> "Grunfeld, Grunfeld Gambit", - "d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 O-O cxd5 Nxd5 Nxd5 Qxd5 Bxc7" -> "Grunfeld, Grunfeld Gambit Accepted", - "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5" -> "Grunfeld", - "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Bc4" -> "Grunfeld, Exchange", - "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Bc4 O-O Ne2 c5" -> "Grunfeld, Exchange", - "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Bc4 O-O Ne2" -> "Grunfeld, Spassky Variation, Main line, 10...cd, 11.cd", - "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Bc4 O-O Ne2" -> "Grunfeld", - "d4 Nf6 c4 g6 Nc3 d5 Nf3" -> "Grunfeld", - "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bg5" -> "Grunfeld, 5.Bg5", - "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bf4" -> "Grunfeld, 5.Bf4", - "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bf4 O-O e3" -> "Grunfeld, with Bf4 & e3", - "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3" -> "Grunfeld", - "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 O-O Qb3" -> "Grunfeld", - "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3" -> "Grunfeld, Russian Variation", - "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dxc4 Qxc4 O-O e4" -> "Grunfeld, Russian", - "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dxc4 Qxc4 O-O e4 Bg4" -> "Grunfeld, Russian", - "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dxc4 Qxc4 O-O e4 Bg4 Be3" -> "Grunfeld Defense, Smyslov", - "d4 Nf6 c4 e6" -> "Queen's Pawn Game", - "d4 Nf6 c4 e6 g3 d5 Bg2" -> "Catalan, Closed", - "d4 Nf6 c4 e6 g3 d5 Bg2 dxc4 Qa4+" -> "Catalan, Open, 5.Qa4", - "d4 Nf6 c4 e6 g3 d5 Bg2 dxc4 Qa4+ Nbd7 Qxc4" -> "Catalan, Open", - "d4 Nf6 c4 e6 g3 d5 Bg2 dxc4 Nf3" -> "Catalan, Open, 5.Nf3", - "d4 Nf6 c4 e6 g3 d5 Bg2 dxc4 Nf3 Be7" -> "Catalan, Open, Classical line", - "d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3" -> "Catalan, Closed, 5.Nf3", - "d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 O-O O-O Nbd7" -> "Catalan, Closed", - "d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 O-O O-O Nbd7 Qc2" -> "Catalan, Closed", - "d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 O-O O-O Nbd7 Qc2 c6 Nbd2" -> "Catalan, Closed", - "d4 Nf6 c4 e6 Nf3" -> "Queen's Pawn Game", - "d4 Nf6 c4 e6 Nf3 Bb4+" -> "Bogo-Indian Defense", - "d4 Nf6 c4 e6 Nf3 b6" -> "Queen's Indian", - "d4 Nf6 c4 e6 Nf3 b6 Nc3 Bb7 Bg5 h6 Bh4 Bb4" -> "Queen's Indian, 4.Nc3, Main line", - "d4 Nf6 c4 e6 Nf3 b6 e3" -> "Queen's Indian", - "d4 Nf6 c4 e6 Nf3 b6 g3" -> "Queen's Indian", - "d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Bb4+" -> "Queen's Indian", - "d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7" -> "Queen's Indian", - "d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 O-O O-O Nc3" -> "Queen's Indian, Old Main line, 7.Nc3", - "d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 O-O O-O Nc3 Ne4 Qc2 Nxc3" -> "Queen's Indian, Old Main line, 9.Qxc3", - "d4 Nf6 c4 e6 Nc3 Bb4" -> "Nimzo-Indian", - "d4 Nf6 c4 e6 Nc3 Bb4 Nf3" -> "Nimzo-Indian, Three Knights", - "d4 Nf6 c4 e6 Nc3 Bb4 Qb3" -> "Nimzo-Indian, Spielmann Variation", - "d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dxc5 Nc6" -> "Nimzo-Indian, Spielmann", - "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3" -> "Nimzo-Indian, Samisch", - "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 c5 f3 d5 cxd5" -> "Nimzo-Indian, Samisch", - "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 c5 e3" -> "Nimzo-Indian, Samisch", - "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 O-O" -> "Nimzo-Indian, Samisch Variation", - "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 O-O e3" -> "Nimzo-Indian, Samisch Variation", - "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 O-O e3 c5 Bd3 Nc6" -> "Nimzo-Indian, Samisch", - "d4 Nf6 c4 e6 Nc3 Bb4 Bg5" -> "Nimzo-Indian, Leningrad", - "d4 Nf6 c4 e6 Nc3 Bb4 Bg5 h6 Bh4 c5 d5 d6" -> "Nimzo-Indian, Leningrad, Main line", - "d4 Nf6 c4 e6 Nc3 Bb4 Qc2" -> "Nimzo-Indian, Classical", - "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 Nc6" -> "Nimzo-Indian, Classical", - "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5" -> "Nimzo-Indian, Classical, Noa Variation", - "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 cxd5 exd5" -> "Nimzo-Indian, Classical, Noa Variation, 5.cd ed", - "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3" -> "Nimzo-Indian, Classical", - "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bxc3+ Qxc3 Ne4 Qc2" -> "Nimzo-Indian, Classical", - "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 c5" -> "Nimzo-Indian, Classical, 4...c5", - "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 c5 dxc5 O-O" -> "Nimzo-Indian, Classical, Pirc Variation", - "d4 Nf6 c4 e6 Nc3 Bb4 e3" -> "Nimzo-Indian, 4.e3", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 c5" -> "Nimzo-Indian", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 Ne2" -> "Nimzo-Indian, 4.e3 c5, 5.Ne2 (Rubinstein)", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 b6" -> "Nimzo-Indian, Fischer Variation", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 Ne2" -> "Nimzo-Indian, Fischer Variation, 5.Ne2", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 Ne2 Ba6" -> "Nimzo-Indian, 4.e3, Bronstein (Byrne) Variation", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O" -> "Nimzo-Indian", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Bd3" -> "Nimzo-Indian, 4.e3 O-O 5.Bd3", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Bd3 d5" -> "Nimzo-Indian, 4.e3 O-O 5.Bd3 d5", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Bd3 d5 a3 Bxc3+ bxc3" -> "Nimzo-Indian, 4.e3, Botvinnik System", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3" -> "Nimzo-Indian, 4.e3 O-O 5.Nf3, without ...d5", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5" -> "Nimzo-Indian, 4.e3", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 b6" -> "Nimzo-Indian, 4.e3, Main line with ...b6", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5" -> "Nimzo-Indian, 4.e3", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O dxc4 Bxc4" -> "Nimzo-Indian, 4.e3, Gligoric System", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O dxc4 Bxc4 Nbd7" -> "Nimzo-Indian, 4.e3, Gligoric System, Bronstein Variation", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O Nc6" -> "Nimzo-Indian, 4.e3, Main line with 7...Nc6", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O Nc6 a3 dxc4 9" -> "Nimzo-Indian, 4.e3, Main line with 8...dc and 9...cd", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O Nc6 a3 Bxc3 bxc3" -> "Nimzo-Indian, 4.e3, Main line with 8...Bxc3", - "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O Nc6 a3 Bxc3 bxc3 dxc4 10 Bxc4" -> "Nimzo-Indian, 4.e3, Main line", - "d4 Nf6 c4 g6" -> "King's Indian Defense", - "d4 Nf6 c4 g6 Nc3" -> "King's Indian", - "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3" -> "King's Indian, Fianchetto", - "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 Nc6 O-O a6" -> "King's Indian, Fianchetto, Panno Variation", - "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 c5" -> "King's Indian, Fianchetto, Yugoslav System", - "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 c5 O-O" -> "King's Indian, Fianchetto, Yugoslav, 7.O-O", - "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 c5 O-O Nc6 d5" -> "King's Indian, Fianchetto, Yugoslav Panno", - "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 Nbd7" -> "King's Indian, Fianchetto", - "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 Nbd7 O-O e5 e4" -> "King's Indian, Fianchetto, Classical Variation, 8.e4", - "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 Nbd7 O-O e5 e4 c6 h3" -> "King's Indian, Fianchetto, Classical Main line", - "d4 Nf6 c4 g6 Nc3 Bg7 e4" -> "King's Indian", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 h3" -> "King's Indian, Makagonov System (5.h3)", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 g3" -> "King's Indian", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2" -> "King's Indian", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 O-O Bg5 c5" -> "King's Indian, Averbakh, 6...c5", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 O-O Bg5 c5 d5 e6" -> "King's Indian, Averbakh, Main line", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4" -> "King's Indian, Four Pawns Attack", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 O-O Be2" -> "King's Indian", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 O-O Be2 c5 Nf3" -> "King's Indian, Four Pawns Attack, with Be2 and Nf3", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 O-O Be2 c5 Nf3 cxd4 Nxd4 Nc6 Be3" -> "King's Indian, Four Pawns Attack, Main line", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3" -> "King's Indian, Samisch Variation", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O" -> "King's Indian, Samisch", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 b6" -> "King's Indian, Samisch, double Fianchetto Variation", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 Nc6" -> "King's Indian, Samisch", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 Nc6 Nge2 a6 Qd2 Rb8" -> "King's Indian, Samisch, Panno Main line", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5" -> "King's Indian, Samisch, Orthodox Variation", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5 Nge2 c6" -> "King's Indian, Samisch, Orthodox, 7.Nge2 c6", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5 d5" -> "King's Indian, Samisch, Orthodox", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5 d5 c6" -> "King's Indian, Samisch, Orthodox, 7.d5 c6", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5 d5 c6 Nge2 cxd5" -> "King's Indian, Samisch, Orthodox Main line", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3" -> "King's Indian", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2" -> "King's Indian", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5" -> "King's Indian", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 d5 Nbd7" -> "King's Indian, Petrosian System", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O" -> "King's Indian, Orthodox", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nbd7 Re1" -> "King's Indian, Orthodox, 7...Nbd7, 8.Re1", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nbd7 Re1 c6 Bf1 a5" -> "King's Indian, Orthodox, 7...Nbd7, Main line", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nc6" -> "King's Indian", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nc6 d5 Ne7 Ne1" -> "King's Indian, Orthodox, Taimanov, 9.Ne1", - "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nc6 d5 Ne7 Ne1 Nd7 10 f3 f5" -> "King's Indian, Orthodox, Taimanov" + val tree = List( + ("A01", "Nimzovich-Larsen Attack", "b3"), + ("A02", "Bird's Opening", "f4"), + ("A03", "Bird's Opening", "f4 d5"), + ("A04", "Reti Opening", "Nf3"), + ("A05", "Reti Opening", "Nf3 Nf6"), + ("A06", "Reti Opening", "Nf3 d5"), + ("A07", "King's Indian Attack", "Nf3 d5 g3"), + ("A08", "King's Indian Attack", "Nf3 d5 g3 c5 Bg2"), + ("A09", "Reti Opening", "Nf3 d5 c4"), + ("A10", "English", "c4"), + ("A11", "English, Caro-Kann Defensive System", "c4 c6"), + ("A12", "English with b3", "c4 c6 Nf3 d5 b3"), + ("A13", "English", "c4 e6"), + ("A14", "English", "c4 e6 Nf3 d5 g3 Nf6 Bg2 Be7 O-O"), + ("A15", "English", "c4 Nf6"), + ("A16", "English", "c4 Nf6 Nc3"), + ("A17", "English", "c4 Nf6 Nc3 e6"), + ("A18", "English, Mikenas-Carls", "c4 Nf6 Nc3 e6 e4"), + ("A19", "English, Mikenas-Carls, Sicilian Variation", "c4 Nf6 Nc3 e6 e4 c5"), + ("A20", "English", "c4 e5"), + ("A21", "English", "c4 e5 Nc3"), + ("A22", "English", "c4 e5 Nc3 Nf6"), + ("A23", "English, Bremen System, Keres Variation", "c4 e5 Nc3 Nf6 g3 c6"), + ("A24", "English, Bremen System with ...g6", "c4 e5 Nc3 Nf6 g3 g6"), + ("A25", "English", "c4 e5 Nc3 Nc6"), + ("A26", "English", "c4 e5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6"), + ("A27", "English, Three Knights System", "c4 e5 Nc3 Nc6 Nf3"), + ("A28", "English", "c4 e5 Nc3 Nc6 Nf3 Nf6"), + ("A29", "English, Four Knights, Kingside Fianchetto", "c4 e5 Nc3 Nc6 Nf3 Nf6 g3"), + ("A30", "English, Symmetrical", "c4 c5"), + ("A31", "English, Symmetrical, Benoni Formation", "c4 c5 Nf3 Nf6 d4"), + ("A32", "English, Symmetrical Variation", "c4 c5 Nf3 Nf6 d4 cxd4 Nxd4 e6"), + ("A33", "English, Symmetrical", "c4 c5 Nf3 Nf6 d4 cxd4 Nxd4 e6 Nc3 Nc6"), + ("A34", "English, Symmetrical", "c4 c5 Nc3"), + ("A35", "English, Symmetrical", "c4 c5 Nc3 Nc6"), + ("A36", "English", "c4 c5 Nc3 Nc6 g3"), + ("A37", "English, Symmetrical", "c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3"), + ("A38", "English, Symmetrical", "c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6"), + ("A39", "English, Symmetrical, Main line with d4", "c4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 Nf3 Nf6 O-O O-O d4"), + ("A40", "Queen's Pawn Game", "d4"), + ("A41", "Queen's Pawn Game (with ...d6)", "d4 d6"), + ("A42", "Modern Defense, Averbakh System", "d4 d6 c4 g6 Nc3 Bg7 e4"), + ("A43", "Old Benoni", "d4 c5"), + ("A44", "Old Benoni Defense", "d4 c5 d5 e5"), + ("A45", "Queen's Pawn Game", "d4 Nf6"), + ("A46", "Queen's Pawn Game", "d4 Nf6 Nf3"), + ("A47", "Queen's Indian", "d4 Nf6 Nf3 b6"), + ("A48", "King's Indian", "d4 Nf6 Nf3 g6"), + ("A49", "King's Indian, Fianchetto without c4", "d4 Nf6 Nf3 g6 g3"), + ("A50", "Queen's Pawn Game", "d4 Nf6 c4"), + ("A51", "Budapest Gambit", "d4 Nf6 c4 e5"), + ("A52", "Budapest Gambit", "d4 Nf6 c4 e5 dxe5 Ng4"), + ("A53", "Old Indian", "d4 Nf6 c4 d6"), + ("A54", "Old Indian, Ukrainian Variation, 4.Nf3", "d4 Nf6 c4 d6 Nc3 e5 Nf3"), + ("A55", "Old Indian, Main line", "d4 Nf6 c4 d6 Nc3 e5 Nf3 Nbd7 e4"), + ("A56", "Benoni Defense", "d4 Nf6 c4 c5"), + ("A57", "Benko Gambit", "d4 Nf6 c4 c5 d5 b5"), + ("A58", "Benko Gambit", "d4 Nf6 c4 c5 d5 b5 cxb5 a6 bxa6"), + ("A59", "Benko Gambit", "d4 Nf6 c4 c5 d5 b5 cxb5 a6 bxa6 Bxa6 Nc3 d6 e4"), + ("A60", "Benoni Defense", "d4 Nf6 c4 c5 d5 e6"), + ("A61", "Benoni", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 Nf3 g6"), + ("A62", "Benoni, Fianchetto Variation", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 Nf3 g6 g3 Bg7 Bg2 O-O"), + ("A63", "Benoni, Fianchetto, 9...Nbd7", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 Nf3 g6 g3 Bg7 Bg2 O-O 9"), + ("A64", "Benoni, Fianchetto, 11...Re8", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 Nf3 g6 g3 Bg7 Bg2 O-O 9"), + ("A65", "Benoni, 6.e4", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4"), + ("A66", "Benoni", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 f4"), + ("A67", "Benoni, Taimanov Variation", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 f4 Bg7 Bb5+"), + ("A68", "Benoni, Four Pawns Attack", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 f4 Bg7 Nf3 O-O"), + ("A69", "Benoni, Four Pawns Attack, Main line", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 f4 Bg7 Nf3 O-O 9"), + ("A70", "Benoni, Classical with 7.Nf3", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3"), + ("A71", "Benoni, Classical, 8.Bg5", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Bg5"), + ("A72", "Benoni, Classical without 9.O-O", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O"), + ("A73", "Benoni, Classical, 9.O-O", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9"), + ("A74", "Benoni, Classical, 9...a6, 10.a4", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9"), + ("A75", "Benoni, Classical with ...a6 and 10...Bg4", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9"), + ("A76", "Benoni, Classical, 9...Re8", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9"), + ("A77", "Benoni, Classical, 9...Re8, 10.Nd2", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9"), + ("A78", "Benoni, Classical with ...Re8 and ...Na6", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9"), + ("A79", "Benoni, Classical, 11.f3", "d4 Nf6 c4 c5 d5 e6 Nc3 exd5 cxd5 d6 e4 g6 Nf3 Bg7 Be2 O-O 9"), + ("A80", "Dutch", "d4 f5"), + ("A81", "Dutch", "d4 f5 g3"), + ("A82", "Dutch, Staunton Gambit", "d4 f5 e4"), + ("A83", "Dutch, Staunton Gambit", "d4 f5 e4 fxe4 Nc3 Nf6 Bg5"), + ("A84", "Dutch", "d4 f5 c4"), + ("A85", "Dutch, with c4 & Nc3", "d4 f5 c4 Nf6 Nc3"), + ("A86", "Dutch", "d4 f5 c4 Nf6 g3"), + ("A87", "Dutch, Leningrad, Main Variation", "d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3"), + ("A88", "Dutch, Leningrad, Main Variation with c6", "d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 O-O O-O d6 Nc3 c6"), + ("A89", "Dutch, Leningrad, Main Variation with Nc6", "d4 f5 c4 Nf6 g3 g6 Bg2 Bg7 Nf3 O-O O-O d6 Nc3 Nc6"), + ("A90", "Dutch", "d4 f5 c4 Nf6 g3 e6 Bg2"), + ("A91", "Dutch Defense", "d4 f5 c4 Nf6 g3 e6 Bg2 Be7"), + ("A92", "Dutch", "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O"), + ("A93", "Dutch, Stonewall, Botvinnik Variation", "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d5 b3"), + ("A94", "Dutch, Stonewall with Ba3", "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d5 b3 c6 Ba3"), + ("A95", "Dutch, Stonewall", "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d5 Nc3 c6"), + ("A96", "Dutch, Classical Variation", "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d6"), + ("A97", "Dutch, Ilyin-Genevsky", "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d6 Nc3 Qe8"), + ("A98", "Dutch, Ilyin-Genevsky Variation with Qc2", "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d6 Nc3 Qe8 Qc2"), + ("A99", "Dutch, Ilyin-Genevsky Variation with b3", "d4 f5 c4 Nf6 g3 e6 Bg2 Be7 Nf3 O-O O-O d6 Nc3 Qe8 b3"), + ("B00", "Uncommon King's Pawn Opening", "e4"), + ("B01", "Scandinavian", "e4 d5"), + ("B02", "Alekhine's Defense", "e4 Nf6"), + ("B03", "Alekhine's Defense", "e4 Nf6 e5 Nd5 d4"), + ("B04", "Alekhine's Defense, Modern", "e4 Nf6 e5 Nd5 d4 d6 Nf3"), + ("B05", "Alekhine's Defense, Modern", "e4 Nf6 e5 Nd5 d4 d6 Nf3 Bg4"), + ("B06", "Robatsch", "e4 g6"), + ("B07", "Pirc", "e4 d6 d4 Nf6"), + ("B08", "Pirc, Classical", "e4 d6 d4 Nf6 Nc3 g6 Nf3"), + ("B09", "Pirc, Austrian Attack", "e4 d6 d4 Nf6 Nc3 g6 f4"), + ("B10", "Caro-Kann", "e4 c6"), + ("B11", "Caro-Kann, Two Knights, 3...Bg4", "e4 c6 Nc3 d5 Nf3 Bg4"), + ("B12", "Caro-Kann Defense", "e4 c6 d4"), + ("B13", "Caro-Kann, Exchange", "e4 c6 d4 d5 exd5 cxd5"), + ("B14", "Caro-Kann, Panov-Botvinnik Attack", "e4 c6 d4 d5 exd5 cxd5 c4 Nf6 Nc3 e6"), + ("B15", "Caro-Kann", "e4 c6 d4 d5 Nc3"), + ("B16", "Caro-Kann, Bronstein-Larsen Variation", "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Nf6 Nxf6+ gxf6"), + ("B17", "Caro-Kann, Steinitz Variation", "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Nd7"), + ("B18", "Caro-Kann, Classical", "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Bf5"), + ("B19", "Caro-Kann, Classical", "e4 c6 d4 d5 Nc3 dxe4 Nxe4 Bf5 Ng3 Bg6 h4 h6 Nf3 Nd7"), + ("B20", "Sicilian", "e4 c5"), + ("B21", "Sicilian, 2.f4 and 2.d4", "e4 c5 f4"), + ("B22", "Sicilian, Alapin", "e4 c5 c3"), + ("B23", "Sicilian, Closed", "e4 c5 Nc3"), + ("B24", "Sicilian, Closed", "e4 c5 Nc3 Nc6 g3"), + ("B25", "Sicilian, Closed", "e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6"), + ("B26", "Sicilian, Closed, 6.Be3", "e4 c5 Nc3 Nc6 g3 g6 Bg2 Bg7 d3 d6 Be3"), + ("B27", "Sicilian", "e4 c5 Nf3"), + ("B28", "Sicilian, O'Kelly Variation", "e4 c5 Nf3 a6"), + ("B29", "Sicilian, Nimzovich-Rubinstein", "e4 c5 Nf3 Nf6"), + ("B30", "Sicilian", "e4 c5 Nf3 Nc6"), + ("B31", "Sicilian, Rossolimo Variation", "e4 c5 Nf3 Nc6 Bb5 g6"), + ("B32", "Sicilian", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 e5"), + ("B33", "Sicilian", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4"), + ("B34", "Sicilian, Accelerated Fianchetto", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 Nxc6"), + ("B35", "Sicilian, Accelerated Fianchetto, Modern Variation with Bc4", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 Nc3 Bg7 Be3 Nf6 Bc4"), + ("B36", "Sicilian, Accelerated Fianchetto", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 c4"), + ("B37", "Sicilian, Accelerated Fianchetto", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 c4 Bg7"), + ("B38", "Sicilian, Accelerated Fianchetto, Maroczy Bind, 6.Be3", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 c4 Bg7 Be3"), + ("B39", "Sicilian, Accelerated Fianchetto, Breyer Variation", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 g6 c4 Bg7 Be3 Nf6 Nc3 Ng4"), + ("B40", "Sicilian", "e4 c5 Nf3 e6"), + ("B41", "Sicilian, Kan", "e4 c5 Nf3 e6 d4 cxd4 Nxd4 a6"), + ("B42", "Sicilian, Kan", "e4 c5 Nf3 e6 d4 cxd4 Nxd4 a6 Bd3"), + ("B43", "Sicilian, Kan, 5.Nc3", "e4 c5 Nf3 e6 d4 cxd4 Nxd4 a6 Nc3"), + ("B44", "Sicilian", "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6"), + ("B45", "Sicilian, Taimanov", "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3"), + ("B46", "Sicilian, Taimanov Variation", "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 a6"), + ("B47", "Sicilian, Taimanov (Bastrikov) Variation", "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 Qc7"), + ("B48", "Sicilian, Taimanov Variation", "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 Qc7 Be3"), + ("B49", "Sicilian, Taimanov Variation", "e4 c5 Nf3 e6 d4 cxd4 Nxd4 Nc6 Nc3 Qc7 Be3 a6 Be2"), + ("B50", "Sicilian", "e4 c5 Nf3 d6"), + ("B51", "Sicilian, Canal-Sokolsky (Rossolimo) Attack", "e4 c5 Nf3 d6 Bb5+"), + ("B52", "Sicilian, Canal-Sokolsky (Rossolimo) Attack", "e4 c5 Nf3 d6 Bb5+ Bd7"), + ("B53", "Sicilian", "e4 c5 Nf3 d6 d4 cxd4 Qxd4"), + ("B54", "Sicilian", "e4 c5 Nf3 d6 d4 cxd4 Nxd4"), + ("B55", "Sicilian, Prins Variation, Venice Attack", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 f3 e5 Bb5+"), + ("B56", "Sicilian", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3"), + ("B57", "Sicilian", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bc4"), + ("B58", "Sicilian", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 Nc3 d6 Be2"), + ("B59", "Sicilian, Boleslavsky Variation, 7.Nb3", "e4 c5 Nf3 Nc6 d4 cxd4 Nxd4 Nf6 Nc3 d6 Be2 e5 Nb3"), + ("B60", "Sicilian, Richter-Rauzer", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5"), + ("B61", "Sicilian, Richter-Rauzer, Larsen Variation, 7.Qd2", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 Bd7 Qd2"), + ("B62", "Sicilian, Richter-Rauzer", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6"), + ("B63", "Sicilian, Richter-Rauzer Attack", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2"), + ("B64", "Sicilian, Richter-Rauzer Attack", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 O-O-O O-O f4"), + ("B65", "Sicilian, Richter-Rauzer Attack, 7...Be7 Defense, 9...Nxd4", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 Be7 O-O-O O-O f4 Nxd4 10 Qxd4"), + ("B66", "Sicilian, Richter-Rauzer Attack, 7...a6", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6"), + ("B67", "Sicilian, Richter-Rauzer Attack, 7...a6 Defense, 8...Bd7", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 O-O-O Bd7"), + ("B68", "Sicilian, Richter-Rauzer Attack, 7...a6 Defense, 9...Be7", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 O-O-O Bd7 f4 Be7"), + ("B69", "Sicilian, Richter-Rauzer Attack, 7...a6 Defense, 11.Bxf6", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 Nc6 Bg5 e6 Qd2 a6 O-O-O Bd7 f4 Be7 10 Nf3 b5 11 Bxf6"), + ("B70", "Sicilian, Dragon Variation", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6"), + ("B71", "Sicilian, Dragon, Levenfish Variation", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 f4"), + ("B72", "Sicilian, Dragon", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3"), + ("B73", "Sicilian, Dragon, Classical", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 O-O"), + ("B74", "Sicilian, Dragon, Classical", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 Be2 Nc6 O-O O-O Nb3"), + ("B75", "Sicilian, Dragon, Yugoslav Attack", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3"), + ("B76", "Sicilian, Dragon, Yugoslav Attack", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3 O-O"), + ("B77", "Sicilian, Dragon, Yugoslav Attack", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3 O-O Qd2 Nc6 Bc4"), + ("B78", "Sicilian, Dragon, Yugoslav Attack, 10.castle long", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3 O-O Qd2 Nc6 Bc4 Bd7 10 O-O-O"), + ("B79", "Sicilian, Dragon, Yugoslav Attack, 12.h4", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 g6 Be3 Bg7 f3 O-O Qd2 Nc6 Bc4 Bd7 10 O-O-O Qa5 11 Bb3 Rfc8 12 h4"), + ("B80", "Sicilian, Scheveningen", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6"), + ("B81", "Sicilian, Scheveningen, Keres Attack", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 g4"), + ("B82", "Sicilian, Scheveningen", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 f4"), + ("B83", "Sicilian", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Be2"), + ("B84", "Sicilian, Scheveningen", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Be2 a6"), + ("B85", "Sicilian, Scheveningen, Classical", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Be2 a6 O-O Qc7 f4 Nc6"), + ("B86", "Sicilian, Fischer-Sozin Attack", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Bc4"), + ("B87", "Sicilian, Fischer-Sozin with ...a6 and ...b5", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Bc4 a6 Bb3 b5"), + ("B88", "Sicilian, Fischer-Sozin Attack", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Bc4 Nc6"), + ("B89", "Sicilian", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 e6 Bc4 Nc6 Be3"), + ("B90", "Sicilian, Najdorf", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6"), + ("B91", "Sicilian, Najdorf, Zagreb (Fianchetto) Variation", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 g3"), + ("B92", "Sicilian, Najdorf, Opocensky Variation", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Be2"), + ("B93", "Sicilian, Najdorf, 6.f4", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 f4"), + ("B94", "Sicilian, Najdorf", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5"), + ("B95", "Sicilian, Najdorf, 6...e6", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6"), + ("B96", "Sicilian, Najdorf", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4"), + ("B97", "Sicilian, Najdorf", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4 Qb6"), + ("B98", "Sicilian, Najdorf", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7"), + ("B99", "Sicilian, Najdorf, 7...Be7 Main line", "e4 c5 Nf3 d6 d4 cxd4 Nxd4 Nf6 Nc3 a6 Bg5 e6 f4 Be7 Qf3 Qc7 O-O-O Nbd7"), + ("C00", "French Defense", "e4 e6"), + ("C01", "French, Exchange", "e4 e6 d4 d5 exd5 exd5 Nc3 Nf6 Bg5"), + ("C02", "French, Advance", "e4 e6 d4 d5 e5"), + ("C03", "French, Tarrasch", "e4 e6 d4 d5 Nd2"), + ("C04", "French, Tarrasch, Guimard Main line", "e4 e6 d4 d5 Nd2 Nc6 Ngf3 Nf6"), + ("C05", "French, Tarrasch", "e4 e6 d4 d5 Nd2 Nf6"), + ("C06", "French, Tarrasch", "e4 e6 d4 d5 Nd2 Nf6 e5 Nfd7 Bd3 c5 c3 Nc6 Ne2 cxd4 cxd4"), + ("C07", "French, Tarrasch", "e4 e6 d4 d5 Nd2 c5"), + ("C08", "French, Tarrasch, Open, 4.ed ed", "e4 e6 d4 d5 Nd2 c5 exd5 exd5"), + ("C09", "French, Tarrasch, Open Variation, Main line", "e4 e6 d4 d5 Nd2 c5 exd5 exd5 Ngf3 Nc6"), + ("C10", "French", "e4 e6 d4 d5 Nc3"), + ("C11", "French", "e4 e6 d4 d5 Nc3 Nf6"), + ("C12", "French, McCutcheon", "e4 e6 d4 d5 Nc3 Nf6 Bg5 Bb4"), + ("C13", "French", "e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7"), + ("C14", "French, Classical", "e4 e6 d4 d5 Nc3 Nf6 Bg5 Be7 e5 Nfd7 Bxe7 Qxe7"), + ("C15", "French, Winawer", "e4 e6 d4 d5 Nc3 Bb4"), + ("C16", "French, Winawer", "e4 e6 d4 d5 Nc3 Bb4 e5"), + ("C17", "French, Winawer, Advance", "e4 e6 d4 d5 Nc3 Bb4 e5 c5"), + ("C18", "French, Winawer", "e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bxc3+ bxc3"), + ("C19", "French, Winawer, Advance", "e4 e6 d4 d5 Nc3 Bb4 e5 c5 a3 Bxc3+ bxc3 Ne7"), + ("C20", "King's Pawn Game", "e4 e5"), + ("C21", "Center Game", "e4 e5 d4 exd4"), + ("C22", "Center Game", "e4 e5 d4 exd4 Qxd4 Nc6"), + ("C23", "Bishop's Opening", "e4 e5 Bc4"), + ("C24", "Bishop's Opening", "e4 e5 Bc4 Nf6"), + ("C25", "Vienna", "e4 e5 Nc3"), + ("C26", "Vienna", "e4 e5 Nc3 Nf6"), + ("C27", "Vienna Game", "e4 e5 Nc3 Nf6 Bc4 Nxe4"), + ("C28", "Vienna Game", "e4 e5 Nc3 Nf6 Bc4 Nc6"), + ("C29", "Vienna Gambit", "e4 e5 Nc3 Nf6 f4"), + ("C30", "King's Gambit Declined", "e4 e5 f4"), + ("C31", "King's Gambit Declined, Falkbeer Counter Gambit", "e4 e5 f4 d5"), + ("C32", "King's Gambit Declined, Falkbeer Counter Gambit", "e4 e5 f4 d5 exd5 e4 d3 Nf6"), + ("C33", "King's Gambit Accepted", "e4 e5 f4 exf4"), + ("C34", "King's Gambit Accepted", "e4 e5 f4 exf4 Nf3"), + ("C35", "King's Gambit Accepted, Cunningham", "e4 e5 f4 exf4 Nf3 Be7"), + ("C36", "King's Gambit Accepted, Abbazia Defense", "e4 e5 f4 exf4 Nf3 d5"), + ("C37", "King's Gambit Accepted", "e4 e5 f4 exf4 Nf3 g5 Nc3"), + ("C38", "King's Gambit Accepted", "e4 e5 f4 exf4 Nf3 g5 Bc4 Bg7"), + ("C39", "King's Gambit Accepted", "e4 e5 f4 exf4 Nf3 g5 h4"), + ("C40", "King's Knight Opening", "e4 e5 Nf3"), + ("C41", "Philidor Defense", "e4 e5 Nf3 d6"), + ("C42", "Petrov Defense", "e4 e5 Nf3 Nf6"), + ("C43", "Petrov, Modern Attack", "e4 e5 Nf3 Nf6 d4 exd4 e5 Ne4 Qxd4"), + ("C44", "King's Pawn Game", "e4 e5 Nf3 Nc6"), + ("C45", "Scotch Game", "e4 e5 Nf3 Nc6 d4 exd4 Nxd4"), + ("C46", "Three Knights", "e4 e5 Nf3 Nc6 Nc3"), + ("C47", "Four Knights", "e4 e5 Nf3 Nc6 Nc3 Nf6"), + ("C48", "Four Knights", "e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5"), + ("C49", "Four Knights", "e4 e5 Nf3 Nc6 Nc3 Nf6 Bb5 Bb4"), + ("C50", "Giuoco Piano", "e4 e5 Nf3 Nc6 Bc4 Bc5"), + ("C51", "Evans Gambit", "e4 e5 Nf3 Nc6 Bc4 Bc5 b4"), + ("C52", "Evans Gambit", "e4 e5 Nf3 Nc6 Bc4 Bc5 b4 Bxb4 c3 Ba5"), + ("C53", "Giuoco Piano", "e4 e5 Nf3 Nc6 Bc4 Bc5 c3"), + ("C54", "Giuoco Piano", "e4 e5 Nf3 Nc6 Bc4 Bc5 c3 Nf6 d4 exd4 cxd4"), + ("C55", "Two Knights Defense", "e4 e5 Nf3 Nc6 Bc4 Nf6"), + ("C56", "Two Knights", "e4 e5 Nf3 Nc6 Bc4 Nf6 d4 exd4 O-O Nxe4"), + ("C57", "Two Knights", "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5"), + ("C58", "Two Knights", "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 exd5 Na5"), + ("C59", "Two Knights", "e4 e5 Nf3 Nc6 Bc4 Nf6 Ng5 d5 exd5 Na5 Bb5+ c6 dxc6 bxc6 Be2 h6"), + ("C60", "Ruy Lopez", "e4 e5 Nf3 Nc6 Bb5"), + ("C61", "Ruy Lopez, Bird's Defense", "e4 e5 Nf3 Nc6 Bb5 Nd4"), + ("C62", "Ruy Lopez, Old Steinitz Defense", "e4 e5 Nf3 Nc6 Bb5 d6"), + ("C63", "Ruy Lopez, Schliemann Defense", "e4 e5 Nf3 Nc6 Bb5 f5"), + ("C64", "Ruy Lopez, Classical", "e4 e5 Nf3 Nc6 Bb5 Bc5"), + ("C65", "Ruy Lopez, Berlin Defense", "e4 e5 Nf3 Nc6 Bb5 Nf6"), + ("C66", "Ruy Lopez", "e4 e5 Nf3 Nc6 Bb5 Nf6 O-O d6"), + ("C67", "Ruy Lopez", "e4 e5 Nf3 Nc6 Bb5 Nf6 O-O Nxe4"), + ("C68", "Ruy Lopez, Exchange", "e4 e5 Nf3 Nc6 Bb5 a6 Bxc6"), + ("C69", "Ruy Lopez, Exchange, Gligoric Variation, 6.d4", "e4 e5 Nf3 Nc6 Bb5 a6 Bxc6 dc O-O f6 d4"), + ("C70", "Ruy Lopez", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4"), + ("C71", "Ruy Lopez", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6"), + ("C72", "Ruy Lopez, Modern Steinitz Defense, 5.O-O", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 O-O"), + ("C73", "Ruy Lopez, Modern Steinitz Defense", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 Bxc6+ bxc6 d4"), + ("C74", "Ruy Lopez, Modern Steinitz Defense", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3"), + ("C75", "Ruy Lopez, Modern Steinitz Defense", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7"), + ("C76", "Ruy Lopez, Modern Steinitz Defense, Fianchetto Variation", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 d6 c3 Bd7 d4 g6"), + ("C77", "Ruy Lopez", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6"), + ("C78", "Ruy Lopez", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O"), + ("C79", "Ruy Lopez, Steinitz Defense Deferred", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O d6"), + ("C80", "Ruy Lopez, Open", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Nxe4"), + ("C81", "Ruy Lopez, Open, Howell Attack", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Nxe4 d4 b5 Bb3 d5 dxe5 Be6"), + ("C82", "Ruy Lopez, Open", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Nxe4 d4 b5 Bb3 d5 dxe5 Be6 c3"), + ("C83", "Ruy Lopez, Open", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Nxe4 d4 b5 Bb3 d5 dxe5 Be6"), + ("C84", "Ruy Lopez, Closed", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7"), + ("C85", "Ruy Lopez, Exchange Variation Doubly Deferred (DERLD)", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Bxc6 dxc6"), + ("C86", "Ruy Lopez, Worrall Attack", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Qe2"), + ("C87", "Ruy Lopez", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 d6"), + ("C88", "Ruy Lopez", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3"), + ("C89", "Ruy Lopez, Marshall", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d5"), + ("C90", "Ruy Lopez, Closed", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6"), + ("C91", "Ruy Lopez, Closed", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 d4"), + ("C92", "Ruy Lopez, Closed", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3"), + ("C93", "Ruy Lopez, Closed, Smyslov Defense", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 h6"), + ("C94", "Ruy Lopez, Closed, Breyer Defense", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Nb8"), + ("C95", "Ruy Lopez, Closed, Breyer", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Nb8 10 d4"), + ("C96", "Ruy Lopez, Closed", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Na5 10 Bc2"), + ("C97", "Ruy Lopez, Closed, Chigorin", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Na5 10 Bc2 c5 11 d4 Qc7"), + ("C98", "Ruy Lopez, Closed, Chigorin", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Na5 10 Bc2 c5 11 d4 Qc7 12 Nbd2 Nc6"), + ("C99", "Ruy Lopez, Closed, Chigorin, 12...cd", "e4 e5 Nf3 Nc6 Bb5 a6 Ba4 Nf6 O-O Be7 Re1 b5 Bb3 O-O c3 d6 h3 Na5 10 Bc2 c5 11 d4 Qc7 12 Nbd2 cxd4 13 cxd4"), + ("D00", "Queen's Pawn Game", "d4 d5"), + ("D01", "Richter-Veresov Attack", "d4 d5 Nc3 Nf6 Bg5"), + ("D02", "Queen's Pawn Game", "d4 d5 Nf3"), + ("D03", "Torre Attack (Tartakower Variation)", "d4 d5 Nf3 Nf6 Bg5"), + ("D04", "Queen's Pawn Game", "d4 d5 Nf3 Nf6 e3"), + ("D05", "Queen's Pawn Game", "d4 d5 Nf3 Nf6 e3 e6"), + ("D06", "Queen's Gambit Declined", "d4 d5 c4"), + ("D07", "Queen's Gambit Declined, Chigorin Defense", "d4 d5 c4 Nc6"), + ("D08", "Queen's Gambit Declined, Albin Counter Gambit", "d4 d5 c4 e5"), + ("D09", "Queen's Gambit Declined, Albin Counter Gambit, 5.g3", "d4 d5 c4 e5 dxe5 d4 Nf3 Nc6 g3"), + ("D10", "Queen's Gambit Declined Slav", "d4 d5 c4 c6"), + ("D11", "Queen's Gambit Declined Slav", "d4 d5 c4 c6 Nf3"), + ("D12", "Queen's Gambit Declined Slav", "d4 d5 c4 c6 Nf3 Nf6 e3 Bf5"), + ("D13", "Queen's Gambit Declined Slav, Exchange Variation", "d4 d5 c4 c6 Nf3 Nf6 cxd5 cxd5"), + ("D14", "Queen's Gambit Declined Slav, Exchange Variation", "d4 d5 c4 c6 Nf3 Nf6 cxd5 cxd5 Nc3 Nc6 Bf4 Bf5"), + ("D15", "Queen's Gambit Declined Slav", "d4 d5 c4 c6 Nf3 Nf6 Nc3"), + ("D16", "Queen's Gambit Declined Slav", "d4 d5 c4 c6 Nf3 Nf6 Nc3 dxc4 a4"), + ("D17", "Queen's Gambit Declined Slav", "d4 d5 c4 c6 Nf3 Nf6 Nc3 dxc4 a4 Bf5"), + ("D18", "Queen's Gambit Declined Slav, Dutch", "d4 d5 c4 c6 Nf3 Nf6 Nc3 dxc4 a4 Bf5 e3"), + ("D19", "Queen's Gambit Declined Slav, Dutch", "d4 d5 c4 c6 Nf3 Nf6 Nc3 dxc4 a4 Bf5 e3 e6 Bxc4 Bb4 O-O O-O Qe2"), + ("D20", "Queen's Gambit Accepted", "d4 d5 c4 dxc4"), + ("D21", "Queen's Gambit Accepted", "d4 d5 c4 dxc4 Nf3"), + ("D22", "Queen's Gambit Accepted", "d4 d5 c4 dxc4 Nf3 a6 e3 Bg4 Bxc4 e6 d5"), + ("D23", "Queen's Gambit Accepted", "d4 d5 c4 dxc4 Nf3 Nf6"), + ("D24", "Queen's Gambit Accepted", "d4 d5 c4 dxc4 Nf3 Nf6 Nc3"), + ("D25", "Queen's Gambit Accepted", "d4 d5 c4 dxc4 Nf3 Nf6 e3"), + ("D26", "Queen's Gambit Accepted", "d4 d5 c4 dxc4 Nf3 Nf6 e3 e6"), + ("D27", "Queen's Gambit Accepted, Classical", "d4 d5 c4 dxc4 Nf3 Nf6 e3 e6 Bxc4 c5 O-O a6"), + ("D28", "Queen's Gambit Accepted, Classical", "d4 d5 c4 dxc4 Nf3 Nf6 e3 e6 Bxc4 c5 O-O a6 Qe2"), + ("D29", "Queen's Gambit Accepted, Classical", "d4 d5 c4 dxc4 Nf3 Nf6 e3 e6 Bxc4 c5 O-O a6 Qe2 b5 Bb3 Bb7"), + ("D30", "Queen's Gambit Declined", "d4 d5 c4 e6"), + ("D31", "Queen's Gambit Declined", "d4 d5 c4 e6 Nc3"), + ("D32", "Queen's Gambit Declined, Tarrasch", "d4 d5 c4 e6 Nc3 c5"), + ("D33", "Queen's Gambit Declined, Tarrasch", "d4 d5 c4 e6 Nc3 c5 cxd5 exd5 Nf3 Nc6 g3"), + ("D34", "Queen's Gambit Declined, Tarrasch", "d4 d5 c4 e6 Nc3 c5 cxd5 exd5 Nf3 Nc6 g3 Nf6 Bg2 Be7"), + ("D35", "Queen's Gambit Declined", "d4 d5 c4 e6 Nc3 Nf6"), + ("D36", "Queen's Gambit Declined, Exchange, Positional line, 6.Qc2", "d4 d5 c4 e6 Nc3 Nf6 cxd5 exd5 Bg5 c6 Qc2"), + ("D37", "Queen's Gambit Declined", "d4 d5 c4 e6 Nc3 Nf6 Nf3"), + ("D38", "Queen's Gambit Declined, Ragozin Variation", "d4 d5 c4 e6 Nc3 Nf6 Nf3 Bb4"), + ("D39", "Queen's Gambit Declined, Ragozin, Vienna Variation", "d4 d5 c4 e6 Nc3 Nf6 Nf3 Bb4 Bg5 dxc4"), + ("D40", "Queen's Gambit Declined, Semi-Tarrasch", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c5"), + ("D41", "Queen's Gambit Declined, Semi-Tarrasch", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cxd5"), + ("D42", "Queen's Gambit Declined, Semi-Tarrasch, 7.Bd3", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c5 cxd5 Nxd5 e3 Nc6 Bd3"), + ("D43", "Queen's Gambit Declined Semi-Slav", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6"), + ("D44", "Queen's Gambit Declined Semi-Slav", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 Bg5 dxc4"), + ("D45", "Queen's Gambit Declined Semi-Slav", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3"), + ("D46", "Queen's Gambit Declined Semi-Slav", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Nbd7 Bd3"), + ("D47", "Queen's Gambit Declined Semi-Slav", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Nbd7 Bd3 dxc4 Bxc4"), + ("D48", "Queen's Gambit Declined Semi-Slav, Meran", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Nbd7 Bd3 dxc4 Bxc4 b5 Bd3 a6"), + ("D49", "Queen's Gambit Declined Semi-Slav, Meran", "d4 d5 c4 e6 Nc3 Nf6 Nf3 c6 e3 Nbd7 Bd3 dxc4 Bxc4 b5 Bd3 a6 e4 c5 10 e5 cxd4 11 Nxb5"), + ("D50", "Queen's Gambit Declined", "d4 d5 c4 e6 Nc3 Nf6 Bg5"), + ("D51", "Queen's Gambit Declined", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Nbd7"), + ("D52", "Queen's Gambit Declined", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Nbd7 e3 c6 Nf3"), + ("D53", "Queen's Gambit Declined", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7"), + ("D54", "Queen's Gambit Declined, Anti-Neo-Orthodox Variation", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Rc1"), + ("D55", "Queen's Gambit Declined", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3"), + ("D56", "Queen's Gambit Declined", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 h6 Bh4"), + ("D57", "Queen's Gambit Declined, Lasker Defense", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 h6 Bh4 Ne4 Bxe7 Qxe7"), + ("D58", "Queen's Gambit Declined, Tartakower (Makagonov-Bondarevsky) System", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 h6 Bh4 b6"), + ("D59", "Queen's Gambit Declined, Tartakower", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 h6 Bh4 b6 cxd5 Nxd5"), + ("D60", "Queen's Gambit Declined, Orthodox Defense", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7"), + ("D61", "Queen's Gambit Declined, Orthodox, Rubinstein Attack", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Qc2"), + ("D62", "Queen's Gambit Declined, Orthodox, Rubinstein Attack", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Qc2 c5 cxd5"), + ("D63", "Queen's Gambit Declined, Orthodox Defense", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1"), + ("D64", "Queen's Gambit Declined, Orthodox, Rubinstein Attack", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Qc2"), + ("D65", "Queen's Gambit Declined, Orthodox, Rubinstein Attack, Main line", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Qc2 a6 cxd5"), + ("D66", "Queen's Gambit Declined, Orthodox Defense, Bd3 line", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Bd3"), + ("D67", "Queen's Gambit Declined, Orthodox Defense, Bd3 line", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Bd3 dxc4 Bxc4 Nd5"), + ("D68", "Queen's Gambit Declined, Orthodox Defense, Classical", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Bd3 dxc4"), + ("D69", "Queen's Gambit Declined, Orthodox Defense, Classical, 13.de", "d4 d5 c4 e6 Nc3 Nf6 Bg5 Be7 e3 O-O Nf3 Nbd7 Rc1 c6 Bd3 dxc4"), + ("D70", "Neo-Grunfeld Defense", "d4 Nf6 c4 g6 f3 d5"), + ("D71", "Neo-Grunfeld", "d4 Nf6 c4 g6 g3 d5"), + ("D72", "Neo-Grunfeld, 5.cd, Main line", "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 cxd5 Nxd5 e4 Nb6 Ne2"), + ("D73", "Neo-Grunfeld, 5.Nf3", "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3"), + ("D74", "Neo-Grunfeld, 6.cd Nxd5, 7.O-O", "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O cxd5 Nxd5 O-O"), + ("D75", "Neo-Grunfeld, 6.cd Nxd5, 7.O-O c5, 8.dxc5", "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O cxd5 Nxd5 O-O c5 dxc5"), + ("D76", "Neo-Grunfeld, 6.cd Nxd5, 7.O-O Nb6", "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O cxd5 Nxd5 O-O Nb6"), + ("D77", "Neo-Grunfeld, 6.O-O", "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O O-O"), + ("D78", "Neo-Grunfeld, 6.O-O c6", "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O O-O c6"), + ("D79", "Neo-Grunfeld, 6.O-O, Main line", "d4 Nf6 c4 g6 g3 d5 Bg2 Bg7 Nf3 O-O O-O c6 cxd5 cxd5"), + ("D80", "Grunfeld", "d4 Nf6 c4 g6 Nc3 d5"), + ("D81", "Grunfeld, Russian Variation", "d4 Nf6 c4 g6 Nc3 d5 Qb3"), + ("D82", "Grunfeld, 4.Bf4", "d4 Nf6 c4 g6 Nc3 d5 Bf4"), + ("D83", "Grunfeld, Grunfeld Gambit", "d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 O-O"), + ("D84", "Grunfeld, Grunfeld Gambit Accepted", "d4 Nf6 c4 g6 Nc3 d5 Bf4 Bg7 e3 O-O cxd5 Nxd5 Nxd5 Qxd5 Bxc7"), + ("D85", "Grunfeld", "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5"), + ("D86", "Grunfeld, Exchange", "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Bc4"), + ("D87", "Grunfeld, Exchange", "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Bc4 O-O Ne2 c5"), + ("D88", "Grunfeld, Spassky Variation, Main line, 10...cd, 11.cd", "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Bc4 O-O Ne2"), + ("D89", "Grunfeld", "d4 Nf6 c4 g6 Nc3 d5 cxd5 Nxd5 e4 Nxc3 bxc3 Bg7 Bc4 O-O Ne2"), + ("D90", "Grunfeld", "d4 Nf6 c4 g6 Nc3 d5 Nf3"), + ("D91", "Grunfeld, 5.Bg5", "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bg5"), + ("D92", "Grunfeld, 5.Bf4", "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bf4"), + ("D93", "Grunfeld, with Bf4 & e3", "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Bf4 O-O e3"), + ("D94", "Grunfeld", "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3"), + ("D95", "Grunfeld", "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 e3 O-O Qb3"), + ("D96", "Grunfeld, Russian Variation", "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3"), + ("D97", "Grunfeld, Russian", "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dxc4 Qxc4 O-O e4"), + ("D98", "Grunfeld, Russian", "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dxc4 Qxc4 O-O e4 Bg4"), + ("D99", "Grunfeld Defense, Smyslov", "d4 Nf6 c4 g6 Nc3 d5 Nf3 Bg7 Qb3 dxc4 Qxc4 O-O e4 Bg4 Be3"), + ("E00", "Queen's Pawn Game", "d4 Nf6 c4 e6"), + ("E01", "Catalan, Closed", "d4 Nf6 c4 e6 g3 d5 Bg2"), + ("E02", "Catalan, Open, 5.Qa4", "d4 Nf6 c4 e6 g3 d5 Bg2 dxc4 Qa4+"), + ("E03", "Catalan, Open", "d4 Nf6 c4 e6 g3 d5 Bg2 dxc4 Qa4+ Nbd7 Qxc4"), + ("E04", "Catalan, Open, 5.Nf3", "d4 Nf6 c4 e6 g3 d5 Bg2 dxc4 Nf3"), + ("E05", "Catalan, Open, Classical line", "d4 Nf6 c4 e6 g3 d5 Bg2 dxc4 Nf3 Be7"), + ("E06", "Catalan, Closed, 5.Nf3", "d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3"), + ("E07", "Catalan, Closed", "d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 O-O O-O Nbd7"), + ("E08", "Catalan, Closed", "d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 O-O O-O Nbd7 Qc2"), + ("E09", "Catalan, Closed", "d4 Nf6 c4 e6 g3 d5 Bg2 Be7 Nf3 O-O O-O Nbd7 Qc2 c6 Nbd2"), + ("E10", "Queen's Pawn Game", "d4 Nf6 c4 e6 Nf3"), + ("E11", "Bogo-Indian Defense", "d4 Nf6 c4 e6 Nf3 Bb4+"), + ("E12", "Queen's Indian", "d4 Nf6 c4 e6 Nf3 b6"), + ("E13", "Queen's Indian, 4.Nc3, Main line", "d4 Nf6 c4 e6 Nf3 b6 Nc3 Bb7 Bg5 h6 Bh4 Bb4"), + ("E14", "Queen's Indian", "d4 Nf6 c4 e6 Nf3 b6 e3"), + ("E15", "Queen's Indian", "d4 Nf6 c4 e6 Nf3 b6 g3"), + ("E16", "Queen's Indian", "d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Bb4+"), + ("E17", "Queen's Indian", "d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7"), + ("E18", "Queen's Indian, Old Main line, 7.Nc3", "d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 O-O O-O Nc3"), + ("E19", "Queen's Indian, Old Main line, 9.Qxc3", "d4 Nf6 c4 e6 Nf3 b6 g3 Bb7 Bg2 Be7 O-O O-O Nc3 Ne4 Qc2 Nxc3"), + ("E20", "Nimzo-Indian", "d4 Nf6 c4 e6 Nc3 Bb4"), + ("E21", "Nimzo-Indian, Three Knights", "d4 Nf6 c4 e6 Nc3 Bb4 Nf3"), + ("E22", "Nimzo-Indian, Spielmann Variation", "d4 Nf6 c4 e6 Nc3 Bb4 Qb3"), + ("E23", "Nimzo-Indian, Spielmann", "d4 Nf6 c4 e6 Nc3 Bb4 Qb3 c5 dxc5 Nc6"), + ("E24", "Nimzo-Indian, Samisch", "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3"), + ("E25", "Nimzo-Indian, Samisch", "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 c5 f3 d5 cxd5"), + ("E26", "Nimzo-Indian, Samisch", "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 c5 e3"), + ("E27", "Nimzo-Indian, Samisch Variation", "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 O-O"), + ("E28", "Nimzo-Indian, Samisch Variation", "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 O-O e3"), + ("E29", "Nimzo-Indian, Samisch", "d4 Nf6 c4 e6 Nc3 Bb4 a3 Bxc3+ bxc3 O-O e3 c5 Bd3 Nc6"), + ("E30", "Nimzo-Indian, Leningrad", "d4 Nf6 c4 e6 Nc3 Bb4 Bg5"), + ("E31", "Nimzo-Indian, Leningrad, Main line", "d4 Nf6 c4 e6 Nc3 Bb4 Bg5 h6 Bh4 c5 d5 d6"), + ("E32", "Nimzo-Indian, Classical", "d4 Nf6 c4 e6 Nc3 Bb4 Qc2"), + ("E33", "Nimzo-Indian, Classical", "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 Nc6"), + ("E34", "Nimzo-Indian, Classical, Noa Variation", "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5"), + ("E35", "Nimzo-Indian, Classical, Noa Variation, 5.cd ed", "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 cxd5 exd5"), + ("E36", "Nimzo-Indian, Classical", "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3"), + ("E37", "Nimzo-Indian, Classical", "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 d5 a3 Bxc3+ Qxc3 Ne4 Qc2"), + ("E38", "Nimzo-Indian, Classical, 4...c5", "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 c5"), + ("E39", "Nimzo-Indian, Classical, Pirc Variation", "d4 Nf6 c4 e6 Nc3 Bb4 Qc2 c5 dxc5 O-O"), + ("E40", "Nimzo-Indian, 4.e3", "d4 Nf6 c4 e6 Nc3 Bb4 e3"), + ("E41", "Nimzo-Indian", "d4 Nf6 c4 e6 Nc3 Bb4 e3 c5"), + ("E42", "Nimzo-Indian, 4.e3 c5, 5.Ne2 (Rubinstein)", "d4 Nf6 c4 e6 Nc3 Bb4 e3 c5 Ne2"), + ("E43", "Nimzo-Indian, Fischer Variation", "d4 Nf6 c4 e6 Nc3 Bb4 e3 b6"), + ("E44", "Nimzo-Indian, Fischer Variation, 5.Ne2", "d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 Ne2"), + ("E45", "Nimzo-Indian, 4.e3, Bronstein (Byrne) Variation", "d4 Nf6 c4 e6 Nc3 Bb4 e3 b6 Ne2 Ba6"), + ("E46", "Nimzo-Indian", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O"), + ("E47", "Nimzo-Indian, 4.e3 O-O 5.Bd3", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Bd3"), + ("E48", "Nimzo-Indian, 4.e3 O-O 5.Bd3 d5", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Bd3 d5"), + ("E49", "Nimzo-Indian, 4.e3, Botvinnik System", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Bd3 d5 a3 Bxc3+ bxc3"), + ("E50", "Nimzo-Indian, 4.e3 O-O 5.Nf3, without ...d5", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3"), + ("E51", "Nimzo-Indian, 4.e3", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5"), + ("E52", "Nimzo-Indian, 4.e3, Main line with ...b6", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 b6"), + ("E53", "Nimzo-Indian, 4.e3", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5"), + ("E54", "Nimzo-Indian, 4.e3, Gligoric System", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O dxc4 Bxc4"), + ("E55", "Nimzo-Indian, 4.e3, Gligoric System, Bronstein Variation", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O dxc4 Bxc4 Nbd7"), + ("E56", "Nimzo-Indian, 4.e3, Main line with 7...Nc6", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O Nc6"), + ("E57", "Nimzo-Indian, 4.e3, Main line with 8...dc and 9...cd", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O Nc6 a3 dxc4 9"), + ("E58", "Nimzo-Indian, 4.e3, Main line with 8...Bxc3", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O Nc6 a3 Bxc3 bxc3"), + ("E59", "Nimzo-Indian, 4.e3, Main line", "d4 Nf6 c4 e6 Nc3 Bb4 e3 O-O Nf3 d5 Bd3 c5 O-O Nc6 a3 Bxc3 bxc3 dxc4 10 Bxc4"), + ("E60", "King's Indian Defense", "d4 Nf6 c4 g6"), + ("E61", "King's Indian", "d4 Nf6 c4 g6 Nc3"), + ("E62", "King's Indian, Fianchetto", "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3"), + ("E63", "King's Indian, Fianchetto, Panno Variation", "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 Nc6 O-O a6"), + ("E64", "King's Indian, Fianchetto, Yugoslav System", "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 c5"), + ("E65", "King's Indian, Fianchetto, Yugoslav, 7.O-O", "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 c5 O-O"), + ("E66", "King's Indian, Fianchetto, Yugoslav Panno", "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 c5 O-O Nc6 d5"), + ("E67", "King's Indian, Fianchetto", "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 Nbd7"), + ("E68", "King's Indian, Fianchetto, Classical Variation, 8.e4", "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 Nbd7 O-O e5 e4"), + ("E69", "King's Indian, Fianchetto, Classical Main line", "d4 Nf6 c4 g6 Nc3 Bg7 Nf3 d6 g3 O-O Bg2 Nbd7 O-O e5 e4 c6 h3"), + ("E70", "King's Indian", "d4 Nf6 c4 g6 Nc3 Bg7 e4"), + ("E71", "King's Indian, Makagonov System (5.h3)", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 h3"), + ("E72", "King's Indian", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 g3"), + ("E73", "King's Indian", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2"), + ("E74", "King's Indian, Averbakh, 6...c5", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 O-O Bg5 c5"), + ("E75", "King's Indian, Averbakh, Main line", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Be2 O-O Bg5 c5 d5 e6"), + ("E76", "King's Indian, Four Pawns Attack", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4"), + ("E77", "King's Indian", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 O-O Be2"), + ("E78", "King's Indian, Four Pawns Attack, with Be2 and Nf3", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 O-O Be2 c5 Nf3"), + ("E79", "King's Indian, Four Pawns Attack, Main line", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f4 O-O Be2 c5 Nf3 cxd4 Nxd4 Nc6 Be3"), + ("E80", "King's Indian, Samisch Variation", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3"), + ("E81", "King's Indian, Samisch", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O"), + ("E82", "King's Indian, Samisch, double Fianchetto Variation", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 b6"), + ("E83", "King's Indian, Samisch", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 Nc6"), + ("E84", "King's Indian, Samisch, Panno Main line", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 Nc6 Nge2 a6 Qd2 Rb8"), + ("E85", "King's Indian, Samisch, Orthodox Variation", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5"), + ("E86", "King's Indian, Samisch, Orthodox, 7.Nge2 c6", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5 Nge2 c6"), + ("E87", "King's Indian, Samisch, Orthodox", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5 d5"), + ("E88", "King's Indian, Samisch, Orthodox, 7.d5 c6", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5 d5 c6"), + ("E89", "King's Indian, Samisch, Orthodox Main line", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 f3 O-O Be3 e5 d5 c6 Nge2 cxd5"), + ("E90", "King's Indian", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3"), + ("E91", "King's Indian", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2"), + ("E92", "King's Indian", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5"), + ("E93", "King's Indian, Petrosian System", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 d5 Nbd7"), + ("E94", "King's Indian, Orthodox", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O"), + ("E95", "King's Indian, Orthodox, 7...Nbd7, 8.Re1", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nbd7 Re1"), + ("E96", "King's Indian, Orthodox, 7...Nbd7, Main line", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nbd7 Re1 c6 Bf1 a5"), + ("E97", "King's Indian", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nc6"), + ("E98", "King's Indian, Orthodox, Taimanov, 9.Ne1", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nc6 d5 Ne7 Ne1"), + ("E99", "King's Indian, Orthodox, Taimanov", "d4 Nf6 c4 g6 Nc3 Bg7 e4 d6 Nf3 O-O Be2 e5 O-O Nc6 d5 Ne7 Ne1 Nd7 10 f3 f5") ).foldLeft(Branch()) { - case (tree, (moves, name)) ⇒ tree.add(moves.split(' ').toList, name) + case (tree, (code, name, moves)) ⇒ tree.add( + moves.split(' ').toList, + Opening(code, name) + ) } } diff --git a/chess/src/main/scala/GameInfo.scala b/chess/src/main/scala/GameInfo.scala new file mode 100644 index 0000000000..222357f6c5 --- /dev/null +++ b/chess/src/main/scala/GameInfo.scala @@ -0,0 +1,28 @@ +package lila.chess + +import format.PgnDump +import Eco.Opening + +final class GameInfo private ( + val game: Game, + val pgn: String, + val opening: Option[Opening]) { + + def toMap = Map( + "pgn" -> pgn, + "opening" -> (opening map { o ⇒ + Map( + "code" -> o.code, + "name" -> o.name + ) + }) + ) +} + +object GameInfo { + + def apply(game: Game) = new GameInfo( + game = game, + pgn = game.pgnMoves, + opening = Eco openingOf game.pgnMoves) +} diff --git a/chess/src/test/scala/EcoTest.scala b/chess/src/test/scala/EcoTest.scala index 623d22ab87..22e13cb2a0 100644 --- a/chess/src/test/scala/EcoTest.scala +++ b/chess/src/test/scala/EcoTest.scala @@ -1,11 +1,12 @@ package lila.chess - class EcoTest extends ChessTest { "Complete game" in { val game = "d4 Nf6 e4 Nxe4 f3 Nd6 g3" - Eco nameOf game must beSome("Queen's Pawn Game") + Eco openingOf game must beSome.like { + case Eco.Opening(code, name) ⇒ name must_== "Queen's Pawn Game" + } } } diff --git a/conf/routes b/conf/routes index 54b0380650..bd2c5182e7 100644 --- a/conf/routes +++ b/conf/routes @@ -20,6 +20,7 @@ POST /api/rematch-accept/:gameId/:color/:newGameId lila.controllers.AppApiC.re POST /api/adjust/:username lila.controllers.AppApiC.adjust(username: String) GET /api/activity/:gameId/:color lila.controllers.AppApiC.activity(gameId: String, color: String) GET /api/game-version/:gameId lila.controllers.AppApiC.gameVersion(gameId: String) +GET /api/game-info/:gameId lila.controllers.AppApiC.gameInfo(gameId: String) GET /api/captcha/create lila.controllers.CaptchaC.create GET /api/captcha/solve/:gameId lila.controllers.CaptchaC.solve(gameId: String) diff --git a/todo b/todo index 9a0cc732cb..6a65178af4 100644 --- a/todo +++ b/todo @@ -6,7 +6,6 @@ any link in-game back button to game -> old status home list of current games not translated registered user disconnection delay -better spam protection than anon + http bad visibility of online indicators during game force resign post
in chat