tsshogi
Version:
TypeScript library for Shogi (Japanese chess)
642 lines • 52.8 kB
JavaScript
"use strict";
// CSA file format (.csa)
// See http://www2.computer-shogi.org/protocol/record_v22.html
Object.defineProperty(exports, "__esModule", { value: true });
exports.getSpecialMoveByName = getSpecialMoveByName;
exports.parseCSAMove = parseCSAMove;
exports.importCSA = importCSA;
exports.getCSASpecialMoveName = getCSASpecialMoveName;
exports.formatCSAMove = formatCSAMove;
exports.exportCSA = exportCSA;
const string_1 = require("./helpers/string.cjs");
const errors_1 = require("./errors.cjs");
const color_1 = require("./color.cjs");
const move_1 = require("./move.cjs");
const piece_1 = require("./piece.cjs");
const position_1 = require("./position.cjs");
const record_1 = require("./record.cjs");
const square_1 = require("./square.cjs");
var LineType;
(function (LineType) {
LineType[LineType["VERSION"] = 0] = "VERSION";
LineType[LineType["EXTENDED_COMMENT"] = 1] = "EXTENDED_COMMENT";
LineType[LineType["COMMENT"] = 2] = "COMMENT";
LineType[LineType["BLACK_NAME"] = 3] = "BLACK_NAME";
LineType[LineType["WHITE_NAME"] = 4] = "WHITE_NAME";
LineType[LineType["METADATA"] = 5] = "METADATA";
LineType[LineType["POSITION"] = 6] = "POSITION";
LineType[LineType["RANK"] = 7] = "RANK";
LineType[LineType["PIECES"] = 8] = "PIECES";
LineType[LineType["FIRST_TURN"] = 9] = "FIRST_TURN";
LineType[LineType["MOVE"] = 10] = "MOVE";
LineType[LineType["SPECIAL_MOVE"] = 11] = "SPECIAL_MOVE";
LineType[LineType["ELAPSED"] = 12] = "ELAPSED";
})(LineType || (LineType = {}));
var SectionType;
(function (SectionType) {
SectionType[SectionType["HEADER"] = 0] = "HEADER";
SectionType[SectionType["MOVE"] = 1] = "MOVE";
SectionType[SectionType["NEUTRAL"] = 2] = "NEUTRAL";
})(SectionType || (SectionType = {}));
const linePatterns = [
{
pattern: /^V/,
type: LineType.VERSION,
sectionType: SectionType.HEADER,
},
{
pattern: /^'\*(.+)$/,
type: LineType.EXTENDED_COMMENT,
sectionType: SectionType.NEUTRAL,
},
{
pattern: /^'(.+)$/,
type: LineType.COMMENT,
sectionType: SectionType.NEUTRAL,
},
{
pattern: /^N\+(.+)$/,
type: LineType.BLACK_NAME,
sectionType: SectionType.HEADER,
},
{
pattern: /^N-(.+)$/,
type: LineType.WHITE_NAME,
sectionType: SectionType.HEADER,
},
{
pattern: /^\$([^:]+):(.+)$/,
type: LineType.METADATA,
sectionType: SectionType.HEADER,
},
{
pattern: /^PI([1-9]{2}[A-Z]{2})*$/,
type: LineType.POSITION,
sectionType: SectionType.HEADER,
},
{
pattern: /^P[1-9]( \* ?|[-+][A-Z][A-Z]){9}$/,
type: LineType.RANK,
sectionType: SectionType.HEADER,
},
{
pattern: /^P[-+]([0-9]{2}[A-Z]{2})*/,
type: LineType.PIECES,
sectionType: SectionType.HEADER,
},
{
pattern: /^[-+]$/,
type: LineType.FIRST_TURN,
sectionType: SectionType.HEADER,
},
{
pattern: /^[-+][0-9]{4}[A-Z]{2}/,
type: LineType.MOVE,
sectionType: SectionType.MOVE,
},
{
pattern: /^%[-+A-Z_]+/,
type: LineType.SPECIAL_MOVE,
sectionType: SectionType.MOVE,
},
{
pattern: /^T([0-9]+(?:\.[0-9]*)?)/,
type: LineType.ELAPSED,
sectionType: SectionType.MOVE,
},
];
function parseLine(line) {
const results = [];
const lines = /^['N$]/.test(line) ? [line] : line.split(",");
for (const line of lines) {
for (let i = 0; i < linePatterns.length; i++) {
const matched = linePatterns[i].pattern.exec(line);
if (matched) {
results.push({
type: linePatterns[i].type,
line: line,
args: matched.slice(1),
sectionType: linePatterns[i].sectionType,
});
break;
}
}
}
return results;
}
const csaNameToRecordMetadataKey = {
EVENT: record_1.RecordMetadataKey.TITLE,
SITE: record_1.RecordMetadataKey.PLACE,
START_TIME: record_1.RecordMetadataKey.START_DATETIME,
END_TIME: record_1.RecordMetadataKey.END_DATETIME,
TIME_LIMIT: record_1.RecordMetadataKey.TIME_LIMIT,
TIME: record_1.RecordMetadataKey.TIME_LIMIT,
"TIME+": record_1.RecordMetadataKey.BLACK_TIME_LIMIT,
"TIME-": record_1.RecordMetadataKey.WHITE_TIME_LIMIT,
OPENING: record_1.RecordMetadataKey.STRATEGY,
MAX_MOVES: record_1.RecordMetadataKey.MAX_MOVES,
JISHOGI: record_1.RecordMetadataKey.JISHOGI,
NOTE: record_1.RecordMetadataKey.NOTE,
};
const csaNameToPieceType = {
FU: piece_1.PieceType.PAWN,
KY: piece_1.PieceType.LANCE,
KE: piece_1.PieceType.KNIGHT,
GI: piece_1.PieceType.SILVER,
KI: piece_1.PieceType.GOLD,
KA: piece_1.PieceType.BISHOP,
HI: piece_1.PieceType.ROOK,
OU: piece_1.PieceType.KING,
TO: piece_1.PieceType.PROM_PAWN,
NY: piece_1.PieceType.PROM_LANCE,
NK: piece_1.PieceType.PROM_KNIGHT,
NG: piece_1.PieceType.PROM_SILVER,
UM: piece_1.PieceType.HORSE,
RY: piece_1.PieceType.DRAGON,
};
function parsePosition(line, position) {
position.resetBySFEN(position_1.InitialPositionSFEN.STANDARD);
for (let i = 2; i + 4 <= line.length; i += 4) {
const file = Number(line[i]);
const rank = Number(line[i + 1]);
position.board.remove(new square_1.Square(file, rank));
}
}
function parseRank(line, position) {
const rank = Number(line[1]);
let begin = 2;
for (let x = 0; x < 9; x += 1) {
const file = 9 - x;
const section = line.slice(begin, begin + 3);
// 次のマス目は通常3文字先になる。
// ただし " * * " のように空きマスが続いた時にメールやHTML上で連続する空白がまとめられて " * * " となることがある。
// これはCSAの仕様といては正しいデータではないが、現実に存在するので配慮する。
// 3文字先へ進めるが、次の文字が "*" であれば1文字戻る。
begin += 3;
if (line[begin] === "*") {
begin -= 1;
}
if (section[0] === " ") {
continue;
}
const color = section[0] === "+" ? color_1.Color.BLACK : color_1.Color.WHITE;
const pieceType = csaNameToPieceType[section.slice(1)];
if (!pieceType) {
return new errors_1.InvalidPieceNameError(section);
}
position.board.set(new square_1.Square(file, rank), new piece_1.Piece(color, pieceType));
}
}
function parsePieces(line, position) {
const color = line[1] === "+" ? color_1.Color.BLACK : color_1.Color.WHITE;
for (let begin = 2; begin + 4 <= line.length; begin += 4) {
const section = line.slice(begin, begin + 4);
if (section === "00AL") {
const counts = (0, position_1.countNotExistingPieces)(position);
if (color === color_1.Color.BLACK) {
position.blackHand.forEach((pieceType) => {
position.blackHand.add(pieceType, counts[pieceType]);
});
}
else {
position.whiteHand.forEach((pieceType) => {
position.whiteHand.add(pieceType, counts[pieceType]);
});
}
return;
}
const file = Number(section[0]);
const rank = Number(section[1]);
const pieceType = csaNameToPieceType[section.slice(2)];
if (!pieceType) {
return new errors_1.InvalidPieceNameError(section);
}
if (file !== 0 && rank !== 0) {
position.board.set(new square_1.Square(file, rank), new piece_1.Piece(color, pieceType));
}
else if (color === color_1.Color.BLACK) {
position.blackHand.add(pieceType, 1);
}
else {
position.whiteHand.add(pieceType, 1);
}
}
}
function parseMove(line, position) {
const color = line[0] === "+" ? color_1.Color.BLACK : color_1.Color.WHITE;
if (color != position.color) {
return new errors_1.InvalidTurnError(line);
}
const fromFile = Number(line[1]);
const fromRank = Number(line[2]);
const toFile = Number(line[3]);
const toRank = Number(line[4]);
const pieceType = csaNameToPieceType[line.slice(5, 7)];
if (!pieceType) {
return new errors_1.InvalidPieceNameError(line);
}
const from = fromFile === 0 && fromRank === 0 ? pieceType : new square_1.Square(fromFile, fromRank);
const to = new square_1.Square(toFile, toRank);
let move = position.createMove(from, to);
if (!move) {
return new errors_1.InvalidMoveError(line);
}
if (from instanceof square_1.Square) {
const basePiece = position.board.at(from);
if (!basePiece) {
return new errors_1.PieceNotExistsError(line);
}
if (basePiece.type !== pieceType) {
if (basePiece.promoted().type === pieceType) {
move = move.withPromote();
}
else {
return new errors_1.PieceNotExistsError(line);
}
}
}
return move;
}
/**
* CSA形式の特殊な指し手の名前をSpecialMoveTypeに変換します。
* @param name 先頭の % 記号を含めない名前をしていします。
* @param color 手番を指定します。 +ILLEGAL_ACTION や -ILLEGAL_ACTION の読み取りに使用します。
*/
function getSpecialMoveByName(name, color) {
switch (name) {
case "CHUDAN":
return (0, move_1.specialMove)(move_1.SpecialMoveType.INTERRUPT);
case "TORYO":
return (0, move_1.specialMove)(move_1.SpecialMoveType.RESIGN);
case "MAX_MOVES":
return (0, move_1.specialMove)(move_1.SpecialMoveType.MAX_MOVES);
case "JISHOGI":
return (0, move_1.specialMove)(move_1.SpecialMoveType.IMPASS);
case "HIKIWAKE":
return (0, move_1.specialMove)(move_1.SpecialMoveType.DRAW);
case "SENNICHITE":
return (0, move_1.specialMove)(move_1.SpecialMoveType.REPETITION_DRAW);
case "TSUMI":
return (0, move_1.specialMove)(move_1.SpecialMoveType.MATE);
case "FUZUMI":
return (0, move_1.specialMove)(move_1.SpecialMoveType.NO_MATE);
case "TIME_UP":
return (0, move_1.specialMove)(move_1.SpecialMoveType.TIMEOUT);
case "ILLEGAL_MOVE":
return (0, move_1.specialMove)(move_1.SpecialMoveType.FOUL_LOSE);
case "+ILLEGAL_ACTION":
return (0, move_1.specialMove)(color == color_1.Color.BLACK ? move_1.SpecialMoveType.FOUL_WIN : move_1.SpecialMoveType.FOUL_LOSE);
case "-ILLEGAL_ACTION":
return (0, move_1.specialMove)(color == color_1.Color.WHITE ? move_1.SpecialMoveType.FOUL_WIN : move_1.SpecialMoveType.FOUL_LOSE);
case "KACHI":
return (0, move_1.specialMove)(move_1.SpecialMoveType.ENTERING_OF_KING);
}
return (0, move_1.anySpecialMove)(name);
}
/**
* CSA形式の指し手を読み取ります。
* @param position
* @param line
*/
function parseCSAMove(position, line) {
return parseMove(line, position);
}
/**
* CSA形式の棋譜を読み取ります。
* @param data
*/
function importCSA(data) {
const metadata = new record_1.RecordMetadata();
const record = new record_1.Record();
const position = new position_1.Position();
position.resetBySFEN(position_1.InitialPositionSFEN.EMPTY);
let preMoveComment = "";
let inMoveSection = false;
const lines = data.replace(/\r?\n\/(\r?\n[\s\S]*)?$/, "").split(/\r?\n/);
for (const line of lines) {
for (const parsed of parseLine(line)) {
if (parsed.sectionType === SectionType.MOVE && !inMoveSection) {
return new errors_1.InvalidLineError(parsed.line);
}
// NOTE:
// WCSC の棋譜中継ではファイルの末尾に $END_TIME が書かれる。
// V2.2 の仕様上は認められないはずだが、エラーにすると実用上困るので無視する。
if (parsed.sectionType === SectionType.HEADER && inMoveSection) {
continue;
}
switch (parsed.type) {
case LineType.VERSION:
break;
case LineType.EXTENDED_COMMENT:
if (inMoveSection) {
record.current.comment = (0, string_1.appendLine)(record.current.comment, parsed.args[0]);
}
else {
preMoveComment = (0, string_1.appendLine)(preMoveComment, parsed.args[0]);
}
break;
case LineType.COMMENT:
break;
case LineType.BLACK_NAME:
metadata.setStandardMetadata(record_1.RecordMetadataKey.BLACK_NAME, parsed.args[0]);
break;
case LineType.WHITE_NAME:
metadata.setStandardMetadata(record_1.RecordMetadataKey.WHITE_NAME, parsed.args[0]);
break;
case LineType.METADATA: {
const key = csaNameToRecordMetadataKey[parsed.args[0]];
if (key) {
metadata.setStandardMetadata(key, parsed.args[1]);
}
else {
metadata.setCustomMetadata(parsed.args[0], parsed.args[1]);
}
break;
}
case LineType.POSITION:
parsePosition(parsed.line, position);
break;
case LineType.RANK: {
const error = parseRank(parsed.line, position);
if (error) {
return error;
}
break;
}
case LineType.PIECES: {
const error = parsePieces(parsed.line, position);
if (error) {
return error;
}
break;
}
case LineType.FIRST_TURN:
if (parsed.line[0] === "+") {
position.setColor(color_1.Color.BLACK);
}
else {
position.setColor(color_1.Color.WHITE);
}
record.clear(position);
record.first.comment = preMoveComment;
inMoveSection = true;
break;
case LineType.MOVE: {
const moveOrError = parseMove(parsed.line, record.position);
if (moveOrError instanceof Error) {
return moveOrError;
}
record.append(moveOrError, { ignoreValidation: true });
break;
}
case LineType.SPECIAL_MOVE: {
const specialMove = getSpecialMoveByName(parsed.line.slice(1), record.position.color);
record.append(specialMove, { ignoreValidation: true });
break;
}
case LineType.ELAPSED:
record.current.setElapsedMs(Number(parsed.args[0]) * 1e3);
break;
}
}
}
if (!inMoveSection) {
record.clear(position);
record.first.comment = preMoveComment;
}
record.goto(0);
record.resetAllBranchSelection();
record.metadata = metadata;
return record;
}
const timeRegExpV2 = /^[0-9]+:[0-9]{2}\+[0-9]+$/;
const timeRegExpV3 = /^[0-9.]+\+[0-9.]+\+[0-9.]+$/;
function formatMetadata(metadata, options) {
let ret = "";
const returnCode = options?.returnCode || "\n";
const blackName = (0, record_1.getBlackPlayerName)(metadata);
if (blackName) {
ret += "N+" + blackName + returnCode;
}
const whiteName = (0, record_1.getWhitePlayerName)(metadata);
if (whiteName) {
ret += "N-" + whiteName + returnCode;
}
const event = metadata.getStandardMetadata(record_1.RecordMetadataKey.TOURNAMENT) ||
metadata.getStandardMetadata(record_1.RecordMetadataKey.TITLE) ||
metadata.getStandardMetadata(record_1.RecordMetadataKey.OPUS_NAME) ||
metadata.getStandardMetadata(record_1.RecordMetadataKey.PUBLISHED_BY);
if (event) {
ret += "$EVENT:" + event + returnCode;
}
const site = metadata.getStandardMetadata(record_1.RecordMetadataKey.PLACE);
if (site) {
ret += "$SITE:" + site + returnCode;
}
const startTime = metadata.getStandardMetadata(record_1.RecordMetadataKey.START_DATETIME) ||
metadata.getStandardMetadata(record_1.RecordMetadataKey.DATE);
if (startTime) {
// 年月日 YYYY/MM/DD (10文字) については KIF 形式と共通
ret += "$START_TIME:" + startTime.slice(10) + returnCode;
}
const endTime = metadata.getStandardMetadata(record_1.RecordMetadataKey.DATE);
if (endTime) {
ret += "$END_TIME:" + endTime.slice(10) + returnCode;
}
const opening = metadata.getStandardMetadata(record_1.RecordMetadataKey.STRATEGY);
if (opening) {
ret += "$OPENING:" + opening + returnCode;
}
const timeLimit = metadata.getStandardMetadata(record_1.RecordMetadataKey.TIME_LIMIT);
if (timeLimit && timeRegExpV2.test(timeLimit)) {
ret += "$TIME_LIMIT:" + timeLimit + returnCode;
}
else if (timeLimit && timeRegExpV3.test(timeLimit)) {
ret += "$TIME:" + timeLimit + returnCode;
}
const blackTimeLimit = metadata.getStandardMetadata(record_1.RecordMetadataKey.BLACK_TIME_LIMIT);
if (blackTimeLimit && timeRegExpV3.test(blackTimeLimit)) {
ret += "$TIME+:" + blackTimeLimit + returnCode;
}
const whiteTimeLimit = metadata.getStandardMetadata(record_1.RecordMetadataKey.WHITE_TIME_LIMIT);
if (whiteTimeLimit && timeRegExpV3.test(whiteTimeLimit)) {
ret += "$TIME-:" + whiteTimeLimit + returnCode;
}
const maxMoves = metadata.getStandardMetadata(record_1.RecordMetadataKey.MAX_MOVES);
if (maxMoves) {
ret += "$MAX_MOVES:" + maxMoves + returnCode;
}
const jishogi = metadata.getStandardMetadata(record_1.RecordMetadataKey.JISHOGI);
if (jishogi) {
ret += "$JISHOGI:" + jishogi + returnCode;
}
const note = metadata.getStandardMetadata(record_1.RecordMetadataKey.NOTE);
if (note) {
ret += "$NOTE:" + note + returnCode;
}
return ret;
}
const pieceTypeToString = {
king: "OU",
rook: "HI",
dragon: "RY",
bishop: "KA",
horse: "UM",
gold: "KI",
silver: "GI",
promSilver: "NG",
knight: "KE",
promKnight: "NK",
lance: "KY",
promLance: "NY",
pawn: "FU",
promPawn: "TO",
};
function formatHand(hand) {
let ret = "";
hand.forEach((pieceType, n) => {
for (let i = 0; i < n; i++) {
ret += "00" + pieceTypeToString[pieceType];
}
});
return ret;
}
const sfenToPCommand = {
[position_1.InitialPositionSFEN.STANDARD]: ["PI", "+"],
[position_1.InitialPositionSFEN.HANDICAP_LANCE]: ["PI11KY", "-"],
[position_1.InitialPositionSFEN.HANDICAP_RIGHT_LANCE]: ["PI91KY", "-"],
[position_1.InitialPositionSFEN.HANDICAP_BISHOP]: ["PI22KA", "-"],
[position_1.InitialPositionSFEN.HANDICAP_ROOK]: ["PI82HI", "-"],
[position_1.InitialPositionSFEN.HANDICAP_ROOK_LANCE]: ["PI82HI11KY", "-"],
[position_1.InitialPositionSFEN.HANDICAP_2PIECES]: ["PI82HI22KA", "-"],
[position_1.InitialPositionSFEN.HANDICAP_4PIECES]: ["PI82HI22KA11KY91KY", "-"],
[position_1.InitialPositionSFEN.HANDICAP_6PIECES]: ["PI82HI22KA21KE81KE11KY91KY", "-"],
[position_1.InitialPositionSFEN.HANDICAP_8PIECES]: ["PI82HI22KA31GI71GI21KE81KE11KY91KY", "-"],
[position_1.InitialPositionSFEN.HANDICAP_10PIECES]: ["PI82HI22KA41KI61KI31GI71GI21KE81KE11KY91KY", "-"],
};
function formatPosition(position, options) {
const returnCode = options?.returnCode || "\n";
const p = sfenToPCommand[position.sfen];
if (p) {
return p[0] + returnCode + p[1] + returnCode;
}
let ret = "";
for (let rank = 1; rank <= 9; rank += 1) {
ret += "P" + rank;
for (let file = 9; file >= 1; file -= 1) {
const piece = position.board.at(new square_1.Square(file, rank));
if (!piece) {
ret += " * ";
}
else if (piece.color === color_1.Color.BLACK) {
ret += "+" + pieceTypeToString[piece.type];
}
else {
ret += "-" + pieceTypeToString[piece.type];
}
}
ret += returnCode;
}
ret += "P+" + formatHand(position.blackHand) + returnCode;
ret += "P-" + formatHand(position.whiteHand) + returnCode;
ret += (position.color === color_1.Color.BLACK ? "+" : "-") + returnCode;
return ret;
}
function formatSquare(square) {
return square instanceof square_1.Square ? `${square.file}${square.rank}` : "00";
}
/**
* 特殊な指し手のCSA形式文字列を取得します。
* 先頭の % は含みません。
* @param move
* @param color 手番を指定します。 +ILLEGAL_ACTION や -ILLEGAL_ACTION の出力に使用します。
*/
function getCSASpecialMoveName(move, color) {
switch (move.type) {
case move_1.SpecialMoveType.INTERRUPT:
return "CHUDAN";
case move_1.SpecialMoveType.RESIGN:
return "TORYO";
case move_1.SpecialMoveType.MAX_MOVES:
return "MAX_MOVES";
case move_1.SpecialMoveType.IMPASS:
return "JISHOGI";
case move_1.SpecialMoveType.DRAW:
return "HIKIWAKE";
case move_1.SpecialMoveType.REPETITION_DRAW:
return "SENNICHITE";
case move_1.SpecialMoveType.MATE:
return "TSUMI";
case move_1.SpecialMoveType.NO_MATE:
return "FUZUMI";
case move_1.SpecialMoveType.TIMEOUT:
return "TIME_UP";
case move_1.SpecialMoveType.FOUL_LOSE:
return "ILLEGAL_MOVE";
case move_1.SpecialMoveType.FOUL_WIN:
return color == color_1.Color.BLACK ? "+ILLEGAL_ACTION" : "-ILLEGAL_ACTION";
case move_1.SpecialMoveType.ENTERING_OF_KING:
return "KACHI";
}
}
/**
* CSA形式の指し手を出力します。
* @param move
*/
function formatCSAMove(move) {
return ((move.color === color_1.Color.BLACK ? "+" : "-") +
formatSquare(move.from) +
formatSquare(move.to) +
pieceTypeToString[move.promote ? (0, piece_1.promotedPieceType)(move.pieceType) : move.pieceType]);
}
/**
* CSA形式の棋譜を出力します。
* @param record
* @param options
*/
function exportCSA(record, options) {
const returnCode = options?.returnCode || "\n";
let ret = "";
if (options?.v3) {
ret += "'CSA encoding=" + (options.v3.encoding || "UTF-8") + returnCode;
}
if (options?.comment) {
for (const line of options.comment.split("\n")) {
ret += "'" + line + returnCode;
}
}
ret += (options?.v3 ? "V3.0" : "V2.2") + returnCode;
ret += formatMetadata(record.metadata, options);
ret += formatPosition(record.initialPosition, options);
record.moves.forEach((node) => {
if (node.ply !== 0) {
let move;
if (node.move instanceof move_1.Move) {
move = formatCSAMove(node.move);
}
else {
const name = getCSASpecialMoveName(node.move, (0, color_1.reverseColor)(node.nextColor));
if (name) {
move = "%" + name;
}
}
if (move) {
ret += move + returnCode;
if (options?.v3?.milliseconds && node.elapsedMs % 1e3 !== 0) {
ret += "T" + node.elapsedMs / 1e3 + returnCode;
}
else {
ret += "T" + Math.floor(node.elapsedMs / 1e3) + returnCode;
}
}
}
if (node.comment) {
const comment = node.comment.endsWith("\n") ? node.comment.slice(0, -1) : node.comment;
comment.split("\n").forEach((line) => {
ret += "'*" + line + returnCode;
});
}
});
return ret;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3NhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NzYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUJBQXlCO0FBQ3pCLDhEQUE4RDs7QUF1UzlELG9EQWtDQztBQU9ELG9DQUVDO0FBTUQsOEJBb0dDO0FBcUtELHNEQTJCQztBQU1ELHNDQU9DO0FBT0QsOEJBMENDO0FBeHJCRCw2Q0FBOEM7QUFDOUMscUNBTWtCO0FBQ2xCLG1DQUE4QztBQUU5QyxpQ0FBeUY7QUFDekYsbUNBQThEO0FBQzlELHlDQUtvQjtBQUNwQixxQ0FRa0I7QUFDbEIscUNBQWtDO0FBRWxDLElBQUssUUFjSjtBQWRELFdBQUssUUFBUTtJQUNYLDZDQUFPLENBQUE7SUFDUCwrREFBZ0IsQ0FBQTtJQUNoQiw2Q0FBTyxDQUFBO0lBQ1AsbURBQVUsQ0FBQTtJQUNWLG1EQUFVLENBQUE7SUFDViwrQ0FBUSxDQUFBO0lBQ1IsK0NBQVEsQ0FBQTtJQUNSLHVDQUFJLENBQUE7SUFDSiwyQ0FBTSxDQUFBO0lBQ04sbURBQVUsQ0FBQTtJQUNWLHdDQUFJLENBQUE7SUFDSix3REFBWSxDQUFBO0lBQ1osOENBQU8sQ0FBQTtBQUNULENBQUMsRUFkSSxRQUFRLEtBQVIsUUFBUSxRQWNaO0FBRUQsSUFBSyxXQUlKO0FBSkQsV0FBSyxXQUFXO0lBQ2QsaURBQU0sQ0FBQTtJQUNOLDZDQUFJLENBQUE7SUFDSixtREFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUpJLFdBQVcsS0FBWCxXQUFXLFFBSWY7QUFFRCxNQUFNLFlBQVksR0FJWjtJQUNKO1FBQ0UsT0FBTyxFQUFFLElBQUk7UUFDYixJQUFJLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDdEIsV0FBVyxFQUFFLFdBQVcsQ0FBQyxNQUFNO0tBQ2hDO0lBQ0Q7UUFDRSxPQUFPLEVBQUUsV0FBVztRQUNwQixJQUFJLEVBQUUsUUFBUSxDQUFDLGdCQUFnQjtRQUMvQixXQUFXLEVBQUUsV0FBVyxDQUFDLE9BQU87S0FDakM7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