OSDN Git Service

The 'test' directory has been moved under 'shogi-server'
authorbeatles <beatles@b8c68f68-1e22-0410-b08e-880e1f8202b4>
Fri, 16 May 2008 12:14:36 +0000 (12:14 +0000)
committerbeatles <beatles@b8c68f68-1e22-0410-b08e-880e1f8202b4>
Fri, 16 May 2008 12:14:36 +0000 (12:14 +0000)
21 files changed:
test/trunk/README.txt [new file with mode: 0644]
test/trunk/TC_ALL.rb [new file with mode: 0644]
test/trunk/TC_floodgate.rb [new file with mode: 0644]
test/trunk/TC_functional.rb [new file with mode: 0644]
test/trunk/TC_jishogi_kachi.rb [new file with mode: 0644]
test/trunk/TC_league.rb [new file with mode: 0644]
test/trunk/TC_login.rb [new file with mode: 0644]
test/trunk/TC_not_sennichite.rb [new file with mode: 0644]
test/trunk/TC_oute_sennichite.rb [new file with mode: 0644]
test/trunk/TC_player.rb [new file with mode: 0644]
test/trunk/TC_rating.rb [new file with mode: 0644]
test/trunk/TC_uchifuzume.rb [new file with mode: 0644]
test/trunk/baseclient.rb [new file with mode: 0644]
test/trunk/csa/jishogi_kachi.csa [new file with mode: 0644]
test/trunk/csa/not_sennichite.csa [new file with mode: 0644]
test/trunk/csa/not_uchifuzume.csa [new file with mode: 0644]
test/trunk/csa/oute_sennichite.csa [new file with mode: 0644]
test/trunk/csa/uchifuzume.csa [new file with mode: 0644]
test/trunk/players.yaml [new file with mode: 0644]
test/trunk/test.yaml [new file with mode: 0644]
test/trunk/test_board.rb [new file with mode: 0644]

diff --git a/test/trunk/README.txt b/test/trunk/README.txt
new file mode 100644 (file)
index 0000000..c3ea934
--- /dev/null
@@ -0,0 +1,15 @@
+How to run test cases
+=====================
+
+1. Run the server with port 4000
+
+$ cd ../shogi-server
+$ ./shogi-server hoge 4000
+
+You can use any server name.
+
+2. Run the test cases
+
+./TC_ALL.rb
+
+
diff --git a/test/trunk/TC_ALL.rb b/test/trunk/TC_ALL.rb
new file mode 100644 (file)
index 0000000..cdd7f69
--- /dev/null
@@ -0,0 +1,11 @@
+require 'TC_functional.rb'
+require 'TC_jishogi_kachi.rb'
+require 'TC_oute_sennichite.rb'
+require 'TC_not_sennichite.rb'
+require 'TC_uchifuzume.rb'
+require 'TC_rating.rb'
+require 'test_board.rb'
+require 'TC_login.rb'
+require 'TC_player.rb'
+require 'TC_floodgate.rb'
+require 'TC_league.rb'
diff --git a/test/trunk/TC_floodgate.rb b/test/trunk/TC_floodgate.rb
new file mode 100644 (file)
index 0000000..69cf8e7
--- /dev/null
@@ -0,0 +1,242 @@
+require 'test/unit'
+load '../shogi-server/shogi-server'
+require '../shogi-server/pairing' 
+
+class MockLogger
+  def debug(str)
+  end
+  def info(str)
+    # puts str
+  end
+  def warn(str)
+  end
+  def error(str)
+  end
+end
+
+$logger = MockLogger.new
+
+class TestFloodgate < Test::Unit::TestCase
+  def setup
+    @fg = ShogiServer::League::Floodgate.new(nil)
+  end
+
+  def teardown
+
+  end
+
+  def test_game_name
+    assert(ShogiServer::League::Floodgate.game_name?("floodgate-900-0"))
+    assert(ShogiServer::League::Floodgate.game_name?("floodgate-0-10"))
+    assert(!ShogiServer::League::Floodgate.game_name?("floodgat-900-0"))
+  end
+
+end
+
+class TestPairing < Test::Unit::TestCase  
+  def setup
+    @pairing= ShogiServer::Pairing.new
+    @a = ShogiServer::BasicPlayer.new
+    @a.win  = 1
+    @a.loss = 2
+    @a.rate = 0
+    @b = ShogiServer::BasicPlayer.new
+    @b.win  = 10
+    @b.loss = 20
+    @b.rate = 1500
+    @c = ShogiServer::BasicPlayer.new
+    @c.win  = 100
+    @c.loss = 200
+    @c.rate = 1000
+  end
+
+  def test_delete_most_playing_player
+    players = [@a, @b, @c]
+    @pairing.delete_most_playing_player(players)
+    assert_equal([@a,@b], players)
+  end
+
+  def test_delete_least_rate_player
+    players = [@a, @b, @c]
+    @pairing.delete_least_rate_player(players)
+    assert_equal([@b,@c], players)
+  end
+end
+
+class TestRandomPairing < Test::Unit::TestCase  
+  def setup
+    @pairing= ShogiServer::RandomPairing.new
+    $called = 0
+    def @pairing.start_game(p1,p2)
+      $called += 1
+    end
+    @a = ShogiServer::BasicPlayer.new
+    @a.win  = 1
+    @a.loss = 2
+    @b = ShogiServer::BasicPlayer.new
+    @b.win  = 10
+    @b.loss = 20
+    @c = ShogiServer::BasicPlayer.new
+    @c.win  = 100
+    @c.loss = 200
+  end
+
+  def test_random_match_1
+    players = [@a]
+    @pairing.match(players)
+    assert_equal(0, $called)
+  end
+
+  def test_random_match_2
+    players = [@a,@b]
+    @pairing.match(players)
+    assert_equal(1, $called)
+  end
+  
+  def test_random_match_3
+    players = [@a, @b, @c]
+    @pairing.match(players)
+    assert_equal(1, $called)
+  end
+end
+
+class TestSwissPairing < Test::Unit::TestCase  
+  def setup
+    @pairing= ShogiServer::SwissPairing.new
+    $pairs = []
+    def @pairing.start_game(p1,p2)
+      $pairs << [p1,p2]
+    end
+    @a = ShogiServer::BasicPlayer.new
+    @a.name = "a"
+    @a.win  = 1
+    @a.loss = 2
+    @a.rate = 0
+    @a.last_game_win = false
+    @b = ShogiServer::BasicPlayer.new
+    @b.name = "b"
+    @b.win  = 10
+    @b.loss = 20
+    @b.rate = 1500
+    @b.last_game_win = true
+    @c = ShogiServer::BasicPlayer.new
+    @c.name = "c"
+    @c.win  = 100
+    @c.loss = 200
+    @c.rate = 1000
+    @c.last_game_win = true
+    @d = ShogiServer::BasicPlayer.new
+    @d.name = "d"
+    @d.win  = 1000
+    @d.loss = 2000
+    @d.rate = 1800
+    @d.last_game_win = true
+  end
+
+  def sort(players)
+    return players.sort{|a,b| a.name <=> b.name}
+  end
+
+  def test_include_newbie
+    assert(@pairing.include_newbie?([@a]))
+    assert(!@pairing.include_newbie?([@b]))
+    assert(@pairing.include_newbie?([@b,@a]))
+    assert(!@pairing.include_newbie?([@b,@c]))
+  end
+
+  def test_match_1
+    @pairing.match([@a])
+    assert_equal(0, $pairs.size)
+  end
+  
+  def test_match_2
+    @pairing.match([@b])
+    assert_equal(0, $pairs.size)
+  end
+  
+  def test_match_3
+    @pairing.match([@a,@b])
+    assert_equal(1, $pairs.size)
+    assert_equal(sort([@a,@b]), sort($pairs.first))
+  end
+  
+  def test_match_4
+    @pairing.match([@c,@b])
+    assert_equal(1, $pairs.size)
+    assert_equal(sort([@b,@c]), sort($pairs.first))
+  end
+  
+  def test_match_5
+    @pairing.match([@c,@b,@a])
+    assert_equal(1, $pairs.size)
+    assert_equal(sort([@b,@c]), sort($pairs.first))
+  end
+  
+  def test_match_6
+    @pairing.match([@c,@b,@a,@d])
+    assert_equal(2, $pairs.size)
+    assert_equal(sort([@b,@d]), sort($pairs.first))
+    assert_equal(sort([@a,@c]), sort($pairs.last))
+  end
+end
+
+class TestExcludeSacrifice < Test::Unit::TestCase  
+  class Dummy
+    attr_reader :players
+    def match(players)
+      @players = players
+    end
+  end
+  
+  def setup
+    @dummy = Dummy.new
+    @obj = ShogiServer::ExcludeSacrifice.new(@dummy)
+    @a = ShogiServer::BasicPlayer.new
+    @a.player_id   = "a"
+    @a.name = "a"
+    @a.win  = 1
+    @a.loss = 2
+    @a.rate = 0
+    @a.last_game_win = false
+    @b = ShogiServer::BasicPlayer.new
+    @b.player_id   = "gps500+e293220e3f8a3e59f79f6b0efffaa931"
+    @b.name = "b"
+    @b.win  = 10
+    @b.loss = 20
+    @b.rate = 1500
+    @b.last_game_win = true
+    @c = ShogiServer::BasicPlayer.new
+    @c.player_id   = "c"
+    @c.name = "c"
+    @c.win  = 100
+    @c.loss = 200
+    @c.rate = 1000
+    @c.last_game_win = true
+  end
+
+  def test_match_1
+    @obj.match([@a])
+    assert_equal(1, @dummy.players.size)
+  end
+  
+  def test_match_2
+    @obj.match([@b])
+    assert_equal(0, @dummy.players.size)
+  end
+  
+  def test_match_3
+    @obj.match([@a, @b])
+    assert_equal(2, @dummy.players.size)
+  end
+
+  def test_match_4
+    @obj.match([@a, @b, @c])
+    assert_equal(2, @dummy.players.size)
+  end
+
+  def test_match_5
+    @obj.match([@a, @c])
+    assert_equal(2, @dummy.players.size)
+  end
+end
+
diff --git a/test/trunk/TC_functional.rb b/test/trunk/TC_functional.rb
new file mode 100644 (file)
index 0000000..41558a1
--- /dev/null
@@ -0,0 +1,242 @@
+require "baseclient"
+require "kconv"
+
+class TestClientAtmark < BaseClient
+  # login with trip
+  def login
+    cmd "LOGIN testsente@p1 dummy x1"
+    cmd "%%GAME testcase-1500-0 +"
+    
+    cmd2 "LOGIN testgote@p2 dummy2 x1"
+    cmd2 "%%CHALLENGE testcase-1500-0 -"
+  end
+
+  def test_toryo
+    result, result2 = handshake do
+      cmd  "%TORYO"
+    end
+    assert(/#LOSE/ =~ result)
+    assert(/#WIN/  =~ result2)
+  end
+end
+
+
+class TestComment < BaseClient
+  def test_toryo
+    result, result2 = handshake do
+      cmd  "%TORYO"
+    end
+    assert(/#LOSE/ =~ result)
+    assert(/#WIN/  =~ result2)
+  end
+
+  def test_inline_comment
+    result, result2 = handshake do
+      cmd "+2625FU,'comment"
+      cmd2 "-2233KA"
+      cmd  "%TORYO"
+    end
+    assert(/#LOSE/ =~ result)
+    assert(/#WIN/  =~ result2)
+  end
+
+  def test_inline_comment_ja_euc
+    result, result2 = handshake do
+      cmd "+2625FU,'\93ú\96{\8cêEUC"
+      cmd2 "-2233KA"
+      cmd  "%TORYO"
+    end
+    assert(/#LOSE/ =~ result)
+    assert(/#WIN/  =~ result2)
+  end
+
+  def test_inline_comment_ja_utf8
+    result, result2 = handshake do
+      cmd "+2625FU,'\93ú\96{\8cêUTF8".toutf8
+      cmd2 "-2233KA"
+      cmd  "%TORYO"
+    end
+    assert(/#LOSE/ =~ result)
+    assert(/#WIN/  =~ result2)
+  end
+end
+
+
+class TestWhiteMovesBlack < BaseClient
+  def test_white_moves_black
+    result, result2 = handshake do
+      cmd  "+9796FU"
+      cmd2 "+1716FU"
+      sleep 0.5
+    end
+    assert(/#ILLEGAL_MOVE/ =~ result)
+    assert(/#WIN/  =~ result)
+    assert(/#ILLEGAL_MOVE/ =~ result2)
+    assert(/#LOSE/ =~ result2)
+  end
+end
+
+
+class CSABaseClient < BaseClient
+  ##
+  # In CSA mode, the server decides sente or gote at random; and sockets are closed
+  # just after the game ends (i.e. %TORYO is sent)
+  # 
+  def handshake
+    login
+
+    sleep 0.5 # wait for game matching
+
+    str  = cmd  "AGREE"
+    str2 = cmd2 "AGREE"
+
+    if /Your_Turn:\+/ =~ str
+      @sente = "cmd"
+      @sente_socket = @socket1
+      @gote  = "cmd2"
+      @gote_socket  = @socket2
+    else
+      @sente = "cmd2"
+      @sente_socket = @socket2
+      @gote  = "cmd"
+      @gote_socket  = @socket1
+    end
+
+    yield if block_given?
+    
+    result  = read_nonblock(@sente_socket)
+    result2 = read_nonblock(@gote_socket)
+    [result, result2]
+  end
+
+  def sente_cmd(str)
+    eval "#{@sente} \"#{str}\""
+  end
+
+  def gote_cmd(str)
+    eval "#{@gote} \"#{str}\""
+  end
+end
+
+class TestLoginCSAWithoutTripGoodGamename < CSABaseClient
+  def login
+    cmd  "LOGIN wo_trip_p1 testcase-1500-0"
+    cmd2 "LOGIN wo_trip_p2 testcase-1500-0"
+  end
+
+  def test_toryo
+    result, result2 = handshake do
+      sente_cmd("%TORYO")
+    end
+    assert(/#LOSE/ =~ result)
+    assert(/#WIN/  =~ result2)
+  end
+end
+
+class TestLoginCSAWithTripGoodGamename < CSABaseClient
+  def login
+    cmd  "LOGIN w_trip_p1 testcase-1500-0,atrip"
+    cmd2 "LOGIN w_trip_p2 testcase-1500-0,anothertrip"
+  end
+
+  def test_toryo
+    result, result2 = handshake do
+      sente_cmd "%TORYO"
+      sleep 0.5
+    end
+    assert(/#LOSE/ =~ result)
+    assert(/#WIN/  =~ result2)
+  end
+end
+
+class TestChallenge < CSABaseClient
+  def login
+    cmd  "LOGIN w_trip_p1 testcase-1500-0,atrip"
+    cmd2 "LOGIN w_trip_p2 testcase-1500-0,anothertrip"
+  end
+
+  def test_toryo
+    result, result2 = handshake do
+      sente_cmd "CHALLENGE"
+      gote_cmd  "CHALLENGE"
+    end
+    assert_match(/CHALLENGE ACCEPTED/, result)
+    assert_match(/CHALLENGE ACCEPTED/, result2)
+  end
+end
+
+class TestFloodgateGame < BaseClient
+  def login
+    classname = self.class.name
+    gamename  = "floodgate-900-0"
+    cmd "LOGIN sente#{classname} dummy x1"
+    cmd "%%GAME #{gamename} *"
+    
+    cmd2 "LOGIN gote#{classname} dummy2 x1"
+    cmd2 "%%GAME #{gamename} *"
+  end
+
+  def test_game_wait
+    login
+    assert(true)
+  end
+end
+
+class TestFloodgateGameWrongTebam < BaseClient
+  def login
+    classname = self.class.name
+    gamename  = "floodgate-900-0"
+    cmd "LOGIN sente#{classname} dummy x1"
+    cmd("%%GAME #{gamename} +")
+  end
+
+  def test_game_wait
+    login
+    sleep 1
+    reply = read_nonblock(@socket1)
+    assert_match(/##\[ERROR\] You are not allowed/m, reply)
+  end
+end
+
+class TestDuplicatedMoves < BaseClient
+  def test_defer
+    result, result2 = handshake do
+      cmd  "+7776FU"
+      cmd  "+8786FU" # defer
+      cmd  "+9796FU" # defer
+      cmd2 "-7374FU"
+      cmd2 "-8384FU"
+      cmd2 "%TORYO" # defer
+      sleep 1
+    end
+    assert(/#WIN/  =~ result)
+    assert(/#LOSE/ =~ result2)
+  end
+
+  def test_defer2
+    result, result2 = handshake do
+      cmd  "+7776FU"
+      cmd  "+8786FU" # defer
+      cmd  "%TORYO" # defer
+      cmd2 "-7374FU"
+      cmd2 "-8384FU"
+      sleep 1
+    end
+    assert(/#LOSE/  =~ result)
+    assert(/#WIN/ =~ result2)
+  end
+
+  def test_defer3
+    result, result2 = handshake do
+      cmd  "+7776FU"
+      cmd  "+8786FU" # defer
+      cmd2 "-7374FU"
+      cmd2 "-8384FU"
+      cmd  "%TORYO" # defer
+      sleep 1
+    end
+    assert(/#LOSE/  =~ result)
+    assert(/#WIN/ =~ result2)
+  end
+end
+
diff --git a/test/trunk/TC_jishogi_kachi.rb b/test/trunk/TC_jishogi_kachi.rb
new file mode 100644 (file)
index 0000000..33e8602
--- /dev/null
@@ -0,0 +1,16 @@
+require "baseclient"
+include Socket::Constants
+
+class JishogiTest < ReadFileClient
+  def test_jishogi_kachi
+    csa = File.open(filepath("jishogi_kachi.csa")) {|f| f.read}
+    handshake(csa)
+    cmd2 "%KACHI"
+    sleep 1
+    result1 = read_nonblock(@socket1)
+    result2 = read_nonblock(@socket2)
+    logout12
+    assert_match(/#JISHOGI.#LOSE/m, result1)
+    assert_match(/#JISHOGI.#WIN/m, result2)
+  end
+end # Client class
diff --git a/test/trunk/TC_league.rb b/test/trunk/TC_league.rb
new file mode 100644 (file)
index 0000000..2dd81ad
--- /dev/null
@@ -0,0 +1,92 @@
+require 'test/unit'
+load '../shogi-server/shogi-server'
+require 'fileutils'
+
+class TestPersistent < Test::Unit::TestCase
+  def setup
+    @filename = File.join(".", "test.yaml")
+    if File.exists?(@filename)
+      FileUtils.rm(@filename)
+    end
+    @persistent = ShogiServer::League::Persistent.new(@filename)
+    @p = ShogiServer::BasicPlayer.new
+    @p.name = "gps_normal"
+    @p.player_id = "gps_normal_dummy_id"
+    @p.last_game_win = true
+  end
+
+  def test_save_player
+    @persistent.save(@p)
+
+    p2 = ShogiServer::BasicPlayer.new
+    p2.player_id = @p.player_id
+
+    @persistent.load_player(p2)
+    assert_equal(p2.last_game_win, false)
+  end
+
+  def test_empty_yaml
+    count = 0
+    @persistent.each_group do |group, players|
+      count += 1
+    end
+    assert_equal(count, 0)
+    FileUtils.rm(@filename)
+    count = 0
+    @persistent.each_group do |group, players|
+      count += 1
+    end
+    assert_equal(count, 0)
+  end
+
+  def test_load_player
+    filename = File.join(".", "players.yaml")
+    persistent = ShogiServer::League::Persistent.new(filename)
+    p = ShogiServer::BasicPlayer.new
+    p.player_id = "gps_normal+e293220e3f8a3e59f79f6b0efffaa931"
+    persistent.load_player(p)
+
+    assert_equal(p.name, "gps_normal")
+    assert_equal(p.rate, -1752.0)
+    assert_equal(p.modified_at.to_s, "Thu May 08 23:50:54 +0900 2008")
+    assert_equal(p.rating_group, 0)
+    assert_equal(p.win, 3384.04877829976)
+    assert_equal(p.loss, 906.949084230512)
+  end
+
+  def test_get_players
+    filename = File.join(".", "players.yaml")
+    persistent = ShogiServer::League::Persistent.new(filename)
+    players = persistent.get_players
+    assert_equal(players.size, 295)
+  end
+end
+
+
+class TestLeague < Test::Unit::TestCase
+  def setup
+    @league = ShogiServer::League.new
+    @league.dir = "."
+    @league.setup_players_database
+
+    @p = ShogiServer::BasicPlayer.new
+    @p.name = "test_name"
+  end
+
+  def teardown
+    @league.shutdown
+  end
+
+  def test_add_player
+    assert(!@league.find(@p.name))
+    @league.add(@p)
+    assert(@league.find(@p.name))
+    @league.delete(@p)
+    assert(!@league.find(@p.name))
+  end
+
+  def test_reload
+    @league.reload
+    assert(true)
+  end
+end
diff --git a/test/trunk/TC_login.rb b/test/trunk/TC_login.rb
new file mode 100644 (file)
index 0000000..8155a9b
--- /dev/null
@@ -0,0 +1,37 @@
+require 'test/unit'
+load '../shogi-server/shogi-server'
+
+class ShogiServer::BasicPlayer
+  attr_accessor :protocol
+end
+
+
+class TestLogin < Test::Unit::TestCase 
+  def setup
+    @p_csa = ShogiServer::BasicPlayer.new
+    @p_csa.name = "hoge"
+    @p_x1 = ShogiServer::BasicPlayer.new
+    @p_x1.name = "hoge"
+    @csa = ShogiServer::LoginCSA.new(@p_csa,"floodgate-900-0,xyz")
+    @x1 = ShogiServer::Loginx1.new(@p_x1, "xyz")
+  end
+
+  def test_player_id
+    assert(@p_x1.player_id == @p_csa.player_id)
+  end
+
+  def test_login_factory_x1
+    player = ShogiServer::BasicPlayer.new
+    player.name = "hoge"
+    login = ShogiServer::Login::factory("LOGIN hoge xyz x1", player)
+    assert_equal(@p_x1.player_id, player.player_id)
+  end
+
+  def test_login_factory_csa
+    player = ShogiServer::BasicPlayer.new
+    player.name = "hoge"
+    login = ShogiServer::Login::factory("LOGIN hoge floodagate-900-0,xyz", player)
+    assert_equal(@p_csa.player_id, player.player_id)
+  end
+
+end
diff --git a/test/trunk/TC_not_sennichite.rb b/test/trunk/TC_not_sennichite.rb
new file mode 100644 (file)
index 0000000..8159d1c
--- /dev/null
@@ -0,0 +1,17 @@
+require "baseclient"
+include Socket::Constants
+
+class NotSennichiteTest < ReadFileClient
+  def test_oute_sennichite
+    csa = File.open(filepath("not_sennichite.csa")) {|f| f.read}
+    handshake(csa)
+    #cmd2 "%KACHI"
+    sleep 1
+    result1 = read_nonblock(@socket1)
+    result2 = read_nonblock(@socket2)
+    logout12
+    assert_no_match(/#DRAW/m, result1)
+    assert_no_match(/#DRAW/m, result2)
+  end
+end # Client class
+
diff --git a/test/trunk/TC_oute_sennichite.rb b/test/trunk/TC_oute_sennichite.rb
new file mode 100644 (file)
index 0000000..855c065
--- /dev/null
@@ -0,0 +1,17 @@
+require "baseclient"
+include Socket::Constants
+
+class OuteSennichiteTest < ReadFileClient
+  def test_oute_sennichite
+    csa = File.open(filepath("oute_sennichite.csa")) {|f| f.read}
+    handshake(csa)
+    #cmd2 "%KACHI"
+    sleep 1
+    result1 = read_nonblock(@socket1)
+    result2 = read_nonblock(@socket2)
+    logout12
+    assert_match(/#OUTE_SENNICHITE.#LOSE/m, result1)
+    assert_match(/#OUTE_SENNICHITE.#WIN/m, result2)
+  end
+end # Client class
+
diff --git a/test/trunk/TC_player.rb b/test/trunk/TC_player.rb
new file mode 100644 (file)
index 0000000..c53b6b4
--- /dev/null
@@ -0,0 +1,31 @@
+require 'test/unit'
+load '../shogi-server/shogi-server'
+
+class TestPlayer < Test::Unit::TestCase
+  def setup
+    @p = ShogiServer::BasicPlayer.new
+  end
+
+  def test_without_password
+    @p.name = "hoge"
+    @p.set_password(nil)
+    assert_nil(@p.player_id)
+  end
+  
+  def test_set_password
+    @p.name = "hoge"
+    @p.set_password("abc")
+    assert(@p.player_id)
+  end
+
+  def test_name_atmark
+    @p.name = "hoge@p1"
+    @p.set_password("abc")
+    assert_match(/@/, @p.player_id)
+  end
+
+  def test_rating_group
+    assert_nothing_raised {@p.rating_group = 1}
+  end
+end
+
diff --git a/test/trunk/TC_rating.rb b/test/trunk/TC_rating.rb
new file mode 100644 (file)
index 0000000..17be3b0
--- /dev/null
@@ -0,0 +1,134 @@
+load '../shogi-server/mk_rate'
+require 'test/unit'
+
+class RatingTest < Test::Unit::TestCase
+  def test_rating1
+    wl = GSL::Matrix[[0,3,9],
+                [1,0,3],
+                [1,1,0]]
+    rating = Rating.new(wl)
+    rating.rating
+    rating.average!
+    rating.integer!
+    assert( rating.rate[0] > rating.rate[1])
+    assert( rating.rate[1] > rating.rate[2])
+  end
+
+  def test_rating2
+    wl = GSL::Matrix[ # \e$B=54)>-4}\e(B2001\e$BG/\e(B9\e$B7n\e(B12\e$BF|9f$N%G!<%?\e(B
+      [  0,  59,  52,  39,  29,  12],    # \e$BL>?M$*$h$S\e(BA\e$B5i\e(B
+      [ 40,   0,  37,  29,  27,  10],    # B\e$B5i\e(B1\e$BAH\e(B
+      [ 33,  35,   0,  50,  92,  41],    # B\e$B5i\e(B2\e$BAH\e(B
+      [ 21,  19,  51,   0, 140,  80],    # C\e$B5i\e(B1\e$BAH\e(B
+      [  5,  21,  82, 103,   0, 124],    # C\e$B5i\e(B2\e$BAH\e(B
+      [  2,   6,   9,  34,  44,   0],    # \e$B%U%j!<%/%i%9\e(B
+    ]
+    rating = Rating.new(wl)
+    assert_nothing_raised {rating.rating}
+    rating.integer!
+    p1, p2, p3, p4, p5, p6 = rating.rate.to_a
+    assert(p1 > p2)
+    assert(p2 > p3)
+    assert(p3 > p4)
+    assert(p4 > p5)
+    assert(p5 > p6)
+  end
+
+  def test_rating3
+    wl = GSL::Matrix[[0, 3, 18], 
+                [1, 0, 14], 
+                [10, 39, 0]]
+    rating = Rating.new(wl)
+    assert_nothing_raised {rating.rating}
+    rating.integer!
+    p1, p2, p3 = rating.rate.to_a
+    assert( p1 > p2 )
+    assert( p3 > p2 )
+  end
+
+  def test_rank2
+    wl = GSL::Matrix[[0, 3],
+                [1, 0]]
+    rating = Rating.new(wl)
+    rating.rating
+    p1 = rating.rate[0]
+    p2 = rating.rate[1]
+    rating.integer!
+    assert( (180..200).include?(p1 - p2), rating.rate.to_a.inspect )
+  end
+
+  def test_rank3
+    wl = GSL::Matrix[[0, 30, 0],
+                [10, 0, 30],
+                [0, 10, 0]]
+    rating = Rating.new(wl)
+    rating.rating
+    rating.average!
+    rating.integer!
+    p1 = rating.rate[0]
+    p2 = rating.rate[1]
+    rating.integer!
+    assert( rating.rate[0] > rating.rate[1])
+    assert( rating.rate[1] > rating.rate[2])
+  end
+end
+
+
+class TestWinLossMatrix < Test::Unit::TestCase
+  def setup
+    keys = ['a', 'b', 'c']
+    win_loss = GSL::Matrix[[0,2,3],[1,0,1],[1,1,0]]
+    @matrix = WinLossMatrix.new(keys, win_loss)
+  end
+    
+  def test_delete_row
+    new_matrix = @matrix.delete_row(1)
+    assert_equal(3, @matrix.size)
+    assert_equal(2, new_matrix.size)
+    assert_equal(['a','c'], new_matrix.keys)
+    assert_equal(GSL::Matrix[[0,3],[1,0]], new_matrix.matrix)
+  end
+
+  def test_delete_rows
+    $deleted = []
+    def @matrix.delete_row(index)
+      $deleted << index
+      self
+    end
+    @matrix.delete_rows([0,1])
+    assert_equal([1,0], $deleted)
+  end
+
+  def test_connected_subsets
+    array = %w!
+      0  0  0  0  0  2  9 74  0  0  0
+      0  0  0  0 21  0  0  0  0  0  0
+      0  0  0  0 19  0  0  0  0  0  0
+      0  0  0  0 13  0  0  0  0  0  0
+      0 19 20 27  0  0  0  0  0  0  0
+      1  0  0  0  0  0  0  0  0  0  5
+      1  0  0  0  0  0  0  0  0  0  9
+      5  0  0  0  0  0  0  0  0  0  0
+      0  0  0  0  0  0  0  0  0  0  6
+      0  0  0  0  0  0  0  0  0  0  1
+      0  0  0  0  0  1  1  0 28  1  0!.map{|v| v.to_i}
+    keys = ["gps+11648e4e66e7ed6a86cb7f1d0cf604fe", 
+            "gps1_wPrBn_hand+cf51828e1e4351eea9a70e754b8e5edc",
+            "gps1_wPrBn_simple+d6c7d5e4acfb4a21072824d3be07c6dc",
+            "gps1_woPrBn+ea563881afd2e56d3dd715538d2da850",
+            "gps2_wPrBn_mem+dbd8165c47a193b7e76fa9adb3b4e445",
+            "gps32+aa0ba6bfbd84caa7ef1cda34562ce90c",
+            "gps500+0706915e56798d393c9aec4749789b2f",
+            "guest+068b4eb12b042a72e1c7791344175d82",
+            "guest+471a3f6aea2804130b5b967e8a42ea3c",
+            "kaneko+4cee2e6a81fea84316b13626e705e431",
+            "yowai_gps+95908f6c18338f5340371f71523fc5e3"]
+    win_loss = GSL::Matrix.alloc(array, 11, 11)
+    obj = WinLossMatrix.new(keys, win_loss)
+    objs = obj.connected_subsets
+    assert_equal(2, objs.size)
+  end
+end
+
+# vim: ts=2 sw=2 sts=0
+
diff --git a/test/trunk/TC_uchifuzume.rb b/test/trunk/TC_uchifuzume.rb
new file mode 100644 (file)
index 0000000..0107743
--- /dev/null
@@ -0,0 +1,31 @@
+require "baseclient"
+include Socket::Constants
+
+class UchifuzumeTest < ReadFileClient
+  def test_uchifuzume
+    csa = File.open(filepath("uchifuzume.csa")) {|f| f.read}
+    handshake(csa)
+    cmd2 "-0064FU"
+    cmd  "%TORYO"
+    sleep 1
+    result1 = read_nonblock(@socket1)
+    result2 = read_nonblock(@socket2)
+    logout12
+    assert_match(/#ILLEGAL_MOVE.*#WIN/m, result1)
+    assert_match(/#ILLEGAL_MOVE.*#LOSE/m, result2)
+  end
+
+  def est_not_uchifuzume
+    csa = File.open(filepath("not_uchifuzume.csa")) {|f| f.read}
+    handshake(csa)
+    cmd2 "-0092FU"
+    cmd  "%TORYO"
+    sleep 1
+    result1 = read_nonblock(@socket1)
+    result2 = read_nonblock(@socket2)
+    logout12
+    assert_match(/#LOSE/m, result1)
+    assert_match(/#WIN/m, result2)
+  end
+end # Client class
+
diff --git a/test/trunk/baseclient.rb b/test/trunk/baseclient.rb
new file mode 100644 (file)
index 0000000..eea2969
--- /dev/null
@@ -0,0 +1,120 @@
+require 'socket'
+require 'stringio'
+require 'test/unit'
+
+class BaseClient < Test::Unit::TestCase
+  def setup
+    port = 4000
+    params = {"Host" => "localhost", "Port" => port, "Prompt" => //}
+    @socket1 = TCPSocket.open("localhost", port)
+    @socket2 = TCPSocket.open("localhost", port)
+  end
+
+  def teardown
+    @socket1.close
+    @socket2.close
+  end
+
+  def login
+    classname = self.class.name
+    cmd "LOGIN sente#{classname} dummy x1"
+    cmd "%%GAME test#{classname}-1500-0 +"
+    
+    cmd2 "LOGIN gote#{classname} dummy2 x1"
+    cmd2 "%%CHALLENGE test#{classname}-1500-0 -"
+  end
+
+  def agree
+    cmd  "AGREE"
+    sleep 0.5
+    cmd2 "AGREE"
+  end
+
+  def handshake
+    login
+
+    sleep 2 # to wait for game matching
+
+    agree
+
+    cmd  "+2726FU"
+    cmd2 "-3334FU"
+   
+    yield if block_given?
+    sleep 2
+    result  = cmd  "LOGOUT"
+    result2 = cmd2 "LOGOUT"
+    result  += read_nonblock(@socket1)
+    result2 += read_nonblock(@socket2)
+    [result, result2]
+  end
+
+  def read_nonblock(io)
+    sleep 0.05  
+    str = ""
+    begin
+      loop do   
+        str << io.read_nonblock(64)
+      end
+    rescue Errno::EAGAIN
+      # do nothing
+    rescue EOFError
+      # do nothing
+    end
+    str
+  end
+
+  def cmd(s)
+    # read the previous return
+    str = read_nonblock(@socket1)
+    @socket1.puts s if s && ! @socket1.closed?
+    str
+  end
+
+  def cmd2(s)
+    # read the previous return
+    str = read_nonblock(@socket2)
+    @socket2.puts s if s && ! @socket2.closed?
+    str
+  end
+
+  def logout12
+    cmd  "LOGOUT"
+    cmd2 "LOGOUT"
+    sleep 1
+  end
+
+  def logout21
+    cmd2 "LOGOUT"
+    cmd  "LOGOUT"
+    sleep 1
+  end
+
+  def test_dummy
+    assert true
+  end
+end
+
+
+class ReadFileClient < BaseClient
+  def filepath(csa_file_name)
+    return File.join(File.dirname(__FILE__), "csa", csa_file_name)
+  end
+
+  def handshake(csa)
+    login
+    sleep 1
+    agree
+    sleep 1
+
+    csa_io = StringIO.new(csa)
+    while line = csa_io.gets do
+      case line
+      when /^\+\d{4}\w{2}/
+        cmd $&
+      when /^\-\d{4}\w{2}/
+        cmd2 $&
+      end
+    end
+  end
+end # ReadFileClient
diff --git a/test/trunk/csa/jishogi_kachi.csa b/test/trunk/csa/jishogi_kachi.csa
new file mode 100644 (file)
index 0000000..3bea936
--- /dev/null
@@ -0,0 +1,975 @@
+V2
+N+gps9_p
+N-gps8_pgsklp
+$EVENT:wdoor+pgsklp_32-0-30+gps9_p+gps8_pgsklp+20060428070035
+$START_TIME:2006/04/28 07:00:35
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  * -KA * 
+P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
+P8 * +KA *  *  *  *  * +HI * 
+P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
++
++7776FU
+T2
+'** 0
+-8384FU
+T1
+'** 0
++7968GI
+T1
+'** 0
+-3334FU
+T1
+'** 0
++6766FU
+T1
+'** 0
+-7162GI
+T1
+'** 0
++5756FU
+T1
+'** 0
+-5354FU
+T1
+'** 0
++3948GI
+T1
+'** 0
+-3142GI
+T1
+'** 0
++4958KI
+T1
+'** 0
+-4132KI
+T1
+'** 0
++6978KI
+T1
+'** 0
+-5141OU
+T1
+'** 0
++5969OU
+T1
+'** 0
+-6152KI
+T1
+'** 0
++6877GI
+T1
+'** 0
+-4233GI
+T1
+'** 0
++8879KA
+T1
+'** 0
+-2231KA
+T1
+'** 0
++3736FU
+T1
+'** 0
+-4344FU
+T1
+'** 0
++5867KI
+T1
+'** 0
+-7374FU
+T1
+'** 0
++4837GI
+T1
+'** 0
+-3164KA
+T1
+'** 0
++7968KA
+T1
+'** 0
+-5243KI
+T1
+'** 0
++6979OU
+T1
+'** 0
+-4131OU
+T1
+'** 0
++2726FU
+T23
+'** 9 -3122OU +1716FU -6253GI +4746FU -9394FU +7988OU -8485FU +2625FU
+-3122OU
+T23
+'** 9 +7988OU -8173KE +2625FU -7385KE +7786GI -9394FU +4746FU -6473KA
++4746FU
+T24
+'** 0 -8173KE +7988OU -6442KA +2625FU -6364FU +1716FU -9394FU +7786GI
+-8173KE
+T24
+'** -28 +7988OU -6442KA +3748GI -6364FU +2937KE -6263GI +1716FU -9394FU
++1716FU
+T24
+'** 0 -9394FU +7988OU -9495FU +2625FU -6442KA +1615FU -8485FU %PASS
+-6442KA
+T11
+'** -31 +1615FU -6364FU +2625FU -6465FU +6665FU -7365KE +7766GI -0064FU
++1615FU
+T18
+'** -3 -6364FU +7988OU -6263GI +2625FU -8485FU +3726GI %PASS
+-6364FU
+T5
+'** -28 +2625FU -6465FU +6665FU %PASS
++2625FU
+T15
+'** -6 -9394FU +3726GI -6263GI +9796FU %PASS
+-6465FU
+T16
+'** -34 +6665FU %PASS
++6665FU
+T15
+'** 31 -8485FU +7766GI -9394FU +3726GI %PASS
+-9394FU
+T23
+'** -67 +6766KI -6263GI +3726GI -9495FU +7786GI -8485FU +8677GI -8252HI
++3726GI
+T1
+'** 34 %PASS
+-9495FU
+T23
+'** 156 +7766GI -8485FU +7988OU -6263GI %PASS
++6766KI
+T23
+'** 140 -9193KY +7675FU -6263GI +6857KA -9596FU +9796FU -8292HI +7786GI
+-9193KY
+T13
+'** 156 %PASS
++7675FU
+T23
+'** 137 -6263GI +6857KA -2231OU +7776GI -8292HI +7574FU -6374GI +0075FU
+-8292HI
+T1
+'** 165 +7969OU -6263GI +7776GI -8485FU +6979OU -7475FU +6675KI -9596FU
++8786FU
+T14
+'** 165 -6263GI +7776GI -4231KA +7574FU -6374GI +0075FU -7483GI
+-6263GI
+T18
+'** 187 +7776GI %PASS
++7776GI
+T6
+'** 187 -4231KA +7988OU -3142KA %PASS
+-4253KA
+T24
+'** 112 +7988OU -5342KA +7887KI -4253KA +7574FU -6374GI +0075FU -7483GI
++7988OU
+T25
+'** 206 %PASS
+-2231OU
+T1
+'** 228 +7887KI -5342KA +6857KA %PASS
++7574FU
+T22
+'** 253 -6374GI +0075FU -7463GI +7687GI -0074FU +6857KA -5342KA %PASS
+-6374GI
+T23
+'** 259 +0075FU -7463GI +5655FU -5455FU +6655KI -9596FU +9796FU -0098FU
++0075FU
+T1
+'** 153 -7483GI +5655FU -9596FU +9796FU -5455FU +6655KI -5342KA +7887KI
+-7463GI
+T25
+'** 256 +2937KE -0064FU +6564FU -5364KA +8685FU -9596FU +9796FU -7385KE
++7887KI
+T1
+'** 228 -3122OU +6857KA -0064FU +6564FU -5364KA +0065FU -6453KA +3635FU
+-0064FU
+T24
+'** 243 +6564FU -5364KA +0065FU -6453KA +8977KE -0064FU +6564FU -5364KA
++6564FU
+T23
+'** 268 -5364KA +2937KE -6442KA +6667KI -2324FU +2524FU -3324GI +0025FU
+-5364KA
+T1
+'** 379 +0065FU -6453KA +8977KE
++0065FU
+T22
+'** 71 -6442KA +8878OU -0074FU +7574FU -6374GI +0075FU -7463GI +6857KA
+-6453KA
+T1
+'** 231 +8977KE -0064FU +6564FU -5364KA +0065FU -6453KA +8878OU -0064FU
++6857KA
+T24
+'** 237 -3122OU +2818HI -1314FU +5768KA -1415FU +2615GI -1115KY +1815HI
+-3122OU
+T13
+'** 231 +3635FU -3435FU +8685FU -7385KE +0086FU -8597NK +8797KI -3334GI
++8977KE
+T23
+'** 221 -5342KA +8878OU -0064FU +6564FU -4264KA +0065FU -6453KA
+-0064FU
+T1
+'** 221 +6564FU -5364KA +8685FU -7385KE +7785KE -8485FU +0084FU -6372GI
++6564FU
+T19
+'** 203 -5364KA +0065FU -6442KA +2838HI -0074FU +7574FU -6374GI +0075FU
+-5364KA
+T1
+'** 409 +2848HI -6453KA +0065FU -0074FU +7574FU -6374GI +0075FU -7463GI
++8685FU
+T24
+'** 268 -7385KE +7785KE -8485FU +0084FU -8586FU +8786KI -9282HI +0083KE
+-8485FU
+T19
+'** 193 +0065FU -6431KA +7785KE -7385KE +7685GI %PASS
++0065FU
+T25
+'** 81 -6442KA +0084FU -9282HI +7785KE -7385KE +7685GI -0073KE +0074KE
+-6431KA
+T1
+'** 190 +7785KE -7385KE +7685GI -0083FU %PASS
++7785KE
+T22
+'** 215 -7385KE +7685GI -9282HI +0086FU -0084FU +8576GI -8292HI +8878OU
+-7385KE
+T1
+'** 275 +7685GI -9282HI +0086FU -0084FU +8576GI
++7685GI
+T23
+'** 194 -9282HI +0086FU -0084FU +8576GI -8292HI %PASS
+-9282HI
+T1
+'** 240 +0086FU -0084FU +8574GI -6374GI +7574FU -8485FU +0071GI -8272HI
++0086FU
+T23
+'** 181 -0084FU +8576GI -8292HI +0077KE -0073FU +8685FU -8485FU +7785KE
+-0084FU
+T1
+'** 212 +8574GI -6374GI +7574FU -8485FU +7473TO -8586FU +8777KI -0087GI
++8576GI
+T24
+'** 186 -3153KA +8878OU -8292HI +2818HI -1112KY +0067KE -0064FU +6564FU
+-0064FU
+T23
+'** 228 +6564FU -3164KA +7665GI -8485FU +8685FU -6453KA +6576GI -5364KA
++6564FU
+T23
+'** 207 -3164KA +7665GI -6442KA
+-6364GI
+T1
+'** 439 +7574FU -0065FU +7665GI -8485FU +8685FU -6465GI +6665KI -8285HI
++1917KY
+T23
+'** 209 -8292HI +2818HI %PASS
+-6473GI
+T15
+'** 296 +2818HI -3142KA +0065FU %PASS
++2818HI
+T23
+'** 268 -8292HI +3635FU -3435FU +0047KE -0064FU +4735KE -4353KI +0034FU
+-8262HI
+T24
+'** 282 +2937KE -6292HI +4645FU -4445FU +3745KE -3344GI +0046FU -7382GI
++1514FU
+T22
+'** 290 -1314FU +0065FU -3153KA +0013FU -1113KY %PASS
+-1314FU
+T23
+'** 153 %PASS
++0065FU
+T1
+'** 117 -3142KA +6667KI -6292HI +6777KI %PASS
+-6272HI
+T18
+'** 121 +0015FU -1415FU +2615GI -0014FU +1526GI %PASS
++2637GI
+T24
+'** 123 -0064FU +0026KE -3142KA +6564FU -7364GI +0065FU -6453GI %PASS
+-3153KA
+T1
+'** 172 +3748GI %PASS
++6667KI
+T22
+'** 228 -7292HI %PASS
+-0064FU
+T24
+'** 181 +0026KE -6465FU +7665GI -0064FU +6576GI -0065KE +5768KA -7292HI
++6777KI
+T17
+'** 181 -6465FU +7574FU -7374GI +5784KA -0075FU +7667GI -6566FU +6766GI
+-6465FU
+T24
+'** 120 +7574FU -7374GI +5784KA -0075FU +7667GI -0076KE +8878OU -6566FU
++7574FU
+T24
+'** 268 -7374GI +5784KA -0075FU +7667GI -6566FU +6766GI -7576FU +8776KI
+-7374GI
+T1
+'** 226 +5784KA -0075KE +8493UM -7587NK +7787KI -0075FU +7667GI -0083KI
++5784KA
+T23
+'** 168 -6566FU +0012FU -1112KY +8493UM -0075FU +7685GI -7485GI +8685FU
+-0075FU
+T1
+'** 295 +7667GI -6566FU +6766GI -0065FU +6657GI -7576FU +8776KI -0075FU
++7667GI
+T24
+'** 208 -6566FU +6766GI -0065FU +6657GI -7576FU +7776KI -0075KE +8777KI
+-0081KE
+T1
+'** 146 +0012FU -1112KY +8451UM -7271HI +5152UM -7576FU +6776GI -3242KI
++8451UM
+T16
+'** 107 -7271HI +5184UM -0083FU +0072FU -7172HI +0073FU -8384FU +7372TO
+-9596FU
+T19
+'** 428 +9796FU -7271HI +5152UM -3242KI +5253UM -4353KI %PASS
++5161UM
+T24
+'** 422 -9697TO +9997KY -9397NY +8797KI -7292HI +0084KE -9293HI +0094FU
+-9697TO
+T23
+'** 661 +9997KY -9397NY +8797KI -7576FU +7776KI -7292HI +1714KY -1114KY
++9997KY
+T1
+'** 168 -9397NY +8797KI -7292HI +0084KE -9293HI +0094KY -9363HI
+-9397NY
+T15
+'** 570 +8797KI -7292HI +0094KY -9282HI +1714KY -1114KY +1814HI -0013KY
++8797KI
+T1
+'** 115 -7282HI +2524FU -3324GI +0026KY -2413GI +1828HI -4333KI +0025KE
+-7292HI
+T24
+'** 570 +0084KE -9293HI +0094KY -9363HI +6172UM -0096FU +9796KI -0097FU
++0094KY
+T1
+'** 212 -0093FU +0084KE -9242HI +8472NK -9394FU +7281NK
+-9242HI
+T20
+'** 259 +9491NY -8173KE +9181NY -0066KY +7766KI -6566FU +6766GI -0065FU
++9491NY
+T24
+'** 346 -8173KE +6151UM -5362KA +5142UM -3342GI +0064HI -0063KA +0012FU
+-8173KE
+T1
+'** 251 +6151UM -0076KY +6776GI -7576FU +7776KI -7475GI +7677KI -7566GI
++0026KE
+T23
+'** 181 -0076KY +7787KI -7677KY +8777KI
+-0076KY
+T23
+'** 143 +6776GI -7576FU +7776KI
++7787KI
+T1
+'** -15 -4241HI +6152UM -4191HI +1714KY -9197RY +8897OU -0094KY +0096FU
+-6566FU
+T23
+'** 96 +6766GI -7465GI +6657GI -4241HI +6172UM -0066FU +7263UM -4191HI
++6766GI
+T1
+'** -268 -7465GI +6665GI -7365KE +2614KE -1114KY +1714KY -0013FU +0077FU
+-7465GI
+T24
+'** 3 +6657GI -4241HI +6172UM -0066FU +7273UM -6667TO +7383UM -4191HI
++6657GI
+T1
+'** -194 -0066FU +5768GI -6556GI +0077FU -6667TO +1714KY -1114KY +2614KE
+-0066FU
+T24
+'** -236 +1714KY -0013FU +0074FU -4241HI +6152UM -4191HI +8776KI -0087FU
++0074FU
+T1
+'** -415 -6667TO +7473TO -4241HI +6183UM -6757TO +8365UM -0079GI +8898OU
+-6667TO
+T14
+'** -565 +7473TO -4241HI +6183UM -6777TO +8777KI -7677NY +8877OU -6576GI
++7473TO
+T23
+'** -631 -4241HI +6183UM -7677NY +8777KI -6777TO +8877OU -6576GI +7788OU
+-4241HI
+T1
+'** -553 +6183UM -4191HI +0092FU -7677NY +8777KI -6777TO +8877OU -6576GI
++6183UM
+T24
+'** -766 -7677NY +8777KI -6777TO +8877OU -6576GI +7788OU -0077KI +8899OU
+-7677NY
+T1
+'** -746 +8777KI -6777TO +8877OU -6576GI +7788OU -0077KI +8899OU -0096FU
++8777KI
+T18
+'** -931 -6777TO +8877OU -6576GI +7788OU -0077KI +8899OU -0096FU +9798KI
+-6777TO
+T1
+'** -818 +8877OU -6576GI +7788OU -0077KI +8899OU
++8877OU
+T14
+'** -858 -6576GI +7788OU -0077KI +8879OU -0087FU +0069KE -4191HI +0092FU
+-6576GI
+T23
+'** -806 +7788OU -0077KI +8899OU
++7788OU
+T1
+'** -815 -0077KI +8879OU -0087FU +0089KE -8788TO +1888HI -4191HI +0092FU
+-0077KI
+T24
+'** -828 +8899OU -4191HI +0092FU -0095KY +0098KY -9597NY +9897KY -0088KI
++8879OU
+T1
+'** -1091 -0087FU +0089KE -8788TO +1888HI -4191HI +0092FU -0087FU +8898HI
+-0087FU
+T24
+'** -912 +0069KE -4191HI +0093KY -9181HI +8372UM
++0089KE
+T23
+'** -1125 -8788TO +1888HI -7788KI +7988OU -0087FU +9787KI -7687NG +8887OU
+-8788TO
+T20
+'** -1218 +1888HI -7788KI +7988OU -0087FU +9787KI -7687NG +8887OU -0067HI
++7969OU
+T23
+'** -1357 -8889TO +6958OU -4191HI +0092FU -9181HI +7382TO -8151HI +5848OU
+-8889TO
+T1
+'** -1218 +6959OU -4191HI +0092FU -9171HI +7363TO -5331KA +1714KY -1114KY
++6958OU
+T13
+'** -1425 -0065KE +5748GI -4191HI +0092FU -9181HI +8372UM -8151HI +5849OU
+-4191HI
+T20
+'** -1300 +0092FU -9181HI +8372UM -8171HI +2614KE -1114KY +1714KY -0013FU
++0092FU
+T13
+'** -1186 -9181HI +8372UM -8171HI +7271UM -7667NG +5848OU -5371KA +0041HI
+-9181HI
+T7
+'** -1121 +8372UM -7667NG +5848OU -6757NG +4857OU -0027GI +1858HI -0065KE
++8372UM
+T23
+'** -1099 -8171HI +7271UM -7667NG +5848OU -5371KA +0041HI -0079KA +4171RY
+-8171HI
+T1
+'** -1043 +7271UM -7667NG +5848OU -5371KA +0051HI -0079KA +5171RY -6757NG
++7271UM
+T12
+'** -953 -7667NG +5848OU -5371KA +0051HI -7193KA +2614KE -1114KY +1714KY
+-5371KA
+T23
+'** -856 +0061HI -7667NG +5847OU -0079KA +0068FU -7997UM +6867FU -0027KI
++0051HI
+T24
+'** -953 -7667NG +5848OU -0079KA +0068FU -0065KE +6867FU -7957UM +4838OU
+-0065KE
+T18
+'** -877 +5171RY -0027KA +0052KA -2718UM +1714KY -6557NK
++5766GI
+T13
+'** -1102 -7767KI +5848OU -6766KI +2614KE -2213OU +5121RY
+-7767KI
+T24
+'** -868 +5848OU -6766KI +1714KY -0047KY +4839OU -0027KA +3928OU -2718UM
++5848OU
+T1
+'** -1214 -6766KI +2614KE -1114KY +1714KY -0013FU +1413NY -2113KE +0014FU
+-6766KI
+T15
+'** -928 +1714KY -0013FU +5171RY -1314FU +4838OU -6656KI %PASS
++2614KE
+T23
+'** -1456 -1114KY +1714KY -0013FU +1413NY -2113KE +5171RY -6557NK +4839OU
+-1114KY
+T24
+'** -1075 +1714KY -0013FU +1413KY -2113KE +0014FU -0011KY +5171RY -6557NK
++1714KY
+T1
+'** -1704 -0013FU
+-6557NK
+T23
+'** -1018 +4839OU -0013FU +1413NY -2113KE +0014KY -3324GI +5171RY
++4838OU
+T23
+'** -1225 -0047GI +3828OU -0013FU +1413NY -2113KE +5171RY -6656KI +0011KA
+-0047GI
+T12
+'** -197 +3828OU -0027KY +2827OU -0013FU +1413NY -2113KE +1813RY -2213OU
++3827OU
+T23
+'** -459 -0013FU
+-0016FU
+T1
+'** -185 +1816HI -0038KA +2726OU -0011KY +1411NY -3816UM +2616OU -2211OU
++1816HI
+T24
+'** -375 -3324GI +5171RY -0038KA +2718OU -3233KI +2524FU -3816UM +0031KA
+-0038KA
+T24
+'** -179 +2726OU -3231KI +5171RY -6656KI +0013FU -0011FU +1312TO -1112FU
++2726OU
+T24
+'** -379 -3231KI +5171RY -6656KI +1412NY -2232OU +0052KA -4342KI +5263UM
+-3324GI
+T1
+'** -343 +2524FU -2324FU +0023FU -3223KI +1412NY -2233OU +5131RY -0032KY
++2524FU
+T15
+'** -240 -3816UM +2616OU -2233OU
+-2324FU
+T7
+'** 118 +5171RY -0025KY +2615OU -3816UM +1516OU -0013FU +0026FU -1314FU
++0023FU
+T14
+'** -59 -3223KI +1412NY -2233OU +5131RY -0032KY +3121RY
+-3223KI
+T23
+'** -25 +1412NY -2233OU +5131RY -0032KE +2617OU -0025KY +0028FU -7667NG
++1412NY
+T2
+'** -865 -2233OU +5131RY -0032KE +0022GI -2322KI +3122RY
+-2233OU
+T23
+'** -218 +5131RY -0032KE +2617OU -3816UM +1716OU -0018HI +0017GI -0015FU
++5131RY
+T1
+'** -1029 -0032KE +0027FU -2425FU +2617OU -0015FU +1615HI -0014KY +1514HI
+-0032KE
+T23
+'** -293 +0022GI -2322KI +3122RY -3342OU +0052KI -4252OU +2232RY -5253OU
++0022GI
+T1
+'** -1702 -2322KI +3122RY -3342OU +1615HI -0025KY +1525HI
+-2322KI
+T1
+'** -364 +3122RY -3342OU +0052KI -4252OU +2232RY -5253OU +0017KE
++3122RY
+T19
+'** -2293 -3342OU +0027FU -0025GI +2617OU -4445FU +0053KY -7153KA +0035KY
+-3342OU
+T1
+'** -476 +2917KE -0025KY +1725KE -2425FU
++0025FU
+T23
+'** -1320 -2425FU +2625OU -0024GI +2514OU -3816UM +1221NY
+-2425FU
+T23
+'** -1640 +2625OU -0024GI +2224RY -3816UM +2516OU -3224KE
++2625OU
+T1
+'** -1682 -0024GI +2514OU -3816UM +0052KI -4252OU +2232RY -0042KY +0064KE
+-0024GI
+T13
+'** -1671 +2224RY -3816UM +2516OU -3224KE
++2514OU
+T23
+'** -2271 -3816UM +0052KI -4252OU +2232RY -0042KI +0064KE -5253OU +3221RY
+-3816UM
+T1
+'** -2219 +0026KI -4333KI +2616KI -0013FU +1213NY -2413GI +2213RY -0024HI
++0052KI
+T14
+'** -2479 -4252OU +2232RY -0042KI +0064KE -5253OU +3221RY -5364OU +2171RY
+-4252OU
+T1
+'** 15081406 +2232RY
++2232RY
+T23
+'** -2479 -0042KI +0064KE -5253OU +1423OU -4738NG +9291TO %PASS
+-0042KY
+T1
+'** -3512 +0064KE -5253OU +1423OU -0033KI +2322OU -3332KI
++0064KE
+T19
+'** -3676 -5253OU +1423OU -0033KI +2322OU -3332KI +2232OU -5364OU +0072FU
+-5253OU
+T4
+'** -1992 +3221RY -4333KI +2151RY -5364OU +5161RY -6473OU +6171RY -7363OU
++1423OU
+T23
+'** -3659 -0033KI +3233RY -4333KI +2322OU -5364OU
+-0033KI
+T24
+'** -3893 +3233RY -4333KI +2322OU -5364OU +0019KY -1649UM +0072KI -0023HI
++3233RY
+T1
+'** -3790 -4333KI +2322OU -5364OU +0072FU -0032HI +2211OU -7193KA +0063KI
+-4333KI
+T24
+'** -3742 +2322OU -5364OU +0072FU -7193KA +7383TO -0067HI +8393TO -6797RY
++2322OU
+T1
+'** -3921 -5364OU +0072FU -0051HI +7271TO -5171HI +0063KI
+-5364OU
+T17
+'** -937 +0072FU -7193KA +7383TO -0067HI +9796KI -6787RY
++0072FU
+T6
+'** -3458 -7153KA +0063KI -6465OU +6353KI -6556OU +5342KI %PASS
+-7193KA
+T23
+'** -1031 +7383TO -3435FU +0025FU -0032HI +2211OU -1625UM
++7383TO
+T1
+'** -3302 -0032HI +2211OU -3435FU +0025FU -3536FU +8393TO
+-3435FU
+T24
+'** -3217 +3635FU -0036FU +3728GI -0027FU +2817GI -1643UM
++3635FU
+T24
+'** -3483 -1643UM +2211OU -3332KI +8393TO -4333UM +0022KA
+-0036FU
+T14
+'** -3320 +8393TO -3637TO +7271TO
++8393TO
+T24
+'** -3339 -1643UM +2211OU -3637TO +0014FU -0032GI +2937KE
+-3637TO
+T1
+'** -3518 +0025FU -0032HI +2211OU -2435GI
++2211OU
+T23
+'** -3596 -6465OU +0022FU -6556OU +2221TO
+-0023GI
+T13
+'** -3458 +1222NY -6465OU
++0022KI
+T6
+'** -3443 -1643UM +2937KE -0036FU +1221NY
+-2312GI
+T24
+'** -3282 +2212KI -5756NK +0082KA -6453OU
++2212KI
+T1
+'** -3447 -4756NG
+-0099HI
+T23
+'** -3117 +0022FU -9997RY +2221TO -6465OU
++0098KY
+T22
+'** -3256 -0096FU +0022FU -9697TO +2221TO
+-0096FU
+T24
+'** -3478 %PASS
++0022FU
+T12
+'** -3903 -9697TO +2221TO -9998RY +2937KE
+-1643UM
+T6
+'** -3759 +9796KI -9998RY %PASS
++0067FU
+T16
+'** -3626 -7667NG +2221TO -9697TO +9897KY
+-5767NK
+T14
+'** -3978 +9796KI -9998RY %PASS
++0068FU
+T23
+'** -3912 -6768NK +2221TO -9697TO +9897KY -9997RY +2937KE
+-6768NK
+T19
+'** -4254 +9796KI -9998RY +1221KI -9896RY
++2221TO
+T24
+'** -4400 -9697TO +0034KY -9998RY +3433NY -4333UM +0022GI
+-9697TO
+T18
+'** -4212 +9291TO
++0034KY
+T5
+'** -4434 -6465OU +3433NY -2433GI +0083KA -0074KY +2937KE
+-9998RY
+T22
+'** -4401 +2937KE
++3433NY
+T1
+'** -4456 -4333UM +0022GI -3332UM +0034KI
+-2433GI
+T24
+'** -4584 +0084KI %PASS
++0084KI
+T15
+'** -4282 %PASS
+-0063KI
+T19
+'** -4064 +9291TO -6656KI +2937KE -6455OU
++2937KE
+T23
+'** -3978 -4756NG +0034GI -3334GI +3534FU -4334UM +0026KE
+-6465OU
+T1
+'** -4145 +0041KA -6556OU %PASS
++0025KA
+T13
+'** -4594 -6556OU +2543UM -4243KY +0041KA -5646OU +4163UM
+-6556OU
+T24
+'** -4596 +2543UM -4243KY +0041KA -6353KI +4123UM -5646OU +2333UM -4637OU
++2543UM
+T1
+'** -4590 -4243KY +0041KA -6353KI +4132UM -5646OU +3233UM
+-4243KY
+T19
+'** -4651 +0032KA -6353KI +3223UM -5646OU +2333UM -4637OU
++0041KA
+T1
+'** -4656 -6353KI +4123UM -5646OU +2333UM
+-0062HI
+T13
+'** -4453 +4123UM -5646OU +2333UM -0078KA
++0051GI
+T13
+'** -3906 -6261HI +4152UM -6151HI +5251UM
+-6261HI
+T23
+'** -4187 +4123UM -5646OU +2333UM -4637OU +7271TO -6171HI +9382TO -7161HI
++4123UM
+T1
+'** -4301 -5646OU +2333UM -4637OU +0052GI -6181HI +5263NG
+-5646OU
+T24
+'** -3770 +2333UM -4637OU +7271TO -6171HI +9382TO -7151HI +3351UM -3748OU
++2333UM
+T1
+'** -4378 -4637OU +0052GI %PASS
+-4637OU
+T24
+'** -3706 +7271TO -6171HI +9382TO -7151HI +3351UM -3748OU
++0052GI
+T1
+'** -3828 -0041KE +3315UM -3736OU +5261NG
+-6181HI
+T24
+'** -3859 +5263NG -8184HI +3343UM -0038FU +7271TO -3839TO
++5263GI
+T1
+'** -3862 -3738OU +9291TO -8184HI +3343UM
+-8184HI
+T12
+'** -3879 +3343UM -8486HI +9291TO
++3343UM
+T11
+'** -4073 -3748OU +7271TO -0023KI +2122TO
+-8486HI
+T23
+'** -3865 +3534FU -8687RY +9291TO -3748OU
++6354NG
+T1
+'** -3808 -7667NG +9291TO -8688RY +7271TO
+-0053FU
+T13
+'** -3811 +4344UM -7667NG
++5453NG
+T10
+'** -3675 -8688RY +7271TO -8884RY +0029KY
+-0057FU
+T12
+'** -3682 +9291TO -8688RY
++3534FU
+T23
+'** -3637 %PASS
+-5758TO
+T23
+'** -3568 +3433TO -3748OU +4344UM -4756NG
++4344UM
+T1
+'** -3533 -4756NG +3433TO -8688RY +4435UM
+-4756NG
+T23
+'** -3687 +7271TO -3748OU +4426UM -4857OU
++9291TO
+T1
+'** -3665 -8687RY +4454UM -3738OU +3433TO
+-8687RY
+T23
+'** -3789 +3433TO -3748OU +4426UM -0037KA
++7271TO
+T12
+'** -3810 -8784RY +5343NG -7667NG +3433TO
+-8784RY
+T23
+'** -3888 +3433TO -8444RY +3343TO -4435RY +5162NG -3746OU
++0064FU
+T1
+'** -4045 -8493RY +6463TO -9391RY +5162NG %PASS
+-8493RY
+T20
+'** -3964 +6463TO -9391RY +3433TO -9171RY
++7181TO
+T1
+'** -3937 %PASS
+-0046FU
+T16
+'** -3935 +6463TO -4647TO +3433TO -3748OU
++3433TO
+T23
+'** -3859 -0041KE +6463TO -4647TO +5354NG -9394RY +6364TO
+-3748OU
+T13
+'** -3906 +4426UM -4857OU +6463TO -4647TO
++6463TO
+T24
+'** -3968 -4647TO +5142NG -0018FU +4426UM -4857OU +2635UM
+-4647TO
+T18
+'** -3993 +5142NG -0038FU +4426UM -4857OU +2635UM -5748OU
++0024FU
+T5
+'** -4012 -0038FU +2423TO -3839TO +0042FU %PASS
+-0037FU
+T23
+'** -4024 +0039FU -9384RY +0054FU -0027FU +4426UM -2728TO
++4426UM
+T24
+'** -4023 -4857OU +2635UM -5767OU +2423TO -3738TO +3534UM
+-4857OU
+T15
+'** -3915 +2635UM -5767OU +2423TO -3738TO %PASS
++2635UM
+T8
+'** -4004 -5767OU +2423TO -3738TO +0014FU -0048FU +0042FU -4849TO +1413TO
+-5748OU
+T23
+'** -4018 +2423TO -3738TO +0042FU -0027FU +3526UM -4737TO +4241TO -2728TO
++3526UM
+T23
+'** 0
+-0025FU
+T1
+'** 0 +2615UM -0017KA +2423TO -0041KE +5354NG -1726UM
++2615UM
+T22
+'** -3968 -0041KE +5354NG -0027KA +5464NG -2736UM +2423TO -3626UM +1526UM
+-0017KA
+T1
+'** -3884 +2423TO -1726UM +1526UM -2526FU +0028FU -3738TO +0071KA -9383RY
++2423TO
+T20
+'** -3840 -1726UM +1526UM -2526FU +0061KA -9396RY +6116UM -3738TO +5142NG
+-1726UM
+T2
+'** -3918 +1526UM -2526FU +0061KA -0083FU +6116UM -3738TO +5162NG -7687NG
++1526UM
+T13
+'** -3987 -2526FU +0061KA -9384RY +6116UM -3738TO +0044FU -4857OU +4443TO
+-2526FU
+T10
+'** -3597 +0061KA -0083FU +6116UM -3738TO +5142NG -7667NG +1626UM -4857OU
++0061KA
+T13
+'** -3979 -9384RY +6116UM -3738TO +1626UM -4857OU +2635UM -5767OU +3525UM
+-0041KI
+T15
+'** -3795 +0042KI -0052FU +0094FU -9384RY +6352TO -4142KI
++5142NG
+T22
+'** -3773 -4142KI +3342TO -9384RY +1122OU -0034KA +6172UM -8444RY +0033KI
+-4142KI
+T15
+'** -3615 +3342TO -9384RY +0094KI -8444RY %PASS
++3342TO
+T7
+'** -3867 -9384RY +1122OU -0034KA +6134UM -8434RY +0033KI -3444RY +0043KI
+-9384RY
+T10
+'** -3662 +6125UM -0044KA +0033KY -2627TO +4243TO -4417UM
++1122OU
+T13
+'** -3772 -0034KA +6172UM -3738TO +0033KI -3425KA +4243TO
+-2627TO
+T20
+'** -3815 +6116UM -0044KA +0033FU -2726TO +0049FU
++6116UM
+T12
+'** -3748 -3738TO
+-0026FU
+T23
+'** -3748 +0034FU -3738TO +3433TO -7667NG +0062FU -7576FU +6261TO -7677TO
++0034FU
+T24
+'** -3880 -3738TO +3433TO -8414RY +0015FU -1444RY +1634UM -4446RY +3425UM
+-3738TO
+T24
+'** -3737 +3433TO -8444RY +0052FU -0018FU +4243TO -4435RY +5251TO -1819TO
++3433TO
+T14
+'** -3845 -8414RY +0015FU -1444RY +1634UM -4446RY +3425UM
+-7667NG
+T9
+'** -3731 +0052FU -0018FU +0062FU -7576FU +5251TO -1819TO +6261TO -7677TO
++0052FU
+T23
+'** -3725 -7576FU +0062FU -0036FU +5251TO -7677TO +6261TO -3637TO +1625UM
+-7576FU
+T1
+'** -3750 +0073FU -7677TO +7372TO -0017FU +5251TO -1718TO +7261TO -1817TO
++0062FU
+T24
+'** -3778 -0036FU +2232OU -7677TO +6261TO -8414RY +0015KY -1474RY +5251TO
+-0036FU
+T22
+'** -3750 +5251TO -7677TO +2232OU -3637TO +4243TO -8414RY +0015KY -1484RY
++2232OU
+T1
+'** -3787 -7677TO +6261TO -9888RY %PASS
+-8414RY
+T14
+'** -3753 +0015KY -1444RY +5251TO -7677TO +6261TO -3637TO
++0015KY
+T19
+'** -3784 -1474RY +5251TO -3637TO +1222KI -7677TO +6261TO -0087KA +3241OU
+-1444RY
+T4
+'** -3781 +5251TO -7677TO +6261TO -4445RY +1513NY -3637TO +3241OU -0015KY
++5251TO
+T24
+'** -3775 -3637TO +6261TO -4435RY +1513NY -7677TO +5343NG -0015GI +1634UM
+-3637TO
+T1
+'** -3771 +6261TO -7677TO +3241OU -4446RY +1625UM -9888RY +1513NY
++1513NY
+T21
+'** -3831 -7677TO +6261TO -0087KA +3241OU -8796UM +1643UM -4445RY +4398UM
+-4446RY
+T16
+'** -3864 +6261TO -2717TO +1625UM -7677TO %PASS
++3241OU
+T23
+'** -4006 -2717TO +1643UM -7677TO +6261TO -2627TO +4398UM -9798TO
+-7677TO
+T23
+'** -4087 +1643UM -9888RY +1322NY -0087KA +2232NY -2717TO +6261TO -8743UM
++6261TO
+T23
+'** -4081 -2728TO +1222KI -2627TO +1615UM -4635RY +1314NY -3565RY +1516UM
+-2728TO
+T13
+'** -4090 +1625UM -2627TO +8171TO -0087KA +2524UM -4645RY +2414UM -8796UM
++1615UM
+T9
+'** -4093 -2627TO +1524UM -4645RY +4243TO -4565RY +4152OU -6574RY +5242OU
+-2627TO
+T14
+'** -4098 +8182TO -9887RY +9181TO -8785RY +1514UM -8565RY +0059KE -5859TO
++4243TO
+T10
+'** -4131 -4635RY +1314NY -0017KA +2324TO -1726UM +1526UM -2726TO +0083KA
+%KACHI
+'P1+TO+TO * +TO+TO+OU * +TO * 
+'P2 *  *  *  *  *  *  *  * +KI
+'P3 *  *  * +TO+NG+TO+TO+TO+NY
+'P4 *  *  *  *  *  *  *  *  * 
+'P5 *  *  *  *  *  *  *  * +UM
+'P6 *  *  * -KI-NG-RY *  *  * 
+'P7-TO * -TO-NG * -TO-TO-TO * 
+'P8-RY *  * -NK-TO-OU-TO-TO * 
+'P9 * -TO *  *  *  *  *  *  * 
+'P+00KE00KI00KI
+'P-00GI00KA00KE00KE00KY00KY00KY
+'+
+'summary:illegal kachi:gps8_pgsklp lose:gps9_p win
+'$END_TIME:2006/04/28 08:11:15
diff --git a/test/trunk/csa/not_sennichite.csa b/test/trunk/csa/not_sennichite.csa
new file mode 100644 (file)
index 0000000..c95a71c
--- /dev/null
@@ -0,0 +1,208 @@
+V2
+N+garyu
+N-coredump
+$EVENT:wdoor+floodgate-900-0+garyu+coredump+20080316040009
+$START_TIME:2008/03/16 04:00:07
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  * -KA * 
+P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
+P8 * +KA *  *  *  *  * +HI * 
+P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
++
++7776FU
+T1
+-8384FU
+T1
++7968GI
+T1
+-3334FU
+T1
++6877GI
+T1
+-7162GI
+T1
++2726FU
+T1
+-3142GI
+T1
++3948GI
+T1
+-5354FU
+T1
++5756FU
+T1
+-4132KI
+T1
++6978KI
+T1
+-5141OU
+T1
++5969OU
+T1
+-6152KI
+T1
++4958KI
+T1
+-4131OU
+T17
++2625FU
+T20
+-2233KA
+T1
++6766FU
+T20
+-4344FU
+T19
++8879KA
+T12
+-3122OU
+T3
++7968KA
+T20
+-4243GI
+T10
++6979OU
+T4
+-6253GI
+T13
++3736FU
+T16
+-7374FU
+T3
++4837GI
+T20
+-8173KE
+T19
++5867KI
+T20
+-5364GI
+T1
++7788GI
+T30
+-9394FU
+T19
++9796FU
+T15
+-8281HI
+T19
++1716FU
+T18
+-5455FU
+T19
++2524FU
+T14
+-2324FU
+T19
++5655FU
+T1
+-4445FU
+T18
++5554FU
+T1
+-4354GI
+T11
++0025FU
+T20
+-2425FU
+T14
++2825HI
+T5
+-0023FU
+T14
++0024FU
+T6
+-2324FU
+T18
++6824KA
+T1
+-3324KA
+T17
++2524HI
+T2
+-0023FU
+T16
++2428HI
+T3
+-5443GI
+T14
++0024FU
+T20
+-2324FU
+T15
++2824HI
+T4
+-0023FU
+T14
++2428HI
+T5
+-5242KI
+T14
++0072KA
+T20
+-8151HI
+T12
++0057FU
+T2
+-4354GI
+T13
++7283UM
+T11
+-5181HI
+T4
++8374UM
+T15
+-4243KI
+T1
++0024FU
+T10
+-2324FU
+T16
++2824HI
+T1
+-0023FU
+T16
++2428HI
+T1
+-8182HI
+T18
++0024FU
+T11
+-2324FU
+T14
++2824HI
+T1
+-0023FU
+T12
++2428HI
+T2
+-8281HI
+T16
++0024FU
+T15
+-2324FU
+T9
++2824HI
+T6
+-0023FU
+T13
++2428HI
+T2
+'P1-KY-HI *  *  *  *  * -KE-KY
+'P2 *  *  *  *  *  * -KI-OU * 
+'P3 *  * -KE-FU * -KI * -FU-FU
+'P4-FU-FU+UM-GI-GI * -FU+HI * 
+'P5 *  *  *  *  * -FU *  *  * 
+'P6+FU * +FU+FU *  * +FU * +FU
+'P7 * +FU * +KI+FU+FU+GI *  * 
+'P8 * +GI+KI *  *  *  *  *  * 
+'P9+KY+KE+OU *  *  *  * +KE+KY
+'P+00FU
+'P-00FU00FU00KA
+'+
+'summary:sennichite:garyu draw:coredump draw
+'rating:#<ShogiServer::GameResultDraw:0xb70be548>
+'$END_TIME:2008/03/16 04:14:42
diff --git a/test/trunk/csa/not_uchifuzume.csa b/test/trunk/csa/not_uchifuzume.csa
new file mode 100644 (file)
index 0000000..d435315
--- /dev/null
@@ -0,0 +1,354 @@
+V2
+N+usapyon-on-note
+N-gps_normal
+$EVENT:wdoor+floodgate-900-0+usapyon-on-note+gps_normal+20080215133008
+$START_TIME:2008/02/15 13:30:05
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  * -KA * 
+P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
+P8 * +KA *  *  *  *  * +HI * 
+P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
++
++2726FU
+T1
+'** 0 joseki
+-8384FU
+T1
+'** 0
++2625FU
+T1
+'** 0 joseki
+-8485FU
+T1
+'** 0
++6978KI
+T1
+'** 0 joseki
+-4132KI
+T1
+'** 0
++2524FU
+T1
+'** 0 joseki
+-2324FU
+T1
+'** 0
++2824HI
+T1
+'** 0 joseki
+-0023FU
+T1
+'** 0
++2426HI
+T1
+'** 0 joseki
+-7172GI
+T1
+'** 0
++9796FU
+T1
+'** 0 joseki
+-9394FU
+T1
+'** 0
++3938GI
+T1
+'** 0 joseki
+-6364FU
+T1
+'** 0
++1716FU
+T1
+'** 0 joseki
+-1314FU
+T1
+'** 0
++7776FU
+T1
+'** 0 joseki
+-8586FU
+T1
+'** 0
++8786FU
+T1
+'** 0 joseki
+-8286HI
+T1
+'** 0
++0087FU
+T1
+'** 0 joseki
+-8684HI
+T1
+'** 0
++3736FU
+T9
+'** 205 h-3736\95à       H-3334\95à       S08822\8ap\90¬\8ap\8eæ H-3122\8bâ  \94n\8eæ H-75\8ap\91Å       H-8474\94ò       H-5756\95à       
+-0086FU
+T53
+'** 0 +8786FU -8486HI +0024FU -2324FU +2624HI -5152OU +2426HI -3334FU +2937KE -2288UM +7988GI -0023FU +0087FU
++8786FU
+T10
+'** -42 H-8786\95à  \95à\8eæ H-8486\94ò  \95à\8eæ h-87\95à\91Å       H-8676\94ò  \95à\8eæ SQ2937\8cj       H-7674\94ò       H-24\95à\91Å       H-7484\94ò       H-2423\95à\90¬\95à\8eæ 
+-8486HI
+T5
+'** -15 +0024FU -2324FU +2624HI -5152OU +7877KI -8685HI +0086FU -8584HI +2425HI -0023FU +8685FU -8482HI
++3635FU
+T4
+'** -61 h-3635\95à       H-8684\94ò       H-87\95à\91Å       H-6465\95à       h-6766\95à       H-2213\8ap       H-2636\94ò       H-8464\94ò       
+-2213KA
+T27
+'** -82 +2636HI -8685HI +1615FU -0086FU +1514FU -8687TO +7887KI -8587RY +1413TO -1113KY +1913NY
++2656HI
+T10
+'** -85 h-2656\94ò       S36152\8bà       H-87\95à\91Å       H-8685\94ò       H-3534\95à       h-3142\8bâ       h-3433\95à\90¬\95à\8eæ at4233\8bâ  \94n\8eæ 
+-1335KA
+T14
+'** -53 +0036FU -8688RY +7988GI -3544KA +0082FU -0087FU +8887GI -4499UM +5653RY -0052KY +5364RY
++0087FU
+T7
+'** 176 h-87\95à\91Å       S28682\94ò       h-36\95à\91Å       S33524\8ap       H-5653\94ò\90¬\95à\8eæ S16152\8bà       S55355\97³       H-53\95à\91Å       
+-8685HI
+T11
+'** 171 +8997KE -8582HI +0036FU -3526KA +3837GI -2637UM +2937KE -0054GI +7968GI -7263GI +5969OU
++0036FU
+T9
+'** 461 H-36\95à\91Å       S33524\8ap       H-5653\94ò\90¬\95à\8eæ S16152\8bà       F-5354\97³       H-53\95à\91Å       F-5424\97³  \8ap\8eæ H-2324\95à  \97³\8eæ F-8997\8cj       
+-3526KA
+T11
+'** -156 +5958OU -3142GI +5655HI -8555HI +8855KA -2644KA +5544KA -4344FU +8977KE -5141OU %PASS
++3837GI
+T11
+'** 393 H-3837\8bâ       h-2637\8ap\90¬\8bâ\8eæ at2937\8cj  \94n\8eæ S33142\8bâ       SJ46\8ap\91Å       S265\8bâ\91Å       H-5655\94ò       H-86\95à\91Å       H-8786\95à  \95à\8eæ 
+-8525HI
+T7
+'** -303 +4939KI -3142GI +5968OU -2637UM +2937KE -2527RY +8855KA -0065GI +5564KA -6556GI +5756FU
++4939KI
+T13
+'** 294 SX4939\8bà       S83142\8bâ       h-3726\8bâ  \8ap\8eæ H-2526\94ò  \8bâ\8eæ S348\8ap\91Å       H-2627\94ò\90¬     F-4837\8ap       
+-2637UM
+T23
+'** -490 +2937KE -2527RY +3745KE -0038GI +0085KA -3142GI +4553NK -4253GI +0028FU -3839NG +2827FU -0052FU
++2937KE
+T15
+'** -999999999 H-2937\8cj  \94n\8eæ H-2527\94ò\90¬     H-3745\8cj       H-2747\97³  \95à\8eæ S24553\8cj  \95à\8eæ H-6162\8bà       H-71\8ap\91Å       F-6263\8bà       
+-2527RY
+T22
+'** -168 +3745KE -0038GI +4553NK -0052FU +0085KA -3242KI +3938KI -2738RY +0049GI -3849RY +5949OU
++3745KE
+T1
+'** -56 H-3745\8cj       H-2747\97³  \95à\8eæ h-4553\8cj\90¬\95à\8eæ F-52\95à\91Å       H-5354NK       h-6465\95à       
+-2747RY
+T11
+'** -221 +4553KE -6162KI +0048FU -4737RY +0028KA -3727RY +2864KA -7263GI +6446KA
++5653RY
+T3
+'** -46 H-5653\94ò\90¬\95à\8eæ S052\95à\91Å       S35354\97³       H-44\8bâ\91Å       H-56\8ap\91Å       H-4757\97³  \95à\8eæ S058\95à\91Å       H-5737\97³       H-3949\8bà       F-3736\97³  \95à\8eæ 
+-0052FU
+T40
+'** -387 +5354RY -4736RY +3948KI -0037GI +4837KI -3637RY +5968OU -3739RY +5464RY -0063KI +6466RY
++5354RY
+T1
+'** -257 H-5354\97³       H-44\8bâ\91Å       H-56\8ap\91Å       H-4737\97³       h-3948\8bà       F-3736\97³  \95à\8eæ S38844\8ap  \8bâ\8eæ H-4344\95à  \8ap\8eæ mc5444\97³  \95à\8eæ 
+-4736RY
+T18
+'** -258 +0038FU -0044GI +0018KA -4445GI +1836KA -4536GI +3948KI -3627NG +5464RY
++0038FU
+T11
+'** -92 H-38\95à\91Å       SB3647\97³       H-5456\97³       H-58\8bâ\91Å       S05968\89¤       
+-0065GI
+T9
+'** -175 +5455RY -3634RY +5968OU -6554GI +5564RY -0063FU +6484RY -0083FU +8485RY
++5455RY
+T15
+'** 153 H-5455\97³       S53634\97³       SI5968\89¤       H-6554\8bâ       H-4533\8cj\90¬\95à\8eæ H-2133\8cj  NK\8eæ F-5564\97³  \95à\8eæ 
+-3634RY
+T12
+'** -217 +0018KA -3142GI +5968OU -5141OU +6766FU -6574GI +7675FU -7463GI +6665FU -6465FU +5565RY
++5968OU
+T2
+'** -143 H-5968\89¤       H-6554\8bâ       H-4533\8cj\90¬\95à\8eæ H-2133\8cj  NK\8eæ H-5564\97³  \95à\8eæ S263\95à\91Å       H-6466\97³       
+-6554GI
+T23
+'** -119 +5564RY -5445GI +6434RY -4534GI +8897KA -0042KE %PASS %PASS
++5564RY
+T1
+'** -999999999 H-5564\97³  \95à\8eæ S063\95à\91Å       S56484\97³       h-83\95à\91Å       h-8475\97³       H-5445\8bâ  \8cj\8eæ S022\95à\91Å       at3122\8bâ  \95à\8eæ H-18\8ap\91Å       
+-0063FU
+T7
+'** -175 +6475RY -5445GI +3948KI -6171KI +3837FU -4546GI +0026KA -0044KE +0045FU
++4533KE
+T5
+'** -416 H-4533\8cj  \95à\8eæ h-3233\8bà  \8cj\8eæ S56484\97³       S347\8cj\91Å       S18833\8ap\90¬\8bà\8eæ at2133\8cj  \94n\8eæ H-56\8ap\91Å       
+-2133KE
+T8
+'** -447 +6475RY -3436RY +3948KI -0064KE +8866KA -3626RY +4837KI -2629RY +0018KA
++6466RY
+T15
+'** -579 H-6466\97³       H-36\95à\91Å       H-3949\8bà       H-3637\95à\90¬     H-3837\95à  \82Æ\8eæ S83345\8cj       H-3736\95à       mc4537\8cj\90¬     
+-0027KE
+T24
+'** -468 +3948KI -2719NK +0082KA -9193KY +8291UM -1918NK +5756FU -1828NK +9182UM -2838NK +4847KI
++3929KI
+T13
+'** -850 H-3929\8bà       H-2719\8cj\90¬\8d\81\8eæ H-2919\8bà  NK\8eæ H-3438\97³  \95à\8eæ S56877\89¤       h-64\8d\81\91Å       H-6675\97³       H-5465\8bâ       
+-2719NK
+T26
+'** -753 +2919KI -3438RY +6877OU -0017KY +0034FU -1719NY +3433TO -3833RY +0034FU -3334RY +0046KE
++2919KI
+T1
+'** -841 H-2919\8bà  NK\8eæ H-3438\97³  \95à\8eæ S56877\89¤       S517\8d\81\91Å       S356\8ap\91Å       H-3858\97³       H-7868\8bà       
+-3438RY
+T7
+'** -865 +6877OU -8193KE +8786FU -0017KY +0034FU -1719NY +3433TO -3233KI +0034FU
++6877OU
+T3
+'** -811 H-6877\89¤       H-64\8d\81\91Å       S56626\97³       H-85\95à\91Å       S027\8ap\91Å       h-3839\97³       H-2754\8ap  \8bâ\8eæ H-3919\97³  \8bà\8eæ 
+-0064KY
+T8
+'** -872 +6646RY -5445GI +4655RY -3847RY +8897KA -4546GI +5556RY -4757RY +5657RY
++6646RY
+T6
+'** -672 S06646\97³       h-85\95à\91Å       H-8786\95à       F-5445\8bâ       S24626\97³       H-3858\97³       F-7968\8bâ       
+-8193KE
+T15
+'** -693 +8786FU -5445GI +4655RY -3858RY +7968GI -5869RY +0059KE %PASS +0082KA
++0082KA
+T10
+'** -425 SA82\8ap\91Å       SR3839\97³       S31918\8bà       H-9385\8cj       S07786\89¤       H-9192\8d\81       mc8685\89¤  \8cj\8eæ 
+-9385KE
+T20
+'** -1514 +7786OU -6467NY +0062FU -6162KI +7867KI -3888RY +7988GI -0064KA +0075KY -6446KA +0071HI
++7786OU
+T15
+'** -187   7786\89¤       H-84\95à\91Å       S742\95à\91Å       S73839\97³       F-8291\8ap\90¬\8d\81\8eæ H-3919\97³  \8bà\8eæ F-34\95à\91Å       
+-6467NY
+T1
+'** -1550 +0062FU -6162KI +7867KI -3888RY +7988GI -0064KA +0075KY -6446KA +0071HI
++0062FU
+T14
+'** -1346 H-62\95à\91Å       H-6162\8bà  \95à\8eæ H-7867\8bà  \88Ç\8eæ H-3888\97³  \8ap\8eæ H-7988\8bâ  \97³\8eæ H-64\8ap\91Å       S375\94ò\91Å       S281\95à\91Å       H-8291\8ap\90¬\8d\81\8eæ mc6446\8ap  \97³\8eæ mc7585\94ò  \8cj\8eæ me19\8bà\8eæ       
+-6162KI
+T9
+'** -1590 +7867KI -3888RY +7988GI -0064KA +0075KY -6446KA +1929KI -0069HI +0071HI
++7867KI
+T2
+'** -1667 H-7867\8bà  \88Ç\8eæ H-3888\97³  \8ap\8eæ H-7988\8bâ  \97³\8eæ H-64\8ap\91Å       S07675\95à       H-6446\8ap  \97³\8eæ H-18\94ò\91Å       S166\94ò\91Å       
+-3888RY
+T5
+'** -1877 +7988GI -0064KA +7675FU -6446KA +0071HI -7261GI +0056KY -5465GI +8291UM
++7988GI
+T8
+'** -1801 H-7988\8bâ  \97³\8eæ H-64\8ap\91Å       S375\94ò\91Å       H-6446\8ap  \97³\8eæ H-7585\94ò  \8cj\8eæ F-81\94ò\91Å       
+-0064KA
+T5
+'** -1934 +7675FU -6446KA +1918KI -0069HI +0079KE -6967RY +7967KE -4657UM +0071HI
++8685OU
+T10
+'** -999999999 S48685\89¤  \8cj\8eæ H-6446\8ap  \97³\8eæ H-71\94ò\91Å       S06261\8bà       H-7191\94ò\90¬\8d\81\8eæ h-4619\8ap\90¬\8bà\8eæ SG62\95à\91Å       H-65\94ò\91Å       S38594\89¤  \95à\8eæ 
+-0084FU
+T20
+'** -3343 +8584OU -6446KA +8291UM -4619UM +0083KY -0069HI +0034FU -1929UM +6756KI -6989RY +3433TO
++8584OU
+T12
+'** 2123   8584\89¤  \95à\8eæ h-6446\8ap  \97³\8eæ H-71\94ò\91Å       S06261\8bà       H-7161\94ò\90¬     at7261\8bâ       H-8291\8ap\90¬\8d\81\8eæ h-4619\8ap\90¬     S88493\89¤       H-69\94ò\91Å       
+-6446KA
+T1
+'** -3253 +8291UM -0083HI +8494OU -4619UM +0085KY -0093FU +9495OU -1964UM +0086KE
++0071HI
+T12
+'** -2129 H-71\94ò\91Å       S06261\8bà       H-7161\94ò\90¬     at7261\8bâ       H-8291\8ap\90¬\8d\81\8eæ S369\94ò\91Å       H-79\8cj\91Å       mc6919\94ò\90¬\8bà\8eæ mc8494\89¤  \95à\8eæ me16\95à\8eæ       
+-6261KI
+T1
+'** -3335 +7191RY -4619UM +0075KE -0081KI +0062FU -0064HI +8493OU -6162KI +0066KY
++7191RY
+T15
+'** -999999999 H-7191\94ò\90¬\8d\81\8eæ SB4619\8ap\90¬\8bà\8eæ S39194\97³  \95à\8eæ S264\94ò\91Å       S38495\89¤       H-83\8bà\91Å       
+-4619UM
+T4
+'** -3014 +0075KE -0081KI +9181RY -7281GI +8291UM -8172GI +8493OU -1955UM +0084KE
++0075KE
+T8
+'** -2554 ST75\8cj\91Å       SA69\94ò\91Å       S362\95à\91Å       H-5162\89¤  \95à\8eæ SL66\8cj\91Å       H-5465\8bâ       mc8494\89¤  \95à\8eæ mc6967\94ò\90¬\8bà\8eæ 
+-0081KI
+T12
+'** -3031 +9181RY -7281GI +8291UM -8172GI +0066KE -0064HI +0074KY -7374FU +6654KE
++9181RY
+T11
+'** -2516 h-9181\97³  \8bà\8eæ H-7281\8bâ  \97³\8eæ H-8291\8ap\90¬     S569\94ò\91Å       a29181\94n  \8bâ\8eæ H-64\94ò\91Å       S48493\89¤       
+-7281GI
+T20
+'** -3284 +8291UM -6171KI +0066KY -8182GI +9182UM -7182KI +8485OU -7374FU +8586OU
++8291UM
+T1
+'** -999999999 H-8291\8ap\90¬     h-64\94ò\91Å       S38493\89¤       a26467\94ò\90¬\8bà\8eæ H-9181\94n  \8bâ\8eæ H-71\8bà\91Å       
+-8172GI
+T7
+'** -3171 +0056KY -1964UM +8494OU -0069HI +5654KY -6967RY +0056KY
++8493OU
+T10
+'** -2820 S58493\89¤       S718\94ò\91Å       H-8897\8bâ       H-7374\95à       H-9119\94n  \94n\8eæ 
+-0069HI
+T6
+'** -3053 +0084KE -6967RY +0082KI -0071KI +8472NK -6172KI +7583NK
++0034FU
+T15
+'** -2697 H-34\95à\91Å       H-3345\8cj       H-79\8cj\91Å       SJ78\94ò\91Å       S43433\95à\90¬     H-3233\8bà  \82Æ\8eæ SF9394\89¤  \95à\8eæ 
+-6967RY
+T4
+'** -3325 +3433TO -3233KI +0034FU -3334KI +0084KE -0081KI +8472NK -8172KI +0084KE
++3433TO
+T15
+'** -2718 H-3433\95à\90¬\8cj\8eæ H-3233\8bà  \82Æ\8eæ S336\8d\81\91Å       h-34\95à\91Å       H-21\8bà\91Å       Es3132\8bâ       H-2131\8bà  \8bâ\8eæ 
+-3233KI
+T4
+'** -3077 +0084KE -0081KI +8472NK -8191KI +7261NK -5142OU +0051GI -4232OU +0082KI -9182KI
++0056KY
+T5
+'** -2693 SF56\8d\81\91Å       SE6764\97³       S336\8d\81\91Å       H-34\95à\91Å       H-9392\89¤       
+-0081KI
+T6
+'** -4481 +9181UM -7281GI +7583NK -6764RY +5654KY -0071KA +0082KI
++9181UM
+T11
+'** -3376 H-9181\94n  \8bà\8eæ H-7281\8bâ  \94n\8eæ H-5654\8d\81  \8bâ\8eæ H-92\94ò\91Å       S09384\89¤       
+-7281GI
+T9
+'** -4840 +7583NK -0091HI +0092KI -8192GI +8392NK -0084KA +9383OU -1964UM +0075GI -6465UM
++0084KE
+T1
+'** -4178 Sg84\8cj\91Å       H-91\94ò\91Å       S092\8d\81\91Å       H-71\8ap\91Å       S19394\89¤  \95à\8eæ 
+-0071KA
+T11
+'** -5200 +9394OU -6776RY +0083KI -0092FU +8492NK -7675RY +0085KI
++9394OU
+T15
+'** -999999999 H-9394\89¤  \95à\8eæ S091\94ò\91Å       S092\8d\81\91Å       H-8192\8bâ       at8492\8cj\90¬     H-9192\94ò  \8d\81\8eæ S39483\89¤       
+-6776RY
+T1
+'** -6246 +7583NK -0093FU +8393NK -0092FU +8492NK -8192GI +0085KE
++7583NK
+T15
+'** -5428 H-7583\8cj\90¬     h-93\95à\91Å       at8393NK  \95à\8eæ at7193\8ap  NK\8eæ SJ83\8d\81\91Å       H-82\8cj\91Å       at8382\8d\81\90¬\8cj\8eæ 
+-0093FU
+T7
+'** -7743 +8393NK -7193KA +0082KY -8182GI +0085KI -9384KA +8584KI
++8393NK
+T7
+'** -999999999 H-8393NK  \95à\8eæ H-7193\8ap  NK\8eæ H-83\8d\81\91Å       H-82\8cj\91Å       at8382\8d\81\90¬     H-7674\97³       H-95\8bà\91Å       H-8182\8bâ  \88Ç\8eæ mc5654\8d\81  \8bâ\8eæ mc9384\8ap  \8cj\8eæ me84\8ap\8eæ       
+-7193KA
+T2
+'** -246840 +9493OU -0092FU +8492NK -7685RY +0083KA -6172KI +8372UM -8172GI
++9493OU
+T11
+'** -51230 S09493\89¤  \8ap\8eæ H-92\95à\91Å       at8492\8cj\90¬     SO7674\97³       H-41\8bà\91Å       S05141\89¤  \8bà\8eæ 
+-7674RY
+T9
+'** -374948 +0041KI -5141OU +0042FU -3142GI
++0094KI
+T15
+'** -999999999 H-94\8bà\91Å       h-92\95à\91Å       at8492\8cj\90¬\95à\8eæ at8192\8bâ  NK\8eæ S09392\89¤  \8bâ\8eæ H-7494\97³  \8bà\8eæ S393\8bâ\91Å       H-6171\8bà       H-41\8bà\91Å       
diff --git a/test/trunk/csa/oute_sennichite.csa b/test/trunk/csa/oute_sennichite.csa
new file mode 100644 (file)
index 0000000..e5bec3d
--- /dev/null
@@ -0,0 +1,302 @@
+V2
+N+test
+N-gps
+$EVENT:wdoor+gps-1500-0+test+gps+20070822031740
+$START_TIME:2007/08/22 03:17:40
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  * -KA * 
+P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
+P8 * +KA *  *  *  *  * +HI * 
+P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
++
++7776FU
+T1
+-3334FU
+T1
+'** 0
++2726FU
+T1
+-8384FU
+T1
+'** 0
++2625FU
+T1
+-8485FU
+T1
+'** 0
++6978KI
+T1
+-4132KI
+T1
+'** 0
++2524FU
+T1
+-2324FU
+T1
+'** 0
++2824HI
+T1
+-8586FU
+T1
+'** 0
++8786FU
+T1
+-8286HI
+T1
+'** 0
++2434HI
+T1
+-2233KA
+T1
+'** 0
++3436HI
+T1
+-3122GI
+T1
+'** 0
++0087FU
+T1
+-8685HI
+T1
+'** 0
++3626HI
+T1
+-5141OU
+T1
+'** 0
++5968OU
+T1
+-7162GI
+T1
+'** 0
++3938GI
+T1
+-6151KI
+T1
+'** 0
++3736FU
+T1
+-7374FU
+T1
+'** 0
++2937KE
+T1
+-8173KE
+T1
+'** 0
++4746FU
+T1
+-0086FU
+T22
+'** 59 +2624HI -8687TO +0023FU -3388UM +7888KI -8788TO +2322TO -3233KI +0023FU -3324KI
++8786FU
+T1
+-8586HI
+T29
+'** 249 +8833UM -2133KE +0087FU -8676HI +3635FU -0025FU +3725KE -3325KE +0077FU -7675HI
++3745KE
+T35
+-3388UM
+T17
+'** 153 +7988GI -0044KA +0087FU -8676HI +0077FU -7646HI +2625HI -7365KE
++7988GI
+T1
+-0044KA
+T36
+'** -19 +0087FU -8676HI +2625HI -0037FU +3847GI -4488UM +8977KE -8878UM
++0087FU
+T45
+-8676HI
+T1
+'** -185 +0035KA -4488UM +7888KI -0079GI +6858OU -7988NG +4553NK -4131OU
++0035KA
+T37
+-0037FU
+T21
+'** -240 +3847GI -4488UM +0077FU -8889UM +7776FU -0044GI +0023FU -2231GI
++3544KA
+T47
+-4344FU
+T15
+'** -321 +0066KA -3738TO +0023FU -3849TO +5756FU -0095KA +6677KA -0025FU
++3837GI
+T1
+-4445FU
+T37
+'** -333 +0077FU -7675HI +0023FU -2223GI +0043KA -0031KE +6869OU -0047KA +6979OU -4765UM
++8877GI
+T37
+-7675HI
+T15
+'** -387 +0066KA -0023FU +6675KA -7475FU +0081HI -4546FU +3746GI -0034KE
++0066KA
+T1
+-0023FU
+T18
+'** -439 +6675KA -7475FU +0081HI -4546FU +3746GI -0034KE +8191RY -3426KE
++6675KA
+T37
+-7475FU
+T31
+'** -521 +0081HI -4546FU +3746GI -0034KE +8191RY -3426KE %PASS -4152OU
++0081HI
+T1
+-4546FU
+T19
+'** -687 +3746GI -0034KE +2625HI -2133KE +2575HI -3446KE +6879OU -0076FU
++0074FU
+T41
+-7365KE
+T17
+'** -991 +7473TO -6273GI +8191RY -4647TO +3728GI -6577NK +7877KI -0076KE
++7473TO
+T1
+-6273GI
+T21
+'** -1008 +8191RY -4647TO +3728GI -6577NK +7877KI -0076KE
++8191RY
+T1
+-4647TO
+T36
+'** -1168 +3728GI -6577NK +7877KI -0076KE +7776KI -7576FU +0074FU -4757TO
++0035KY
+T1
+-0033FU
+T34
+'** -1812 +3748GI -0046KA +0074FU -7362GI +4847GI -6557NK
++7766GI
+T41
+-0076KE
+T22
+'** -2268 +6869OU -4737TO %PASS -0047KA
++6879OU
+T47
+-6557NK
+T14
+'** -2706 +2628HI -0048FU +4959KI -0068KA
++6657GI
+T49
+-4757TO
+T15
+'** -4264 +2628HI -0088KA
++4959KI
+T1
+-0088GI
+T17
+'** -4342 +7888KI -0068KA +7978OU -6859UM
++7969OU
+T25
+-0047KA
+T132
+'** -7093 +0058KE -8889GI +0074FU -8978NG
++0058FU
+T39
+-8889GI
+T66
+'** -5593 +0042FU -3242KI +9151RY -4151OU +0077KI -8978NG
++0042FU
+T1
+-3242KI
+T15
+'** -248084 +7877KI -0056KE +7776KI -0078KA +6979OU -7887UM
++7877KI
+T2
+-0055KA
+T52
+'** -250796 +0034KE -3334FU +7776KI -7576FU +9151RY -4151OU +0061KI -5161OU
++0043KE
+T65
+-4243KI
+T16
+'** -251150 +9151RY -4151OU +0061KI -5152OU +6162KI -7362GI
++9151RY
+T1
+-4151OU
+T13
+'** -251337 +0052KI -5152OU
++0042KI
+T5
+-5142OU
+T1
+'** -254340 +3533NY -4333KI +0043FU -4232OU +2623RY -2223GI +4342TO -3242OU +0043FU -3343KI
++3533NY
+T64
+-4333KI
+T1
+'** -255125 +0043FU -4232OU +2623RY -3223OU +0024FU -2334OU +3635FU -3435OU +3726GI -3536OU +2637GI -5537UM
++0043FU
+T64
+-4232OU
+T1
+'** -254931 +2623RY -3223OU +0024FU -2334OU +3635FU -3435OU +3726GI -3546OU +2635GI -4635OU
++2623RY
+T64
+-3223OU
+T1
+'** -255125 +0024FU -2334OU +3635FU -3435OU +3726GI -3524OU +2615GI -2415OU +1716FU -1524OU
++0024FU
+T62
+-2334OU
+T1
+'** -255412 +3635FU -3445OU +3736GI -4544OU +3645GI -4435OU +4544GI -3524OU +4435GI -2423OU +3534GI -3334KI
++3635FU
+T62
+-3435OU
+T1
+'** -256221 +3726GI -3546OU +2635GI -4637OU +5948KI -5748TO +3526GI -3728OU +2637GI -5537KA
++3726GI
+T62
+-3546OU
+T1
+'** -256221 +2635GI -4637OU +5948KI -5748TO +3546GI -3726OU +4635GI -2635OU
++2637GI
+T56
+-4635OU
+T1
+'** -488281
++3726GI
+T57
+-3546OU
+T1
+'** -488281
++2637GI
+T57
+-4635OU
+T1
+'** -488281
++3746GI
+T34
+-3526OU
+T1
+'** -256337 +4635GI -2637OU +5948KI -5748TO +3526GI -3728OU +2637GI -5537UM
++4635GI
+T34
+-2637OU
+T1
+'** -257278 +5948KI -5748TO +3546GI -3728OU +4637GI -2819OU +3728GI -5528UM
++3526GI
+T34
+-3746OU
+T1
+'** -488281
++2637GI
+T34
+-4635OU
+T1
+'P1 *  *  *  *  *  *  * -KE-KY
+'P2 *  *  *  *  *  *  * -GI * 
+'P3-FU * -GI-FU-FU+FU-KI * -FU
+'P4 *  *  *  *  *  *  * +FU * 
+'P5 *  * -FU * -KA *  *  *  * 
+'P6 *  * -KE *  * -OU *  *  * 
+'P7+FU+FU+KI+FU-TO-KA+GI * +FU
+'P8 *  *  *  * +FU *  *  *  * 
+'P9+KY-GI * +OU+KI *  *  * +KY
+'P-00FU00FU00FU00FU00FU00HI00HI00KE00KE00KI00KY
+'+
+'summary:sennichite:gps draw:test draw
+'$END_TIME:2007/08/22 03:51:08
diff --git a/test/trunk/csa/uchifuzume.csa b/test/trunk/csa/uchifuzume.csa
new file mode 100644 (file)
index 0000000..a00d8b5
--- /dev/null
@@ -0,0 +1,339 @@
+V2
+N+usapyon-on-note
+N-KShogi900
+$EVENT:wdoor+floodgate-900-0+usapyon-on-note+KShogi900+20080217020012
+$START_TIME:2008/02/17 02:00:08
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  * -KA * 
+P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
+P8 * +KA *  *  *  *  * +HI * 
+P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
++
++2726FU
+T1
+'** 0 joseki
+-4132KI
+T1
+'** 0 
++7776FU
+T1
+'** 0 joseki
+-3334FU
+T1
+'** 0 
++6978KI
+T1
+'** 0 joseki
+-5354FU
+T1
+'** 0 
++2625FU
+T1
+'** 0 joseki
+-5455FU
+T1
+'** 0 
++3948GI
+T1
+'** 0 joseki
+-2233KA
+T1
+'** 0 
++7968GI
+T1
+'** 0 joseki
+-7162GI
+T1
+'** 0 
++5969OU
+T1
+'** 0 joseki
+-6253GI
+T1
+'** 0 
++4958KI
+T1
+'** 0 joseki
+-5354GI
+T1
+'** 0 
++6766FU
+T1
+'** 0 joseki
+-3142GI
+T1
+'** 0 
++4746FU
+T1
+'** 0 joseki
+-8384FU
+T1
+'** 0 
++4847GI
+T1
+'** 0 joseki
+-8485FU
+T1
+'** 0 
++6867GI
+T1
+'** 0 joseki
+-8586FU
+T1
+'** 0 
++8786FU
+T1
+'** 0 joseki
+-8286HI
+T1
+'** 0 
++0087FU
+T1
+'** 0 joseki
+-8682HI
+T1
+'** 0 
++3736FU
+T1
+'** 0 joseki
+-4344FU
+T1
+'** 0 
++2937KE
+T1
+'** 0 joseki
+-4243GI
+T1
+'** 0 
++9796FU
+T1
+'** 0 joseki
+-6364FU
+T1
+'** 0 
++6979OU
+T1
+'** 0 joseki
+-5141OU
+T1
+'** 0 
++1716FU
+T1
+'** 0 joseki
+-1314FU
+T1
+'** 0 
++5868KI
+T1
+'** 0 joseki
+-7374FU
+T15
+'** -21 -7374FU +8877KA -8173KE +2858HI -7385KE +7795KA -8283HI +5756FU -9394FU +9586KA -3342KA
++5756FU
+T15
+'** 95 H-5756\95à       H-5556\95à  \95à\8eæ H-8897\8ap       F-3342\8ap       S26756\8bâ  \95à\8eæ H-5463\8bâ       S54758\8bâ       
+-5556FU
+T15
+'** -30 -5556FU +8877KA -8173KE +6756GI -0055FU +5667GI -7385KE +7795KA -6162KI +9586KA -6263KI +6869KI -9394FU
++2858HI
+T1
+'** 32 H-2858\94ò       F-3342\8ap       H-8877\8ap       H-4131\89¤       H-4756\8bâ  \95à\8eæ S288\95à\91Å       
+-1415FU
+T34
+'** -13 -1415FU +8897KA -1516FU +9764KA -8292HI +0018FU -6152KI +6497KA -3342KA +9742UM -5242KI +4756GI -9394FU
++1615FU
+T15
+'** -999999999 H-1615\95à  \95à\8eæ h-9394\95à       F-8897\8ap       H-3342\8ap       S24756\8bâ  \95à\8eæ F-4131\89¤       
+-0016FU
+T25
+'** 4 -0016FU +4756GI -1115KY +0018FU -3435FU +0055FU -5463GI +5647GI -3536FU +4736GI -8173KE
++8897KA
+T10
+'** 205 h-8897\8ap       H-3315\8ap  \95à\8eæ H-1916\8d\81  \95à\8eæ H-1537\8ap\90¬\8cj\8eæ H-1611\8d\81\90¬\8d\81\8eæ H-3747\94n  \8bâ\8eæ H-1121\88Ç  \8cj\8eæ S84151\89¤       H-9764\8ap  \95à\8eæ mc4758\94n  \94ò\8eæ mc6758\8bâ  \94n\8eæ 
+-3342KA
+T30
+'** 68 -3342KA +1916KY -9394FU +0053FU -8262HI +5818HI -9495FU +1514FU -9596FU
++1916KY
+T15
+'** -999999999 H-1916\8d\81  \95à\8eæ S24352\8bâ       F-5856\94ò  \95à\8eæ S23243\8bà       H-5658\94ò       H-8173\8cj       
+-9394FU
+T12
+'** 47 -9394FU +0053FU -8262HI +4756GI -3435FU +5647GI -3536FU +4736GI -9495FU +4645FU -9596FU
++4756GI
+T15
+'** 456 S24756\8bâ  \95à\8eæ SR3435\95à       S55647\8bâ       F-3536\95à  \95à\8eæ H-4736\8bâ  \95à\8eæ H-4131\89¤       
+-9495FU
+T16
+'** 71 -9495FU +0053FU -0088FU +9788KA -9596FU +4645FU -4253KA +7969OU -6152KI +0055FU -5463GI
++6665FU
+T15
+'** 435 H-6665\95à       SZ3435\95à       S85647\8bâ       h-3536\95à  \95à\8eæ H-4736\8bâ  \95à\8eæ F-88\95à\91Å       mc9788\8ap  \95à\8eæ mc9596\95à  \95à\8eæ 
+-9596FU
+T20
+'** -49 -9596FU +9764KA -4264KA +6564FU -9697TO +9997KY -9197NY +8997KE -0096FU +0086KY -0083KY +8683NY -9697TO
++9764KA
+T15
+'** 529 H-9764\8ap  \95à\8eæ H-4264\8ap  \8ap\8eæ at6564\95à  \8ap\8eæ H-27\8ap\91Å       h-6463\95à\90¬     H-57\95à\91Å       H-5857\94ò  \95à\8eæ 
+-4264KA
+T2
+'** -56 -4264KA +6564FU -9697TO +9997KY -9197NY +8997KE -0096FU +0055FU -9697TO +5554FU -9787TO +0063KA -4131OU +0088FU -8778TO
++6564FU
+T12
+'** 90 H-6564\95à  \8ap\8eæ H-49\8ap\91Å       S238\8ap\91Å       H-4958\8ap\90¬\94ò\8eæ H-6758\8bâ  \94n\8eæ S119\94ò\91Å       S05849\8bâ       mc1115\8d\81  \95à\8eæ mc6463\95à\90¬     me63\82Æ\8eæ       
+-0049KA
+T23
+'** -1 -0049KA +0055FU -4958UM +6858KI -9697TO +8997KE -0057FU +5859KI -9197NY
++5859HI
+T1
+'** 133 S85859\94ò       H-4938\8ap\90¬     H-55\95à\91Å       S788\95à\91Å       f-5554\95à  \8bâ\8eæ S18889\95à\90¬\8cj\8eæ S07989\89¤  \82Æ\8eæ H-3837\94n  \8cj\8eæ 
+-4938UM
+T13
+'** -17 -4938UM +0055FU -3837UM +5957HI -3746UM +0042FU -3242KI +5554FU -0088FU +0063KA
++0055FU
+T1
+'** 111 H-55\95à\91Å       H-88\95à\91Å       S27988\89¤       H-3837\94n  \8cj\8eæ F-5554\95à  \8bâ\8eæ h-3759\94n  \94ò\8eæ H-5453\95à\90¬     H-18\94ò\91Å       
+-3837UM
+T16
+'** -58 -3837UM +5957HI -3748UM +5554FU -0086FU +8786FU -4857UM +6857KI -4354GI +0055FU
++5957HI
+T15
+'** -999999999 H-5957\94ò       H-3746\94n  \95à\8eæ H-5554\95à  \8bâ\8eæ H-4657\94n  \94ò\8eæ S342\95à\91Å       at3242\8bà  \95à\8eæ H-6857\8bà  \94n\8eæ F-4354\8bâ  \95à\8eæ 
+-3748UM
+T2
+'** -43 -3748UM +5554FU -0086FU +8786FU -4857UM +6857KI -4354GI +0055FU -0049HI +7968OU -0066FU +6758GI -4989RY +5554FU -8286HI +5453TO -8676HI
++5554FU
+T15
+'** -223 H-5554\95à  \8bâ\8eæ H-4857\94n  \94ò\8eæ at6857\8bà  \94n\8eæ S219\94ò\91Å       S569\8bâ\91Å       H-88\95à\91Å       H-63\8ap\91Å       S04352\8bâ       
+-0086FU
+T2
+'** 35 -0086FU +8786FU -4354GI +0055FU -4857UM +6857KI -0049HI +0069GI -0068FU +7968OU -8286HI +5554FU -4948RY +5758KI
++5453TO
+T13
+'** 10 S35453\95à\90¬     H-8687\95à\90¬\95à\8eæ h-63\8ap\91Å       S152\95à\91Å       a25343\82Æ  \8bâ\8eæ H-3243\8bà  \82Æ\8eæ 
+-8687TO
+T12
+'** -263 -8687TO +0085FU -4857UM +6857KI -0059HI +7968OU -5989RY +0063KA -0052FU +7879KI -8999RY +6374UM -9998RY +0078GI -8778TO
++5343TO
+T1
+'** 416 S75343\82Æ  \8bâ\8eæ H-3243\8bà  \82Æ\8eæ H-6463\95à\90¬     mc9697\95à\90¬     mc8997\8cj  \82Æ\8eæ me97\8cj\8eæ       
+-8778TO
+T23
+'** -351 -8778TO +7978OU -0088KI +7869OU -3243KI +2524FU -8889KI +5758HI -4858UM +6958OU -0038HI +0048GI -0057FU +5857OU -8288RY +0063KA -4132OU +6374UM -3836RY
++6778GI
+T15
+'** -999999999 H-6778\8bâ  \82Æ\8eæ H-88\8bà\91Å       S07969\89¤       H-3243\8bà  \82Æ\8eæ H-6463\95à\90¬     F-8889\8bà  \8cj\8eæ 
+-0088KI
+T18
+'** -500 -0088KI +7969OU -3243KI +0063KA -4131OU +0054GI -4857UM +6857KI -8878KI +6978OU -0088HI +7867OU -8287RY +8977KE -8878RY
++7969OU
+T1
+'** 1730   7969\89¤       H-3243\8bà  \82Æ\8eæ H-6463\95à\90¬     S066\8cj\91Å       H-7867\8bâ       S08287\94ò\90¬     
+-3243KI
+T24
+'** -487 -3243KI +0063KA -0052FU +0054GI -0087KE +7887GI -8287RY +0032GI -4132OU
++6463TO
+T1
+'** -1350 H-6463\95à\90¬     S386\8cj\91Å       H-52\8bâ\91Å       at6152\8bà  \8bâ\8eæ 
+-4857UM
+T15
+'** -701 -4857UM +6857KI -8878KI +6978OU -0088HI +7867OU -8287RY +0077GI -0068GI +0052GI -6152KI +6352TO -4152OU +0064KA -8778RY +6766OU -6857GI +6657OU
++6857KI
+T13
+'** -2519 h-6857\8bà  \94n\8eæ H-79\94ò\91Å       S06958\89¤       H-7978\94ò\90¬\8bâ\8eæ S068\95à\91Å       S38287\94ò\90¬     H-67\8ap\91Å       mc7889\97³  \8cj\8eæ mc6789\8ap  \97³\8eæ me89\8ap\8eæ       
+-8878KI
+T1
+'** -656 -8878KI +6978OU -0088HI +7867OU -8287RY +0077GI -0068GI +0052GI -6152KI +6352TO -4152OU +0064KA -8778RY +6766OU -6857GI +6657OU
++6978OU
+T15
+'** -999999999 H-6978\89¤  \8bà\8eæ S788\94ò\91Å       S07867\89¤       h-8287\94ò\90¬     S077\8bà\91Å       H-8889\94ò\90¬\8cj\8eæ H-68\8bâ\91Å       
+-0088HI
+T1
+'** -654 -0088HI +7869OU -0067FU +5667GI -8889RY +6958OU -8288RY +0078GI -0055KE
++7867OU
+T10
+'** -1181 H-7867\89¤       H-8287\94ò\90¬     S077\8bà\91Å       h-78\8bâ\91Å       S16766\89¤       S054\8cj\91Å       S16655\89¤       H-8785\97³       S17675\95à       
+-8287RY
+T17
+'** -641 -8287RY +0077KI -8878RY +6766OU -7868RY +5767KI -0065FU +5665GI -8777RY
++0077KI
+T1
+'** -1600 H-77\8bà\91Å       S38878\94ò\90¬     S06766\89¤       S054\8cj\91Å       S06655\89¤       H-8785\97³       S065\95à\91Å       
+-8878RY
+T17
+'** -595 -8878RY +6766OU -7868RY +5767KI -0065FU +5665GI -8777RY +8977KE -0057GI +6656OU -0055FU
++6766OU
+T1
+'** 971   6766\89¤       SB7869\97³       S35767\8bà       H-54\8cj\91Å       S16657\89¤       
+-7868RY
+T17
+'** -594 -7868RY +7767KI -0054KE +6655OU -6857RY +6757KI -8757RY +0052GI -6152KI
++5767KI
+T12
+'** -1232 H-5767\8bà       H-57\8bâ\91Å       S16665\89¤       H-8785\97³       S175\8bâ\91Å       H-6869\97³       
+-0057GI
+T14
+'** -722 -0057GI +6665OU -0073KE +6373TO -8173KE +6574OU -6867RY +0086FU -6756RY +0032GI -4132OU +7787KI -5665RY +7473OU
++6655OU
+T1
+'** -48138 H-6655\89¤       H-8777\97³  \8bà\8eæ S252\8ap\91Å       S34142\89¤       H-5243\8ap\90¬\8bà\8eæ S76152\8bà       
+-0054FU
+T14
+'** -1493 -0054FU +5564OU -8783RY +0052GI -6152KI +6352TO -4152OU +0061GI -5261OU
++5565OU
+T13
+'** -3584 H-5565\89¤       H-8785\97³       S275\8ap\91Å       H-7475\95à       at7675\95à  \95à\8eæ S174\8ap\91Å       S06564\89¤       mc7463\8ap  \82Æ\8eæ mc6463\89¤  \8ap\8eæ me89\8cj\8eæ       
+-8785RY
+T1
+'** -30000 -8785RY +0075GI -6867RY +7767KI -0064FU +6364TO -0073KE +6473TO -8173KE +6564OU -0063FU +6473OU
++0075GI
+T14
+'** -999999999 H-75\8bâ\91Å       H-6867\97³  \8bà\8eæ at7767\8bà  \97³\8eæ S173\8cj\91Å       S16564\89¤       H-7475\95à  \8bâ\8eæ H-52\8bâ\91Å       
+-6867RY
+T1
+'** -30000 -6867RY +7767KI -0064FU +6364TO -0073KE +6473TO -8173KE +6564OU -0063FU +6473OU
++0066KA
+T14
+'** -9874260 S566\8ap\91Å       S064\95à\91Å       
+-0064FU
+T1
+'** -30000 -0064FU +6364TO -5766NG +7766KI -0073KE +6473TO -8173KE +6564OU -0053KI +6473OU
++6564OU
+T1
+'** -9874802 H-6564\89¤  \95à\8eæ 
+-0072KE
+T1
+'** -30000 -0072KE +6372TO -0053KI +6465OU -0064FU +7564GI
++6372TO
+T1
+'** -9874786 H-6372\82Æ  \8cj\8eæ 
+-0053KI
+T1
+'** -30000 -0053KI +6465OU -5766NG +7766KI -0064FU +7564GI
++6465OU
+T15
+'** 377   6465\89¤       H-6777\97³  \8bà\8eæ H-32\8bâ\91Å       S04132\89¤       H-24\8cj\91Å       mc6766\97³  \8bà\8eæ mc7261\82Æ  \8bà\8eæ me75\8bâ\8eæ       
+-5766NG
+T1
+'** -30000 -5766NG +7766KI -0064FU +7564GI
++7766KI
+T1
+'** -2810   7766\8bà  \91S\8eæ 
+'P1-KY-KE * -KI * -OU * -KE-KY
+'P2 *  * +TO *  *  *  *  *  * 
+'P3 *  *  *  * -KI-KI * -FU * 
+'P4 *  * -FU * -FU-FU-FU *  * 
+'P5 * -RY+GI+OU *  *  * +FU+FU
+'P6-FU * +FU+KI+GI+FU+FU * +KY
+'P7 *  *  * -RY *  *  *  *  * 
+'P8 *  *  *  *  *  *  *  *  * 
+'P9+KY+KE *  *  *  *  *  *  * 
+'P+00FU00FU00FU00FU00FU00GI00GI00KA00KE
+'P-00FU00KA
+'+
+'summary:uchifuzume:KShogi900 lose:usapyon-on-note win
+'rating:usapyon-on-note+0c6049789d5fa11db9785155258b93b5:KShogi900+d0426ce2e69157611ba5e225f4a92d11
+'$END_TIME:2008/02/17 02:12:10
diff --git a/test/trunk/players.yaml b/test/trunk/players.yaml
new file mode 100644 (file)
index 0000000..46995ee
--- /dev/null
@@ -0,0 +1,2094 @@
+--- 
+players: 
+  5: 
+    gps2_rg+6a8be1bf7a75b6f75ee31f8c1c0c489a: 
+      last_modified: 2008-05-04 12:19:51 +09:00
+      name: gps2_rg
+      rate: 1051.0
+      win: 12.0
+      loss: 8.0
+      rating_group: 5
+    gps2+2dd0aa2d841f508edc69bb113f70642b: 
+      last_modified: 2008-05-04 12:19:51 +09:00
+      name: gps2
+      rate: 981.0
+      win: 45.8602477491377
+      loss: 51.7974713434314
+      rating_group: 5
+    gps2_k7p+5426a28d8a75cd7ed662b2090ca881c9: 
+      last_modified: 2008-05-01 03:37:26 +09:00
+      name: gps2_k7p
+      rate: 1051.0
+      win: 11.8352784293642
+      loss: 7.89360618372286
+      rating_group: 5
+    gps2_k7p4+e5f61cad57b66e6483b0ac3933564168: 
+      last_modified: 2008-05-03 08:03:56 +09:00
+      name: gps2_k7p4
+      rate: 897.0
+      win: 8.0
+      loss: 13.0
+      rating_group: 5
+    gps2_k7p2+fc2919b6df6578ce4b4a6a449fd73346: 
+      last_modified: 2008-05-01 23:28:07 +09:00
+      name: gps2_k7p2
+      rate: 1036.0
+      win: 10.9621929140671
+      loss: 7.96664156541485
+      rating_group: 5
+    gps2_k7p3+2ee3afcc1fda4ce87023a575102da0b5: 
+      last_modified: 2008-05-02 15:35:04 +09:00
+      name: gps2_k7p3
+      rate: 981.0
+      win: 9.0
+      loss: 9.0
+      rating_group: 5
+  11: 
+    gps3_p+dea40e920b32ad920881f840ca1fecf0: 
+      last_modified: 2008-05-04 23:45:59 +09:00
+      name: gps3_p
+      rate: 926.0
+      win: 6.0
+      loss: 14.0
+      rating_group: 11
+    gps3_pke7+a8472716b65c248d7283308f8b085acc: 
+      last_modified: 2008-05-04 23:45:59 +09:00
+      name: gps3_pke7
+      rate: 1073.0
+      win: 14.0
+      loss: 6.0
+      rating_group: 11
+  0: 
+    gps_effect5x3func7+57ddcc5f075d66a422fc7037f92e91a1: 
+      last_modified: 2008-04-11 23:58:09 +09:00
+      name: gps_effect5x3func7
+      rate: 2894.0
+      win: 14.1843881597541
+      loss: 13.386632664677
+      rating_group: 0
+    gps_ppa2+6c5dc86d68f9130735e60b0fe9a2ea96: 
+      last_modified: 2008-05-02 13:11:30 +09:00
+      name: gps_ppa2
+      rate: 2840.0
+      win: 13.9897623400963
+      loss: 17.9879456013727
+      rating_group: 0
+    gps_do2+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-05-03 20:38:24 +09:00
+      name: gps_do2
+      rate: 2912.0
+      win: 53.986531798629
+      loss: 45.9909614051652
+      rating_group: 0
+    gps_cpu2+7641d40a2d4d4af7ddc9def42529ea9b: 
+      last_modified: 2008-04-02 16:29:35 +09:00
+      name: gps_cpu2
+      rate: 3114.0
+      win: 30.0789895320084
+      loss: 23.2771098034858
+      rating_group: 0
+    gps_cc3+9aff337746cbc96eccaef09f45a17765: 
+      last_modified: 2008-04-28 00:53:35 +09:00
+      name: gps_cc3
+      rate: 2936.0
+      win: 21.8292497973772
+      loss: 16.1510769520277
+      rating_group: 0
+    gps_lt3b+70dddf5a3ebd35efa71468c2e5e53691: 
+      last_modified: 2008-03-08 03:11:48 +09:00
+      name: gps_lt3b
+      rate: 2893.0
+      win: 10.5484879004933
+      loss: 10.0211511265367
+      rating_group: 0
+    spearCSA2008+417e7849a8ac94c94202e7d821db9b7e: 
+      last_modified: 2008-05-08 23:50:54 +09:00
+      name: spearCSA2008
+      rate: -2019.0
+      win: 27.0
+      last_game_win: true
+      loss: 12.0
+      rating_group: 0
+    tomi900+ff3ccfad330a8731a7a1100d2c081489: 
+      last_modified: 2008-02-14 23:24:09 +09:00
+      name: tomi900
+      rate: -2376.0
+      win: 8.10630245430416
+      loss: 13.8584073745703
+      rating_group: 0
+    gps_qtseeplus+223748d30f3f8b7efa3423de12a6bd96: 
+      last_modified: 2008-04-08 16:51:59 +09:00
+      name: gps_qtseeplus
+      rate: 2918.0
+      win: 16.7028105818679
+      loss: 13.6749889028838
+      rating_group: 0
+    Lesserkai+d800b2b8e356f4559ea3ba4519f11eff: 
+      last_modified: 2008-04-12 18:08:04 +09:00
+      name: Lesserkai
+      rate: -3035.0
+      win: 1.36585588490053
+      loss: 93.0862283848441
+      rating_group: 0
+    gps_qtseemc+1706abae91c059ba3ffed3dc9c9cfe1d: 
+      last_modified: 2008-04-05 15:57:36 +09:00
+      name: gps_qtseemc
+      rate: 2763.0
+      win: 8.07708612911955
+      loss: 16.1424457840462
+      rating_group: 0
+    gps_pr8+5592a0e99b70a051fedcdbf5810334ef: 
+      last_modified: 2008-03-24 02:45:16 +09:00
+      name: gps_pr8
+      rate: 2950.0
+      win: 13.9539803665413
+      loss: 9.51999326841611
+      rating_group: 0
+    gps_normal+e293220e3f8a3e59f79f6b0efffaa931: 
+      last_modified: 2008-05-08 23:50:54 +09:00
+      name: gps_normal
+      rate: -1752.0
+      win: 3384.04877829976
+      loss: 906.949084230512
+      rating_group: 0
+    usapyon-on-note+0c6049789d5fa11db9785155258b93b5: 
+      last_modified: 2008-04-23 20:45:22 +09:00
+      name: usapyon-on-note
+      rate: -2375.0
+      win: 229.550829494412
+      loss: 672.106457095826
+      rating_group: 0
+    gps_cc+503016c7f3e9d55687099f632e7b7dff: 
+      last_modified: 2008-04-25 13:43:00 +09:00
+      name: gps_cc
+      rate: 2802.0
+      win: 9.23774550873844
+      loss: 14.8077130398311
+      rating_group: 0
+    gps_pp+1e5a182134af18b0c64843196e2b4e81: 
+      last_modified: 2008-05-07 22:52:24 +09:00
+      name: gps_pp
+      rate: 2866.0
+      win: 19.0
+      loss: 21.0
+      rating_group: 0
+    ssp+21f52837bcc36952291e3ca14b75c1e8: 
+      last_modified: 2008-04-30 20:48:33 +09:00
+      name: ssp
+      rate: -2535.0
+      win: 50.2719100204888
+      loss: 249.512660733661
+      rating_group: 0
+    imai+81dc9bdb52d04dc20036dbd8313ed055: 
+      last_modified: 2008-05-08 22:36:40 +09:00
+      name: imai
+      rate: -2301.0
+      last_game_win: false
+      win: 6.0
+      loss: 20.0
+      rating_group: 0
+    gps_tm+83f57ee9b210d4247a5ceb2e20bfbff8: 
+      last_modified: 2008-02-26 23:49:17 +09:00
+      name: gps_tm
+      rate: 2883.0
+      win: 8.89521993921137
+      loss: 8.90554984628389
+      rating_group: 0
+    gps_cpu4rs+b0530c15c38c0d10e4d1e3ac00dba352: 
+      last_modified: 2008-04-10 15:49:03 +09:00
+      name: gps_cpu4rs
+      rate: 3236.0
+      win: 15.5527424717879
+      loss: 14.7893992317924
+      rating_group: 0
+    gps_small_step_1+3eacd3587c056e61f7a34ac81b25f3a1: 
+      last_modified: 2008-04-28 23:22:30 +09:00
+      name: gps_small_step_1
+      rate: 2873.0
+      win: 15.352514288629
+      loss: 16.3427595653383
+      rating_group: 0
+    gps_newopening6_2dan+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-05-03 20:55:08 +09:00
+      name: gps_newopening6_2dan
+      rate: 2921.0
+      win: 56.9834509073819
+      loss: 45.987385502195
+      rating_group: 0
+    gps_kachi3+d4a19b7839aea28259fbb1071b5b352c: 
+      last_modified: 2008-04-29 20:47:48 +09:00
+      name: gps_kachi3
+      rate: 2910.0
+      win: 20.3186016436094
+      loss: 17.4368835954953
+      rating_group: 0
+    gps_mc+226caf236915aa9ae9a98b16514f9871: 
+      last_modified: 2008-04-03 19:11:21 +09:00
+      name: gps_mc
+      rate: 2939.0
+      win: 15.7890995446369
+      loss: 11.4835823075585
+      rating_group: 0
+    gps_kh+f034f70ba869796cd6f953d84e85b9b8: 
+      last_modified: 2008-05-02 10:22:31 +09:00
+      name: gps_kh
+      rate: 2872.0
+      win: 13.9825518506586
+      loss: 14.9874986816353
+      rating_group: 0
+    gps+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-05-08 23:31:31 +09:00
+      name: gps
+      rate: 2884.0
+      win: 1175.66739199111
+      loss: 1203.22715879058
+      rating_group: 0
+    gps_newopening4+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-04-30 12:38:10 +09:00
+      name: gps_newopening4
+      rate: 2810.0
+      win: 57.3861518936011
+      loss: 87.4893233925526
+      rating_group: 0
+    gps_qtsee2+076ea545a9d74230e053400d043993d9: 
+      last_modified: 2008-04-06 01:02:34 +09:00
+      name: gps_qtsee2
+      rate: 2973.0
+      win: 18.4240146179166
+      loss: 11.0372650659614
+      rating_group: 0
+    usa_test+0c6049789d5fa11db9785155258b93b5: 
+      last_modified: 2008-05-02 16:15:29 +09:00
+      name: usa_test
+      rate: -2303.0
+      win: 596.726845953427
+      loss: 1486.33022716432
+      rating_group: 0
+    Kakinoki-Test+89704a19dfaea78d699800e63bef0dea: 
+      last_modified: 2008-05-08 23:16:21 +09:00
+      name: Kakinoki-Test
+      rate: -1781.0
+      last_game_win: false
+      win: 1502.51399278973
+      loss: 570.847036100743
+      rating_group: 0
+    YSS+707d4f98d9d2620cdaab58f19d02a2e4: 
+      last_modified: 2008-04-07 08:51:42 +09:00
+      name: YSS
+      rate: -1529.0
+      win: 1012.14413170938
+      loss: 121.533527986877
+      rating_group: 0
+    Nanoha2008+667f27d411182c654c12a55edc01460b: 
+      last_modified: 2008-05-08 23:36:36 +09:00
+      name: Nanoha2008
+      rate: -2786.0
+      win: 3.0
+      last_game_win: false
+      loss: 62.0
+      rating_group: 0
+    misaki900+d9ffaac630ab2ae0e93674c1b505f1aa: 
+      last_modified: 2008-05-08 20:20:50 +09:00
+      name: misaki900
+      rate: -2293.0
+      win: 915.676971193636
+      loss: 1742.47270086152
+      rating_group: 0
+    tacos+282db3bc7edc88e4f182382c8b5cc147: 
+      last_modified: 2008-05-08 09:39:25 +09:00
+      name: tacos
+      rate: -1818.0
+      win: 657.754164439212
+      loss: 355.565692600649
+      rating_group: 0
+    gps_qtseeapp+ca8836c54b39c7fef557966e19a45c4b: 
+      last_modified: 2008-04-09 21:08:37 +09:00
+      name: gps_qtseeapp
+      rate: 2901.0
+      win: 16.1716844095597
+      loss: 14.6247159019338
+      rating_group: 0
+    KShogi900+d0426ce2e69157611ba5e225f4a92d11: 
+      last_modified: 2008-04-27 09:49:56 +09:00
+      name: KShogi900
+      rate: -1768.0
+      win: 387.398787408915
+      loss: 145.420571829785
+      rating_group: 0
+    gps_kh2+73cb40740074cde329b31fb6f7b0a2d1: 
+      last_modified: 2008-05-04 00:33:13 +09:00
+      name: gps_kh2
+      rate: 2839.0
+      win: 17.0
+      loss: 22.0
+      rating_group: 0
+    aleag1tst+3123059c1c816471780539f6b6b738dc: 
+      last_modified: 2008-05-01 20:10:26 +09:00
+      name: aleag1tst
+      rate: -2463.0
+      win: 9.48524456819644
+      loss: 29.9907372901062
+      rating_group: 0
+    coredump+8c0b2e8281d25adfb3a6bd4fdcae6e57: 
+      last_modified: 2008-05-02 11:00:08 +09:00
+      name: coredump
+      rate: -1984.0
+      win: 459.776797445082
+      loss: 337.429375313976
+      rating_group: 0
+    tomi900+fc9505d3dd1ebdd726ad7d2d1fc17c42: 
+      last_modified: 2008-02-17 18:24:33 +09:00
+      name: tomi900
+      rate: -2394.0
+      win: 16.6734844869228
+      loss: 41.0136210133544
+      rating_group: 0
+    gps_effect5x3const16+1268f1e5638290288bce86eabe09826c: 
+      last_modified: 2008-04-10 18:44:22 +09:00
+      name: gps_effect5x3const16
+      rate: 2904.0
+      win: 14.0017416718463
+      loss: 12.4685158739091
+      rating_group: 0
+    garyu+2e31d52fa05194cf8f2ad023ac572f09: 
+      last_modified: 2008-05-03 01:49:54 +09:00
+      name: garyu
+      rate: -2592.0
+      win: 97.261418788048
+      loss: 706.624377702383
+      rating_group: 0
+    gps1000+e293220e3f8a3e59f79f6b0efffaa931: 
+      last_modified: 2008-02-11 02:11:19 +09:00
+      name: gps1000
+      rate: -1837.0
+      win: 33.513467493493
+      loss: 12.472413919018
+      rating_group: 0
+    gps_exp5o8+ee125a193a2ba9c1bf4f662a87494c2e: 
+      last_modified: 2008-05-01 11:54:17 +09:00
+      name: gps_exp5o8
+      rate: 2873.0
+      win: 15.8338481766278
+      loss: 16.814632622013
+      rating_group: 0
+    yowai_gps+95908f6c18338f5340371f71523fc5e3: 
+      last_modified: 2008-05-08 02:10:38 +09:00
+      name: yowai_gps
+      rate: -2507.0
+      win: 225.669212529662
+      loss: 290.616556759499
+      rating_group: 0
+    MyMove900+94a2fb7f864ae656bdf9ed1d1dae3a3c: 
+      last_modified: 2008-05-08 23:53:26 +09:00
+      name: MyMove900
+      rate: -2253.0
+      last_game_win: true
+      win: 1360.66968921526
+      loss: 2363.83249839534
+      rating_group: 0
+    gps_newopening+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-03-24 12:46:27 +09:00
+      name: gps_newopening
+      rate: 2885.0
+      win: 286.317698576181
+      loss: 283.546448297247
+      rating_group: 0
+    YSS-1s+707d4f98d9d2620cdaab58f19d02a2e4: 
+      last_modified: 2008-02-25 12:10:26 +09:00
+      name: YSS-1s
+      rate: -1794.0
+      win: 65.3391219828853
+      loss: 10.0415273195652
+      rating_group: 0
+    gps800+e293220e3f8a3e59f79f6b0efffaa931: 
+      last_modified: 2008-02-20 11:45:21 +09:00
+      name: gps800
+      rate: -2037.0
+      win: 154.968017134351
+      loss: 112.015983590553
+      rating_group: 0
+    gps_pr8nrc+9c818a715439bb58038ea13860fa67a4: 
+      last_modified: 2008-03-28 03:28:28 +09:00
+      name: gps_pr8nrc
+      rate: 2983.0
+      win: 15.2870195536467
+      loss: 8.6458627298524
+      rating_group: 0
+    gps_s3+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-05-06 21:30:22 +09:00
+      name: gps_s3
+      rate: 2910.0
+      win: 63.0
+      loss: 54.0
+      rating_group: 0
+    gps_q5p30_2+b46f4b3b73dd9fe02be65a13fea11267: 
+      last_modified: 2008-05-01 13:31:31 +09:00
+      name: gps_q5p30_2
+      rate: 2923.0
+      win: 9.91954762752418
+      loss: 7.93089563712773
+      rating_group: 0
+    gps_pp2+1028f7b380e75bd54a5adb6de266e90d: 
+      last_modified: 2008-05-08 16:07:05 +09:00
+      name: gps_pp2
+      rate: 2825.0
+      win: 10.0
+      loss: 14.0
+      rating_group: 0
+    gps_newopening5_2dan+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-05-01 15:33:32 +09:00
+      name: gps_newopening5_2dan
+      rate: 2978.0
+      win: 30.7005284346696
+      loss: 17.8061733102248
+      rating_group: 0
+    cat18_on_note+1a3871214cdb95f2f7f9e2910c4cf3bb: 
+      last_modified: 2008-04-20 14:23:15 +09:00
+      name: cat18_on_note
+      rate: -2385.0
+      win: 158.469804422715
+      loss: 474.828163150174
+      rating_group: 0
+    gps_lt3+a62314b60359500f4974c756b04d98e8: 
+      last_modified: 2008-03-06 20:40:07 +09:00
+      name: gps_lt3
+      rate: 2876.0
+      win: 10.9114049440672
+      loss: 11.4125817038391
+      rating_group: 0
+    gps_ce2l+970196b4e4c872321da146e7afe8f298: 
+      last_modified: 2008-03-29 16:53:13 +09:00
+      name: gps_ce2l
+      rate: 2833.0
+      win: 8.12683984375216
+      loss: 10.8520014353578
+      rating_group: 0
+    gps_exp3o4+3066c53d1daa02af64e5590a2b0fc0d2: 
+      last_modified: 2008-05-01 11:45:01 +09:00
+      name: gps_exp3o4
+      rate: 2873.0
+      win: 14.8469848849175
+      loss: 15.8286221375783
+      rating_group: 0
+    misaki-on-note+d9ffaac630ab2ae0e93674c1b505f1aa: 
+      last_modified: 2008-02-18 13:45:41 +09:00
+      name: misaki-on-note
+      rate: -2409.0
+      win: 7.6867985801868
+      loss: 13.6426899212265
+      rating_group: 0
+    gps_qtsee2mc3+d891620d5f4f4e770f726dbbe471d04c: 
+      last_modified: 2008-04-07 03:52:09 +09:00
+      name: gps_qtsee2mc3
+      rate: 2919.0
+      win: 16.4187162582884
+      loss: 13.4225518156186
+      rating_group: 0
+    cat10+4bf1d145889d0e2410b76cefb149a404: 
+      last_modified: 2008-04-05 18:46:36 +09:00
+      name: cat10
+      rate: -2387.0
+      win: 149.082727062101
+      loss: 315.274052558195
+      rating_group: 0
+    gps_see+243d91f6c72383cf5892a6f8fbb434c1: 
+      last_modified: 2008-03-14 23:33:43 +09:00
+      name: gps_see
+      rate: 2902.0
+      win: 11.410682224614
+      loss: 10.2861901919957
+      rating_group: 0
+    gps_cpu4+1990ca8a73acba0401f325228d8c4f96: 
+      last_modified: 2008-04-29 06:53:19 +09:00
+      name: gps_cpu4
+      rate: 3227.0
+      win: 47.9581993943147
+      loss: 33.4593638353841
+      rating_group: 0
+    gps_open25+4d56adee9881b46fb4afbbd012927f77: 
+      last_modified: 2008-03-25 14:06:12 +09:00
+      name: gps_open25
+      rate: 2919.0
+      win: 14.200925757193
+      loss: 11.615577284037
+      rating_group: 0
+    gps_qtseeareaplus+5b9d8f9e83727e96205e14dadd591991: 
+      last_modified: 2008-04-08 13:24:48 +09:00
+      name: gps_qtseeareaplus
+      rate: 2954.0
+      win: 18.1971584089735
+      loss: 12.1262337391889
+      rating_group: 0
+    gps_kh3+d2663672168f8bb0598d79995b007685: 
+      last_modified: 2008-05-04 05:08:19 +09:00
+      name: gps_kh3
+      rate: 2884.0
+      win: 20.0
+      loss: 20.0
+      rating_group: 0
+    gps_np+3c3ed5c337e39d047bc524e8d8eb0c6b: 
+      last_modified: 2008-04-17 13:34:11 +09:00
+      name: gps_np
+      rate: 2864.0
+      win: 14.3060572181627
+      loss: 15.9983548226445
+      rating_group: 0
+    gps_so+a143c0e9135d136d05f8f6c63953a3a3: 
+      last_modified: 2008-04-11 16:53:45 +09:00
+      name: gps_so
+      rate: 2784.0
+      win: 7.09254352512512
+      loss: 12.6087468546625
+      rating_group: 0
+    gps_ka8+13f69316942a7bb10b33769f4f6513c9: 
+      last_modified: 2008-05-02 10:16:23 +09:00
+      name: gps_ka8
+      rate: 2780.0
+      win: 10.9888205042163
+      loss: 19.9828527944161
+      rating_group: 0
+    gps_kachi2+aab2d27a867ba2a63a1f92ce999845f3: 
+      last_modified: 2008-04-28 02:24:26 +09:00
+      name: gps_kachi2
+      rate: 2918.0
+      win: 20.8983310934689
+      loss: 17.1026689105532
+      rating_group: 0
+    gps_mc3+5cef59cf3430503dacd5d71122802791: 
+      last_modified: 2008-04-06 23:50:56 +09:00
+      name: gps_mc3
+      rate: 2907.0
+      win: 29.0023324106828
+      loss: 25.2929762134241
+      rating_group: 0
+    yowa_usa+0c6049789d5fa11db9785155258b93b5: 
+      last_modified: 2008-05-08 23:36:36 +09:00
+      name: yowa_usa
+      rate: -2724.0
+      win: 10.8629800426498
+      last_game_win: true
+      loss: 161.737929496205
+      rating_group: 0
+    gps_step_100+69a935e4287879be46f83b2817b46f85: 
+      last_modified: 2008-05-02 22:06:19 +09:00
+      name: gps_step_100
+      rate: 2884.0
+      win: 16.9991860852941
+      loss: 16.9976980786016
+      rating_group: 0
+    gps_pfo+eafbd3c8c3c02fbc307b9ee9be81dd3d: 
+      last_modified: 2008-05-05 19:14:12 +09:00
+      name: gps_pfo
+      rate: -2473.0
+      win: 269.0
+      loss: 221.0
+      rating_group: 0
+    gps_open25_20+d70e3f7b088ccfd310962bb37fc975ac: 
+      last_modified: 2008-03-26 16:27:46 +09:00
+      name: gps_open25_20
+      rate: 2931.0
+      win: 13.7364342241624
+      loss: 10.4680907249845
+      rating_group: 0
+    kiri-test+f6e396dc8eb6a1123ed65d7ddcc78243: 
+      last_modified: 2008-04-27 13:50:45 +09:00
+      name: kiri-test
+      rate: -2092.0
+      win: 40.5473992591258
+      loss: 37.9301462747398
+      rating_group: 0
+    gps_mc2+ef32e1eeadb591be032ffd87fa8f3aab: 
+      last_modified: 2008-04-04 17:11:44 +09:00
+      name: gps_mc2
+      rate: 2804.0
+      win: 8.7152292056957
+      loss: 13.7960054306812
+      rating_group: 0
+    gps_cc2+e178cc4ceb7f69ca039aa46c746f18bf: 
+      last_modified: 2008-04-26 21:59:53 +09:00
+      name: gps_cc2
+      rate: 2866.0
+      win: 17.7971465882009
+      loss: 19.6880419042549
+      rating_group: 0
+    gps_cpu4tbb+d631d551c7b87d36905f46167caa41c5: 
+      last_modified: 2008-04-29 06:53:19 +09:00
+      name: gps_cpu4tbb
+      rate: 3127.0
+      win: 8.68479132982944
+      loss: 15.4436996507596
+      rating_group: 0
+    gps_qtsee+d094a7c36b2c59d9cd7fcd2231505f8a: 
+      last_modified: 2008-04-04 22:25:14 +09:00
+      name: gps_qtsee
+      rate: 2991.0
+      win: 18.9090769183675
+      loss: 10.1784071014068
+      rating_group: 0
+    gps_seenr+734797905c1a9e6d1ad64f19c31a1e1d: 
+      last_modified: 2008-03-13 01:51:12 +09:00
+      name: gps_seenr
+      rate: 2921.0
+      win: 11.7279128495228
+      loss: 9.48396449634873
+      rating_group: 0
+    gps_mc00+67fe440a10c121de46c4276fc6332b7a: 
+      last_modified: 2008-04-11 12:15:31 +09:00
+      name: gps_mc00
+      rate: 2884.0
+      win: 11.7897169909261
+      loss: 11.7839083830482
+      rating_group: 0
+    gps_kf+3301824de7e4a161724564abf32f0363: 
+      last_modified: 2008-05-03 01:24:13 +09:00
+      name: gps_kf
+      rate: 2884.0
+      win: 20.0
+      loss: 19.9995076024558
+      rating_group: 0
+    gps500+e293220e3f8a3e59f79f6b0efffaa931: 
+      last_modified: 2008-05-08 23:40:19 +09:00
+      name: gps500
+      rate: -2423.0
+      win: 475.931766690695
+      loss: 1720.65416034238
+      rating_group: 0
+    bingo+7859e4cc481f9487f5d45e6ade7a2518: 
+      last_modified: 2008-05-01 03:38:47 +09:00
+      name: bingo
+      rate: -1623.0
+      last_game_win: false
+      win: 1208.89734617365
+      loss: 237.437390949787
+      rating_group: 0
+    spear900_note+0de01547572775761f6eb2b9ec59dbae: 
+      last_modified: 2008-05-02 07:07:38 +09:00
+      name: spear900_note
+      rate: -2103.0
+      win: 247.103632012203
+      loss: 251.852475537186
+      rating_group: 0
+  6: 
+    gps0_kab6+67a1c27d42175909f3dfb4be9b34468d: 
+      last_modified: 2008-05-04 16:34:03 +09:00
+      name: gps0_kab6
+      rate: 1114.0
+      win: 13.0
+      loss: 7.0
+      rating_group: 6
+    gps0_epi+3d727b4e40d6345563da37a3f33c0c83: 
+      last_modified: 2008-05-04 00:26:05 +09:00
+      name: gps0_epi
+      rate: 936.0
+      win: 8.0
+      loss: 12.0
+      rating_group: 6
+    gps0_mpke+bb9f7923189236268b0bfee73e995729: 
+      last_modified: 2008-04-30 01:57:00 +09:00
+      name: gps0_mpke
+      rate: 971.0
+      win: 8.77311662103004
+      loss: 10.726403086889
+      rating_group: 6
+    gps0+3db9f442857731ed6f858ac991bc90d5: 
+      last_modified: 2008-05-04 16:34:03 +09:00
+      name: gps0
+      rate: 1006.0
+      win: 40.6362611991685
+      last_game_win: true
+      loss: 38.7001461662861
+      rating_group: 6
+    gps0_epkm+5f692dd43863431e607e059122178b21: 
+      last_modified: 2008-05-01 13:46:06 +09:00
+      name: gps0_epkm
+      rate: 971.0
+      win: 8.92702954525609
+      loss: 10.9098581122795
+      rating_group: 6
+  1: 
+    gps1_pmpc10+886242d533721d4f6deb70ab99c65b8a: 
+      last_modified: 2008-03-09 03:47:04 +09:00
+      name: gps1_pmpc10
+      rate: 1027.0
+      win: 11.2028891182806
+      loss: 8.53709973211393
+      rating_group: 1
+    gps1_pmp2+eaf775d96a8a33ca7d935c65e4bf6792: 
+      last_modified: 2008-04-25 18:55:17 +09:00
+      name: gps1_pmp2
+      rate: 994.0
+      win: 7.41429387801882
+      loss: 8.34541679222178
+      rating_group: 1
+    gps1_pmp4+c08b10fe0f713d9dd64c7b46abe8ec37: 
+      last_modified: 2008-04-27 12:10:25 +09:00
+      name: gps1_pmp4
+      rate: 774.0
+      win: 3.77791937551651
+      loss: 15.1395135795855
+      rating_group: 1
+    gps0_p+d5b7ec89ea83deaece5f6e0a5fcdfad7: 
+      last_modified: 2008-05-06 00:26:20 +09:00
+      name: gps0_p
+      rate: 980.0
+      win: 160.600056350417
+      loss: 168.073317052044
+      rating_group: 1
+    gps1_ppb+0ac9978c2bd7b19ab10a7aa1e2284cd5: 
+      last_modified: 2008-05-02 19:40:39 +09:00
+      name: gps1_ppb
+      rate: 1122.0
+      win: 13.0
+      loss: 7.0
+      rating_group: 1
+    gps1_p+e2a4088894d38f53c579be64644aa0ce: 
+      last_modified: 2008-05-04 09:18:24 +09:00
+      name: gps1_p
+      rate: 1015.0
+      win: 122.337709090737
+      loss: 122.158686634462
+      rating_group: 1
+    gps1_pmp3+9b3a277d62350375b0d1b5a3e8b501e0: 
+      last_modified: 2008-04-26 11:45:15 +09:00
+      name: gps1_pmp3
+      rate: 1050.0
+      win: 10.281108847505
+      loss: 8.42133796130253
+      rating_group: 1
+    gps1_ppabb3+e6df1c5175209f2ddbc537401eae0052: 
+      last_modified: 2008-04-08 10:50:53 +09:00
+      name: gps1_ppabb3
+      rate: 909.0
+      win: 12.0874241992837
+      loss: 18.14354756741
+      rating_group: 1
+    gps0_pnpee2+93f19f509fe12c6f49d3a1e6a0b2e725: 
+      last_modified: 2008-04-25 17:35:14 +09:00
+      name: gps0_pnpee2
+      rate: 909.0
+      win: 7.4117785398901
+      loss: 11.1196619009622
+      rating_group: 1
+    gps0_epi2+585ee99a46f1453587ed4dbce7bf1712: 
+      last_modified: 2008-05-04 13:24:15 +09:00
+      name: gps0_epi2
+      rate: 1015.0
+      win: 11.0
+      loss: 9.0
+      rating_group: 1
+    gps1_pmp6+7e4a98f5d21d0bfbdbf06c905a5ec76f: 
+      last_modified: 2008-04-29 17:18:37 +09:00
+      name: gps1_pmp6
+      rate: 980.0
+      win: 8.73319292008062
+      loss: 10.6748914106424
+      rating_group: 1
+    gps1_pmp5+2dc0d15860881dad0c2048ba6046b3b3: 
+      last_modified: 2008-04-28 14:55:23 +09:00
+      name: gps1_pmp5
+      rate: 1015.0
+      win: 9.57992527409892
+      loss: 9.57928748387886
+      rating_group: 1
+    gps1_pe2+2f8973d8d3e301ca5819a8c6cf650e1a: 
+      last_modified: 2008-04-30 14:12:40 +09:00
+      name: gps1_pe2
+      rate: 1015.0
+      win: 15.2959586162338
+      loss: 14.2828692000647
+      rating_group: 1
+    gps0_pkte+da595ccd83a463811f6b606c066810d0: 
+      last_modified: 2008-04-21 11:52:25 +09:00
+      name: gps0_pkte
+      rate: 1087.0
+      win: 11.4662095419876
+      loss: 6.17743471733985
+      rating_group: 1
+    gps1_pcx+5b2e1a61c9dc9a869ab14d5a8d98e74d: 
+      last_modified: 2008-04-21 16:46:36 +09:00
+      name: gps1_pcx
+      rate: 980.0
+      win: 7.95923156541008
+      loss: 9.72718755194501
+      rating_group: 1
+    gps1_pmp+16b30034aa230cb0390fbb4b9afb29d1: 
+      last_modified: 2008-04-25 03:13:30 +09:00
+      name: gps1_pmp
+      rate: 1108.0
+      win: 11.0418289499423
+      loss: 6.44561033853136
+      rating_group: 1
+    gps0_pmke+4e3c1830c160c63cd4450b84eb0b2f54: 
+      last_modified: 2008-04-27 15:41:40 +09:00
+      name: gps0_pmke
+      rate: 1088.0
+      win: 12.323826352781
+      loss: 6.62244088559627
+      rating_group: 1
+    gps1_pkj+bf60767768e6a99e06734e7365c2f1ee: 
+      last_modified: 2008-05-03 12:18:29 +09:00
+      name: gps1_pkj
+      rate: 980.0
+      win: 9.0
+      loss: 11.0
+      rating_group: 1
+    gps0_pnpef+6a7f1956f921cc8ab4b2d123f14f6ac4: 
+      last_modified: 2008-04-23 19:43:55 +09:00
+      name: gps0_pnpef
+      rate: 980.0
+      win: 9.06187135480589
+      loss: 9.06017127503476
+      rating_group: 1
+    gps0_pke5+facace91f58b19e1bd54f788d5601f47: 
+      last_modified: 2008-05-01 15:52:53 +09:00
+      name: gps0_pke5
+      rate: 980.0
+      win: 9.92368849637954
+      loss: 9.91752462603345
+      rating_group: 1
+    gps0_pnpee+9d1358e53dcab6368c74a6c556e2ae09: 
+      last_modified: 2008-04-24 22:42:36 +09:00
+      name: gps0_pnpee
+      rate: 945.0
+      win: 8.25074808692898
+      loss: 10.0901391336692
+      rating_group: 1
+    gps1_pepf+4aad5d94ef116c66f9d85dea66a5d5c9: 
+      last_modified: 2008-05-01 17:02:54 +09:00
+      name: gps1_pepf
+      rate: 1050.0
+      win: 10.9287270917035
+      loss: 8.93239341491624
+      rating_group: 1
+    gps1_pkd+92b2e371254e093ee41288d99d68ee29: 
+      last_modified: 2008-05-04 09:18:24 +09:00
+      name: gps1_pkd
+      rate: 980.0
+      win: 9.0
+      loss: 11.0
+      rating_group: 1
+    gps0_pmkb+815a8899b63276bec38b8c54886fe355: 
+      last_modified: 2008-04-26 20:02:50 +09:00
+      name: gps0_pmkb
+      rate: 1127.0
+      win: 13.1421706174191
+      loss: 5.63133448814683
+      rating_group: 1
+    gps0_pkte2+996384f8b2baf98042196c0990aff956: 
+      last_modified: 2008-04-22 18:45:12 +09:00
+      name: gps0_pkte2
+      rate: 1015.0
+      win: 9.84562219563632
+      loss: 8.06071389199098
+      rating_group: 1
+    gps0_pbsm+7fd35123ccaa14f67462976d22fb2810: 
+      last_modified: 2008-04-29 15:33:50 +09:00
+      name: gps0_pbsm
+      rate: 909.0
+      win: 7.7450965938711
+      loss: 11.6441019024452
+      rating_group: 1
+    gps0_p15rp2+e64ad2ae7fd1217425c8489d1e190668: 
+      last_modified: 2008-04-11 03:35:30 +09:00
+      name: gps0_p15rp2
+      rate: 872.0
+      win: 5.4791200834662
+      loss: 10.1748393347354
+      rating_group: 1
+    gps1_ppabb2+d07da6400758989888fff3fcbb4a938c: 
+      last_modified: 2008-04-06 18:52:41 +09:00
+      name: gps1_ppabb2
+      rate: 1030.0
+      win: 14.8422787892135
+      loss: 11.1303228560631
+      rating_group: 1
+    gps0_ppkd2+bf6912b6dbd47900a79d5c1fb792dd52: 
+      last_modified: 2008-05-06 00:26:20 +09:00
+      name: gps0_ppkd2
+      rate: 945.0
+      win: 9.0
+      loss: 11.0
+      rating_group: 1
+    gps0_ppbw+20c38aac12d0a0cdcd1a0a5a8aa4d6fa: 
+      last_modified: 2008-04-30 14:46:16 +09:00
+      name: gps0_ppbw
+      rate: 980.0
+      win: 9.80169607999749
+      loss: 9.80612633695485
+      rating_group: 1
+    gps1_pnpe+0ab166cc8ae68837ce39031ed949df91: 
+      last_modified: 2008-04-22 19:04:02 +09:00
+      name: gps1_pnpe
+      rate: 1122.0
+      win: 11.6353971180556
+      loss: 6.27379905956942
+      rating_group: 1
+  7: 
+    gps1_epf3+259d1309f956da0c489fa1e2b927cd9c: 
+      last_modified: 2008-05-03 09:16:56 +09:00
+      name: gps1_epf3
+      rate: 1027.0
+      win: 11.0
+      loss: 9.0
+      rating_group: 7
+    gps1_epf2+3d5b65bb7f12ad93dacf6c6a590a4dfb: 
+      last_modified: 2008-05-01 23:18:14 +09:00
+      name: gps1_epf2
+      rate: 1063.0
+      win: 11.9546345439284
+      loss: 7.96566841464449
+      rating_group: 7
+    gps1_kd2+856d95db222350404da567880e3a3485: 
+      last_modified: 2008-05-04 08:44:44 +09:00
+      name: gps1_kd2
+      rate: 958.0
+      win: 9.0
+      loss: 11.0
+      rating_group: 7
+    gps1+5df059ccf2eda413600fc00081cc3d54: 
+      last_modified: 2008-05-04 08:44:44 +09:00
+      name: gps1
+      rate: 992.0
+      win: 38.7560781175983
+      loss: 40.7812257933127
+      rating_group: 7
+    gps1_e4+b2edfcc33e14f5a5041b9ba1bcc08c3c: 
+      last_modified: 2008-04-30 15:15:39 +09:00
+      name: gps1_e4
+      rate: 957.0
+      win: 8.82659124938429
+      loss: 10.7904097029538
+      rating_group: 7
+  2: 
+    gps6_psmf+01b42ab957311139e07ede84f547355b: 
+      last_modified: 2008-04-10 20:27:18 +09:00
+      name: gps6_psmf
+      rate: 1017.0
+      win: 7.80590970299945
+      loss: 7.79646032724219
+      rating_group: 2
+    gps6_rp3+9ac0b1cb4eb5b51c1062bd97d0a47ef4: 
+      last_modified: 2008-05-04 16:51:42 +09:00
+      name: gps6_rp3
+      rate: 1017.0
+      win: 10.0
+      loss: 10.0
+      rating_group: 2
+    gps7_p+edcd30db6362262ddb5c42327c96bcdc: 
+      last_modified: 2008-05-04 09:45:39 +09:00
+      name: gps7_p
+      rate: 979.0
+      win: 54.77840245852
+      loss: 57.306261169016
+      rating_group: 2
+    gps7_pkeu2+06cf8d45cd8db00554aa81d08bbbed21: 
+      last_modified: 2008-05-01 22:18:55 +09:00
+      name: gps7_pkeu2
+      rate: 979.0
+      win: 9.95615463613726
+      loss: 9.9613054078766
+      rating_group: 2
+    gps6_pw4+02ee4810f85e8a88b088f4561be4cb83: 
+      last_modified: 2008-05-08 03:54:12 +09:00
+      name: gps6_pw4
+      rate: 909.0
+      win: 7.0
+      loss: 13.0
+      rating_group: 2
+    gps6_ppb2+fa14f013a1cb083ad0da5dd3ed61cab6: 
+      last_modified: 2008-05-03 11:58:11 +09:00
+      name: gps6_ppb2
+      rate: 1017.0
+      win: 10.0
+      loss: 10.0
+      rating_group: 2
+    gps7_pz2+705c4dbca749eb9d17ca07a73e2e04cb: 
+      last_modified: 2008-04-07 17:28:42 +09:00
+      name: gps7_pz2
+      rate: 982.0
+      win: 6.78177767981663
+      loss: 8.280716551552
+      rating_group: 2
+    gps6_pw3+a53d6169ee0c70812da62c5251ddb25d: 
+      last_modified: 2008-05-07 10:26:36 +09:00
+      name: gps6_pw3
+      rate: 1017.0
+      win: 10.0
+      loss: 10.0
+      rating_group: 2
+    gps6_pebv+527147c9835290f6c5ddc5b9ddb35666: 
+      last_modified: 2008-04-30 17:48:51 +09:00
+      name: gps6_pebv
+      rate: 982.0
+      win: 8.83377589213516
+      loss: 10.800285846288
+      rating_group: 2
+    gps7_pz3+b69d94a2f5764780061eb9dd7d8a79a6: 
+      last_modified: 2008-04-08 17:13:41 +09:00
+      name: gps7_pz3
+      rate: 1017.0
+      win: 7.61059534994535
+      loss: 7.62017859056819
+      rating_group: 2
+    gps7_pkab+fd61ed1b7ae0cc7c862c6386cb8a3644: 
+      last_modified: 2008-05-02 19:13:06 +09:00
+      name: gps7_pkab
+      rate: 924.0
+      win: 8.0
+      loss: 11.0
+      rating_group: 2
+    gps6_peb3+2a699ef355a01127ed97fa7efca111f4: 
+      last_modified: 2008-05-01 15:56:46 +09:00
+      name: gps6_peb3
+      rate: 1088.0
+      win: 11.9100572426239
+      loss: 7.93522543019853
+      rating_group: 2
+    gps6_peb+42afc7b6b767396b1e83b355c0deea22: 
+      last_modified: 2008-04-30 00:47:07 +09:00
+      name: gps6_peb
+      rate: 1125.0
+      win: 12.6676118707801
+      loss: 6.82195084311398
+      rating_group: 2
+    gps6_p+94b2b9d94ed461ab4b4053a2d4c4a114: 
+      last_modified: 2008-05-08 23:51:37 +09:00
+      name: gps6_p
+      rate: 1017.0
+      win: 131.734394623725
+      last_game_win: true
+      loss: 122.431671775223
+      rating_group: 2
+    gps7_pep+121fdf8ca75a59cc152c19c67e2daed4: 
+      last_modified: 2008-04-30 17:29:38 +09:00
+      name: gps7_pep
+      rate: 1086.0
+      win: 12.7525997544867
+      loss: 6.87280643894678
+      rating_group: 2
+    gps7_pkab4+99f0133905fb05d3b6de0a469f382dd0: 
+      last_modified: 2008-05-04 09:45:39 +09:00
+      name: gps7_pkab4
+      rate: 909.0
+      win: 8.0
+      loss: 12.0
+      rating_group: 2
+    gps6_psmf2+0d49e10c9175e6600d84cf8511a9e8d0: 
+      last_modified: 2008-04-11 15:56:58 +09:00
+      name: gps6_psmf2
+      rate: 1017.0
+      win: 7.87765342522577
+      loss: 7.88207025636964
+      rating_group: 2
+    gps6_pw2+92b472c3f617095009fed8960f5670a4: 
+      last_modified: 2008-05-06 15:16:35 +09:00
+      name: gps6_pw2
+      rate: 909.0
+      win: 7.0
+      loss: 13.0
+      rating_group: 2
+  8: 
+    gps6_akt+c3100b3aa28d7219a8cf5c11e977526e: 
+      last_modified: 2008-05-03 08:37:56 +09:00
+      name: gps6_akt
+      rate: 1081.0
+      win: 13.0
+      loss: 6.0
+      rating_group: 8
+    gps6_pw6+712bd16b4a856f9d6a193c868621347d: 
+      last_modified: 2008-05-08 23:14:25 +09:00
+      name: gps6_pw6
+      rate: 989.0
+      win: 14.0
+      last_game_win: true
+      loss: 11.0
+      rating_group: 8
+    gps6_rp2+fc6cfcea7623c03a83b53089ba8c5ae8: 
+      last_modified: 2008-05-04 13:29:22 +09:00
+      name: gps6_rp2
+      rate: 982.0
+      win: 11.0
+      loss: 9.0
+      rating_group: 8
+    gps6+d915e85b03226884d42e5602373dfd02: 
+      last_modified: 2008-05-08 23:14:25 +09:00
+      name: gps6
+      rate: 947.0
+      last_game_win: false
+      win: 26.0
+      loss: 38.0
+      rating_group: 8
+  3: 
+    gps4_p+53ee4319f15f9cae0b108de6befac23b: 
+      last_modified: 2008-04-28 11:36:01 +09:00
+      name: gps4_p
+      rate: 1022.0
+      win: 64.9417662122736
+      loss: 55.9935568106017
+      rating_group: 3
+    gps4_pkep+3e887935d6b823165b5ef06ffc31e7ee: 
+      last_modified: 2008-04-25 06:48:44 +09:00
+      name: gps4_pkep
+      rate: 951.0
+      win: 7.35253627034135
+      loss: 11.0644423115383
+      rating_group: 3
+    gps4_paebf2+5e73acb18c0edf18355c1b8bc5c6e22c: 
+      last_modified: 2008-04-07 14:04:23 +09:00
+      name: gps4_paebf2
+      rate: 1022.0
+      win: 7.51827645124211
+      loss: 7.51802897203015
+      rating_group: 3
+    gps4_pmkke+a479c9c94175d5b52bb10612e9f922b9: 
+      last_modified: 2008-04-27 15:54:25 +09:00
+      name: gps4_pmkke
+      rate: 1057.0
+      win: 10.4245996233114
+      loss: 8.52445975437956
+      rating_group: 3
+    gps4_pkep2+caa2af4cf9c0d28c06c3d70fd1bc473d: 
+      last_modified: 2008-04-26 03:17:00 +09:00
+      name: gps4_pkep2
+      rate: 914.0
+      win: 6.51048120006291
+      loss: 12.1080218278633
+      rating_group: 3
+    gps4_paebf5+0bef04a983e064f6f81b74582576ea2b: 
+      last_modified: 2008-04-10 02:20:50 +09:00
+      name: gps4_paebf5
+      rate: 1022.0
+      win: 7.73684061157097
+      loss: 7.73566466353795
+      rating_group: 3
+    gps4_paebf4+b01dbad724eb48420ccdb2a7e4cb22ad: 
+      last_modified: 2008-04-09 03:03:04 +09:00
+      name: gps4_paebf4
+      rate: 987.0
+      win: 6.88429453628398
+      loss: 8.41980869197081
+      rating_group: 3
+    gps4_pmkke2+da66a3260b9799655b3a797320752305: 
+      last_modified: 2008-04-28 11:36:01 +09:00
+      name: gps4_pmkke2
+      rate: 1022.0
+      win: 9.56652811778896
+      loss: 9.57133999095356
+      rating_group: 3
+  999: 
+    gps7_ppabI3+0272537aeed684c58bc1104033e34aa0: 
+      last_modified: 2008-02-12 00:49:37 +09:00
+      name: gps7_ppabI3
+      rate: 0
+      win: 2.37413854405468
+      loss: 4.75192340608516
+      rating_group: 999
+    ipa+43945d0d3e53ac07d91b0e0f59fd1e21: 
+      last_modified: 2008-03-30 14:57:21 +09:00
+      name: ipa
+      rate: 0
+      win: 0.0
+      loss: 1.37599301613844
+      rating_group: 999
+    gps7_pmk2+9c1c35a453346f0b5b664949689c98b8: 
+      last_modified: 2008-03-05 11:04:57 +09:00
+      name: gps7_pmk2
+      rate: 0
+      win: 7.19734717659165
+      loss: 3.08348905396196
+      rating_group: 999
+    gps_do+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-05-01 16:55:51 +09:00
+      name: gps_do
+      rate: 0
+      win: 5.97558324489925
+      loss: 0.994988766801764
+      rating_group: 999
+    GOD+098f6bcd4621d373cade4e832627b4f6: 
+      last_modified: 2008-03-14 22:48:17 +09:00
+      name: GOD
+      rate: 0
+      win: 0.0
+      loss: 1.43410183880869
+      rating_group: 999
+    gps7_pmk3+a3f122a05091ce9f0939de99d96b114d: 
+      last_modified: 2008-03-06 15:16:05 +09:00
+      name: gps7_pmk3
+      rate: 0
+      win: 4.16049011364312
+      loss: 6.23719503773664
+      rating_group: 999
+    gps1_ppabb+3d1e87fe095b83f982bfbddc5cec13e1: 
+      last_modified: 2008-03-31 14:36:41 +09:00
+      name: gps1_ppabb
+      rate: 0
+      win: 6.24789639065473
+      loss: 4.15965642161918
+      rating_group: 999
+    gps4_paebf3+0126f06215f43b87402ccadd720169e4: 
+      last_modified: 2008-04-08 10:46:12 +09:00
+      name: gps4_paebf3
+      rate: 0
+      win: 2.27910114803295
+      loss: 6.8444977266173
+      rating_group: 999
+    gps1_pka+add01fb87e5a1293d005247c9387391c: 
+      last_modified: 2008-02-12 01:34:32 +09:00
+      name: gps1_pka
+      rate: 0
+      win: 3.95938224668317
+      loss: 3.9603124754782
+      rating_group: 999
+    R+098f6bcd4621d373cade4e832627b4f6: 
+      last_modified: 2008-02-22 12:20:16 +09:00
+      name: R
+      rate: 0
+      win: 0.448143453067201
+      loss: 2.24050154600835
+      rating_group: 999
+    gps7_pska+ed528aeabb3dccbdf53a5243888aadae: 
+      last_modified: 2008-02-14 16:25:32 +09:00
+      name: gps7_pska
+      rate: 0
+      win: 3.67338779718212
+      loss: 3.67339093111968
+      rating_group: 999
+    gps_s2+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-05-04 02:17:33 +09:00
+      name: gps_s2
+      rate: 0
+      win: 2.0
+      loss: 9.0
+      rating_group: 999
+    gps_pr8s3+2a1dd56e1d9ed3a626c737bcdee3ca49: 
+      last_modified: 2008-03-25 22:39:21 +09:00
+      name: gps_pr8s3
+      rate: 0
+      win: 1.95129196539734
+      loss: 4.55762133499333
+      rating_group: 999
+    matomoni+50a6348c667759604bc4ff9247c11473: 
+      last_modified: 2008-05-05 22:07:24 +09:00
+      name: matomoni
+      rate: 0
+      win: 0.0
+      loss: 13.007470167874
+      rating_group: 999
+    TeamGPS+91d5d6d0427f78f20dbdc8e76007356d: 
+      last_modified: 2008-05-04 02:26:43 +09:00
+      name: TeamGPS
+      rate: 0
+      win: 1.0
+      loss: 0.0
+      rating_group: 999
+    test2+47bce5c74f589f4867dbd57e9ca9f808: 
+      last_modified: 2008-02-12 18:59:40 +09:00
+      name: test2
+      rate: 0
+      win: 1.19658441710944
+      loss: 2.39816368022251
+      rating_group: 999
+    test1+47bce5c74f589f4867dbd57e9ca9f808: 
+      last_modified: 2008-02-12 18:59:40 +09:00
+      name: test1
+      rate: 0
+      win: 2.39816368022251
+      loss: 1.19658441710944
+      rating_group: 999
+    gps4_pkep3+de14ab38aba203fba5770eb28de528ea: 
+      last_modified: 2008-04-26 22:15:24 +09:00
+      name: gps4_pkep3
+      rate: 0
+      win: 4.70323518646419
+      loss: 8.46352764886076
+      rating_group: 999
+    misaki900+8fb8876e8bb2125c004ded950d8bbb67: 
+      last_modified: 2008-05-02 02:39:23 +09:00
+      name: misaki900
+      rate: 0
+      win: 3.0
+      loss: 5.99867526631817
+      rating_group: 999
+    gps1_pmpc8+9678ca96f57cc5a75782a1145fc9987b: 
+      last_modified: 2008-03-07 05:34:47 +09:00
+      name: gps1_pmpc8
+      rate: 0
+      win: 4.71466137351621
+      loss: 4.18614807675241
+      rating_group: 999
+    pc2+03c7c0ace395d80182db07ae2c30f034: 
+      last_modified: 2008-03-10 20:31:36 +09:00
+      name: pc2
+      rate: 0
+      win: 1.09512293936863
+      loss: 0.0
+      rating_group: 999
+    gps6_pw+1d7aebda92dce3ad0ce3fd218e8bfcff: 
+      last_modified: 2008-05-05 21:49:00 +09:00
+      name: gps6_pw
+      rate: 0
+      win: 1.0
+      loss: 0.0
+      rating_group: 999
+    pc2+92eb5ffee6ae2fec3ad71c777531578f: 
+      last_modified: 2008-03-30 11:08:12 +09:00
+      name: pc2
+      rate: 0
+      win: 1.36018889195079
+      loss: 0.387278490318016
+      rating_group: 999
+    gps1_pka4+94a4ef82f4f0dae7d12fcd9e9fa68dc7: 
+      last_modified: 2008-02-14 01:36:38 +09:00
+      name: gps1_pka4
+      rate: 0
+      win: 4.45559409749626
+      loss: 3.6480188462149
+      rating_group: 999
+    gps7_psee2+82121163db0812c49f26279d42febd4e: 
+      last_modified: 2008-03-04 09:08:38 +09:00
+      name: gps7_psee2
+      rate: 0
+      win: 4.05059795826744
+      loss: 5.57366777190387
+      rating_group: 999
+    gps1_pe3+6df8e3e8851329a1ca3ec14c33ba804b: 
+      last_modified: 2008-03-04 13:54:33 +09:00
+      name: gps1_pe3
+      rate: 0
+      win: 3.04228163567075
+      loss: 7.10358487942135
+      rating_group: 999
+    gps1_pg+0283617fd60191c1e333831b9c10defa: 
+      last_modified: 2008-02-21 18:13:59 +09:00
+      name: gps1_pg
+      rate: 0
+      win: 4.43060682067607
+      loss: 3.54004292474244
+      rating_group: 999
+    Ayaka2007+7dcac6e40988bcfa8407fc0744f6b64e: 
+      last_modified: 2008-02-24 02:39:43 +09:00
+      name: Ayaka2007
+      rate: 0
+      win: 0.0
+      loss: 30.5649072804631
+      rating_group: 999
+    kaneko+5058f1af8388633f609cadb75a75dc9d: 
+      last_modified: 2008-03-05 10:41:37 +09:00
+      name: kaneko
+      rate: 0
+      win: 0.0
+      loss: 1.77449942396776
+      rating_group: 999
+    gps7_pmpc+a8189b0f3742350ee20e2caba0808441: 
+      last_modified: 2008-03-31 14:33:38 +09:00
+      name: gps7_pmpc
+      rate: 0
+      win: 3.46975464137791
+      loss: 7.63073259993943
+      rating_group: 999
+    gps4_pmpc+37ee2322482bbb586663be8e8cf47e6d: 
+      last_modified: 2008-03-04 12:42:10 +09:00
+      name: gps4_pmpc
+      rate: 0
+      win: 5.08024006179467
+      loss: 3.55085944910098
+      rating_group: 999
+    pc2+a87ff679a2f3e71d9181a67b7542122c: 
+      last_modified: 2008-03-11 22:52:07 +09:00
+      name: pc2
+      rate: 0
+      win: 0.54172245849132
+      loss: 3.26461164467359
+      rating_group: 999
+    pc1+a87ff679a2f3e71d9181a67b7542122c: 
+      last_modified: 2008-03-11 22:50:59 +09:00
+      name: pc1
+      rate: 0
+      win: 3.85595408171491
+      loss: 3.13266127153545
+      rating_group: 999
+    ymshogi_test+61b2c94ea07eda40cfc396e9ae7286cf: 
+      last_modified: 2008-05-03 05:07:58 +09:00
+      name: ymshogi_test
+      rate: 0
+      win: 0.966399854105744
+      loss: 53.9649846244257
+      rating_group: 999
+    misaki+d9ffaac630ab2ae0e93674c1b505f1aa: 
+      last_modified: 2008-05-08 23:40:19 +09:00
+      name: misaki
+      rate: 0
+      win: 4.85072439857614
+      last_game_win: false
+      loss: 3.85093185852652
+      rating_group: 999
+    ellecia2+3123059c1c816471780539f6b6b738dc: 
+      last_modified: 2008-03-25 18:48:46 +09:00
+      name: ellecia2
+      rate: 0
+      win: 0.650607307852355
+      loss: 1.22554823127326
+      rating_group: 999
+    ovo2+25bbdcd06c32d477f7fa1c3e4a91b032: 
+      last_modified: 2008-05-02 13:12:12 +09:00
+      name: ovo2
+      rate: 0
+      win: 0.0
+      loss: 48.237522040793
+      rating_group: 999
+    misakitest+098f6bcd4621d373cade4e832627b4f6: 
+      last_modified: 2008-02-10 20:09:45 +09:00
+      name: misakitest
+      rate: 0
+      win: 3.13216359232655
+      loss: 1.17483538100067
+      rating_group: 999
+    gps1_pnpg+ea2a4e4f1c8469f37299aa535f397adb: 
+      last_modified: 2008-02-26 00:01:03 +09:00
+      name: gps1_pnpg
+      rate: 0
+      win: 3.25890841273782
+      loss: 5.58228591589497
+      rating_group: 999
+    gps7_pmk2-30+faf5199cadb7774bad74b17a5c6cc0a1: 
+      last_modified: 2008-03-06 00:29:06 +09:00
+      name: gps7_pmk2-30
+      rate: 0
+      win: 4.64919706385219
+      loss: 5.1591179437548
+      rating_group: 999
+    gps4_pbp+d81ba2e3205d35d0dd2d12be19bf9d67: 
+      last_modified: 2008-02-16 03:17:29 +09:00
+      name: gps4_pbp
+      rate: 0
+      win: 3.73322544415813
+      loss: 4.56461635049319
+      rating_group: 999
+    gps0_p15rp+21e0d6345a0afd3f8a9464337fc70f81: 
+      last_modified: 2008-04-10 09:34:05 +09:00
+      name: gps0_p15rp
+      rate: 0
+      win: 1.55571521000306
+      loss: 3.89169575116332
+      rating_group: 999
+    gps1_pnp4+1d2710ee2228968ecffb0d7e7021c144: 
+      last_modified: 2008-02-25 02:43:23 +09:00
+      name: gps1_pnp4
+      rate: 0
+      win: 3.22085262459041
+      loss: 5.52555734219273
+      rating_group: 999
+    Ayaka2007+7052b1f054caaaf7769f15fccfdc4798: 
+      last_modified: 2008-02-25 03:44:04 +09:00
+      name: Ayaka2007
+      rate: 0
+      win: 0.919586531359499
+      loss: 16.5457426948978
+      rating_group: 999
+    pc2+c81e728d9d4c2f636f067f89cc14862c: 
+      last_modified: 2008-04-19 13:31:23 +09:00
+      name: pc2
+      rate: 0
+      win: 3.28656026387904
+      loss: 2.51707390348184
+      rating_group: 999
+    gps1_pmpc4+dc07789d1cf8f1dca6ab9a893c59bbb2: 
+      last_modified: 2008-03-06 15:19:38 +09:00
+      name: gps1_pmpc4
+      rate: 0
+      win: 5.20057471794151
+      loss: 4.15923237999246
+      rating_group: 999
+    gps7_psa2+4089f050b68443af2a6f4986afc759f6: 
+      last_modified: 2008-02-13 05:53:50 +09:00
+      name: gps7_psa2
+      rate: 0
+      win: 4.41815546839211
+      loss: 3.61211579954968
+      rating_group: 999
+    gps0_ppkd+6321826bbd94fb62c7e4c99dc494db42: 
+      last_modified: 2008-05-05 06:52:19 +09:00
+      name: gps0_ppkd
+      rate: 0
+      win: 3.0
+      loss: 2.0
+      rating_group: 999
+    gps_exp16b+9f74478657f8a65175fc0f42489acc05: 
+      last_modified: 2008-04-27 20:36:25 +09:00
+      name: gps_exp16b
+      rate: 0
+      win: 0.0
+      loss: 5.71503485564411
+      rating_group: 999
+    gps7_kab2+ad71e0fa23c82c9f87e6e6884a07b129: 
+      last_modified: 2008-05-02 15:09:19 +09:00
+      name: gps7_kab2
+      rate: 0
+      win: 0.0
+      loss: 1.0
+      rating_group: 999
+    gps7_ppabI2+024cc4c494638819aef73d6a71925d9c: 
+      last_modified: 2008-02-11 04:41:19 +09:00
+      name: gps7_ppabI2
+      rate: 0
+      win: 3.5323942549571
+      loss: 3.52839482243325
+      rating_group: 999
+    tomcat+48bae5e28e7585ccdfad978d2ce056b2: 
+      last_modified: 2008-03-01 17:47:43 +09:00
+      name: tomcat
+      rate: 0
+      win: 1.46199582559984
+      loss: 0.969582861500572
+      rating_group: 999
+    your_program_name+1060b7b46a3bd36b3a0d66e0127d0517: 
+      last_modified: 2008-04-23 23:47:35 +09:00
+      name: your_program_name
+      rate: 0
+      win: 0.0
+      loss: 1.8231757836041
+      rating_group: 999
+    gps7_pz4+2820db5da30c537181cfacd23a04bec5: 
+      last_modified: 2008-04-09 11:14:59 +09:00
+      name: gps7_pz4
+      rate: 0
+      win: 6.13575163921137
+      loss: 8.45396550690933
+      rating_group: 999
+    gps6_pw7+80058cfe0f6cd26a4118ed60b9b67154: 
+      last_modified: 2008-05-08 23:51:37 +09:00
+      name: gps6_pw7
+      rate: 0
+      last_game_win: false
+      win: 4.0
+      loss: 3.0
+      rating_group: 999
+    gps1_pe13+6cc12bf8490991d034d004731855b27f: 
+      last_modified: 2008-03-03 20:52:38 +09:00
+      name: gps1_pe13
+      rate: 0
+      win: 0.504442859236656
+      loss: 2.52431759752155
+      rating_group: 999
+    gps7_psee3+c6cf70391c5f7877e82068c76ebf5b64: 
+      last_modified: 2008-03-05 02:06:03 +09:00
+      name: gps7_psee3
+      rate: 0
+      win: 5.10990415683874
+      loss: 5.100732957657
+      rating_group: 999
+    gps1_pmpc2+e142c4bbdf75e8ae0331dad77d0f98eb: 
+      last_modified: 2008-03-05 09:31:45 +09:00
+      name: gps1_pmpc2
+      rate: 0
+      win: 5.63947581946014
+      loss: 3.07398447031382
+      rating_group: 999
+    gps7_pmpc2+6185c9d6c43dff3a2bef269b63a53eb7: 
+      last_modified: 2008-04-06 16:23:30 +09:00
+      name: gps7_pmpc2
+      rate: 0
+      win: 7.43363614746777
+      loss: 7.44099697225586
+      rating_group: 999
+    test1+098f6bcd4621d373cade4e832627b4f6: 
+      last_modified: 2008-03-26 21:15:42 +09:00
+      name: test1
+      rate: 0
+      win: 0.0
+      loss: 1.31785860451171
+      rating_group: 999
+    gps7_ppabI+58008bcbd80ec35321353dceaacd77ce: 
+      last_modified: 2008-02-10 16:27:57 +09:00
+      name: gps7_ppabI
+      rate: 0
+      win: 3.5034694912018
+      loss: 3.50885823530829
+      rating_group: 999
+    pc2+c4ca4238a0b923820dcc509a6f75849b: 
+      last_modified: 2008-03-11 22:28:00 +09:00
+      name: pc2
+      rate: 0
+      win: 4.18171068842216
+      loss: 2.74689869667087
+      rating_group: 999
+    pc1+c4ca4238a0b923820dcc509a6f75849b: 
+      last_modified: 2008-04-25 19:33:00 +09:00
+      name: pc1
+      rate: 0
+      win: 4.80701091245275
+      loss: 6.06830448939908
+      rating_group: 999
+    test2+098f6bcd4621d373cade4e832627b4f6: 
+      last_modified: 2008-03-26 21:15:42 +09:00
+      name: test2
+      rate: 0
+      win: 1.31785860451171
+      loss: 0.0
+      rating_group: 999
+    gps1_pr68+ab84ca8c4c34df394ef67ddb8a55c575: 
+      last_modified: 2008-02-10 15:52:23 +09:00
+      name: gps1_pr68
+      rate: 0
+      win: 1.94971780216178
+      loss: 5.06277266660577
+      rating_group: 999
+    gps30_8cpu+813015cab4287a23392e0082220c5805: 
+      last_modified: 2008-05-04 02:33:05 +09:00
+      name: gps30_8cpu
+      rate: 0
+      win: 4.0
+      loss: 0.0
+      rating_group: 999
+    kaneko-test+5058f1af8388633f609cadb75a75dc9d: 
+      last_modified: 2008-05-04 02:26:43 +09:00
+      name: kaneko-test
+      rate: 0
+      win: 0.0
+      loss: 1.0
+      rating_group: 999
+    gps_wcsc17+a213f8b2b86d4f1595c8c0de34e7f2e2: 
+      last_modified: 2008-05-02 19:49:30 +09:00
+      name: gps_wcsc17
+      rate: 0
+      win: 0.0
+      loss: 1.0
+      rating_group: 999
+    username1+5f4dcc3b5aa765d61d8327deb882cf99: 
+      last_modified: 2008-03-04 02:04:18 +09:00
+      name: username1
+      rate: 0
+      win: 0.0
+      loss: 21.7871556340513
+      rating_group: 999
+    gps1_pkte+c8beae8bd7158b319a91b379c057b05f: 
+      last_modified: 2008-03-12 19:45:55 +09:00
+      name: gps1_pkte
+      rate: 0
+      win: 5.02005760026863
+      loss: 6.13723134166796
+      rating_group: 999
+    gps_pp6+be1cf926449472274af55a1b074e357e: 
+      last_modified: 2008-05-08 23:31:31 +09:00
+      name: gps_pp6
+      rate: 0
+      win: 4.0
+      loss: 6.0
+      rating_group: 999
+    gps_mc0+aa6598cc8577f5af6c122e18d13efb40: 
+      last_modified: 2008-04-10 05:52:07 +09:00
+      name: gps_mc0
+      rate: 0
+      win: 4.65735073577001
+      loss: 3.88433998290132
+      rating_group: 999
+    gps1_pka3+e996af61ebb5e773bb5f6eaeedb6f399: 
+      last_modified: 2008-02-13 04:44:24 +09:00
+      name: gps1_pka3
+      rate: 0
+      win: 3.21009672369634
+      loss: 4.01530826585413
+      rating_group: 999
+    gps4_paebf+1fdaa09e7f9c16ed1091ee09428fc0ac: 
+      last_modified: 2008-04-06 17:47:00 +09:00
+      name: gps4_paebf
+      rate: 0
+      win: 6.69990403704951
+      loss: 8.18551413932288
+      rating_group: 999
+    gps4_pky+8a88b1752937def23cda64522ff3c077: 
+      last_modified: 2008-02-14 01:47:54 +09:00
+      name: gps4_pky
+      rate: 0
+      win: 3.64780525160742
+      loss: 4.45632381394203
+      rating_group: 999
+    gps8cpu+51ba10507fee37a907cda72bd63d72f0: 
+      last_modified: 2008-02-20 13:43:30 +09:00
+      name: gps8cpu
+      rate: 0
+      win: 4.97969982709647
+      loss: 0.391750615406864
+      rating_group: 999
+    gps1_pe+57225819b01bcd9494ba5c69f15552c3: 
+      last_modified: 2008-03-02 05:49:24 +09:00
+      name: gps1_pe
+      rate: 0
+      win: 4.93804003702345
+      loss: 4.94716343109585
+      rating_group: 999
+    gps1_pmpc3+e39b448ccdd53108ed5367db5ee2776a: 
+      last_modified: 2008-03-06 00:28:24 +09:00
+      name: gps1_pmpc3
+      rate: 0
+      win: 5.16523260869099
+      loss: 3.60899376668153
+      rating_group: 999
+    gps1_pnp+2a8efcf93fe5946869e4f31fa3c36a7a: 
+      last_modified: 2008-02-22 17:24:41 +09:00
+      name: gps1_pnp
+      rate: 0
+      win: 4.92911996634997
+      loss: 3.57902285620133
+      rating_group: 999
+    gps_kachi+3b91020198c46a8070fcbbe55c1f984b: 
+      last_modified: 2008-04-26 23:52:45 +09:00
+      name: gps_kachi
+      rate: 0
+      win: 3.76781181342986
+      loss: 6.59706844766145
+      rating_group: 999
+    yoshiki+5058f1af8388633f609cadb75a75dc9d: 
+      last_modified: 2008-03-21 22:20:11 +09:00
+      name: yoshiki
+      rate: 0
+      win: 0.0
+      loss: 1.86668664677574
+      rating_group: 999
+    gps_cpu4p16+561d1247b6b08664758faa68347cadaf: 
+      last_modified: 2008-04-06 12:20:43 +09:00
+      name: gps_cpu4p16
+      rate: 0
+      win: 7.42949610697478
+      loss: 5.94750065979917
+      rating_group: 999
+    gps_8cpu+813015cab4287a23392e0082220c5805: 
+      last_modified: 2008-05-04 08:00:38 +09:00
+      name: gps_8cpu
+      rate: 0
+      win: 5.0
+      loss: 4.0
+      rating_group: 999
+    gps30+813015cab4287a23392e0082220c5805: 
+      last_modified: 2008-05-06 23:42:28 +09:00
+      name: gps30
+      rate: 0
+      win: 12.027391442297
+      loss: 4.0
+      rating_group: 999
+    gps_scr+58b813a0dc157dfdbeabd3afe7643726: 
+      last_modified: 2008-05-08 23:18:02 +09:00
+      name: gps_scr
+      rate: 0
+      win: 3.0
+      loss: 6.0
+      rating_group: 999
+    usaoya+098f6bcd4621d373cade4e832627b4f6: 
+      last_modified: 2008-03-29 23:04:17 +09:00
+      name: usaoya
+      rate: 0
+      win: 0.574085339470999
+      loss: 1.70599269116463
+      rating_group: 999
+    gps1_pnp3+be109baa51edd8d89c0de206a3895ae0: 
+      last_modified: 2008-02-24 10:07:30 +09:00
+      name: gps1_pnp3
+      rate: 0
+      win: 4.11184105119365
+      loss: 4.11287148225036
+      rating_group: 999
+    spear900+05b08566ff2ec028287189062e521d1d: 
+      last_modified: 2008-03-03 15:52:55 +09:00
+      name: spear900
+      rate: 0
+      win: 9.05771994907118
+      loss: 2.01414206050652
+      rating_group: 999
+    mattari_yuchan_test+aac81b5c0cf7bf4b5842e3908a709502: 
+      last_modified: 2008-05-08 23:53:26 +09:00
+      name: mattari_yuchan_test
+      rate: 0
+      win: 3.0
+      last_game_win: false
+      loss: 10.0
+      rating_group: 999
+    yowai_gps_test+dcbd015b6d6271acedcd30b84453c353: 
+      last_modified: 2008-02-09 23:10:01 +09:00
+      name: yowai_gps_test
+      rate: 0
+      win: 0.0
+      loss: 1.16300981411347
+      rating_group: 999
+    gps1_pt+dbe4ea3ae48cb785bf92d670723c925a: 
+      last_modified: 2008-02-16 02:16:17 +09:00
+      name: gps1_pt
+      rate: 0
+      win: 2.49153833722485
+      loss: 4.56017852061372
+      rating_group: 999
+    gps8cpu+11648e4e66e7ed6a86cb7f1d0cf604fe: 
+      last_modified: 2008-05-03 05:57:55 +09:00
+      name: gps8cpu
+      rate: 0
+      win: 9.76910925599213
+      loss: 0.714102787732918
+      rating_group: 999
+    gps2_p+d8a9eeb8a2501b81581be0d57677c145: 
+      last_modified: 2008-03-04 12:42:10 +09:00
+      name: gps2_p
+      rate: 0
+      win: 12.5717996135362
+      loss: 12.4612707575602
+      rating_group: 999
+    pc2+e4da3b7fbbce2345d7772b0674a318d5: 
+      last_modified: 2008-03-11 22:52:23 +09:00
+      name: pc2
+      rate: 0
+      win: 0.96451771211084
+      loss: 3.86918367231102
+      rating_group: 999
+    misaki+098f6bcd4621d373cade4e832627b4f6: 
+      last_modified: 2008-02-10 20:09:45 +09:00
+      name: misaki
+      rate: 0
+      win: 1.17483538100067
+      loss: 3.13216359232655
+      rating_group: 999
+    pc1+e4da3b7fbbce2345d7772b0674a318d5: 
+      last_modified: 2008-03-11 22:52:23 +09:00
+      name: pc1
+      rate: 0
+      win: 4.43605643445131
+      loss: 0.0
+      rating_group: 999
+    gps_qtseearea+73c32ddbeef3515fce4d71786c38ef71: 
+      last_modified: 2008-04-07 10:15:59 +09:00
+      name: gps_qtseearea
+      rate: 0
+      win: 7.51134737969909
+      loss: 5.25426201436594
+      rating_group: 999
+    gps_pp10+cfa3292063eb247e51fd103e53999c85: 
+      last_modified: 2008-05-08 23:24:58 +09:00
+      name: gps_pp10
+      rate: 0
+      win: 2.0
+      loss: 3.0
+      rating_group: 999
+    gps7_pmk4+4bf23894d31c124f683995d341faeb5b: 
+      last_modified: 2008-03-07 07:02:21 +09:00
+      name: gps7_pmk4
+      rate: 0
+      win: 4.71389101336148
+      loss: 5.76081264301408
+      rating_group: 999
+    gps7_pmk+c118a5489ce33b97f4aeb0783b90a3a5: 
+      last_modified: 2008-03-05 07:12:35 +09:00
+      name: gps7_pmk
+      rate: 0
+      win: 5.13125988290303
+      loss: 5.13019364054553
+      rating_group: 999
+    gps1_old+cbd6837c2403128221c7f65315a76928: 
+      last_modified: 2008-03-04 18:20:09 +09:00
+      name: gps1_old
+      rate: 0
+      win: 4.07954455349915
+      loss: 6.12004175552569
+      rating_group: 999
+    gps7_pkeu+946dd752934d80e81a6c0588bb35ac6f: 
+      last_modified: 2008-05-01 07:17:08 +09:00
+      name: gps7_pkeu
+      rate: 0
+      win: 0.99037817695798
+      loss: 5.94458057622329
+      rating_group: 999
+    kaneko-test1+c1d518f5c51f59cfcdfa6fd0d74011d1: 
+      last_modified: 2008-03-09 18:25:44 +09:00
+      name: kaneko-test1
+      rate: 0
+      win: 0.540731006296224
+      loss: 3.24425845783411
+      rating_group: 999
+    GEPPER+098f6bcd4621d373cade4e832627b4f6: 
+      last_modified: 2008-05-06 23:42:28 +09:00
+      name: GEPPER
+      rate: 0
+      win: 0.0
+      loss: 21.7051709294456
+      rating_group: 999
+    gps1_pnp2+33bb7c6e4d09574114756ab1fff59f37: 
+      last_modified: 2008-02-23 17:29:25 +09:00
+      name: gps1_pnp2
+      rate: 0
+      win: 4.07503051644584
+      loss: 4.53050101342215
+      rating_group: 999
+    kaneko-test2+c1d518f5c51f59cfcdfa6fd0d74011d1: 
+      last_modified: 2008-03-09 18:25:44 +09:00
+      name: kaneko-test2
+      rate: 0
+      win: 3.24425845783411
+      loss: 0.540731006296224
+      rating_group: 999
+    gps1_pr88+736974779028c8a9ae369c40b99f4bab: 
+      last_modified: 2008-02-11 06:50:53 +09:00
+      name: gps1_pr88
+      rate: 0
+      win: 3.92435650239876
+      loss: 2.74763123663178
+      rating_group: 999
+    pc1+0cc175b9c0f1b6a831c399e269772661: 
+      last_modified: 2008-03-30 11:08:12 +09:00
+      name: pc1
+      rate: 0
+      win: 0.387278490318016
+      loss: 3.96740892622904
+      rating_group: 999
+    gps7_psa3+a252b8b8cf94d378376c30efaa7e3c12: 
+      last_modified: 2008-02-13 23:04:38 +09:00
+      name: gps7_psa3
+      rate: 0
+      win: 3.64638172435888
+      loss: 3.64110823557492
+      rating_group: 999
+    ssp+fe33467fa97283fd0c6e39106f020753: 
+      last_modified: 2008-03-17 23:03:43 +09:00
+      name: ssp
+      rate: 0
+      win: 0.0
+      loss: 1.18879968181155
+      rating_group: 999
+    gps_lg2+3460302ed6cc24fb91dcadab211b18b1: 
+      last_modified: 2008-03-30 13:16:17 +09:00
+      name: gps_lg2
+      rate: 0
+      win: 6.16876149215196
+      loss: 8.22146578496015
+      rating_group: 999
+    gps7_psa+ca86319a6b0d196e3f387bf8f6242d63: 
+      last_modified: 2008-02-12 14:18:55 +09:00
+      name: gps7_psa
+      rate: 0
+      win: 4.38515241355686
+      loss: 3.58513866015491
+      rating_group: 999
+    gps6_pw5+d22cb490b411ace707b146b090d1a2be: 
+      last_modified: 2008-05-08 00:03:24 +09:00
+      name: gps6_pw5
+      rate: 0
+      win: 1.0
+      loss: 0.0
+      rating_group: 999
+    pc2+0cc175b9c0f1b6a831c399e269772661: 
+      last_modified: 2008-04-25 19:33:00 +09:00
+      name: pc2
+      rate: 0
+      win: 2.76296190816758
+      loss: 1.79764425753254
+      rating_group: 999
+    k+9fe9de3be8ad533149a36f366dff0bb3: 
+      last_modified: 2008-02-22 12:20:16 +09:00
+      name: k
+      rate: 0
+      win: 1.34444228366597
+      loss: 0.448143453067201
+      rating_group: 999
+    gps1_pka2+7033c93adba70e063c3b744929e6f7c8: 
+      last_modified: 2008-02-12 15:54:28 +09:00
+      name: gps1_pka2
+      rate: 0
+      win: 3.18814600262029
+      loss: 4.78618461567772
+      rating_group: 999
+  9: 
+    gps_cpu2p30_2+15defe6c4af0b3e5e174a310dd06ebf4: 
+      last_modified: 2008-04-04 12:49:22 +09:00
+      name: gps_cpu2p30_2
+      rate: 1034.0
+      win: 14.495785804564
+      loss: 13.0494578486005
+      rating_group: 9
+    gps_cpu2p+574e90d7b2abe343a75b8c1cfeed5ff3: 
+      last_modified: 2008-04-03 14:02:43 +09:00
+      name: gps_cpu2p
+      rate: 966.0
+      win: 6.46147592240348
+      loss: 8.61783504348173
+      rating_group: 9
+    gps_cpu2p30+06dacba1b8567acc21c488080ea413c3: 
+      last_modified: 2008-04-04 10:59:08 +09:00
+      name: gps_cpu2p30
+      rate: 981.0
+      win: 13.0308146635658
+      loss: 15.9408731430726
+      rating_group: 9
+    gpsp+20d6b4b22597e621dc2f1fb39197d948: 
+      last_modified: 2008-04-06 12:20:43 +09:00
+      name: gpsp
+      rate: 1016.0
+      win: 37.6081660351548
+      loss: 33.9880763905332
+      rating_group: 9
+  4: 
+    gps6_orig+23daece4324fd5c2c7f2ef3f01e22cbd: 
+      last_modified: 2008-04-25 22:11:02 +09:00
+      name: gps6_orig
+      rate: 1005.0
+      win: 56.4475550891671
+      loss: 52.9404587900779
+      rating_group: 4
+    gps7_nmb005_2+f9f5b4ad8876211ec87063448e3f309c: 
+      last_modified: 2008-04-22 21:18:36 +09:00
+      name: gps7_nmb005_2
+      rate: 953.0
+      win: 30.9780397575928
+      loss: 39.830690034666
+      rating_group: 4
+    gps7_nmbf2048+7222b303fe6c918f085352fae3e948e0: 
+      last_modified: 2008-04-24 18:07:39 +09:00
+      name: gps7_nmbf2048
+      rate: 1023.0
+      win: 19.1988151416004
+      loss: 17.3554541281629
+      rating_group: 4
+    gps7_nmb005+0603aa6be69954719efd16294d46e1fd: 
+      last_modified: 2008-04-19 22:30:16 +09:00
+      name: gps7_nmb005
+      rate: 1023.0
+      win: 19.0187875399771
+      loss: 15.5574290158712
+      rating_group: 4
+    gps8_orig+04b3be38b45d6c7341216df4494eba88: 
+      last_modified: 2008-04-21 01:54:49 +09:00
+      name: gps8_orig
+      rate: 988.0
+      win: 34.8334553178621
+      loss: 34.7756725880529
+      rating_group: 4
+    gps7_nmb005_3+833dbce4e46df7d07021364f70b004be: 
+      last_modified: 2008-04-25 22:11:02 +09:00
+      name: gps7_nmb005_3
+      rate: 1005.0
+      win: 18.5204889389606
+      loss: 18.5374372283291
+      rating_group: 4
+  10: 
+    gps7_kab3+b2920e23a50211cb5e3cd14f65efd909: 
+      last_modified: 2008-05-03 06:30:07 +09:00
+      name: gps7_kab3
+      rate: 1076.0
+      win: 12.0
+      loss: 7.0
+      rating_group: 10
+    gps7_kab5+b58d115ca7a38174b8e094d80d1f754b: 
+      last_modified: 2008-05-04 17:13:22 +09:00
+      name: gps7_kab5
+      rate: 1052.0
+      win: 12.0
+      loss: 8.0
+      rating_group: 10
+    gps7_kab4+dadcdaa4377a9741d4476298f0dc3d28: 
+      last_modified: 2008-05-03 23:35:23 +09:00
+      name: gps7_kab4
+      rate: 888.0
+      win: 7.0
+      loss: 12.0
+      rating_group: 10
+    gps7+3b3309e4846a69406950c38040488e08: 
+      last_modified: 2008-05-04 17:13:22 +09:00
+      name: gps7
+      rate: 982.0
+      win: 27.0
+      loss: 31.0
+      rating_group: 10
diff --git a/test/trunk/test.yaml b/test/trunk/test.yaml
new file mode 100644 (file)
index 0000000..da94d50
--- /dev/null
@@ -0,0 +1,3 @@
+--- 
+players: {}
+
diff --git a/test/trunk/test_board.rb b/test/trunk/test_board.rb
new file mode 100644 (file)
index 0000000..141af70
--- /dev/null
@@ -0,0 +1,779 @@
+## $Id$
+
+$:.unshift File.join(File.dirname(__FILE__), "..", "shogi-server")
+load    'shogi-server'
+require 'test/unit'
+
+module ShogiServer
+class Board
+  def set_from_str(strs)
+    strs.split(/\n/).each do |str|
+      if (str =~ /^P\d/)
+        str.sub!(/^P(.)/, '')
+        y = $1.to_i
+        x = 9
+        while (str.length > 2)
+          str.sub!(/^(...?)/, '')
+          one = $1
+          if (one =~ /^([\+\-])(..)/)
+            sg = $1
+            name = $2
+            if (sg == "+")
+              sente = true
+            else
+              sente = false
+            end
+            if ((x < 1) || (9 < x) || (y < 1) || (9 < y))
+              raise "bad position #{x} #{y}"
+            end
+            case (name)
+            when "FU"
+              PieceFU::new(self, x, y, sente)
+            when "KY"
+              PieceKY::new(self, x, y, sente)
+            when "KE"
+              PieceKE::new(self, x, y, sente)
+            when "GI"
+              PieceGI::new(self, x, y, sente)
+            when "KI"
+              PieceKI::new(self, x, y, sente)
+            when "OU"
+              PieceOU::new(self, x, y, sente)
+            when "KA"
+              PieceKA::new(self, x, y, sente)
+            when "HI"
+              PieceHI::new(self, x, y, sente)
+            when "TO"
+              PieceFU::new(self, x, y, sente, true)
+            when "NY"
+              PieceKY::new(self, x, y, sente, true)
+            when "NK"
+              PieceKE::new(self, x, y, sente, true)
+            when "NG"
+              PieceGI::new(self, x, y, sente, true)
+            when "UM"
+              PieceKA::new(self, x, y, sente, true)
+            when "RY"
+              PieceHI::new(self, x, y, sente, true)
+            else
+              raise "unkown piece #{name}"
+            end
+          end
+          x = x - 1
+        end
+      elsif (str =~ /^P([\+\-])/)
+        sg = $1
+        if (sg == "+")
+          sente = true
+        else
+          sente = false
+        end
+        str.sub!(/^../, '')
+        while (str.length > 3)
+          str.sub!(/^..(..)/, '')
+          name = $1
+          case (name)
+          when "FU"
+            PieceFU::new(self, 0, 0, sente)
+          when "KY"
+            PieceKY::new(self, 0, 0, sente)
+          when "KE"
+            PieceKE::new(self, 0, 0, sente)
+          when "GI"
+            PieceGI::new(self, 0, 0, sente)
+          when "KI"
+            PieceKI::new(self, 0, 0, sente)
+          when "KA"
+            PieceKA::new(self, 0, 0, sente)
+          when "HI"
+            PieceHI::new(self, 0, 0, sente)
+          else
+            raise "unkown piece #{name}"
+          end
+        end
+      end
+    end
+  end
+end
+end
+
+class Test_kachi < Test::Unit::TestCase
+  def test_kachi_good
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1+HI+HI+KA+KA+OU *  *  *  * 
+P2+FU+FU+FU+FU+FU+FU *  *  * 
+P+00FU00FU
+EOM
+    assert_equal(true, b.good_kachi?(true))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P8-HI-HI-KA-KA-OU *  *  *  * 
+P9-FU-FU-FU-FU-FU-FU *  *  * 
+P-00FU
+EOM
+    assert_equal(true, b.good_kachi?(false))
+  end
+
+  def test_kachi_good
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1+HI+HI+KA+KA+OU *  *  *  * 
+P2+FU+FU+FU+FU+FU+FU *  *  * 
+P+00FU00FU
+EOM
+    assert_equal(true, b.good_kachi?(true))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P8-HI-HI-KA-KA-OU *  *  *  * 
+P9-FU-FU-FU-FU-FU-FU *  *  * 
+P-00FU
+EOM
+    assert_equal(true, b.good_kachi?(false))
+  end
+
+  def test_kachi_bad
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1+HI+HI+KA+KA+OU *  *  *  * 
+P2+FU+FU+FU+FU+FU+FU *  *  * 
+P+00FU
+EOM
+    assert_equal(false, b.good_kachi?(true)) # point is not enough
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P8-HI-HI-KA-KA-OU *  *  *  * 
+P9-FU-FU-FU-FU-FU-FU *  *  * 
+EOM
+    assert_equal(false, b.good_kachi?(false)) # point is not enough
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1+HI+HI+KA+KA+OU *  *  *  * 
+P2+FU+FU+FU+FU+FU *  *  *  *
+P+00FU00FU00FU
+EOM
+    assert_equal(false, b.good_kachi?(true)) # number on board is not enough
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P8-HI-HI-KA-KA-OU *  *  *  * 
+P9-FU-FU-FU-FU-FU *  *  *  * 
+P-00FU00FU
+EOM
+    assert_equal(false, b.good_kachi?(false)) # number on board is not enough
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1+HI+HI+KA+KA+OU *  *  * -HI
+P2+FU+FU+FU+FU+FU+FU *  *  * 
+P+00FU00FU
+EOM
+    assert_equal(false, b.good_kachi?(true)) # checkmate
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P8-HI-HI-KA-KA-OU *  *  * +HI
+P9-FU-FU-FU-FU-FU-FU *  *  * 
+P-00FU
+EOM
+    assert_equal(false, b.good_kachi?(false)) # checkmate
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1+TO+TO * +TO+TO+OU * +TO * 
+P2 *  *  *  *  *  *  *  * +KI
+P3 *  *  * +TO+NG+TO+TO+TO+NY
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  * +UM
+P6 *  *  * -KI-NG-RY *  *  * 
+P7-TO * -TO-NG * -TO-TO-TO * 
+P8-RY *  * -NK-TO-OU-TO-TO * 
+P9 * -TO *  *  *  *  *  *  * 
+P+00KI00KI00KE
+P-00KA00GI00KE00KE00KY00KY00KY
+-
+EOM
+    assert_equal(true, b.good_kachi?(false))
+  end
+end
+
+class Test_gps < Test::Unit::TestCase
+  def test_gote_promote
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  *  *  * 
+P3-FU * -FU-FU-FU-FU-KA-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 * -FU+FU *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+KE+FU+FU+FU+FU+FU+FU
+P8 *  *  *  *  *  *  * +HI * 
+P9+KY * +GI+KI+OU+KI+GI+KE+KY
+P+00FU
+P-00KA
+EOM
+    assert_equal(:normal, b.handle_one_move("-3377UM"))
+  end
+
+  def test_capture_promoted_and_put
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  * -KA * 
+P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
+P8 * +KA *  *  *  *  * +HI * 
+P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
+EOM
+
+    assert_equal(:normal, b.handle_one_move("+7776FU"))
+    assert_equal(:normal, b.handle_one_move("-3334FU"))
+    assert_equal(:normal, b.handle_one_move("+2726FU"))
+    assert_equal(:normal, b.handle_one_move("-4344FU"))
+    assert_equal(:normal, b.handle_one_move("+3948GI"))
+    assert_equal(:normal, b.handle_one_move("-8242HI"))
+    assert_equal(:normal, b.handle_one_move("+5756FU"))
+    assert_equal(:normal, b.handle_one_move("-3132GI"))
+    assert_equal(:normal, b.handle_one_move("+5968OU"))
+    assert_equal(:normal, b.handle_one_move("-5162OU"))
+    assert_equal(:normal, b.handle_one_move("+6878OU"))
+    assert_equal(:normal, b.handle_one_move("-6272OU"))
+    assert_equal(:normal, b.handle_one_move("+4958KI"))
+    assert_equal(:normal, b.handle_one_move("-7282OU"))
+    assert_equal(:normal, b.handle_one_move("+9796FU"))
+    assert_equal(:normal, b.handle_one_move("-9394FU"))
+    assert_equal(:normal, b.handle_one_move("+2625FU"))
+    assert_equal(:normal, b.handle_one_move("-2233KA"))
+    assert_equal(:normal, b.handle_one_move("+3736FU"))
+    assert_equal(:normal, b.handle_one_move("-7172GI"))
+    assert_equal(:normal, b.handle_one_move("+7968GI"))
+    assert_equal(:normal, b.handle_one_move("-4152KI"))
+    assert_equal(:normal, b.handle_one_move("+6857GI"))
+    assert_equal(:normal, b.handle_one_move("-3243GI"))
+    assert_equal(:normal, b.handle_one_move("+6968KI"))
+    assert_equal(:normal, b.handle_one_move("-5354FU"))
+    assert_equal(:normal, b.handle_one_move("+1716FU"))
+    assert_equal(:normal, b.handle_one_move("-1314FU"))
+    assert_equal(:normal, b.handle_one_move("+4746FU"))
+    assert_equal(:normal, b.handle_one_move("-6364FU"))
+    assert_equal(:normal, b.handle_one_move("+4645FU"))
+    assert_equal(:normal, b.handle_one_move("-5263KI"))
+    assert_equal(:normal, b.handle_one_move("+2937KE"))
+    assert_equal(:normal, b.handle_one_move("-7374FU"))
+    assert_equal(:normal, b.handle_one_move("+2524FU"))
+    assert_equal(:normal, b.handle_one_move("-2324FU"))
+    assert_equal(:normal, b.handle_one_move("+4544FU"))
+    assert_equal(:normal, b.handle_one_move("-4344GI"))
+    assert_equal(:normal, b.handle_one_move("+0045FU"))
+    assert_equal(:normal, b.handle_one_move("-4445GI"))
+    assert_equal(:normal, b.handle_one_move("+8833UM"))
+    assert_equal(:normal, b.handle_one_move("-2133KE"))
+    assert_equal(:normal, b.handle_one_move("+0088KA"))
+    assert_equal(:normal, b.handle_one_move("-5455FU"))
+    assert_equal(:normal, b.handle_one_move("+8855KA"))
+    assert_equal(:normal, b.handle_one_move("-4243HI"))
+    assert_equal(:normal, b.handle_one_move("+2824HI"))
+    assert_equal(:normal, b.handle_one_move("-4554GI"))
+    assert_equal(:normal, b.handle_one_move("+0044FU"))
+    assert_equal(:normal, b.handle_one_move("-4353HI"))
+    assert_equal(:normal, b.handle_one_move("+2422RY"))
+    assert_equal(:normal, b.handle_one_move("-5455GI"))
+    assert_equal(:normal, b.handle_one_move("+5655FU"))
+    assert_equal(:normal, b.handle_one_move("-0056FU"))
+    assert_equal(:normal, b.handle_one_move("+5756GI"))
+    assert_equal(:normal, b.handle_one_move("-0057FU"))
+    assert_equal(:normal, b.handle_one_move("+4857GI"))
+    assert_equal(:normal, b.handle_one_move("-9495FU"))
+    assert_equal(:normal, b.handle_one_move("+9695FU"))
+    assert_equal(:normal, b.handle_one_move("-0096FU"))
+    assert_equal(:normal, b.handle_one_move("+9996KY"))
+    assert_equal(:normal, b.handle_one_move("-0085KA"))
+  end
+end
+
+
+class Test_promote < Test::Unit::TestCase
+  def test_fu
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU *
+P2 *  *  *  *
+P3+FU *  * +HI
+P4 * +FU *  *
+P5 *  * +FU *
+EOM
+    assert_equal(:normal, b.handle_one_move("+9392TO"))
+    assert_equal(:normal, b.handle_one_move("+8483TO"))
+    assert_equal(:illegal, b.handle_one_move("+7574TO"))
+    assert_equal(:normal, b.handle_one_move("+6364RY"))
+  end
+end
+
+class Test_move < Test::Unit::TestCase
+  def test_fu
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2 * +FU *
+EOM
+    assert_equal(:illegal, b.handle_one_move("+8281FU"))
+  end
+  def test_hi
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2 * +HI *
+EOM
+    assert_equal(:normal, b.handle_one_move("+8212HI"))
+    assert_equal(:illegal, b.handle_one_move("+1223HI"))
+  end
+  def test_ry
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2 * +RY *
+EOM
+    assert_equal(:normal, b.handle_one_move("+8212RY"))
+    assert_equal(:normal, b.handle_one_move("+1223RY"))
+  end
+end
+
+class Test_put < Test::Unit::TestCase
+  def test_fu
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P+00FU00FU
+EOM
+    assert_equal(:illegal, b.handle_one_move("+0011FU"))
+    assert_equal(:normal, b.handle_one_move("+0022FU"))
+  end
+  def test_ky
+     b = ShogiServer::Board.new
+     b.set_from_str(<<EOM)
+P1-OU * +OU
+P+00KY00KY
+EOM
+    assert_equal(:illegal, b.handle_one_move("+0011KY"))
+    assert_equal(:normal, b.handle_one_move("+0022KY"))
+  end
+
+  def test_ke
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P+00KE00KE00KE
+EOM
+    assert_equal(:illegal, b.handle_one_move("+0011KE"))
+    assert_equal(:illegal, b.handle_one_move("+0022KE"))
+    assert_equal(:normal, b.handle_one_move("+0033KE"))
+  end
+end
+
+
+class Test_2fu < Test::Unit::TestCase
+  def test_2fu
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P+00FU00FU
+EOM
+    assert_equal(:normal, b.handle_one_move("+0022FU"))
+    assert_equal(:illegal, b.handle_one_move("+0023FU"))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P+00FU00FU
+EOM
+    assert_equal(:normal, b.handle_one_move("+0022FU"))
+    assert_equal(:normal, b.handle_one_move("+0032FU"))
+  end
+end
+
+class Test_sennichite < Test::Unit::TestCase
+  def test_oute_sennichite0
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU *  * +OU
+P2 *  * +HI *
+EOM
+##    b.history[b.to_s] = 1
+    assert_equal(:normal, b.handle_one_move("+7271HI")) #1
+    assert_equal(:normal, b.handle_one_move("-9192OU"))
+    assert_equal(:normal, b.handle_one_move("+7172HI"))
+    assert_equal(:normal, b.handle_one_move("-9291OU"))
+
+    assert_equal(:normal, b.handle_one_move("+7271HI")) # 2
+    assert_equal(:normal, b.handle_one_move("-9192OU"))
+    assert_equal(:normal, b.handle_one_move("+7172HI"))
+    assert_equal(:normal, b.handle_one_move("-9291OU"))
+
+    assert_equal(:normal, b.handle_one_move("+7271HI")) # 3
+    assert_equal(:normal, b.handle_one_move("-9192OU"))
+    assert_equal(:normal, b.handle_one_move("+7172HI"))
+    assert_equal(:normal, b.handle_one_move("-9291OU"))
+
+    assert_equal(:oute_sennichite_sente_lose, b.handle_one_move("+7271HI")) # 4
+  end
+
+  def test_oute_sennichite1 #330
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  * -KA * 
+P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
+P8 * +KA *  *  *  *  * +HI * 
+P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
+EOM
+b.history[b.to_s] = 1
+
+    assert_equal(:normal, b.handle_one_move("+2726FU"))
+    assert_equal(:normal, b.handle_one_move("-8384FU"))
+    assert_equal(:normal, b.handle_one_move("+2625FU"))
+    assert_equal(:normal, b.handle_one_move("-8485FU"))
+    assert_equal(:normal, b.handle_one_move("+6978KI"))
+    assert_equal(:normal, b.handle_one_move("-4132KI"))
+    assert_equal(:normal, b.handle_one_move("+2524FU"))
+    assert_equal(:normal, b.handle_one_move("-2324FU"))
+    assert_equal(:normal, b.handle_one_move("+2824HI"))
+    assert_equal(:normal, b.handle_one_move("-0023FU"))
+    assert_equal(:normal, b.handle_one_move("+2484HI"))
+    assert_equal(:normal, b.handle_one_move("-8284HI"))
+    assert_equal(:normal, b.handle_one_move("+4938KI"))
+    assert_equal(:normal, b.handle_one_move("-9394FU"))
+    assert_equal(:normal, b.handle_one_move("+5969OU"))
+    assert_equal(:normal, b.handle_one_move("-0049HI"))
+
+    assert_equal(:normal, b.handle_one_move("+6968OU"))
+    assert_equal(:normal, b.handle_one_move("-4948RY"))
+    assert_equal(:normal, b.handle_one_move("+6869OU"))
+    assert_equal(:normal, b.handle_one_move("-4849RY"))
+
+    assert_equal(:normal, b.handle_one_move("+6968OU"))
+    assert_equal(:normal, b.handle_one_move("-4948RY"))
+    assert_equal(:normal, b.handle_one_move("+6869OU"))
+    assert_equal(:normal, b.handle_one_move("-4849RY"))
+
+    assert_equal(:normal, b.handle_one_move("+6968OU"))
+    assert_equal(:normal, b.handle_one_move("-4948RY"))
+    assert_equal(:normal, b.handle_one_move("+6869OU"))
+    assert_equal(:normal, b.handle_one_move("-4849RY"))
+
+    assert_equal(:normal, b.handle_one_move("+6968OU")) # added
+    assert_equal(:oute_sennichite_gote_lose, b.handle_one_move("-4948RY"))
+  end
+
+  def test_not_oute_sennichite
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU *  * +OU
+P2 *  * +HI *
+EOM
+##    b.history[b.to_s] = 1
+    assert_equal(:normal, b.handle_one_move("+7271HI")) #1
+    assert_equal(:normal, b.handle_one_move("-9192OU"))
+    assert_equal(:normal, b.handle_one_move("+7172HI"))
+    assert_equal(:normal, b.handle_one_move("-9291OU"))
+
+    assert_equal(:normal, b.handle_one_move("+7271HI")) # 2
+    assert_equal(:normal, b.handle_one_move("-9192OU"))
+    assert_equal(:normal, b.handle_one_move("+7174HI")) # stop oute here
+    assert_equal(:normal, b.handle_one_move("-9291OU"))
+
+    assert_equal(:normal, b.handle_one_move("+7471HI")) # 3
+    assert_equal(:normal, b.handle_one_move("-9192OU"))
+    assert_equal(:normal, b.handle_one_move("+7172HI"))
+    assert_equal(:normal, b.handle_one_move("-9291OU"))
+
+    assert_equal(:sennichite, b.handle_one_move("+7271HI")) # 4
+  end
+
+  def test_sennichite0
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+EOM
+    b.history[b.to_s] = 1
+    assert_equal(:normal, b.handle_one_move("+7172OU"))
+    assert_equal(:normal, b.handle_one_move("-9192OU"))
+    assert_equal(:normal, b.handle_one_move("+7271OU"))
+    assert_equal(:normal, b.handle_one_move("-9291OU")) # 2
+
+    assert_equal(:normal, b.handle_one_move("+7172OU"))
+    assert_equal(:normal, b.handle_one_move("-9192OU"))
+    assert_equal(:normal, b.handle_one_move("+7271OU"))
+    assert_equal(:normal, b.handle_one_move("-9291OU")) # 3
+
+    assert_equal(:normal, b.handle_one_move("+7172OU"))
+    assert_equal(:normal, b.handle_one_move("-9192OU"))
+    assert_equal(:normal, b.handle_one_move("+7271OU"))
+    assert_equal(:sennichite, b.handle_one_move("-9291OU")) # 4
+  end
+
+  def test_sennichite1          # 329
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  * -KA * 
+P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
+P8 * +KA *  *  *  *  * +HI * 
+P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
+EOM
+    b.history[b.to_s] = 1
+
+    assert_equal(:normal, b.handle_one_move("+2858HI"))
+    assert_equal(:normal, b.handle_one_move("-8252HI"))
+    assert_equal(:normal, b.handle_one_move("+5828HI"))
+    assert_equal(:normal, b.handle_one_move("-5282HI"))
+    assert_equal(:normal, b.handle_one_move("+2858HI"))
+    assert_equal(:normal, b.handle_one_move("-8252HI"))
+    assert_equal(:normal, b.handle_one_move("+5828HI"))
+    assert_equal(:normal, b.handle_one_move("-5282HI"))
+    assert_equal(:normal, b.handle_one_move("+2858HI"))
+    assert_equal(:normal, b.handle_one_move("-8252HI"))
+    assert_equal(:normal, b.handle_one_move("+5828HI"))
+    assert_equal(:sennichite, b.handle_one_move("-5282HI"))
+  end
+end
+
+class Test_checkmate < Test::Unit::TestCase
+  def test_ki
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2 * +KI
+EOM
+    assert_equal(true, b.checkmated?(false)) # gote is loosing
+    assert_equal(false, b.checkmated?(true))
+  end
+
+  def test_hi
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +HI+OU
+EOM
+    assert_equal(true, b.checkmated?(false)) # gote is loosing
+    assert_equal(false, b.checkmated?(true))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * 
+P2 * +HI+OU
+EOM
+    assert_equal(false, b.checkmated?(false)) # hisha can't capture
+    assert_equal(false, b.checkmated?(true))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * 
+P2 * +RY+OU
+EOM
+    assert_equal(true, b.checkmated?(false)) # ryu can capture
+    assert_equal(false, b.checkmated?(true))
+  end
+
+  def test_KE
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2 *  *  *
+P3 * +KE *
+EOM
+    assert_equal(true, b.checkmated?(false))
+    assert_equal(false, b.checkmated?(true))
+  end
+end
+
+class Test_uchifuzume < Test::Unit::TestCase
+  def test_uchifuzume1          # 331
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
+P2 * -HI *  *  *  *  * -KA * 
+P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
+P4 *  *  *  *  *  *  *  *  * 
+P5 *  *  *  *  *  *  *  *  * 
+P6 *  *  *  *  *  *  *  *  * 
+P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
+P8 * +KA *  *  *  *  * +HI * 
+P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
+EOM
+
+    assert_equal(:normal, b.handle_one_move("+2726FU"))
+    assert_equal(:normal, b.handle_one_move("-8384FU"))
+    assert_equal(:normal, b.handle_one_move("+2625FU"))
+    assert_equal(:normal, b.handle_one_move("-8485FU"))
+    assert_equal(:normal, b.handle_one_move("+2524FU"))
+    assert_equal(:normal, b.handle_one_move("-2324FU"))
+    assert_equal(:normal, b.handle_one_move("+2824HI"))
+    assert_equal(:normal, b.handle_one_move("-8586FU"))
+    assert_equal(:normal, b.handle_one_move("+8786FU"))
+    assert_equal(:normal, b.handle_one_move("-0087FU"))
+    assert_equal(:normal, b.handle_one_move("+0023FU"))
+    assert_equal(:normal, b.handle_one_move("-8788TO"))
+    assert_equal(:normal, b.handle_one_move("+2322TO"))
+    assert_equal(:normal, b.handle_one_move("-8879TO"))
+    assert_equal(:normal, b.handle_one_move("+2231TO"))
+    assert_equal(:normal, b.handle_one_move("-7969TO"))
+    assert_equal(:normal, b.handle_one_move("+5969OU"))
+    assert_equal(:normal, b.handle_one_move("-8286HI"))
+    assert_equal(:normal, b.handle_one_move("+3141TO"))
+    assert_equal(:normal, b.handle_one_move("-5141OU"))
+    assert_equal(:normal, b.handle_one_move("+2484HI"))
+    assert_equal(:normal, b.handle_one_move("-8684HI"))
+    assert_equal(:normal, b.handle_one_move("+6978OU"))
+    assert_equal(:normal, b.handle_one_move("-8424HI"))
+    assert_equal(:normal, b.handle_one_move("+7776FU"))
+    assert_equal(:normal, b.handle_one_move("-7374FU"))
+    assert_equal(:normal, b.handle_one_move("+7675FU"))
+    assert_equal(:normal, b.handle_one_move("-7475FU"))
+    assert_equal(:normal, b.handle_one_move("+0079KI"))
+    assert_equal(:normal, b.handle_one_move("-7576FU"))
+    assert_equal(:normal, b.handle_one_move("+7888OU"))
+    assert_equal(:normal, b.handle_one_move("-7677TO"))
+    assert_equal(:normal, b.handle_one_move("+8877OU"))
+    assert_equal(:normal, b.handle_one_move("-2474HI"))
+    assert_equal(:normal, b.handle_one_move("+7788OU"))
+    assert_equal(:normal, b.handle_one_move("-0086KI"))
+    assert_equal(:normal, b.handle_one_move("+9998KY"))
+    assert_equal(:normal, b.handle_one_move("-7424HI"))
+    assert_equal(:normal, b.handle_one_move("+0099GI"))
+    assert_equal(:normal, b.handle_one_move("-0028HI"))
+    assert_equal(:normal, b.handle_one_move("+0078FU"))
+    assert_equal(:uchifuzume, b.handle_one_move("-0087FU"))
+  end
+
+  def test_uchifuzume2
+    # http://wdoor.c.u-tokyo.ac.jp/shogi/tools/view/index.cgi?go_last=on&csa=http%3A%2F%2Fwdoor.c.u-tokyo.ac.jp%2Fshogi%2Flogs%2FLATEST%2Fwdoor%2Bfloodgate-900-0%2Busapyon-on-note%2BKShogi900%2B20080217020012.csa
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-KY-KE * -KI * -OU * -KE-KY
+P2 *  * +TO *  *  *  *  *  *
+P3 *  *  *  * -KI-KI * -FU *
+P4 *  * -FU * -FU-FU-FU *  *
+P5 * -RY+GI+OU *  *  * +FU+FU
+P6-FU * +FU+KI+GI+FU+FU * +KY
+P7 *  *  * -RY *  *  *  *  *
+P8 *  *  *  *  *  *  *  *  *
+P9+KY+KE *  *  *  *  *  *  *
+P+00FU00FU00FU00FU00FU00GI00GI00KA00KE
+P-00FU00KA
+-
+EOM
+    assert_equal(:uchifuzume, b.handle_one_move("-0064FU"))
+  end
+
+  def test_uchifuzume3
+    # http://wdoor.c.u-tokyo.ac.jp/shogi/tools/view/index.cgi?go_last=on&csa=http%3A%2F%2Fwdoor.c.u-tokyo.ac.jp%2Fshogi%2Flogs%2FLATEST%2Fwdoor%2Bfloodgate-900-0%2Busapyon-on-note%2Bgps_normal%2B20080215133008.csa
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1 * -GI * -KI-OU * -GI * -KY
+P2 *  *  *  * -FU *  *  *  *
+P3+OU * -FU-FU * -FU-KI-FU *
+P4+KI+KE-RY * -GI *  *  * -FU
+P5 *  *  *  *  *  *  *  *  *
+P6+FU *  *  * +KY *  *  * +FU
+P7 * +FU *  * +FU *  *  *  *
+P8 * +GI *  *  *  *  *  *  *
+P9+KY+KE *  *  *  *  *  * -UM
+P+00KA00KI00KE00KY00FU00FU00FU
+P-00HI00KE00FU00FU00FU00FU00FU
+-
+EOM
+    assert_equal(:normal, b.handle_one_move("-0092FU"))
+  end
+
+  def test_ou
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2+FU *  *
+P3 * +HI *
+EOM
+    assert_equal(false, b.uchifuzume?(true))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2+FU *  *
+P3 * +RY *
+EOM
+    assert_equal(true, b.uchifuzume?(true))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P2-OU * +OU
+P3+FU *  *
+P4 * +RY *
+EOM
+    assert_equal(false, b.uchifuzume?(true)) # ou can move backward
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P2-OU * +OU
+P3+FU * +KA
+P4 * +RY *
+EOM
+    assert_equal(true, b.uchifuzume?(true)) # ou can move backward and kaku can capture it
+ end                   
+
+
+  def test_friend
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2+FU * -HI
+P3 * +RY *
+EOM
+    assert_equal(false, b.uchifuzume?(true))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2+FU * +FU-HI
+P3 * +RY *
+EOM
+    assert_equal(true, b.uchifuzume?(true)) # hisha blocked by fu
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2+FU *  *
+P3-GI+RY *
+EOM
+    assert_equal(true, b.uchifuzume?(true))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2+FU *  *
+P3-KI+RY *
+EOM
+    assert_equal(false, b.uchifuzume?(true))
+
+    b = ShogiServer::Board.new
+    b.set_from_str(<<EOM)
+P1-OU * +OU
+P2+FU *  *
+P3-NG+RY *
+EOM
+    assert_equal(false, b.uchifuzume?(true))
+ end
+end