grhino-0.16.1/0000700000175000017500000000000011436423225013313 5ustar lerdsuwalerdsuwagrhino-0.16.1/highlight_black.xpm0000644000175000017500000000415011436423225017156 0ustar lerdsuwalerdsuwa/* XPM */ static char * highlight_black_xpm[] = { "40 40 22 1", " c None", ". c #000000", "+ c #26860F", "@ c #21770D", "# c #154908", "$ c #0A2604", "% c #040D01", "& c #000100", "* c #237A0D", "= c #0F3605", "- c #1A5C0A", "; c #030B01", "> c #185309", ", c #1B610A", "' c #25820E", ") c #051202", "! c #124007", "~ c #24810E", "{ c #010501", "] c #185409", "^ c #0D2F05", "/ c #061502", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++*=..........=*++++++++++++.", ".+++++++++++-;............;-+++++++++++.", ".++++++++++>................>++++++++++.", ".+++++++++,..................,+++++++++.", ".++++++++')..................)'++++++++.", ".++++++++!....................!++++++++.", ".+++++++~{....................{~+++++++.", ".+++++++]......................]+++++++.", ".+++++++^......................^+++++++.", ".+++++++/....................../+++++++.", ".+++++++{......................{+++++++.", ".+++++++........................+++++++.", ".+++++++{......................{+++++++.", ".+++++++/....................../+++++++.", ".+++++++^......................^+++++++.", ".+++++++]......................]+++++++.", ".+++++++~{....................{~+++++++.", ".++++++++!....................!++++++++.", ".++++++++')..................)'++++++++.", ".+++++++++,..................,+++++++++.", ".++++++++++>................>++++++++++.", ".+++++++++++-;............;-+++++++++++.", ".++++++++++++*=..........=*++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/board.cc0000644000175000017500000001572711436423224014736 0ustar lerdsuwalerdsuwa/* board.cc Game Board Operations Copyright (c) 2000-2005, 2006 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "board.h" #include "iter.h" #include "hash.h" #include #include #include #ifdef _ # undef _ #endif #ifdef N_ # undef N_ #endif #include #define _(x) gettext(x) #define N_(x) (x) #include "table-dat.h" byte_board_type board_empty = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; byte_board_type board_begin = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,-1, 1, 0, 0, 0, 0, 0, 0, 1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; // Flipable in 3 directions #define FT3(a,b,c) ((1<<(a)) + (1<<(b)) + (1<<(c))) #define FT3SE FT3(DIR_E, DIR_SE, DIR_S) #define FT3SW FT3(DIR_W, DIR_SW, DIR_S) #define FT3NE FT3(DIR_E, DIR_NE, DIR_N) #define FT3NW FT3(DIR_W, DIR_NW, DIR_N) // Flipable in 5 directions #define FT5(a,b,c,d,e) ((1<<(a)) + (1<<(b)) + (1<<(c)) + (1<<(d)) + (1<<(e))) #define FT5S FT5(DIR_E, DIR_SE, DIR_S, DIR_SW, DIR_W) #define FT5E FT5(DIR_N, DIR_NE, DIR_E, DIR_SE, DIR_S) #define FT5W FT5(DIR_N, DIR_NW, DIR_W, DIR_SW, DIR_S) #define FT5N FT5(DIR_E, DIR_NE, DIR_N, DIR_NW, DIR_W) // Flipable in 8 directions #define FT8 255 // Table of flipable directions in each position int flip_table[64] = { FT3SE, FT3SE, FT5S, FT5S, FT5S, FT5S, FT3SW, FT3SW, FT3SE, FT3SE, FT5S, FT5S, FT5S, FT5S, FT3SW, FT3SW, FT5E, FT5E, FT8, FT8, FT8, FT8, FT5W, FT5W, FT5E, FT5E, FT8, FT8, FT8, FT8, FT5W, FT5W, FT5E, FT5E, FT8, FT8, FT8, FT8, FT5W, FT5W, FT5E, FT5E, FT8, FT8, FT8, FT8, FT5W, FT5W, FT3NE, FT3NE, FT5N, FT5N, FT5N, FT5N, FT3NW, FT3NW, FT3NE, FT3NE, FT5N, FT5N, FT5N, FT5N, FT3NW, FT3NW }; // No default initialization to speed up search byte_board_info::byte_board_info() { } byte_board_info::byte_board_info(const byte_board_type *board_init) { *this = board_init; } byte_board_info& byte_board_info::operator=(const byte_board_type *board_init) { memcpy(board, board_init, sizeof(byte_board_type)); move = NUM_MOVE; board_iterator iter; iter.init_pos(); do { if (is_empty(iter.pos)) move--; } while (iter.next()); if (move < 0) throw std::runtime_error(_("invalid initial board")); hash = get_hash(this); return *this; } byte_board_info& byte_board_info::operator=(const byte_board_info& src) { memcpy(this, &src, sizeof(byte_board_info)); return *this; } void byte_board_info::set_pos(int color, int pos) { board[pos] = color; move = NUM_MOVE; board_iterator iter; iter.init_pos(); do { if (is_empty(iter.pos)) move--; } while (iter.next()); if (move < 0) move = 0; // Assume edit not finished hash = get_hash(this); } bool byte_board_info::can_play_nocheck(int color, int pos) const { board_dir_iterator iter; for (int dir = DIR_START; dir <= DIR_END; ++dir) { if (flip_table[pos] & (1 << dir)) { iter.init_pos(pos); int count = 0; while (iter.next_dir(dir)) { piece_type p = board[iter.pos]; if (p == EMPTY) { break; } else if (p == color) { if (count) { return true; } else { break; } } else { count++; } } } } return false; } bool byte_board_info::can_play_nocheck(int color, int pos, int dir_count[NUM_DIR]) const { bool ret = false; board_dir_iterator iter; for (int dir = DIR_START; dir <= DIR_END; ++dir) { if (flip_table[pos] & (1 << dir)) { iter.init_pos(pos); int count = 0; dir_count[dir] = 0; while (iter.next_dir(dir)) { piece_type p = board[iter.pos]; if (p == EMPTY) { break; } else if (p == color) { if (count) { ret = true; dir_count[dir] = count; } break; } else { count++; } } } else dir_count[dir] = 0; } return ret; } bool byte_board_info::can_play(int color) const { board_iterator iter; iter.init_pos(); do { if (can_play(color, iter.pos)) return true; } while (iter.next()); return false; } // Assume can_play(...) is true for color and pos void byte_board_info::place_piece(int color, int pos) { board[pos] = color; // Place the new piece move++; hash ^= get_hash_piece(color, pos); // Flip pieces in all directions board_dir_iterator iter; for (int dir = DIR_START; dir <= DIR_END; ++dir) { if (flip_table[pos] & (1 << dir)) { iter.init_pos(pos); int count = 0; while (iter.next_dir(dir)) { piece_type p = board[iter.pos]; if (p == EMPTY) { // Not flanked break; } else if (p == color) { while (count) { // Flanked // Flip iter.next_dir_nocheck(dir ^ 4); board[iter.pos] = color; hash ^= get_hash_flip(iter.pos); count--; } break; } else { count++; } } } } } // Assume can_play(...) is true for color and pos void byte_board_info::place_piece(int color, int pos, int dir_count[NUM_DIR]) { board[pos] = color; // Place the new piece move++; hash ^= get_hash_piece(color, pos); // Flip pieces in all directions board_dir_iterator iter; for (int dir = DIR_START; dir <= DIR_END; ++dir) { if (flip_table[pos] & (1 << dir)) { if (dir_count[dir]) { iter.init_pos(pos); int count = dir_count[dir]; while (count) { iter.next_dir(dir); board[iter.pos] = color; hash ^= get_hash_flip(iter.pos); count--; } } } } } int byte_board_info::board_diff_score() const { int score = 0; board_iterator iter; iter.init_pos(); do { score += board[iter.pos]; } while (iter.next()); return score; } int byte_board_info::board_black_score() const { int score = 0; board_iterator iter; iter.init_pos(); do { if (board[iter.pos] == BLACK) score++; } while (iter.next()); return score; } int byte_board_info::board_white_score() const { int score = 0; board_iterator iter; iter.init_pos(); do { if (board[iter.pos] == WHITE) score++; } while (iter.next()); return score; } bool operator==(const byte_board_info &board1, const byte_board_info &board2) { if (memcmp(board1.board, board2.board, 64)) return false; return true; } grhino-0.16.1/icon_new.xpm0000644000175000017500000000454111436423225015660 0ustar lerdsuwalerdsuwa/* XPM */ static char * icon_new_xpm[] = { "38 38 50 1", " c None", ". c #3FDD18", "+ c #206E0C", "@ c #43DE1D", "# c #91EC7B", "$ c #D7F8CF", "% c #F9FEF8", "& c #3ED817", "* c #247E0E", "= c #0D2E05", "- c #020600", "; c #51E02E", "> c #DAF8D2", ", c #FFFFFF", "' c #39C816", ") c #0C2A04", "! c #000000", "~ c #40DD1A", "{ c #D6F8CE", "] c #3EDB18", "^ c #0D2F05", "/ c #87EA6F", "( c #27890F", "_ c #D0F6C6", ": c #0F3606", "< c #F5FDF3", "[ c #030B01", "} c #FDFEFC", "| c #000200", "1 c #E6FAE1", "2 c #081C03", "3 c #B0F1A0", "4 c #195A0A", "5 c #59E138", "6 c #F8FEF7", "7 c #36BE14", "8 c #020701", "9 c #8EEB77", "0 c #25810E", "a c #7EE863", "b c #ECFCE8", "c c #2A9410", "d c #061602", "e c #44DE1F", "f c #77E75C", "g c #99ED85", "h c #3DD617", "i c #2C9C11", "j c #21740C", "k c #103706", "..................++..................", "..................++..................", "..................++..................", ".....@#$%%$#@.....++.....&*=--=*&.....", "....;>,,,,,,>;....++....')!!!!!!)'....", "...~{,,,,,,,,{~...++...]^!!!!!!!!^]...", ".../,,,,,,,,,,/...++...(!!!!!!!!!!(...", "..._,,,,,,,,,,_...++...:!!!!!!!!!!:...", "...<,,,,,,,,,,<...++...[!!!!!!!!!![...", "...},,,,,,,,,,}...++...|!!!!!!!!!!|...", "...1,,,,,,,,,,1...++...2!!!!!!!!!!2...", "...3,,,,,,,,,,3...++...4!!!!!!!!!!4...", "...56,,,,,,,,65...++...78!!!!!!!!87...", "....9,,,,,,,,9....++....0!!!!!!!!0....", ".....ab,,,,ba.....++.....cd!!!!dc.....", "......efggfe......++......hijjih......", "..................++..................", "..................++..................", "++++++++++++++++++kk++++++++++++++++++", "++++++++++++++++++kk++++++++++++++++++", "..................++..................", "..................++..................", "..................++..................", ".....&*=--=*&.....++.....@#$%%$#@.....", "....')!!!!!!)'....++....;>,,,,,,>;....", "...]^!!!!!!!!^]...++...~{,,,,,,,,{~...", "...(!!!!!!!!!!(...++.../,,,,,,,,,,/...", "...:!!!!!!!!!!:...++..._,,,,,,,,,,_...", "...[!!!!!!!!!![...++...<,,,,,,,,,,<...", "...|!!!!!!!!!!|...++...},,,,,,,,,,}...", "...2!!!!!!!!!!2...++...1,,,,,,,,,,1...", "...4!!!!!!!!!!4...++...3,,,,,,,,,,3...", "...78!!!!!!!!87...++...56,,,,,,,,65...", "....0!!!!!!!!0....++....9,,,,,,,,9....", ".....cd!!!!dc.....++.....ab,,,,ba.....", "......hijjih......++......efggfe......", "..................++..................", "..................++.................."}; grhino-0.16.1/bottom.xpm0000644000175000017500000001632211436423224015362 0ustar lerdsuwalerdsuwa/* XPM */ static char * bottom_xpm[] = { "360 20 3 1", " c None", ". c #C3C3C3", "+ c #000000", "...................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++...................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................"}; grhino-0.16.1/icon_black.xpm0000644000175000017500000000502611436423225016142 0ustar lerdsuwalerdsuwa/* XPM */ static char * icon_black_xpm[] = { "48 48 2 1", " c None", ". c #000000", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ........ ", " ............ ", " ................ ", " .................. ", " .................... ", " ...................... ", " ........................ ", " ........................ ", " .......................... ", " .......................... ", " ............................ ", " ............................ ", " ............................ ", " ............................ ", " ............................ ", " ............................ ", " ............................ ", " ............................ ", " .......................... ", " .......................... ", " ........................ ", " ........................ ", " ...................... ", " .................... ", " .................. ", " ................ ", " ............ ", " ........ ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; grhino-0.16.1/load.cc0000644000175000017500000000662511436423225014564 0ustar lerdsuwalerdsuwa/* load.cc Game File Loader Copyright (c) 2005, 2006 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include "load.h" #include "game.h" #include "gutil.h" #include "ggamewin.h" void process_game(std::vector &t, game_library_log &game) { t.push_back(game); } void load_game_list(const char *f) { std::vector *game_vec = new std::vector; try { if (!game_library_opened(f)) process_file(f, *game_vec, false, false); } catch (std::exception &e) { gtstream bufstr; gtout(bufstr, _("Error: %$")) << e.what(); error_message_box(bufstr); delete game_vec; return; } catch (...) { gtstream bufstr; gtout(bufstr, _("Error: problem reading file %$")) << f; error_message_box(bufstr); delete game_vec; return; } if (!game_vec->size()) { gtstream bufstr; gtout(bufstr, _("Error: file %$ does not contain game data")) << f; error_message_box(bufstr); delete game_vec; return; } else if (game_vec->size() == 1) { // Remove highlight from Game List // window update_game_list.update(UPDATE_ALL); load_game((*game_vec)[0]); delete game_vec; return; } else // game_library will handle memory release of game_vec game_library(game_vec, f); } void cancel_edit_mode(); // In grhino.cc void load_game(const game_library_log &game) { byte_board_info board = game.board; // Loop for all game moves for (int i = 0; i < game.num_move_queue; ++i) { int player = game.move_queue_color[i]; int pos = game.move_queue[i]; // Catch broken game record if (!board.can_play(player, pos)) { gtstream bufstr; gtout(bufstr, _("Error: game contains invalid move %$%$")) << static_cast('A' + pos_to_x(pos)) << static_cast('1' + pos_to_y(pos)); error_message_box(bufstr); return; } board.place_piece(player, pos); } cancel_input(); cancel_edit_mode(); if (game.random) cur_game_info.new_game_from_board(&(game.board), game.move_queue_color[0]); else cur_game_info.new_game_from_begin(0); // Loop for all game moves // FIXME: Deal with use_clock, time for (int i = 0; i < game.num_move_queue; ++i) { int pos = game.move_queue[i]; cur_game_info.place_piece(pos, game.time_queue[i]); } if (game.timeout) cur_game_info.player_timeout(); else if (game.resign) cur_game_info.player_resign(); else if (cur_game_info.is_game_play()) cur_game_info.game_end(); *view_board_ptr = cur_game_info.board_history[0]; view_player = cur_game_info.player_history[0]; set_view_mode(VIEW_MODE_HISTORY); view_position = 0; draw_board(); update_move.update(UPDATE_ALL); // Don't update update_game_list here // since it may be called from Game List // window itself. } grhino-0.16.1/gen_pattern.cc0000644000175000017500000004201211436423224016140 0ustar lerdsuwalerdsuwa/* gen_pattern.cc Game Pattern Generator Copyright (c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include #include #include #include #include "pattern.h" #include "log_proc.h" #include "gtstream.h" #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x // Grab version number in VERSION variable // Use same version number as main GRhino program #undef VERSION const char * #include "scripts/version" ; const char *prog_name = "gen_pattern"; const char *prog_ver = VERSION; struct pattern_state { pattern_t p; // Pattern information // pat[PATTERN][MOVE_INDEX][PATTERN_INDEX] // where // PATTERN = ROW1, ROW2, etc. // MOVE_INDEX = 0, 1, ..., num_move_index-1 // PATTERN_INDEX = 0, 1, ... according to // positions of black and white pieces raw_pattern_info ***pat; pattern_state(pattern_t p_, raw_pattern_info ***pat_) : p(p_), pat(pat_) {} }; /* Calculate score based on b = number of black wins w = number of white wins Result truncated to fit signed char. */ signed char log_func(long b, long w) { if (b == w) // Special case to avoid round-off problem return 0; long a; // Make sure we don't put too high score for case // like win-loss = 1-0 if (b+w < 5) a = 5 - b - w; else a = 1; // Make formula work even when either b or w is zero long x; // Make sure we don't have rounding non-symmetry if (b > w) x = static_cast(10*log(static_cast(b+a)/(w+a))); else x = -static_cast(10*log(static_cast(w+a)/(b+a))); // Limit value to fit signed char if (x > 7) x = 7; else if (x < -7) x = -7; return static_cast(x); } void init_file(pattern_t p) { // Special marker for all patterns if (p == PATTERN_UNKNOWN) { for (int p = 0; p != PATTERN_UNKNOWN; p++) init_file(static_cast(p)); return; } int handle = creat(get_pattern_file(p), S_IRUSR | S_IWUSR); if (handle == -1) { gtstream bufstr; gtout(bufstr, _("cannot create file %$\n")) << get_pattern_file(p); throw std::runtime_error(bufstr.str()); } // Loop for all move indexes raw_pattern_info **pat = new raw_pattern_info *[num_move_index]; for (int pos = 0; pos < num_move_index; ++pos) { pat[pos] = new raw_pattern_info[get_pattern_size(p)]; // Loop for all pattern indexes for (int i = 0; i < get_pattern_size(p); ++i) { pat[pos][i].black_win = 0; pat[pos][i].white_win = 0; } } // Loop for all move indexes for (int pos = 0; pos < num_move_index; ++pos) { // Write all pattern indexes int size = sizeof(raw_pattern_info) * get_pattern_size(p); if (write(handle, pat[pos], size) != size) { close(handle); gtstream bufstr; gtout(bufstr, _("cannot write file %$\n")) << get_pattern_file(p); throw std::runtime_error(bufstr.str()); } } for (int pos = 0; pos < num_move_index; ++pos) { delete [] pat[pos]; } delete [] pat; close(handle); } int num_update[PATTERN_UNKNOWN][num_move_index]; int update_list[PATTERN_UNKNOWN][num_move_index][60]; int update_move_index; void init_info() { update_move_index = -1; for (int p = 0; p != PATTERN_UNKNOWN; ++p) for (int i = 0; i < num_move_index; ++i) num_update[p][i] = 0; } bool find_update(pattern_t p, int move_index, int pos) { for (int i = 0; i < num_update[p][move_index]; ++i) { if (pos == update_list[p][move_index][i]) // Already updated return true; } return false; } void update_info_table(pattern_t p, raw_pattern_info ***pat, int diff, int move_index, int pos1, int pos2, int pos3, int pos4) { if (find_update(p, move_index, pos1)) return; update_list[p][move_index][num_update[p][move_index]] = pos1; num_update[p][move_index]++; update_list[p][move_index][num_update[p][move_index]] = pos2; num_update[p][move_index]++; update_list[p][move_index][num_update[p][move_index]] = pos3; num_update[p][move_index]++; update_list[p][move_index][num_update[p][move_index]] = pos4; num_update[p][move_index]++; // Find winner { if (diff > 0) pat[p][move_index][pos1].black_win++; else if (diff < 0) pat[p][move_index][pos1].white_win++; else { // Draw game pat[p][move_index][pos1].black_win++; pat[p][move_index][pos1].white_win++; } } if (get_pattern_symmetry(p)) { if (diff > 0) pat[p][move_index][pos2].black_win++; else if (diff < 0) pat[p][move_index][pos2].white_win++; else { pat[p][move_index][pos2].black_win++; pat[p][move_index][pos2].white_win++; } } // Need to maintain fairness when // comparing positions during searching { if (diff < 0) pat[p][move_index][pos3].black_win++; else if (diff > 0) pat[p][move_index][pos3].white_win++; else { pat[p][move_index][pos3].black_win++; pat[p][move_index][pos3].white_win++; } } if (get_pattern_symmetry(p)) { if (diff < 0) pat[p][move_index][pos4].black_win++; else if (diff > 0) pat[p][move_index][pos4].white_win++; else { pat[p][move_index][pos4].black_win++; pat[p][move_index][pos4].white_win++; } } } void update_info(pattern_t p, raw_pattern_info ***pat, byte_board_info *board, int diff) { // Special marker for all patterns if (p == PATTERN_UNKNOWN) { for (int pp = 0; pp != PATTERN_UNKNOWN; pp++) update_info(static_cast(pp), pat, board, diff); return; } int move_index = to_move_index(board->get_num_move()); for (int i = 0; i < get_num_pattern(p); ++i) { // Appeared pattern_index int pos1 = 0; for (int j = 0; j < get_pattern_piece(p); ++j) { pos1 += pow_3[j] * to_pattern_index(board->board[ static_cast(pattern_data[p].pattern[i][j])]); } // Mirrored pattern_index int pos2 = 0; for (int j = 0; j < get_pattern_piece(p); ++j) { pos2 += pow_3[j] * to_pattern_index(board->board[ static_cast(pattern_data[p].pattern[i][get_pattern_piece(p)-1-j])]); } // Color swapped pattern_index int pos3 = 0; for (int j = 0; j < get_pattern_piece(p); ++j) { pos3 += pow_3[j] * to_pattern_index(-board->board[ static_cast(pattern_data[p].pattern[i][j])]); } // Mirrored and color swapped pattern_index int pos4 = 0; for (int j = 0; j < get_pattern_piece(p); ++j) { pos4 += pow_3[j] * to_pattern_index(-board->board[ static_cast(pattern_data[p].pattern[i][get_pattern_piece(p)-1-j])]); } // Update some poorly represented patterns during // early to midgame from late-mid game as well if (move_index < 8 && (p == PATTERN_ROW1 || p == PATTERN_ROW2 || p == PATTERN_EDGE_X || p == PATTERN_CORNER5X2 || p == PATTERN_DIAG1 || p == PATTERN_DIAG2)) { for (int move_index_ = 0; move_index_ < 8; move_index_++) { update_info_table(p, pat, diff, move_index_, pos1, pos2, pos3, pos4); } } else update_info_table(p, pat, diff, move_index, pos1, pos2, pos3, pos4); } } void process_game(pattern_state &t, game_log &game) { byte_board_info board(game.board); init_info(); // Now collect pattern info // Loop for all game moves for (int i = 0; i < game.num_move_queue; ++i) { int player = game.move_queue_color[i]; int pos = game.move_queue[i]; // Dump core upon broken game record if (!board.can_play(player, pos)) throw std::runtime_error(_("invalid game moves")); board.place_piece(player, pos); // Update game info using final scores update_info(t.p, t.pat, &board, game.black_score-game.white_score); } } void load_file(const char *f, pattern_state &t) { pattern_t p = t.p; raw_pattern_info ***pat = t.pat; // Special marker for all patterns if (p == PATTERN_UNKNOWN) { for (int pp = 0; pp != PATTERN_UNKNOWN; pp++) { pattern_state tt(static_cast(pp), pat); load_file(f, tt); } return; } int handle = open(get_pattern_file(p), O_RDONLY); if (handle == -1) { gtstream bufstr; gtout(bufstr, _("cannot open file %$\n")) << get_pattern_file(p); throw std::runtime_error(bufstr.str()); } int io_size = sizeof(raw_pattern_info) * get_pattern_size(p); pat[p] = new raw_pattern_info *[num_move_index]; // Loop for all move indexes for (int pos = 0; pos < num_move_index; ++pos) { // Read all pattern indexes pat[p][pos] = new raw_pattern_info[get_pattern_size(p)]; if (read(handle, pat[p][pos], io_size) != io_size) { close(handle); gtstream bufstr; gtout(bufstr, _("cannot read file %$\n")) << get_pattern_file(p); throw std::runtime_error(bufstr.str()); } } close(handle); } void store_file(const char *f, pattern_state &t) { pattern_t p = t.p; raw_pattern_info ***pat = t.pat; // Special marker for all patterns if (p == PATTERN_UNKNOWN) { for (int pp = 0; pp != PATTERN_UNKNOWN; pp++) { pattern_state tt(static_cast(pp), pat); store_file(f, tt); } return; } int io_size = sizeof(raw_pattern_info) * get_pattern_size(p); int handle = creat(get_pattern_file(p), S_IRUSR | S_IWUSR); if (handle == -1) { gtstream bufstr; gtout(bufstr, _("cannot create file %$\n")) << get_pattern_file(p); throw std::runtime_error(bufstr.str()); } // Loop for all move indexes for (int pos = 0; pos < num_move_index; ++pos) { // Write all pattern indexes if (write(handle, pat[p][pos], io_size) != io_size) { close(handle); gtstream bufstr; gtout(bufstr, _("cannot write file %$\n")) << get_pattern_file(p); throw std::runtime_error(bufstr.str()); } } close(handle); } void generate_file(const char *f, pattern_state &t) { pattern_t p = t.p; raw_pattern_info ***pat = t.pat; // Special marker for all patterns if (p == PATTERN_UNKNOWN) { for (int pp = 0; pp != PATTERN_UNKNOWN; pp++) { pattern_state tt(static_cast(pp), pat); generate_file(f, tt); } return; } int handle = creat(get_pattern_data_file(p), S_IRUSR | S_IWUSR); if (handle == -1) { gtstream bufstr; gtout(bufstr, _("cannot create file %$\n")) << get_pattern_data_file(p); throw std::runtime_error(bufstr.str()); } int size = get_pattern_size(p); pattern_info **pat2 = new pattern_info *[num_move_index]; for (int pos = 0; pos < num_move_index; ++pos) { pat2[pos] = new pattern_info[size]; for (int i = 0; i < size; ++i) { pat2[pos][i] = log_func( pat[p][pos][i].black_win, pat[p][pos][i].white_win); } } // Set default value according to // number of corners for (int pos = 1; pos < num_move_index-1; ++pos) { for (int i = 0; i < size; ++i) { if (pat[p][pos][i].black_win + pat[p][pos][i].white_win == 0) { int pat2i = 0; if (p == PATTERN_ROW1) { pat2i += 64 * extract_color(i, 0); pat2i += 64 * extract_color(i, 7); } else if (p == PATTERN_DIAG1) { pat2i += 64 * extract_color(i, 0); pat2i += 64 * extract_color(i, 7); } else if (p == PATTERN_EDGE_X) { pat2i += 64 * extract_color(i, 1); pat2i += 64 * extract_color(i, 8); } else if (p == PATTERN_CORNER5X2) { pat2i += 64 * extract_color(i, 0); } if (pat2i > 127) pat2[pos][i] = 127; else if (pat2i < -127) pat2[pos][i] = -127; else pat2[pos][i] = pat2i; } } } // Interpolate for (int pos = 1; pos < num_move_index-1; ++pos) { for (int i = 0; i < size; ++i) { if (pat[p][pos][i].black_win + pat[p][pos][i].white_win == 0 && pat2[pos][i] == 0) { int pos_a = pos-1; int pos_b = pos+1; while (pos_a > 0 && pat2[pos_a][i] == 0 && pat[p][pos_a][i].black_win + pat[p][pos_a][i].white_win == 0) pos_a--; while (pos_b < num_move_index-1 && pat2[pos_b][i] == 0 && pat[p][pos_b][i].black_win + pat[p][pos_b][i].white_win == 0) pos_b++; // Should not suffer symmetry problem during // division pat2[pos][i] = ((pos-pos_a)*pat2[pos_b][i] + (pos_b-pos)*pat2[pos_a][i]) /(pos_b-pos_a); } } } // Compress table int comp_size = size/3*2; for (int pos = 0; pos < num_move_index; ++pos) { // Verify table symmetry for (int j = comp_size, k = size/3-1; j < size; ++j, --k) { if (pat2[pos][j] != -pat2[pos][k]) { /* std::cout << "p=" << p << " pos=" << pos << " j=" << j << " k=" << k << " : " << int(pat2[pos][j]) << ' ' << int(pat2[pos][k]); show_pattern(p, j); std::cout << " : "; show_pattern(p, k); std::cout << ' ' << pat[p][pos][j].black_win; std::cout << ' ' << pat[p][pos][j].white_win; std::cout << ' ' << pat[p][pos][k].black_win; std::cout << ' ' << pat[p][pos][k].white_win; std::cout << '\n';*/ throw std::runtime_error(_("pattern symmetry error")); } } if (write(handle, pat2[pos], comp_size) != comp_size) { close(handle); gtstream bufstr; gtout(bufstr, _("cannot write file %$\n")) << get_pattern_data_file(p); throw std::runtime_error(bufstr.str()); } } for (int pos = 0; pos < num_move_index; ++pos) { delete [] pat2[pos]; } delete [] pat2; close(handle); } void process_pattern(pattern_t pattern, int argc, char *argv[]) { bool init_pattern = false; raw_pattern_info ***pat = 0; for (int i = 2; i < argc; ++i) { if (strcmp(argv[i], "init") == 0) { // Create new file with empty // pattern data init_file(pattern); // Write empty pattern data init_pattern = false; // Force reload } else if (strcmp(argv[i], "gen") == 0) { // Generate data file suitable // for GRhino // Pattern data not yet initialized if (init_pattern == false) { delete [] pat; pat = new raw_pattern_info **[PATTERN_UNKNOWN]; for (int pp = 0; pp != PATTERN_UNKNOWN; pp++) pat[pp] = 0; } pattern_state t(pattern, pat); if (init_pattern == false) { load_file(argv[i], t); // Only load once init_pattern = true; } generate_file(argv[i], t); } else { // Command line argument is // a filename // Pattern data not yet initialized if (init_pattern == false) { delete [] pat; pat = new raw_pattern_info **[PATTERN_UNKNOWN]; for (int pp = 0; pp != PATTERN_UNKNOWN; pp++) pat[pp] = 0; } pattern_state t(pattern, pat); if (init_pattern == false) { load_file(argv[i], t); // Only load once init_pattern = true; } process_file(argv[i], t); store_file(argv[i], t); // Store after every processed // file } } // Free allocated memory if (pat) { for (int pp = 0; pp != PATTERN_UNKNOWN; pp++) { // In case we are processing only one // pattern if (pat[pp]) { for (int pos = 0; pos < num_move_index; ++pos) { delete [] pat[pp][pos]; } delete [] pat[pp]; } } } delete [] pat; } int main_real(int argc, char *argv[]) { use_private_files(true); if (argc == 1) { gtout(std::cout, _("%$ %$ - Pattern generator\n")) << prog_name << prog_ver; std::cout << _("(c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij\n\n"); gtout(std::cout, _("Usage: %$ PATTERN init|gen|FILES\n\n")) << prog_name; return 0; } else if (argc < 3) throw std::runtime_error(_("bad arguments")); pattern_t pattern = PATTERN_UNKNOWN; if (strcmp(argv[1], "row1") == 0) { pattern = PATTERN_ROW1; } else if (strcmp(argv[1], "row2") == 0) { pattern = PATTERN_ROW2; } else if (strcmp(argv[1], "row3") == 0) { pattern = PATTERN_ROW3; } else if (strcmp(argv[1], "row4") == 0) { pattern = PATTERN_ROW4; } else if (strcmp(argv[1], "diag1") == 0) { pattern = PATTERN_DIAG1; } else if (strcmp(argv[1], "diag2") == 0) { pattern = PATTERN_DIAG2; } else if (strcmp(argv[1], "diag3") == 0) { pattern = PATTERN_DIAG3; } else if (strcmp(argv[1], "diag4") == 0) { pattern = PATTERN_DIAG4; } else if (strcmp(argv[1], "diag5") == 0) { pattern = PATTERN_DIAG5; } else if (strcmp(argv[1], "edge-x") == 0) { pattern = PATTERN_EDGE_X; } else if (strcmp(argv[1], "corner5x2") == 0) { pattern = PATTERN_CORNER5X2; } else if (strcmp(argv[1], "all") == 0) { ; } else { throw std::runtime_error(_("bad pattern name")); } process_pattern(pattern, argc, argv); return 0; } int main(int argc, char *argv[]) { try { return main_real(argc, argv); } catch (std::exception &e) { std::cout << std::flush; gtout(std::cerr, _("%$: %$\n")) << prog_name << e.what(); } catch (const char *s) { std::cout << std::flush; gtout(std::cerr, _("%$: exception %$\n")) << prog_name << s; } catch (...) { std::cout << std::flush; gtout(std::cerr, _("%$: unknown exception\n")) << prog_name; } return 1; } grhino-0.16.1/gen_opening.cc0000644000175000017500000001255011436423224016126 0ustar lerdsuwalerdsuwa/* gen_opening.cc Game Opening Generator Copyright (c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include #include #include #include #include #include "board.h" #include "opening.h" #include "gtstream.h" #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x // Grab version number in VERSION variable // Use same version number as main GRhino program #undef VERSION const char * #include "scripts/version" ; const char *prog_name = "gen_opening"; const char *prog_ver = VERSION; int num_data = 1; byte_board_info *board_ptr; byte_board_info *init_board_ptr; char to_hex[] = "0123456789abcdef"; /* Board output format { OPENING NAME, PLAYER AFTER OPENING, { FINAL BOARD }, NUMBER OF MOVES, SAMPLE MOVE SEQUENCE } */ void output_board(std::ostream &os, const byte_board_info *board, const char *name, int player, std::deque &d) { // No i18n for file output! if (num_data != 1) os << ",\n"; os << "\t{ N_(\"" << name << "\"), " << player << ",\n"; os << "\t {"; for (int y = 0; y < 8; ++y) { if (y != 0) os << "\n\t "; for (int x = 0; x < 8; ++x) { os << std::setw(2) << static_cast(board->board[xy_to_pos(x, y)]); if (!(x == 7 && y == 7)) os << ", "; } } os << " },\n"; os << "\t " << d.size() << ", \""; for (size_t i = 0; i < d.size(); ++i) { os << "\\x" << to_hex[d[i]/16] << to_hex[d[i]%16]; } os << "\" }"; } int main_real(int argc, char * /*argv*/[]) { if (argc != 1) { gtout(std::cout, _("%$ %$ - Game opening generator\n")) << prog_name << prog_ver; std::cout << _("(c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij\n\n"); gtout(std::cout, _("Usage: %$ \n\n")) << prog_name; return 0; } board_ptr = new byte_board_info(); init_board_ptr = new byte_board_info(&board_begin); // Try opening data file std::ifstream ifs("openings.txt"); if (!ifs) throw std::runtime_error(_("cannot open file openings.txt")); // Generate header std::ofstream ofs("opening-dat.h"); ofs << "/* Generated by gen_opening. */\n\n"; // Generate start board ofs << "opening_info opening_data[] = {\n"; std::deque dummy_d; output_board(ofs, init_board_ptr, "None", BLACK, dummy_d); std::set name_set; for ( ; ; ) { std::string buffer; getline(ifs, buffer); // End of file if (!ifs) break; // Output board only for normalized // openings with C4 as first move if (buffer.size() > 2 && buffer[0] == 'C' && buffer[1] == '4') { // Initialize board *board_ptr = *init_board_ptr; // Flip pieces int i = 0; int player = BLACK; std::deque d; do { // A1 .. H8 for black // a1 .. h8 for white player = isupper(buffer[i]) ? BLACK : WHITE; int pos = xy_to_pos(toupper(buffer[i]) - 'A', buffer[i+1] - '1'); board_ptr->place_piece(player, pos); // Record sample sequence d.push_back(pos); i += 2; } while (buffer[i] != ' '); // Find next player after finish // opening player = -player; if (!board_ptr->can_play(player)) player = -player; // Skip spaces while (buffer[i] == ' ') i++; // Get opening name int imax = buffer.size(); int j = 0; std::string name; for ( ; ; ) { if (i == imax) break; // Skip "**" (newer openings) if (imax-i >= 2 && buffer[i] == '*' && buffer[i+1] == '*') i += 2; // Skip "(t3)" (diagonal openings) else if (imax-i >= 4 && buffer[i] == '(' && buffer[i+1] == 't') i += 4; // Skip consecutive spaces else if (buffer[i] == ' ' && j > 0 && name[j-1] == ' ') i++; else { if (buffer[i] == '\"') { name += '\\'; j++; } name += buffer[i]; i++; j++; } } // Remove trailing space if (name[j-1] == ' ') name.erase(j-1, 1); // Output board if not a duplicate // of previous opening if (name_set.insert(name).second) { num_data++; output_board(ofs, board_ptr, name.c_str(), player, d); } } } ofs << "\n};\n\n"; ofs << "const int NUM_OPENING_DATA = " << num_data << ";\n"; return 0; } int main(int argc, char *argv[]) { try { return main_real(argc, argv); } catch (std::exception &e) { std::cout << std::flush; gtout(std::cerr, _("%$: %$\n")) << prog_name << e.what(); } catch (const char *s) { std::cout << std::flush; gtout(std::cerr, _("%$: exception %$\n")) << prog_name << s; } catch (...) { std::cout << std::flush; gtout(std::cerr, _("%$: unknown exception\n")) << prog_name; } return 1; } grhino-0.16.1/pattern.cc0000644000175000017500000002463111436423225015317 0ustar lerdsuwalerdsuwa/* pattern.cc Pattern database Copyright (c) 2001, 2002, 2003 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "pattern.h" #include "order.h" #include "gtstream.h" #include #include #include #include #include #include #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) (x) // These are not correct in terms of symmetry but provide better // opening moves const char row1_pattern[4][8] = { { A1, B1, C1, D1, E1, F1, G1, H1 }, { A8, B8, C8, D8, E8, F8, G8, H8 }, { A1, A2, A3, A4, A5, A6, A7, A8 }, { H1, H2, H3, H4, H5, H6, H7, H8 } }; const char row2_pattern[4][8] = { { A2, B2, C2, D2, E2, F2, G2, H2 }, { A7, B7, C7, D7, E7, F7, G7, H7 }, { B1, B2, B3, B4, B5, B6, B7, B8 }, { G1, G2, G3, G4, G5, G6, G7, G8 } }; const char row3_pattern[4][8] = { { A3, B3, C3, D3, E3, F3, G3, H3 }, { A6, B6, C6, D6, E6, F6, G6, H6 }, { C1, C2, C3, C4, C5, C6, C7, C8 }, { F1, F2, F3, F4, F5, F6, F7, F8 } }; const char row4_pattern[4][8] = { { A4, B4, C4, D4, E4, F4, G4, H4 }, { A5, B5, C5, D5, E5, F5, G5, H5 }, { D1, D2, D3, D4, D5, D6, D7, D8 }, { E1, E2, E3, E4, E5, E6, E7, E8 } }; const char diag1_pattern[2][8] = { { A1, B2, C3, D4, E5, F6, G7, H8 }, { H1, G2, F3, E4, D5, C6, B7, A8 } }; const char diag2_pattern[4][7] = { { A2, B3, C4, D5, E6, F7, G8 }, { B1, C2, D3, E4, F5, G6, H7 }, { H2, G3, F4, E5, D6, C7, B8 }, { G1, F2, E3, D4, C5, B6, A7 } }; const char diag3_pattern[4][6] = { { A3, B4, C5, D6, E7, F8 }, { C1, D2, E3, F4, G5, H6 }, { H3, G4, F5, E6, D7, C8 }, { F1, E2, D3, C4, B5, A6 } }; const char diag4_pattern[4][5] = { { A4, B5, C6, D7, E8 }, { D1, E2, F3, G4, H5 }, { H4, G5, F6, E7, D8 }, { E1, D2, C3, B4, A5 } }; const char diag5_pattern[4][4] = { { A5, B6, C7, D8 }, { E1, F2, G3, H4 }, { H5, G6, F7, E8 }, { D1, C2, B3, A4 } }; const char edge_x_pattern[4][10] = { { B2, A1, B1, C1, D1, E1, F1, G1, H1, G2 }, { B7, A8, B8, C8, D8, E8, F8, G8, H8, G7 }, { B2, A1, A2, A3, A4, A5, A6, A7, A8, B7 }, { G2, H1, H2, H3, H4, H5, H6, H7, H8, G7 } }; const char corner5x2_pattern[8][10] = { { A1, B1, C1, D1, E1, A2, B2, C2, D2, E2 }, { H1, G1, F1, E1, D1, H2, G2, F2, E2, D2 }, { A8, B8, C8, D8, E8, A7, B7, C7, D7, E7 }, { H8, G8, F8, E8, D8, H7, G7, F7, E7, D7 }, { A1, A2, A3, A4, A5, B1, B2, B3, B4, B5 }, { A8, A7, A6, A5, A4, B8, B7, B6, B5, B4 }, { H1, H2, H3, H4, H5, G1, H2, H3, H4, G5 }, { H8, H7, H6, H5, H4, G8, H7, H6, H5, G4 } }; const pattern_data_t pattern_data[PATTERN_UNKNOWN] = { { 8, true, 4, PATTERN_PATH "row1.pat", PATTERN_PATH "row1.bin", { row1_pattern[0], row1_pattern[1], row1_pattern[2], row1_pattern[3], 0, 0, 0, 0 } }, { 8, true, 4, PATTERN_PATH "row2.pat", PATTERN_PATH "row2.bin", { row2_pattern[0], row2_pattern[1], row2_pattern[2], row2_pattern[3], 0, 0, 0, 0 } }, { 8, true, 4, PATTERN_PATH "row3.pat", PATTERN_PATH "row3.bin", { row3_pattern[0], row3_pattern[1], row3_pattern[2], row3_pattern[3], 0, 0, 0, 0 } }, { 8, true, 4, PATTERN_PATH "row4.pat", PATTERN_PATH "row4.bin", { row4_pattern[0], row4_pattern[1], row4_pattern[2], row4_pattern[3], 0, 0, 0, 0 } }, { 8, true, 2, PATTERN_PATH "diag1.pat", PATTERN_PATH "diag1.bin", { diag1_pattern[0], diag1_pattern[1], 0, 0, 0, 0, 0, 0 } }, { 7, true, 4, PATTERN_PATH "diag2.pat", PATTERN_PATH "diag2.bin", { diag2_pattern[0], diag2_pattern[1], diag2_pattern[2], diag2_pattern[3], 0, 0, 0, 0 } }, { 6, true, 4, PATTERN_PATH "diag3.pat", PATTERN_PATH "diag3.bin", { diag3_pattern[0], diag3_pattern[1], diag3_pattern[2], diag3_pattern[3], 0, 0, 0, 0 } }, { 5, true, 4, PATTERN_PATH "diag4.pat", PATTERN_PATH "diag4.bin", { diag4_pattern[0], diag4_pattern[1], diag4_pattern[2], diag4_pattern[3], 0, 0, 0, 0 } }, { 4, true, 4, PATTERN_PATH "diag5.pat", PATTERN_PATH "diag5.bin", { diag5_pattern[0], diag5_pattern[1], diag5_pattern[2], diag5_pattern[3], 0, 0, 0, 0 } }, { 10, true, 4, PATTERN_PATH "edge-x.pat", PATTERN_PATH "edge-x.bin", { edge_x_pattern[0], edge_x_pattern[1], edge_x_pattern[2], edge_x_pattern[3], 0, 0, 0, 0 } }, { 10, false, 8, PATTERN_PATH "corner5x2.pat", PATTERN_PATH "corner5x2.bin", { corner5x2_pattern[0], corner5x2_pattern[1], corner5x2_pattern[2], corner5x2_pattern[3], corner5x2_pattern[4], corner5x2_pattern[5], corner5x2_pattern[6], corner5x2_pattern[7] } } }; pattern_info *pattern_table[PATTERN_UNKNOWN][num_move_index]; // File used by gen_pattern const char *get_pattern_file_public(pattern_t p) { return pattern_data[p].pattern_file; } // File used by gen_pattern const char *get_pattern_file_private(pattern_t p) { const char * s = get_pattern_file_public(p); const char * l = strrchr(s, '/'); if (l) s = l+1; return s; } // File containing condensed information for GRhino const char *get_pattern_data_file_public(pattern_t p) { return pattern_data[p].data_file; } // File containing condensed information for GRhino const char *get_pattern_data_file_private(pattern_t p) { const char * s = get_pattern_data_file_public(p); const char * l = strrchr(s, '/'); if (l) s = l+1; return s; } const char *get_pattern_file(pattern_t p) { if (get_use_private_files()) return get_pattern_file_private(p); else return get_pattern_file_public(p); } const char *get_pattern_data_file(pattern_t p) { if (get_use_private_files()) return get_pattern_data_file_private(p); else return get_pattern_data_file_public(p); } void pattern_table_init(pattern_t p) { int size = pow_3[get_pattern_piece(p)]; int comp_size = size/3*2; int handle = open(get_pattern_data_file(p), O_RDONLY); if (handle == -1) { gtstream bufstr; gtout(bufstr, _("cannot open file %$\n")) << get_pattern_data_file(p); throw std::runtime_error(bufstr.str()); } for (int i = 0; i < num_move_index; ++i) { pattern_table[p][i] = new pattern_info[size]; if (read(handle, pattern_table[p][i], comp_size) != comp_size) { close(handle); gtstream bufstr; gtout(bufstr, _("cannot read file %$\n")) << get_pattern_data_file(p); throw std::runtime_error(bufstr.str()); } for (int j = comp_size, k = size/3-1; j < size; ++j, --k) pattern_table[p][i][j] = -pattern_table[p][i][k]; } close(handle); } void pattern_table_init() { pattern_table_init(PATTERN_ROW1); pattern_table_init(PATTERN_ROW2); pattern_table_init(PATTERN_ROW3); pattern_table_init(PATTERN_ROW4); pattern_table_init(PATTERN_DIAG1); pattern_table_init(PATTERN_DIAG2); pattern_table_init(PATTERN_DIAG3); pattern_table_init(PATTERN_DIAG4); pattern_table_init(PATTERN_DIAG5); pattern_table_init(PATTERN_CORNER5X2); } inline int pattern_eval(byte_board_info *board, int pos, pattern_t p) { int score = 0; for (int i = 0; i < pattern_data[p].num_pattern; ++i) { int pos1 = 0; for (int j = 0; j < pattern_data[p].piece; ++j) { pos1 += pow_3[j] * to_pattern_index(board->board[ static_cast(pattern_data[p].pattern[i][j])]); } score += pattern_table[p][pos][pos1]; } return score; } int pattern_eval(byte_board_info *board, pattern_t p, int index) { if (board->get_num_move() == 0) return 0; // Beginning of the game int pos = to_move_index(board->get_num_move()); int pos1 = 0; for (int j = 0; j < pattern_data[p].piece; ++j) { pos1 += pow_3[j] * to_pattern_index(board->board[ static_cast(pattern_data[p].pattern[index][j])]); } return pattern_table[p][pos][pos1]; } int pattern_eval(byte_board_info *board) { if (board->get_num_move() == 0) return 0; // Beginning of the game int score = 0; int pos = to_move_index(board->get_num_move()); score += pattern_eval(board, pos, PATTERN_ROW1); score += pattern_eval(board, pos, PATTERN_ROW2); score += pattern_eval(board, pos, PATTERN_ROW3); score += pattern_eval(board, pos, PATTERN_ROW4); score += pattern_eval(board, pos, PATTERN_DIAG1); score += pattern_eval(board, pos, PATTERN_DIAG2); score += pattern_eval(board, pos, PATTERN_DIAG3); score += pattern_eval(board, pos, PATTERN_DIAG4); score += pattern_eval(board, pos, PATTERN_DIAG5); score += pattern_eval(board, pos, PATTERN_CORNER5X2); return score; } inline void pattern_eval_debug(byte_board_info *board, int pos, pattern_t p) { int score = 0; std::cout << " Pat" << int(p) << ' '; for (int i = 0; i < pattern_data[p].num_pattern; ++i) { int pos1 = 0; for (int j = 0; j < pattern_data[p].piece; ++j) { switch(board->board[static_cast(pattern_data[p].pattern[i][j])]) { case BLACK: std::cout << "X "; break; case WHITE: std::cout << "O "; break; case EMPTY: std::cout << ". "; break; } pos1 += pow_3[j] * to_pattern_index(board->board[ static_cast(pattern_data[p].pattern[i][j])]); } std::cout << "-> " << int(pattern_table[p][pos][pos1]) << '\n'; score += pattern_table[p][pos][pos1]; } } void pattern_eval_debug(byte_board_info *board) { int pos = to_move_index(board->get_num_move()); pattern_eval_debug(board, pos, PATTERN_ROW1); pattern_eval_debug(board, pos, PATTERN_ROW2); pattern_eval_debug(board, pos, PATTERN_ROW3); pattern_eval_debug(board, pos, PATTERN_ROW4); pattern_eval_debug(board, pos, PATTERN_DIAG1); pattern_eval_debug(board, pos, PATTERN_DIAG2); pattern_eval_debug(board, pos, PATTERN_DIAG3); pattern_eval_debug(board, pos, PATTERN_DIAG4); pattern_eval_debug(board, pos, PATTERN_DIAG5); pattern_eval_debug(board, pos, PATTERN_CORNER5X2); } void show_pattern(pattern_t p, int i) { std::cout << " "; for (int j = 0; j < get_pattern_piece(p); ++j) { switch (to_board_index(i % 3)) { case WHITE: std::cout << "O "; break; case BLACK: std::cout << "X "; break; case EMPTY: std::cout << ". "; break; } i /= 3; } } // pos = 1 .. 60 int to_move_index(int pos) { return (pos - 1)/4; } grhino-0.16.1/acinclude.m4/0000755000175000017500000000000011436423224015572 5ustar lerdsuwalerdsuwagrhino-0.16.1/acinclude.m4/glibc21.m40000644000175000017500000000144511436423224017263 0ustar lerdsuwalerdsuwa# glibc21.m4 serial 3 dnl Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([gl_GLIBC21], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, ac_cv_gnu_library_2_1, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2_1=yes, ac_cv_gnu_library_2_1=no) ] ) AC_SUBST(GLIBC21) GLIBC21="$ac_cv_gnu_library_2_1" ] ) grhino-0.16.1/acinclude.m4/gettext.m40000644000175000017500000003766611436423224017542 0ustar lerdsuwalerdsuwa# gettext.m4 serial 58 (gettext-0.16) dnl Copyright (C) 1995-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2006. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define([gt_included_intl], ifelse([$1], [external], ifdef([AM_GNU_GETTEXT_][INTL_SUBDIR], [yes], [no]), [yes])) define([gt_libtool_suffix_prefix], ifelse([$1], [use-libtool], [l], [])) gt_NEEDS_INIT AM_GNU_GETTEXT_NEED([$2]) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) dnl Sometimes, on MacOS X, libintl requires linking with CoreFoundation. gt_INTL_MACOSX dnl Set USE_NLS. AC_REQUIRE([AM_NLS]) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl Add a version number to the cache macros. case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. if test $gt_api_version -ge 3; then gt_revision_test_code='[[ #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ]]' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi AC_CACHE_CHECK([for GNU gettext in libc], [$gt_func_gnugettext_libc], [AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings], [eval "$gt_func_gnugettext_libc=yes"], [eval "$gt_func_gnugettext_libc=no"])]) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], [$gt_func_gnugettext_libintl], [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [eval "$gt_func_gnugettext_libintl=yes"], [eval "$gt_func_gnugettext_libintl=no"]) dnl Now see whether libintl exists and depends on libiconv. if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *);], [bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV $LIBTHREAD" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV $LTLIBTHREAD" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi CATOBJEXT= if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Some extra flags are needed during linking. LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi AC_MSG_CHECKING([whether to use NLS]) AC_MSG_RESULT([$USE_NLS]) if test "$USE_NLS" = "yes"; then AC_MSG_CHECKING([where the gettext function comes from]) if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi AC_MSG_RESULT([$gt_source]) fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl For backward compatibility. Some Makefiles may be using this. INTLOBJS= if test "$USE_INCLUDED_LIBINTL" = yes; then INTLOBJS="\$(GETTOBJS)" fi AC_SUBST(INTLOBJS) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl Checks for special options needed on MacOS X. dnl Defines INTL_MACOSX_LIBS. AC_DEFUN([gt_INTL_MACOSX], [ dnl Check for API introduced in MacOS X 10.2. AC_CACHE_CHECK([for CFPreferencesCopyAppValue], gt_cv_func_CFPreferencesCopyAppValue, [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFPreferencesCopyAppValue(NULL, NULL)], [gt_cv_func_CFPreferencesCopyAppValue=yes], [gt_cv_func_CFPreferencesCopyAppValue=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], 1, [Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) fi dnl Check for API introduced in MacOS X 10.3. AC_CACHE_CHECK([for CFLocaleCopyCurrent], gt_cv_func_CFLocaleCopyCurrent, [gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" AC_TRY_LINK([#include ], [CFLocaleCopyCurrent();], [gt_cv_func_CFLocaleCopyCurrent=yes], [gt_cv_func_CFLocaleCopyCurrent=no]) LIBS="$gt_save_LIBS"]) if test $gt_cv_func_CFLocaleCopyCurrent = yes; then AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], 1, [Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi AC_SUBST([INTL_MACOSX_LIBS]) ]) dnl gt_NEEDS_INIT ensures that the gt_needs variable is initialized. m4_define([gt_NEEDS_INIT], [ m4_divert_text([DEFAULTS], [gt_needs=]) m4_define([gt_NEEDS_INIT], []) ]) dnl Usage: AM_GNU_GETTEXT_NEED([NEEDSYMBOL]) AC_DEFUN([AM_GNU_GETTEXT_NEED], [ m4_divert_text([INIT_PREPARE], [gt_needs="$gt_needs $1"]) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) grhino-0.16.1/acinclude.m4/codeset.m40000644000175000017500000000136611436423224017470 0ustar lerdsuwalerdsuwa# codeset.m4 serial 2 (gettext-0.16) dnl Copyright (C) 2000-2002, 2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET); return !cs;], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) grhino-0.16.1/acinclude.m4/lib-link.m40000644000175000017500000006424411436423224017547 0ustar lerdsuwalerdsuwa# lib-link.m4 serial 9 (gettext-0.16) dnl Copyright (C) 2001-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_PREREQ(2.50) dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and dnl augments the CPPFLAGS variable. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ AC_LIB_LINKFLAGS_BODY([$1], [$2]) ac_cv_lib[]Name[]_libs="$LIB[]NAME" ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" ac_cv_lib[]Name[]_cppflags="$INC[]NAME" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the dnl results of this search when this library appears as a dependency. HAVE_LIB[]NAME=yes undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) dnl searches for libname and the libraries corresponding to explicit and dnl implicit dependencies, together with the specified include files and dnl the ability to compile and link the specified testcode. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME dnl accordingly. AC_LIB_LINKFLAGS_BODY([$1], [$2]) dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, dnl because if the user has installed lib[]Name and not disabled its use dnl via --without-lib[]Name-prefix, he wants to use it. ac_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ ac_save_LIBS="$LIBS" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) LIBS="$ac_save_LIBS" ]) if test "$ac_cv_lib[]Name" = yes; then HAVE_LIB[]NAME=yes AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) AC_MSG_CHECKING([how to link with lib[]$1]) AC_MSG_RESULT([$LIB[]NAME]) else HAVE_LIB[]NAME=no dnl If $LIB[]NAME didn't lead to a usable library, we don't need dnl $INC[]NAME either. CPPFLAGS="$ac_save_CPPFLAGS" LIB[]NAME= LTLIB[]NAME= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, dnl hardcode_direct, hardcode_minus_L. AC_DEFUN([AC_LIB_RPATH], [ dnl Tell automake >= 1.10 to complain if config.rpath is missing. m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])]) AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done ]) wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" dnl Determine whether the user wants rpath handling at all. AC_ARG_ENABLE(rpath, [ --disable-rpath do not hardcode runtime library paths], :, enable_rpath=yes) ]) dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and dnl the libraries corresponding to explicit and implicit dependencies. dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib$1-prefix], [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib$1-prefix don't search for lib$1 in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) dnl Search the library and its dependencies in $additional_libdir and dnl $LDFLAGS. Using breadth-first-seach. LIB[]NAME= LTLIB[]NAME= INC[]NAME= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='$1 $2' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" dnl See if it was already located by an earlier AC_LIB_LINKFLAGS dnl or AC_LIB_HAVE_LINKFLAGS call. uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" else dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined dnl that this library doesn't exist. So just drop it. : fi else dnl Search the library lib$name in $additional_libdir and $LDFLAGS dnl and the already constructed $LIBNAME/$LTLIBNAME. found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" \ && { test -f "$additional_libdir/lib$name.$shlibext" \ || { test "$shlibext" = dll \ && test -f "$additional_libdir/lib$name.dll.a"; }; }; then found_dir="$additional_libdir" if test -f "$additional_libdir/lib$name.$shlibext"; then found_so="$additional_libdir/lib$name.$shlibext" else found_so="$additional_libdir/lib$name.dll.a" fi if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" \ && { test -f "$dir/lib$name.$shlibext" \ || { test "$shlibext" = dll \ && test -f "$dir/lib$name.dll.a"; }; }; then found_dir="$dir" if test -f "$dir/lib$name.$shlibext"; then found_so="$dir/lib$name.$shlibext" else found_so="$dir/lib$name.dll.a" fi if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then dnl Found the library. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then dnl Linking with a shared library. We attempt to hardcode its dnl directory into the executable's runpath, unless it's the dnl standard /usr/lib. if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then dnl No hardcoding is needed. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl Use an explicit option to hardcode DIR into the resulting dnl binary. dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi dnl The hardcoding into $LIBNAME is system dependent. if test "$hardcode_direct" = yes; then dnl Using DIR/libNAME.so during linking hardcodes DIR into the dnl resulting binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then dnl Use an explicit option to hardcode DIR into the resulting dnl binary. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else dnl Rely on "-L$found_dir". dnl But don't add it if it's already contained in the LDFLAGS dnl or the already constructed $LIBNAME haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" else dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH dnl here, because this doesn't fit in flags passed to the dnl compiler. So give up. No hardcoding. This affects only dnl very old systems. dnl FIXME: Not sure whether we should use dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" dnl here. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then dnl Linking with a static library. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" else dnl We shouldn't come here, but anyway it's good to have a dnl fallback. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" fi fi dnl Assume the include files are nearby. additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then dnl Potentially add $additional_includedir to $INCNAME. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's /usr/local/include and we are using GCC on Linux, dnl 3. if it's already present in $CPPFLAGS or the already dnl constructed $INCNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INC[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $INCNAME. INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" fi fi fi fi fi dnl Look for dependencies. if test -n "$found_la"; then dnl Read the .la file. It defines the variables dnl dlname, library_names, old_library, dependency_libs, current, dnl age, revision, installed, dlopen, dlpreopen, libdir. save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" dnl We use only dependency_libs. for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's /usr/local/lib and we are using GCC on Linux, dnl 3. if it's already present in $LDFLAGS or the already dnl constructed $LIBNAME, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LIBNAME. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIB[]NAME; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LTLIBNAME. LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then dnl Potentially add DIR to rpathdirs. dnl The rpathdirs will be appended to $LIBNAME at the end. haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi dnl Potentially add DIR to ltrpathdirs. dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) dnl Handle this in the next round. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) dnl Handle this in the next round. Throw away the .la's dnl directory; it is already contained in a preceding -L dnl option. names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) dnl Most likely an immediate library name. LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" ;; esac done fi else dnl Didn't find the library; assume it is in the system directories dnl known to the linker and runtime loader. (All the system dnl directories known to the linker should also be known to the dnl runtime loader, otherwise the system is severely misconfigured.) LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user must dnl pass all path elements in one option. We can arrange that for a dnl single library, but not when more than one $LIBNAMEs are used. alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" else dnl The -rpath options are cumulative. for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then dnl When using libtool, the option that works for both libraries and dnl executables is -R. The -R options are cumulative. for found_dir in $ltrpathdirs; do LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" done fi ]) dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, dnl unless already present in VAR. dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes dnl contains two or three consecutive elements that belong together. AC_DEFUN([AC_LIB_APPENDTOVAR], [ for element in [$2]; do haveit= for x in $[$1]; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then [$1]="${[$1]}${[$1]:+ }$element" fi done ]) dnl For those cases where a variable contains several -L and -l options dnl referring to unknown libraries and directories, this macro determines the dnl necessary additional linker options for the runtime path. dnl AC_LIB_LINKFLAGS_FROM_LIBS([LDADDVAR], [LIBSVALUE], [USE-LIBTOOL]) dnl sets LDADDVAR to linker options needed together with LIBSVALUE. dnl If USE-LIBTOOL evaluates to non-empty, linking with libtool is assumed, dnl otherwise linking without libtool is assumed. AC_DEFUN([AC_LIB_LINKFLAGS_FROM_LIBS], [ AC_REQUIRE([AC_LIB_RPATH]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) $1= if test "$enable_rpath" != no; then if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then dnl Use an explicit option to hardcode directories into the resulting dnl binary. rpathdirs= next= for opt in $2; do if test -n "$next"; then dir="$next" dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= else case $opt in -L) next=yes ;; -L*) dir=`echo "X$opt" | sed -e 's,^X-L,,'` dnl No need to hardcode the standard /usr/lib. if test "X$dir" != "X/usr/$acl_libdirstem"; then rpathdirs="$rpathdirs $dir" fi next= ;; *) next= ;; esac fi done if test "X$rpathdirs" != "X"; then if test -n ""$3""; then dnl libtool is used for linking. Use -R options. for dir in $rpathdirs; do $1="${$1}${$1:+ }-R$dir" done else dnl The linker is used for linking directly. if test -n "$hardcode_libdir_separator"; then dnl Weird platform: only the last -rpath option counts, the user dnl must pass all path elements in one option. alldirs= for dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="$flag" else dnl The -rpath options are cumulative. for dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" $1="${$1}${$1:+ }$flag" done fi fi fi fi fi AC_SUBST([$1]) ]) grhino-0.16.1/acinclude.m4/lib-ld.m40000644000175000017500000000653111436423224017204 0ustar lerdsuwalerdsuwa# lib-ld.m4 serial 3 (gettext-0.13) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by GCC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(acl_cv_path_LD, [if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) grhino-0.16.1/acinclude.m4/cxxac.m40000644000175000017500000012570311436423224017152 0ustar lerdsuwalerdsuwadnl ***************************************************************** dnl C++ Tests for Autoconf dnl (c) 1997,1998,1999,2000,2001,2002,2003,2007 by Kriang Lerdsuwanakij dnl lerdsuwa@users.sourceforge.net dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl As a special exception, the file `configure' generated by dnl `autoconf' from this file is not covered by the GNU General Public dnl License. This exception does not however invalidate any other dnl reasons why the generated file might be covered by the GNU General dnl Public License. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. dnl dnl ***************************************************************** dnl History before ChangeLog records: dnl Version 0.11.1 (Sep 15, 2001) dnl - Fix AH_VERBATIM usage. dnl - Fix CXXAC_BAD_NEW test. dnl - Use size_t instead of unsigned. dnl dnl Version 0.11.0 (Sep 11, 2001) dnl - Add CXXAC_BAD_NEW, CXXAC_HEADER_MACRO dnl - Update to autoconf 2.53 dnl dnl Version 0.10.5 (Jul 6, 2001) dnl - Update comments with the release of gcc 2.95, 3.0 dnl dnl Version 0.10.4 (Dec 13, 1999) dnl - Add CXXAC_SIZE_BOOL dnl dnl Version 0.10.3 (Feb 17, 1999) dnl - Change CXXAC_GUIDE_DECL and its variables dnl and macros to CXXAC_NO_GUIDE_DECL dnl dnl Version 0.10.2 (Jan 6, 1999) dnl - Change for loop to do while loop in dnl CXXAC_NEW_THROW_BAD_ALLOC test dnl dnl Version 0.10.1 (May 27, 1998) dnl - Fix error in namespace test dnl - Check iostream library before displaying test dnl message in using namespace std test. dnl - Remove extra '$' in using namespace std test dnl dnl Version 0.10.0 (Mar 5, 1998) dnl - Add CXXAC_BAD_ALLOC, CXXAC_NEW_THROW_BAD_ALLOC dnl dnl Version 0.9.0 (Mar 3, 1998) dnl - Add CXXAC_HAVE_TYPENAME dnl - Add CXXAC_GUIDE_DECL dnl - Rename macros _CXX_* to CXX__*. dnl - Rename CXXAC_HAVE_MEMBER_TEMPLATE to dnl CXXAC_HAVE_MEMBER_FUNCTION_TEMPLATE dnl Version 0.8.0 (Mar 1, 1998) dnl - Append space to cxxac_cv_header_need_ext and dnl cxxac_cv_header_missing output from CXX_HEADER_ALL dnl - Move AC_REQUIRE inside CXXAC_LIB_NEED_USING_STD to dnl avoid corrupted screen output when namespace was not dnl testes dnl - Set cxxac_cv_have_header_string inside dnl CXXAC_LIB_NEED_USING_STD dnl - Add CXXAC_STRING_ERASE, CXXAC_TEST_ALL updated dnl dnl Version 0.7.0 (Oct 10, 1997) dnl - Add CXXAC_DEFAULT_EXCEPTION dnl dnl Version 0.6.1 (Sep 2, 1997) dnl - Fix access problem in member template test dnl - Add member template and namespace in dnl CXXAC_TEST_ALL dnl dnl Version 0.6.0 (Aug 14, 1997) dnl - Add CXXAC_HEADER dnl - Modify CXXAC_HEADER_ALL to use CXXAC_HEADER dnl - Add CXXAC_HAVE_NAMESPACE dnl - Add CXXAC_LIB_NEED_USING_STD dnl - Fix bug in CXXAC_BAD_DELETE - return value now dnl removed dnl dnl Version 0.5.0 (Aug 8, 1997) dnl - First version dnl dnl To do: dnl - RTTI (#include, -frtti, etc.) dnl - More exception handling dnl - new when there is not enough memory dnl - new (nothrow) dnl - auto_ptr in #include dnl dnl ***************************************************************** dnl CXXAC_TYPE_WCHAR_T Test if `wchar_t' is a C++ built-in type. dnl If it fails (cxxac_cv_have_wchar_t = no), dnl you can use CXXAC_DEFINE_WCHAR_T to determine if dnl they can be safely defined. dnl dnl Results: cxxac_cv_have_wchar_t = yes/no dnl CXX__HAVE_WCHAR_T defined in header file dnl if cxxac_cv_have_wchar_t = yes dnl AC_DEFUN([CXXAC_TYPE_WCHAR_T], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ wchar_t keyword]) AH_TEMPLATE([CXX__HAVE_WCHAR_T], [Define if C++ wchar_t is found.]) AC_CACHE_VAL(cxxac_cv_have_wchar_t, [ AC_TRY_COMPILE([], [wchar_t a = L'a';], [ cxxac_cv_have_wchar_t=yes ], [ cxxac_cv_have_wchar_t=no ]) ]) if test $cxxac_cv_have_wchar_t = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_have_wchar_t = yes; then AC_DEFINE(CXX__HAVE_WCHAR_T) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_TYPE_BOOL Test if `bool' is a C++ built-in type. It is dnl supported by gcc 2.6.x or newer. dnl If it fails (cxxac_cv_have_bool = no), dnl you can use CXXAC_DEFINE_BOOL to determine if dnl they can be safely defined. dnl dnl Results: cxxac_cv_have_bool = yes/no dnl CXX__HAVE_BOOL defined in header file dnl if cxxac_cv_have_bool = yes dnl AC_DEFUN([CXXAC_TYPE_BOOL], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ bool keyword]) AH_TEMPLATE([CXX__HAVE_BOOL], [Define if C++ bool is found.]) AC_CACHE_VAL(cxxac_cv_have_bool, [ AC_TRY_COMPILE([], [ bool ba = true, bb = false; bool bc = bb; int ia = 1, ib = 2; int ic = (int)ba; bool bd = (ia == ib); if (bd) { ia = 0; } if (!bd) { ia = 0; } if (ba && bb) { ia = 0; } if (ba || bb) { ia = 0; } ], [ cxxac_cv_have_bool=yes ], [ cxxac_cv_have_bool=no ]) ]) if test $cxxac_cv_have_bool = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_have_bool = yes; then AC_DEFINE(CXX__HAVE_BOOL) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_SIZE_BOOL Test the size of `bool'. dnl dnl Results: cxxac_cv_bool_size = sizeof(bool) dnl AC_DEFUN([CXXAC_SIZE_BOOL], [ AC_REQUIRE([CXXAC_TYPE_BOOL]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for size of C++ bool]) if test $cxxac_cv_have_bool = yes; then AC_CACHE_VAL(cxxac_cv_bool_size, [ AC_TRY_RUN([ #include #include int main() { FILE *f = fopen("cf_cxxac.out", "w"); if (f) { fprintf(f, "%d", sizeof(bool)); fclose(f); exit(0); } else exit(1); } ], [ cxxac_cv_bool_size=`cat cf_cxxac.out` ], [ cxxac_cv_bool_size="N/A (error during test)" ], [ cxxac_cv_bool_size="N/A (due to cross-compilation)" ]) rm -f cf_cxxac.out ]) else cxxac_cv_bool_size="N/A" fi AC_MSG_RESULT($cxxac_cv_bool_size) AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_DEFINE_BOOL Test if `bool', `true' and `false' can be dnl defined. Use this macro if you want to use dnl `bool' variable type even the compiler don't dnl support it. dnl If it fails (cxxac_cv_can_define_bool = no) dnl there must be symbol conflict somewhere. dnl dnl Results: cxxac_cv_can_define_bool = yes/no dnl CXX__CAN_DEFINE_BOOL defined in header file dnl if cxxac_cv_can_define_bool = yes dnl AC_DEFUN([CXXAC_DEFINE_BOOL], [ AC_REQUIRE([CXXAC_TYPE_BOOL]) AC_LANG_PUSH([C++]) AH_TEMPLATE([CXX__CAN_DEFINE_BOOL], [Define if bool, true, false can be redefined.]) AH_VERBATIM([CXX__CAN_DEFINE_BOOL2], [ #ifndef CXX__HAVE_BUILTIN_BOOL # ifdef CXX__CAN_DEFINE_BOOL enum bool { false = 0, true = 1 }; # endif #endif ]) if test $cxxac_cv_have_bool = no; then AC_MSG_CHECKING([if bool, true and false can be defined]) AC_CACHE_VAL(cxxac_cv_can_define_bool, [ AC_TRY_COMPILE([], [int bool = 0,true = 0,false = 1;], [ AC_TRY_COMPILE([ enum bool { false = 0, true = 1 }; ], [ bool a = true, b = false; ], [ cxxac_cv_can_define_bool=yes ], [ cxxac_cv_can_define_bool=no ]) ], [ cxxac_cv_can_define_bool=no ]) ]) if test $cxxac_cv_can_define_bool = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_can_define_bool; then AC_DEFINE(CXX__CAN_DEFINE_BOOL) fi fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_HAVE_EXPLICIT Test if `explicit' is available. It is dnl supported by gcc 2.7.x or newer. dnl If not supported, workaround is automatically dnl provided in your header file after running dnl Autoheader. dnl dnl Results: cxxac_cv_have_explicit = yes/no dnl CXX__HAVE_EXPLICIT defined in header file dnl if cxxac_cv_have_explicit = yes dnl AC_DEFUN([CXXAC_HAVE_EXPLICIT], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ explicit keyword]) AH_TEMPLATE([CXX__HAVE_EXPLICIT], [Define if explicit is available.]) AH_VERBATIM([CXX__HAVE_EXPLICIT2], [ #ifndef CXX__HAVE_EXPLICIT # define explicit /* Discard `explicit' */ # define CXX__NO_EXPLICIT 1 #endif ]) AC_CACHE_VAL(cxxac_cv_have_explicit, [ AC_TRY_COMPILE([ class obj_a { private: int b; public: explicit obj_a(int _b) { b = _b; } }; ], [ // Nothing in function body ], [ AC_TRY_COMPILE([ class obj_a { private: int b; public: explicit obj_a(int _b) { b = _b; } void func(obj_a _a) { b = _a.b; } }; ], [ int i = 0; obj_a a(1); a.func(i); // Must error here, attempt to convert // from type int to class obj_a ], [ cxxac_cv_have_explicit=no ], [ cxxac_cv_have_explicit=yes ]) ], [ cxxac_cv_have_explicit=no ]) ]) if test $cxxac_cv_have_explicit = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_have_explicit = yes; then AC_DEFINE(CXX__HAVE_EXPLICIT) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_HAVE_MUTABLE Test if `mutable' is available. It is dnl supported by gcc 2.5.x or newer. dnl If not supported, some workaround is dnl provided in your header file after running dnl Autoheader. But you also have to modify your dnl source files to cast away const-ness of dnl pointers used to modify the member data. dnl dnl Results: cxxac_cv_have_mutable = yes/no dnl CXX__HAVE_MUTABLE defined in header file dnl if cxxac_cv_have_mutable = yes dnl CXX__NO_MUTABLE defined in header file dnl if cxxac_cv_have_mutable = no dnl AC_DEFUN([CXXAC_HAVE_MUTABLE], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ mutable keyword]) AH_TEMPLATE([CXX__HAVE_MUTABLE], [Define if mutable is available.]) AH_VERBATIM([CXX__HAVE_MUTABLE2], [ #ifndef CXX__HAVE_MUTABLE # define mutable /* Discard `mutable' */ /* Change const T * => T * const */ # define _CXXAC_THIS(T) T * const cppacThis = (T * const) this; # define _CXXAC_THAT(T, P) T * const cppacThat = (T * const) (P); #endif ]) AC_CACHE_VAL(cxxac_cv_have_mutable, [ AC_TRY_COMPILE([ class obj_a { private: mutable int b; // Must OK here public: obj_a() : b(0) {} // Must OK here void setb(int _b) const { b = _b; } }; ], [ obj_a a; a.setb(1); // Must OK here ], [ cxxac_cv_have_mutable=yes ], [ cxxac_cv_have_mutable=no ]) ]) if test $cxxac_cv_have_mutable = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_have_mutable = yes; then AC_DEFINE(CXX__HAVE_MUTABLE) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_HAVE_MEMBER_FUNCTION_TEMPLATE dnl Test if member function template is available. dnl It is supported by gcc 2.8.0 or newer. dnl dnl There is no workaround for this problem. dnl Your configure script should report error and dnl terminate immediately dnl dnl Results: cxxac_cv_have_member_template = yes/no dnl AC_DEFUN([CXXAC_HAVE_MEMBER_FUNCTION_TEMPLATE], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ member template]) AC_CACHE_VAL(cxxac_cv_have_member_template, [ AC_TRY_COMPILE([ template class obj_a { public: T *b; obj_a(T *_b = 0) : b(_b) {} // Must OK here template void copy(obj_a& _a) { b = (T *)(_a.b); } }; class obj_b { private: int c; public: obj_b() : c(0) {} }; ], [ int a; obj_b b; obj_a ptr_a(&a); obj_a ptr_b(&b); ptr_b.copy(ptr_a); // Must OK here ], [ cxxac_cv_have_member_template=yes ], [ cxxac_cv_have_member_template=no ]) ]) if test $cxxac_cv_have_member_template = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_BAD_FOR Test if variables declared inside for statement dnl persist after for loop. The correct behavior is dnl that they do not and is supported by gcc 2.7.x dnl or newer. dnl dnl There is no workaround provided. If you still dnl need the old behavior, use CXXAC_WANT_BAD_FOR dnl instead. dnl dnl Results: cxxac_cv_bad_for = yes/no dnl AC_DEFUN([CXXAC_BAD_FOR], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for scope of variable declared inside for statement]) AC_CACHE_VAL(cxxac_cv_bad_for, [ AC_TRY_COMPILE([], [ for (int i = 0; i < 10; i++) ; for (int i = 0; i < 10; i++) // Must OK here ; ], [ cxxac_cv_bad_for=no ], [ cxxac_cv_bad_for=yes ]) ]) if test $cxxac_cv_bad_for = yes; then AC_MSG_RESULT(wrong) else AC_MSG_RESULT(correct) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_WANT_BAD_FOR Same as CXXAC_BAD_FOR but also add dnl `-fno-for-scope' if the compiler support it dnl (works only with gcc). dnl dnl Results: cxxac_cv_bad_for = yes/no dnl cxxac_cv_bad_for_corrected = yes/no dnl if cxxac_cv_bad_for = yes dnl AC_DEFUN([CXXAC_WANT_BAD_FOR], [ AC_REQUIRE([CXXAC_WANT_BAD_FOR]) AC_LANG_PUSH([C++]) if test $cxxac_cv_bad_for = yes; then AC_MSG_CHECKING([if old for variable scope can be obtained]) cxxac_save_CXXFLAGS="$CXXFLAGS" AC_CACHE_VAL(cxxac_cv_bad_for_corrected, [ CXXFLAGS="$CXXFLAGS -fno-for-scope" if test $GXX = yes; then AC_TRY_COMPILE([], [ for (int i = 0; i < 10; i++) ; for (int i = 0; i < 10; i++) // Must error here ; ], [ cxxac_cv_bad_for_corrected=no ], [ cxxac_cv_bad_for_corrected=yes ]) else cxxac_cv_bad_for_corrected=no fi ]) if test $cxxac_cv_bad_for_corrected = yes; then AC_MSG_RESULT(yes) dnl Keep -fno-for-scope else AC_MSG_RESULT(no) dnl Don't keep -fno-for-scope CXXFLAGS="$cxxac_save_CXXFLAGS" fi fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_HAVE_ARRAY_NEW dnl Test if operator new[](size_t) is supported. dnl If not supported, you don't have to replace dnl the array version of new. dnl dnl Results: cxxac_cv_have_array_new = yes/no dnl CXX__HAVE_ARRAY_NEW defined in header file dnl if cxxac_cv_have_array_new = yes dnl AC_DEFUN([CXXAC_HAVE_ARRAY_NEW], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ array new replacement]) AH_TEMPLATE([CXX__HAVE_ARRAY_NEW], [ changequote(<<, >>)dnl Define if void *operator new[](size_t) is supported. changequote([, ])dnl ]) AC_CACHE_VAL(cxxac_cv_have_array_new, [ AC_TRY_COMPILE( #include changequote(<<, >>)dnl << void *operator new[](size_t /*n*/) throw() // Must OK here { return 0; } >>, changequote([, ])dnl [ // Nothing in function body ], [ cxxac_cv_have_array_new=yes ], [ cxxac_cv_have_array_new=no ]) ]) if test $cxxac_cv_have_array_new = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_have_array_new = yes; then AC_DEFINE(CXX__HAVE_ARRAY_NEW) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_HAVE_PLACEMENT_NEW dnl Test if operator new(size_t,void *) is supported. dnl If not supported, you don't have to replace dnl the placement version of new. dnl dnl Results: cxxac_cv_have_placement_new = yes/no dnl CXX__HAVE_PLACEMENT_NEW defined in header file dnl if cxxac_cv_have_place_new = yes dnl AC_DEFUN([CXXAC_HAVE_PLACEMENT_NEW], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ new(size_t,void *) replacement]) AH_TEMPLATE([CXX__HAVE_PLACEMENT_NEW], [ changequote(<<, >>)dnl Define if void *operator new[](size_t, void *) is supported. changequote([, ])dnl ]) AC_CACHE_VAL(cxxac_cv_have_placement_new, [ AC_TRY_COMPILE([ #include void *operator new(size_t /*n*/,void *p) // Must OK here { return p; } ], [ // Nothing in function body ], [ cxxac_cv_have_placement_new=yes ], [ cxxac_cv_have_placement_new=no ]) ]) if test $cxxac_cv_have_placement_new = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_have_placement_new = yes; then AC_DEFINE(CXX__HAVE_PLACEMENT_NEW) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_BAD_NEW Test if operator new and new[] does not dnl support `throw(std::bad_alloc)' exception dnl specification. dnl If not supported, no throw(...) is needed. dnl dnl Results: cxxac_cv_bad_new = yes/no dnl CXX__NEW_NO_THROW defined in header file dnl if cxxac_cv_bad_new = yes dnl AC_DEFUN([CXXAC_BAD_NEW], [ AC_REQUIRE([CXXAC_BAD_ALLOC]) AC_REQUIRE([CXXAC_LIB_NEED_USING_STD]) dnl avoid broken message CXXAC_HEADER(iostream) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ exception specification for new]) AH_TEMPLATE([CXX__NEW_NO_THROW], [Define if new cannot accept exception specification.]) AH_VERBATIM([CXX__NEW_THROW_BAD_ALLOC2], [ #if !defined(CXX__NEW_NO_THROW) && defined(CXX__BAD_ALLOC) # define CXX__NEW_THROW throw(BAD_ALLOC) #else # define CXX__NEW_THROW #endif ]) AC_CACHE_VAL(cxxac_cv_bad_new, [ AC_TRY_COMPILE([ #include CXX__HEADER_new $cxxac_using_namespace_std void *p; void *operator new(size_t /*s*/) throw(bad_alloc) // Must OK here { return p; } ], [ // Nothing in function body ], [ cxxac_cv_bad_new=no ], [ cxxac_cv_bad_new=yes ]) ]) dnl Message printed is the reverse of $cxxac_cv_bad_new if test $cxxac_cv_bad_new = yes; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi if test $cxxac_cv_bad_new = yes; then AC_DEFINE(CXX__NEW_NO_THROW) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_BAD_DELETE Test if operator delete and delete[] does not dnl support `throw()' exception specification. dnl throw() is required by gcc 2.8.x or newer. dnl If not supported, no throw() is needed. dnl dnl Results: cxxac_cv_bad_delete = yes/no dnl CXX__DELETE_NO_THROW defined in header file dnl if cxxac_cv_bad_delete = yes dnl AC_DEFUN([CXXAC_BAD_DELETE], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ exception specification for delete]) AH_TEMPLATE([CXX__DELETE_NO_THROW], [Define if delete cannot accept exception specification.]) AH_VERBATIM([CXX__DELETE_NO_THROW2], [ #ifndef CXX__DELETE_NO_THROW # define CXX__DELETE_THROW throw() #else # define CXX__DELETE_THROW #endif ]) AC_CACHE_VAL(cxxac_cv_bad_delete, [ AC_TRY_COMPILE([ void operator delete(void * /*p*/) throw() // Must OK here { } ], [ // Nothing in function body ], [ cxxac_cv_bad_delete=no ], [ cxxac_cv_bad_delete=yes ]) ]) dnl Message printed is the reverse of $cxxac_cv_bad_delete if test $cxxac_cv_bad_delete = yes; then AC_MSG_RESULT(no) else AC_MSG_RESULT(yes) fi if test $cxxac_cv_bad_delete = yes; then AC_DEFINE(CXX__DELETE_NO_THROW) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_HAVE_NAMESPACE dnl Test if namespace is supported. It is dnl supported by gcc 2.95.x or newer dnl and egcs 1.1. dnl dnl Results: cxxac_cv_have_namespace = yes/no dnl CXX__HAVE_NAMESPACE defined in header file dnl if cxxac_cv_have_namespace = yes dnl AC_DEFUN([CXXAC_HAVE_NAMESPACE], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ namespace]) AH_TEMPLATE([CXX__HAVE_NAMESPACE], [Define if namespace is available.]) AC_CACHE_VAL(cxxac_cv_have_namespace, [ AC_TRY_COMPILE([ namespace N1 { int a; } // original-namespace-definition namespace N1 { int b; } // extension-namespace-definition namespace { int c; } // unnamed-namespace-definition namespace N2 = N1; // namespace-alias-definition namespace N3 { int d; } namespace N4 { typedef int e; typedef long f; } namespace N5 { namespace N6 { int g; } } int ia = N1::a; // qualified-namespace-specifier int ib = ::N1::a; // qualified-namespace-specifier w/ ::(opt) int ic = N5::N6::g; // qualified-namespace-specifier w/ // nested-name-specifier(opt) using namespace N3; // using-directive using N4::e; // using-declaration using ::N4::f; // using-declaration w/ ::(opt) e ea; f fa; ], [ // Nothing in function body ], [ cxxac_cv_have_namespace=yes ], [ cxxac_cv_have_namespace=no ]) ]) if test $cxxac_cv_have_namespace = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_have_namespace = yes; then AC_DEFINE(CXX__HAVE_NAMESPACE) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_DEFAULT_EXCEPTION dnl Test if exception handling is on by default. dnl It is supported by gcc 2.8.0 or newer. dnl dnl Results: cxxac_cv_default_exception = yes/no dnl CXX__DEFAULT_EXCEPTION defined in header file dnl if cxxac_cv_default_exception = yes dnl AC_DEFUN([CXXAC_DEFAULT_EXCEPTION], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([if exception handling is on by default]) AH_TEMPLATE([CXX__DEFAULT_EXCEPTION], [Define if exception handling is on by default.]) AC_CACHE_VAL(cxxac_cv_default_exception, [ AC_TRY_COMPILE([ ], [ try { throw 1; } catch (...) { throw; } ], [ cxxac_cv_default_exception=yes ], [ cxxac_cv_default_exception=no ]) ]) AC_MSG_RESULT($cxxac_cv_default_exception) if test $cxxac_cv_default_exception = yes; then AC_DEFINE(CXX__DEFAULT_EXCEPTION) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_HAVE_TYPENAME dnl Test if the typename keyword works. dnl It is supported by gcc 2.8.0 or newer. dnl dnl Results: cxxac_cv_have_typename = yes/no dnl CXX__HAVE_TYPENAME defined in header file dnl if cxxac_cv_have_typename = yes dnl AC_DEFUN([CXXAC_HAVE_TYPENAME], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([for C++ typename keyword]) AH_TEMPLATE([CXX__HAVE_TYPENAME], [Define if typename is available.]) AH_VERBATIM([CXX__HAVE_TYPENAME2], [ #ifdef CXX__HAVE_TYPENAME # define TYPENAME typename #else # define TYPENAME #endif ]) AC_CACHE_VAL(cxxac_cv_have_typename, [ AC_TRY_COMPILE([ class A { public: typedef int type; int value; }; template class C { public: int f () { typename T::type p; return sizeof p; } }; ], [ C c; c.f(); ], [ cxxac_cv_have_typename=yes ], [ cxxac_cv_have_typename=no ]) ]) AC_MSG_RESULT($cxxac_cv_have_typename) if test $cxxac_cv_have_typename = yes; then AC_DEFINE(CXX__HAVE_TYPENAME) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_NO_GUIDE_DECL dnl Test if ordinary function declaration will not dnl guide the compiler to instantiate the template dnl version of the function. dnl It is supported by gcc 2.8.0 or newer. dnl dnl Results: cxxac_cv_no_guide_decl = yes/no dnl CXX__NO_GUIDE_DECL defined in header file dnl if cxxac_cv_no_guide_decl = yes dnl AC_DEFUN([CXXAC_NO_GUIDE_DECL], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_CHECKING([if C++ guided declaration for template function disabled]) AH_TEMPLATE([CXX__NO_GUIDE_DECL], [Define if guided declaration is used.]) AH_VERBATIM([CXX__NO_GUIDE_DECL2], [ #ifndef CXX__NO_GUIDE_DECL # define LEFTRIGHT #else # define LEFTRIGHT <> #endif ]) AC_CACHE_VAL(cxxac_cv_no_guide_decl, [ AC_TRY_COMPILE([ template int f(T &t); template class C { int value; public: friend int f<>(T &); }; ], [ ], [ cxxac_cv_no_guide_decl=yes ], [ cxxac_cv_no_guide_decl=no ]) ]) AC_MSG_RESULT($cxxac_cv_no_guide_decl) if test $cxxac_cv_no_guide_decl = yes; then AC_DEFINE(CXX__NO_GUIDE_DECL) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_LIB_NEED_USING_STD dnl Test if library supports using namespace std. dnl It is supported by libg++ 2.7.x or newer. dnl dnl Results: cxxac_cv_lib_need_using_std = yes/no dnl CXX__LIB_NEED_USING_STD defined in header file dnl if cxxac_cv_lib_need_using_std = yes dnl cxxac_using_namespace_std = "" or dnl "using namespace std;" dnl dnl [lib.contents] dnl AC_DEFUN([CXXAC_LIB_NEED_USING_STD], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_REQUIRE([CXXAC_HAVE_NAMESPACE]) dnl avoid broken message CXXAC_HEADER(iostream) AC_MSG_CHECKING([if using namespace std supported by C++ library]) AH_TEMPLATE([CXX__LIB_NEED_USING_STD], [Define if using namespace std; is required by the library.]) AH_VERBATIM([CXX__LIB_NEED_USING_STD2], [ #ifdef CXX__LIB_NEED_USING_STD # define USING_NAMESPACE_STD using namespace std #else # define USING_NAMESPACE_STD #endif ]) AC_CACHE_VAL(cxxac_cv_lib_need_using_std, [ if test $cxxac_cv_have_namespace = yes; then AC_TRY_COMPILE([ #include CXX__HEADER_iostream using namespace std; ], [ cout << '\n'; ], [ cxxac_cv_lib_need_using_std=yes ], [ cxxac_cv_lib_need_using_std=no ]) else cxxac_cv_lib_need_using_std=no fi ]) AC_MSG_RESULT($cxxac_cv_lib_need_using_std) if test $cxxac_cv_lib_need_using_std = yes; then AC_DEFINE(CXX__LIB_NEED_USING_STD) cxxac_using_namespace_std="using namespace std;" else AC_DEFINE(USING_NAMESPACE_STD) cxxac_using_namespace_std="" fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_HEADER_MACRO Set macros inside config.h.in. dnl AC_DEFUN([CXXAC_HEADER_MACRO], [ AH_TEMPLATE([CXX__HAVE_HEADER_algorithm], [Define if header algorithm is available.]) AH_TEMPLATE([CXX__HEADER_algorithm], [Define if header algorithm is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_bitset], [Define if header bitset is available.]) AH_TEMPLATE([CXX__HEADER_bitset], [Define if header bitset is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_complex], [Define if header complex is available.]) AH_TEMPLATE([CXX__HEADER_complex], [Define if header complex is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_deque], [Define if header deque is available.]) AH_TEMPLATE([CXX__HEADER_deque], [Define if header deque is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_exception], [Define if header exception is available.]) AH_TEMPLATE([CXX__HEADER_exception], [Define if header exception is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_fstream], [Define if header fstream is available.]) AH_TEMPLATE([CXX__HEADER_fstream], [Define if header fstream is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_functional], [Define if header functional is available.]) AH_TEMPLATE([CXX__HEADER_functional], [Define if header functional is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_iomanip], [Define if header iomanip is available.]) AH_TEMPLATE([CXX__HEADER_iomanip], [Define if header iomanip is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_ios], [Define if header ios is available.]) AH_TEMPLATE([CXX__HEADER_ios], [Define if header ios is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_iofwd], [Define if header iofwd is available.]) AH_TEMPLATE([CXX__HEADER_iofwd], [Define if header iofwd is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_iostream], [Define if header iostream is available.]) AH_TEMPLATE([CXX__HEADER_iostream], [Define if header iostream is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_istream], [Define if header istream is available.]) AH_TEMPLATE([CXX__HEADER_istream], [Define if header istream is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_iterator], [Define if header iterator is available.]) AH_TEMPLATE([CXX__HEADER_iterator], [Define if header iterator is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_limits], [Define if header limits is available.]) AH_TEMPLATE([CXX__HEADER_limits], [Define if header limits is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_list], [Define if header list is available.]) AH_TEMPLATE([CXX__HEADER_list], [Define if header list is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_locale], [Define if header locale is available.]) AH_TEMPLATE([CXX__HEADER_locale], [Define if header locale is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_map], [Define if header map is available.]) AH_TEMPLATE([CXX__HEADER_map], [Define if header map is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_memory], [Define if header memory is available.]) AH_TEMPLATE([CXX__HEADER_memory], [Define if header memory is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_new], [Define if header new is available.]) AH_TEMPLATE([CXX__HEADER_new], [Define if header new is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_numeric], [Define if header numeric is available.]) AH_TEMPLATE([CXX__HEADER_numeric], [Define if header numeric is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_ostream], [Define if header ostream is available.]) AH_TEMPLATE([CXX__HEADER_ostream], [Define if header ostream is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_queue], [Define if header queue is available.]) AH_TEMPLATE([CXX__HEADER_queue], [Define if header queue is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_set], [Define if header set is available.]) AH_TEMPLATE([CXX__HEADER_set], [Define if header set is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_sstream], [Define if header sstream is available.]) AH_TEMPLATE([CXX__HEADER_sstream], [Define if header sstream is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_stack], [Define if header stack is available.]) AH_TEMPLATE([CXX__HEADER_stack], [Define if header stack is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_stdexcept], [Define if header stdexcept is available.]) AH_TEMPLATE([CXX__HEADER_stdexcept], [Define if header stdexcept is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_streambuf], [Define if header streambuf is available.]) AH_TEMPLATE([CXX__HEADER_streambuf], [Define if header streambuf is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_string], [Define if header string is available.]) AH_TEMPLATE([CXX__HEADER_string], [Define if header string is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_typeinfo], [Define if header typeinfo is available.]) AH_TEMPLATE([CXX__HEADER_typeinfo], [Define if header typeinfo is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_utility], [Define if header utility is available.]) AH_TEMPLATE([CXX__HEADER_utility], [Define if header utility is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_valarray], [Define if header valarray is available.]) AH_TEMPLATE([CXX__HEADER_valarray], [Define if header valarray is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_vector], [Define if header vector is available.]) AH_TEMPLATE([CXX__HEADER_vector], [Define if header vector is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cassert], [Define if header cassert is available.]) AH_TEMPLATE([CXX__HEADER_cassert], [Define if header cassert is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cctype], [Define if header cctype is available.]) AH_TEMPLATE([CXX__HEADER_cctype], [Define if header cctype is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cerrno], [Define if header cerrno is available.]) AH_TEMPLATE([CXX__HEADER_cerrno], [Define if header cerrno is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cfloat], [Define if header cfloat is available.]) AH_TEMPLATE([CXX__HEADER_cfloat], [Define if header cfloat is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_ciso646], [Define if header ciso646 is available.]) AH_TEMPLATE([CXX__HEADER_ciso646], [Define if header ciso646 is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_climits], [Define if header climits is available.]) AH_TEMPLATE([CXX__HEADER_climits], [Define if header climits is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_clocale], [Define if header clocale is available.]) AH_TEMPLATE([CXX__HEADER_clocale], [Define if header clocale is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cmath], [Define if header cmath is available.]) AH_TEMPLATE([CXX__HEADER_cmath], [Define if header cmath is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_csetjmp], [Define if header csetjmp is available.]) AH_TEMPLATE([CXX__HEADER_csetjmp], [Define if header csetjmp is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_csignal], [Define if header csignal is available.]) AH_TEMPLATE([CXX__HEADER_csignal], [Define if header csignal is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cstdarg], [Define if header cstdarg is available.]) AH_TEMPLATE([CXX__HEADER_cstdarg], [Define if header cstdarg is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cstddef], [Define if header cstddef is available.]) AH_TEMPLATE([CXX__HEADER_cstddef], [Define if header cstddef is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cstdio], [Define if header cstdio is available.]) AH_TEMPLATE([CXX__HEADER_cstdio], [Define if header cstdio is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cstdlib], [Define if header cstdlib is available.]) AH_TEMPLATE([CXX__HEADER_cstdlib], [Define if header cstdlib is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cstring], [Define if header cstring is available.]) AH_TEMPLATE([CXX__HEADER_cstring], [Define if header cstring is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_ctime], [Define if header ctime is available.]) AH_TEMPLATE([CXX__HEADER_ctime], [Define if header ctime is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cwchar], [Define if header cwchar is available.]) AH_TEMPLATE([CXX__HEADER_cwchar], [Define if header cwchar is available.]) AH_TEMPLATE([CXX__HAVE_HEADER_cwctype], [Define if header cwctype is available.]) AH_TEMPLATE([CXX__HEADER_cwctype], [Define if header cwctype is available.]) ]) dnl ***************************************************************** dnl CXXAC_HEADER Test if the specified C++ and C library header dnl is available. dnl It is supported by gcc 3.x or newer. dnl dnl Results: cxxac_cv_have_header_xxx = yes/no/need_h dnl If cxxac_cv_have_header_xxx = yes/need_h, then dnl CXX__HAVE_HEADER_xxx defined in header file dnl to be 0 (need .h) dnl or 1 (OK) dnl cxxac_cv_header_xxx = header name found dnl CXX__HEADER_xxx defined as header name dnl AC_DEFUN([CXXAC_HEADER], [ if eval "test \"\$cxxac_done_header_$1\" != yes"; then AC_REQUIRE([AC_PROG_CXX]) AC_REQUIRE([CXXAC_HEADER_MACRO]) AC_LANG_PUSH([C++]) dnl $2 can be empty if test "$2" != quiet; then AC_MSG_CHECKING([for C++ library header $1]) fi AC_CACHE_VAL(cxxac_cv_have_header_$1, [ AC_TRY_CPP([#include <$1>], [ eval "cxxac_cv_have_header_$1=yes" ], [ AC_TRY_CPP([#include <$1.h>], [ eval "cxxac_cv_have_header_$1=need_h" ], [ eval "cxxac_cv_have_header_$1=no" ]) ]); ]) eval "cxxac_cv_have_header=\$cxxac_cv_have_header_$1" if test $cxxac_cv_have_header = yes; then cxxac_result=yes eval "cxxac_cv_header_$1=$1" AC_DEFINE_UNQUOTED(CXX__HAVE_HEADER_$1,1) AC_DEFINE_UNQUOTED(CXX__HEADER_$1,<$1>) elif test $cxxac_cv_have_header = need_h; then cxxac_result="need .h" eval "cxxac_cv_header_$1=$1.h" AC_DEFINE_UNQUOTED(CXX__HAVE_HEADER_$1,0) AC_DEFINE_UNQUOTED(CXX__HEADER_$1,<$1.h>) else cxxac_result=no eval "cxxac_cv_header_$1=" fi dnl $2 can be empty if test "$2" != quiet; then AC_MSG_RESULT($cxxac_result) fi AC_LANG_POP([C++]) eval "cxxac_done_header_$1=yes" fi ]) dnl ***************************************************************** dnl CXXAC_HEADER_ALL Test if all C++ and C library header is dnl available. dnl It is supported by gcc 3.x or newer. dnl dnl Results: cxxac_cv_have_all_header = yes/no dnl CXX__HAVE_ALL_HEADER defined in header file dnl if cxxac_cv_have_all_header = yes dnl cxxac_cv_header_need_ext = list of files that dnl require `.h' extension dnl cxxac_cv_missing = list of files that is dnl cannot be found even dnl with `.h' added dnl AC_DEFUN([CXXAC_HEADER_ALL], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_MSG_NOTICE(checking for all C++ library header) AH_TEMPLATE([CXX__HAVE_ALL_HEADER], [Define if all C++ and C library header is available.]) cxxac_file="algorithm bitset complex deque exception fstream functional" cxxac_file="$cxxac_file iomanip ios iosfwd iostream istream iterator limits" cxxac_file="$cxxac_file list locale map memory new numeric" cxxac_file="$cxxac_file ostream queue set sstream stack stdexcept" cxxac_file="$cxxac_file streambuf string typeinfo utility valarray vector" cxxac_file="$cxxac_file cassert cctype cerrno cfloat" cxxac_file="$cxxac_file ciso646 climits clocale cmath" cxxac_file="$cxxac_file csetjmp csignal cstdarg cstddef" cxxac_file="$cxxac_file cstdio cstdlib cstring ctime cwchar cwctype" cxxac_cv_have_all_header=yes cxxac_cv_header_need_ext= cxxac_cv_header_missing= for cxxac_f in $cxxac_file; do CXXAC_HEADER($cxxac_f) if test $cxxac_cv_have_header != yes; then cxxac_cv_have_all_header=no if test $cxxac_cv_have_header = need_h; then cxxac_cv_header_need_ext="$cxxac_cv_header_need_ext $cxxac_f" else cxxac_cv_header_missing="$cxxac_cv_header_missing $cxxac_f" fi fi done dnl Append a space for easy check later cxxac_cv_header_need_ext="$cxxac_cv_header_need_ext " cxxac_cv_header_missing="$cxxac_cv_header_missing " AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_STRING_ERASE Test if `string::erase' is available. It is dnl supported by libstdc++ 2.8.0 or newer. dnl If not available, string::remove (in libg++ dnl before 2.8.0) or string::replace (in all dnl versions of libg++/libstdc++) may be used. dnl dnl Results: cxxac_cv_string_erase = yes/no dnl CXX__STRING_ERASE defined in header file dnl if cxxac_cv_string_erase = yes dnl AC_DEFUN([CXXAC_STRING_ERASE], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_REQUIRE([CXXAC_LIB_NEED_USING_STD]) if test "x$cxxac_cv_have_header_string" = x; then CXXAC_HEADER(string) fi AC_MSG_CHECKING([for C++ string::erase method]) AH_TEMPLATE([CXX__STRING_ERASE], [Define if string::erase(...) is available.]) AC_CACHE_VAL(cxxac_cv_string_erase, [ AC_TRY_COMPILE([ /* Some macro defined in curses.h */ #undef move #undef clear #undef erase #include <$cxxac_cv_header_string> $cxxac_using_namespace_std ], [ string s("test"); s.erase(0,1); ], [ cxxac_cv_string_erase=yes ], [ cxxac_cv_string_erase=no ]) ]) if test $cxxac_cv_string_erase = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_string_erase = yes; then AC_DEFINE(CXX__STRING_ERASE) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_STRING_IO Test if stream I/O operators for string dnl is available. dnl dnl Results: cxxac_cv_string_io = yes/no dnl CXX__STRING_IO defined in header file dnl if cxxac_cv_string_io = yes dnl AC_DEFUN([CXXAC_STRING_IO], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_REQUIRE([CXXAC_LIB_NEED_USING_STD]) CXXAC_HEADER(string) CXXAC_HEADER(iostream) AC_MSG_CHECKING([for stream I/O operators for C++ string]) AH_TEMPLATE([CXX__STRING_IO], [Define if I/O stream operators for string is available.]) AC_CACHE_VAL(cxxac_cv_string_io, [ AC_TRY_COMPILE([ /* Some macro defined in curses.h */ #undef move #undef clear #undef erase #include <$cxxac_cv_header_string> #include <$cxxac_cv_header_iostream> $cxxac_using_namespace_std ], [ string s("test"), t; cout << s << '\n'; cin >> t; ], [ cxxac_cv_string_io=yes ], [ cxxac_cv_string_io=no ]) ]) AC_MSG_RESULT($cxxac_cv_string_io) if test $cxxac_cv_string_io = yes; then AC_DEFINE(CXX__STRING_IO) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_BAD_ALLOC Test if `bad_alloc' is available. It is dnl supported by gcc 2.95.x or newer and dnl egcs 1.1 dnl dnl Results: cxxac_cv_bad_alloc = yes/no dnl CXX__BAD_ALLOC defined in header file dnl if cxxac_cv_bad_alloc = yes dnl AC_DEFUN([CXXAC_BAD_ALLOC], [ AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH([C++]) AC_REQUIRE([CXXAC_LIB_NEED_USING_STD]) if test "x$cxxac_cv_have_header_new" = x; then CXXAC_HEADER(new) fi AC_REQUIRE([CXXAC_DEFAULT_EXCEPTION]) AC_MSG_CHECKING([for bad_alloc]) AH_TEMPLATE([CXX__BAD_ALLOC], [Define if bad_alloc is available.]) AH_VERBATIM([CXX__LIB_NEED_USING_STD_BAD_ALLOC], [ #ifdef CXX__BAD_ALLOC # include CXX__HEADER_new #else # ifdef CXX__LIB_NEED_USING_STD namespace std { class bad_alloc {}; } # else class bad_alloc {}; # endif #endif #ifdef CXX__LIB_NEED_USING_STD # define BAD_ALLOC std::bad_alloc #else # define BAD_ALLOC bad_alloc #endif ]) AC_CACHE_VAL(cxxac_cv_bad_alloc, [ if test $cxxac_cv_default_exception = yes; then AC_TRY_COMPILE([ #include <$cxxac_cv_header_new> $cxxac_using_namespace_std bad_alloc b; ], [ ], [ cxxac_cv_bad_alloc=yes ], [ cxxac_cv_bad_alloc=no ]) else cxxac_cv_bad_alloc=no fi ]) if test $cxxac_cv_bad_alloc = yes; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi if test $cxxac_cv_bad_alloc = yes; then AC_DEFINE(CXX__BAD_ALLOC) fi AC_LANG_POP([C++]) ]) dnl ***************************************************************** dnl CXXAC_TEST_ALL Run all test except CXXAC_WANT_xxx and dnl untested tests dnl dnl Results: All of above test dnl AC_DEFUN([CXXAC_TEST_ALL], [ CXXAC_TYPE_WCHAR_T CXXAC_TYPE_BOOL CXXAC_DEFINE_BOOL CXXAC_HAVE_EXPLICIT CXXAC_HAVE_MUTABLE CXXAC_DEFAULT_EXCEPTION CXXAC_HAVE_MEMBER_FUNCTION_TEMPLATE CXXAC_HAVE_TYPENAME CXXAC_NO_GUIDE_DECL CXXAC_HAVE_NAMESPACE CXXAC_LIB_NEED_USING_STD CXXAC_BAD_FOR CXXAC_HAVE_ARRAY_NEW CXXAC_HAVE_PLACEMENT_NEW CXXAC_BAD_NEW CXXAC_BAD_DELETE CXXAC_HEADER_ALL CXXAC_STRING_ERASE ]) dnl ***************************************************************** dnl End of C++ Tests for Autoconf dnl ***************************************************************** grhino-0.16.1/acinclude.m4/lib-prefix.m40000644000175000017500000001503611436423224020102 0ustar lerdsuwalerdsuwa# lib-prefix.m4 serial 5 (gettext-0.15) dnl Copyright (C) 2001-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't dnl require excessive bracketing. ifdef([AC_HELP_STRING], [AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], [AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed dnl to access previously installed libraries. The basic assumption is that dnl a user will want packages to use other packages he previously installed dnl with the same --prefix option. dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate dnl libraries, but is otherwise very convenient. AC_DEFUN([AC_LIB_PREFIX], [ AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_LIB_PREPARE_MULTILIB]) AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) dnl By default, look in $includedir and $libdir. use_additional=yes AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) AC_LIB_ARG_WITH([lib-prefix], [ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib --without-lib-prefix don't search for libraries in includedir and libdir], [ if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then AC_LIB_WITH_FINAL_PREFIX([ eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" ]) else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi ]) if test $use_additional = yes; then dnl Potentially add $additional_includedir to $CPPFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/include, dnl 2. if it's already present in $CPPFLAGS, dnl 3. if it's /usr/local/include and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_includedir" != "X/usr/include"; then haveit= for x in $CPPFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_includedir"; then dnl Really add $additional_includedir to $CPPFLAGS. CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" fi fi fi fi dnl Potentially add $additional_libdir to $LDFLAGS. dnl But don't add it dnl 1. if it's the standard /usr/lib, dnl 2. if it's already present in $LDFLAGS, dnl 3. if it's /usr/local/lib and we are using GCC on Linux, dnl 4. if it doesn't exist as a directory. if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= for x in $LDFLAGS; do AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux*) haveit=yes;; esac fi fi if test -z "$haveit"; then if test -d "$additional_libdir"; then dnl Really add $additional_libdir to $LDFLAGS. LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" fi fi fi fi fi ]) dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, dnl acl_final_exec_prefix, containing the values to which $prefix and dnl $exec_prefix will expand at the end of the configure script. AC_DEFUN([AC_LIB_PREPARE_PREFIX], [ dnl Unfortunately, prefix and exec_prefix get only finally determined dnl at the end of configure. if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" ]) dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the dnl variables prefix and exec_prefix bound to the values they will have dnl at the end of the configure script. AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], [ acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" $1 exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" ]) dnl AC_LIB_PREPARE_MULTILIB creates a variable acl_libdirstem, containing dnl the basename of the libdir, either "lib" or "lib64". AC_DEFUN([AC_LIB_PREPARE_MULTILIB], [ dnl There is no formal standard regarding lib and lib64. The current dnl practice is that on a system supporting 32-bit and 64-bit instruction dnl sets or ABIs, 64-bit libraries go under $prefix/lib64 and 32-bit dnl libraries go under $prefix/lib. We determine the compiler's default dnl mode by looking at the compiler's library search path. If at least dnl of its elements ends in /lib64 or points to a directory whose absolute dnl pathname ends in /lib64, we assume a 64-bit ABI. Otherwise we use the dnl default, namely "lib". acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ]) grhino-0.16.1/acinclude.m4/intdiv0.m40000644000175000017500000000334011436423224017411 0ustar lerdsuwalerdsuwa# intdiv0.m4 serial 1 (gettext-0.11.3) dnl Copyright (C) 2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([gt_INTDIV0], [ AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_CACHE_CHECK([whether integer division by zero raises SIGFPE], gt_cv_int_divbyzero_sigfpe, [ AC_TRY_RUN([ #include #include static void #ifdef __cplusplus sigfpe_handler (int sig) #else sigfpe_handler (sig) int sig; #endif { /* Exit with code 0 if SIGFPE, with code 1 if any other signal. */ exit (sig != SIGFPE); } int x = 1; int y = 0; int z; int nan; int main () { signal (SIGFPE, sigfpe_handler); /* IRIX and AIX (when "xlc -qcheck" is used) yield signal SIGTRAP. */ #if (defined (__sgi) || defined (_AIX)) && defined (SIGTRAP) signal (SIGTRAP, sigfpe_handler); #endif /* Linux/SPARC yields signal SIGILL. */ #if defined (__sparc__) && defined (__linux__) signal (SIGILL, sigfpe_handler); #endif z = x / y; nan = y / y; exit (1); } ], gt_cv_int_divbyzero_sigfpe=yes, gt_cv_int_divbyzero_sigfpe=no, [ # Guess based on the CPU. case "$host_cpu" in alpha* | i[34567]86 | m68k | s390*) gt_cv_int_divbyzero_sigfpe="guessing yes";; *) gt_cv_int_divbyzero_sigfpe="guessing no";; esac ]) ]) case "$gt_cv_int_divbyzero_sigfpe" in *yes) value=1;; *) value=0;; esac AC_DEFINE_UNQUOTED(INTDIV0_RAISES_SIGFPE, $value, [Define if integer division by zero raises signal SIGFPE.]) ]) grhino-0.16.1/acinclude.m4/lcmessage.m40000644000175000017500000000240411436423224017777 0ustar lerdsuwalerdsuwa# lcmessage.m4 serial 4 (gettext-0.14.2) dnl Copyright (C) 1995-2002, 2004-2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995. # Check whether LC_MESSAGES is available in . AC_DEFUN([gt_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], gt_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], gt_cv_val_LC_MESSAGES=yes, gt_cv_val_LC_MESSAGES=no)]) if test $gt_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi ]) grhino-0.16.1/acinclude.m4/iconv.m40000644000175000017500000000642611436423224017162 0ustar lerdsuwalerdsuwa# iconv.m4 serial AM4 (gettext-0.11.3) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) grhino-0.16.1/acinclude.m4/progtest.m40000644000175000017500000000555011436423224017710 0ustar lerdsuwalerdsuwa# progtest.m4 serial 4 (gettext-0.14.2) dnl Copyright (C) 1996-2003, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. AC_PREREQ(2.50) # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [ # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in [[\\/]]* | ?:[[\\/]]*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in ifelse([$5], , $PATH, [$5]); do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&AS_MESSAGE_LOG_FD if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) grhino-0.16.1/acinclude.m4/isc-posix.m40000644000175000017500000000213311436423224017751 0ustar lerdsuwalerdsuwa# isc-posix.m4 serial 2 (gettext-0.11.2) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # This file is not needed with autoconf-2.53 and newer. Remove it in 2005. # This test replaces the one in autoconf. # Currently this macro should have the same name as the autoconf macro # because gettext's gettext.m4 (distributed in the automake package) # still uses it. Otherwise, the use in gettext.m4 makes autoheader # give these diagnostics: # configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX # configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX undefine([AC_ISC_POSIX]) AC_DEFUN([AC_ISC_POSIX], [ dnl This test replaces the obsolescent AC_ISC_POSIX kludge. AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) ] ) grhino-0.16.1/row2.bin0000600000175000017500000020011211436423225014674 0ustar lerdsuwalerdsuwagrhino-0.16.1/diag2.bin0000600000175000017500000005255611436423224015011 0ustar lerdsuwalerdsuwagrhino-0.16.1/MANIFEST0000644000175000017500000000542111436423224014457 0ustar lerdsuwalerdsuwaABOUT-NLS COPYING ChangeLog MANIFEST Makefile.in NEWS README TODO acinclude.m4/codeset.m4 acinclude.m4/cxxac.m4 acinclude.m4/gettext.m4 acinclude.m4/glibc21.m4 acinclude.m4/iconv.m4 acinclude.m4/intdiv0.m4 acinclude.m4/isc-posix.m4 acinclude.m4/lcmessage.m4 acinclude.m4/lib-ld.m4 acinclude.m4/lib-link.m4 acinclude.m4/lib-prefix.m4 acinclude.m4/progtest.m4 aclocal.m4 ad.append ad.prepend ad.rule aiai.cc alphabeta.cc alphabeta.h black.xpm black_last.xpm binfile.cc binfile.h bitboard.cc bitboard.h board.cc board.h boardio.cc boardio.h book.bin book.cc book.h bottom.xcf bottom.xpm config.h.in configure configure.in corner5x2.bin desktop/grhino.desktop.in RPCP diag1.bin diag2.bin diag3.bin diag4.bin diag5.bin dump_pattern.cc empty.xpm fdstream.h game.cc game.h gameinfo.cc gameinfo.h gen_book.cc gen_opening.cc gen_pattern.cc gen_table.cc gevalwin.cc gevalwin.h ggamewin.cc ggamewin.h ghistwin.cc ghistwin.h gpref.cc gpref.h grhino.cc grhino.png gtp.cc gtp.h gtp-rhino.cc gtstream.h gtstream.cc gutil.cc gutil.h hash.cc hash.h help/C/figures/gamelist.png help/C/figures/history.png help/C/figures/mainwindow.png help/C/figures/mainwindow.xcf help/C/figures/pattern.png help/C/figures/prefs-ai.png help/C/figures/prefs-board.png help/C/figures/prefs-theme.png help/C/figures/toolbar-edit.png help/C/grhino-C.omf.in RPCP help/C/grhino.xml RPCP help/C/legal.xml highlight_black.xpm highlight_empty.xpm highlight_white.xpm hint_black.xpm hint_white.xpm icon_black.xpm icon_bw.xpm icon_empty.xpm icon_new.xpm icon_white.xpm iter.cc iter.h left.xcf left.xpm load.cc load.h log_proc.h opening.cc opening-dat.h opening.h order.cc order.h parity.cc parity.h pattern.cc pattern.h po/boldquot.sed po/ChangeLog po/en@boldquot.header po/en_GB.po po/en_GB.UTF-8.po po/en@quot.header po/en_US.UTF-8.po po/grhino.pot po/insert-header.sin po/Makefile po/Makefile.in po/Makefile.in.in po/Makevars po/POTFILES po/POTFILES.in po/quot.sed po/remove-potcdate.sed po/remove-potcdate.sin po/Rules-quot proginfo.cc proginfo.h rand.cc rand.h randboard.cc randboard.h right.xcf right.xpm row1.bin row2.bin row3.bin row4.bin scripts/commit scripts/commit-template scripts/config.guess scripts/config.rpath scripts/config.sub scripts/copy-message scripts/copy-message.pl scripts/dircheck scripts/en_GB.pl scripts/install-sh scripts/makepkg scripts/makepkg-release scripts/mkinstalldirs scripts/rpcp scripts/utf-quotes.pl scripts/version table-dat.h test.cc theme/small/black.xpm theme/small/black_last.xpm theme/small/bottom.xpm theme/small/empty.xpm theme/small/highlight_black.xpm theme/small/highlight_empty.xpm theme/small/highlight_white.xpm theme/small/hint_black.xpm theme/small/hint_white.xpm theme/small/left.xpm theme/small/top.xpm theme/small/right.xpm theme/small/white.xpm theme/small/white_last.xpm top.xcf top.xpm white.xpm white_last.xpm grhino-0.16.1/ad.prepend0000644000175000017500000000357511436423224015301 0ustar lerdsuwalerdsuwa# # Makefile for GRhino # Copyright (c) 2000-2005, 2006 Kriang Lerdsuwanakij # email: lerdsuwa@users.sourceforge.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ prefix = @prefix@ datarootdir = @datarootdir@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ mandir = @mandir@ man1dir = $(mandir)/man1 docdir = @docdir@ etcdir = @sysconfdir@ datadir = @datadir@ localedir = @datadir@/locale helpdir = @datadir@/gnome/help/grhino omfdir = @datadir@/omf/grhino icon_dir = @datadir@/pixmaps pattern_dir = @datadir@/${PACKAGE}-${VERSION}/pattern book_dir = @datadir@/${PACKAGE}-${VERSION}/book theme_dir = @datadir@/${PACKAGE}-${VERSION}/theme # DESTDIR used in rules below is undefined by default. # It will be defined when building package. CC = @CC@ CXX = @CXX@ CPP = @CPP@ CXXCPP = @CXXCPP@ CFLAGS = @CFLAGS@ CXXFLAGS = @CXXFLAGS@ CPPFLAGS = @CPPFLAGS@ CCFLAGS = $(CPPFLAGS) $(CFLAGS) CXXCFLAGS = $(CPPFLAGS) $(CXXFLAGS) LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ grhino-0.16.1/README0000644000175000017500000000314011436423224014202 0ustar lerdsuwalerdsuwaSYSTEM REQUIREMENTS ------------------- - GTK+ 2 and GNOME 2 - A fairly recent C++ compiler and its corresponding standard C++ library - Pthreads library (on Linux, this is already included with glibc) INSTALLATION ------------ Use the usual "./configure" and "make" commands. Then, "make install" with the required priviledge to install to the target directory. There are two executable files built. The GNOME GUI is called "grhino". In addition, the GTP front-end, useful as an engine to other program called "gtp-rhino" is also available. You can use GTP front-end such as Quarry to make two different GRhino play each other. You can use the configure options "--disable-gnome" and "--disable-gtp" to disabling building either executable. The rest of binaries (gen_pattern, gen_book, etc.) may be built with "make all". They can be ignored and are not installed into target directories. They are used by program author to generate data for AI. grhino DOCUMENTATION -------------------- For documentation on how to use GRhino, refer to the online help found in the game. gtp-rhino DOCUMENTATION ----------------------- For gtp-rhino, use "gtp-rhino --help" to list all options. Implemented GTP commands: protocol_version, name, version, known_command, list_commands, quit, boardsize, clear_board, komi, play, genmove, undo, final_score, showboard, reg_genmove Unimplemented GTP commands: time_settings, time_left (only allow Quarry to run without crashing, no AI time limit is enforced yet) GTP Extension: set_game, list_games (Quarry use) grhino-auto_play (For testing) grhino-0.16.1/bitboard.cc0000644000175000017500000000443211436423224015424 0ustar lerdsuwalerdsuwa/* bitboard.cc Game Board Operations for BitBoard Copyright (c) 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "bitboard.h" bit_board_type bit_board_empty = { { 0x00000000, 0x00000000 }, { 0x00000000, 0x00000000 } }; bit_board_type bit_board_begin = { { 0x00000008, 0x10000000 }, { 0x00000010, 0x08000000 } }; // No default initialization to speed up search bit_board_info::bit_board_info() { } // Fast bit counting essential for endgame search int count_bits(int x) { int count = bit_count_table[x & 0xFF]; x >>= 8; count += bit_count_table[x & 0xFF]; x >>= 8; count += bit_count_table[x & 0xFF]; x >>= 8; count += bit_count_table[x & 0xFF]; return count; } bit_board_info::bit_board_info(const bit_board_type *board_init) { memcpy(&board, board_init, sizeof(board_type)); int occupied_upper = board.black[0] | board.white[1]; int occupied_lower = board.black[1] | board.white[1]; move = count_bits(occupied_upper) + count_bits(occupied_lower) - 4; hash = get_hash(this); } bit_board_info& bit_board_info::operator=(const bit_board_type *board_init) { memcpy(board, board_init, sizeof(bit_board_type)); move = NUM_MOVE; board_iterator iter; iter.init_pos(); do { if (is_empty(iter.pos)) move--; } while (iter.next()); hash = get_hash(this); return *this; } bit_board_info& bit_board_info::operator=(const bit_board_info& src) { memcpy(this, &src, sizeof(bit_board_info)); return *this; } bool operator==(const bit_board_info &board1, const bit_board_info &board2) { if (memcmp(&(board1.board), &(board2.board), sizeof(bit_board_type))) return false; return true; } grhino-0.16.1/gtp.cc0000644000175000017500000001717611436423224014441 0ustar lerdsuwalerdsuwa/* gtp-rhino.cc GRhino GTP Frontend Copyright (c) 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include "board.h" #include "gtstream.h" #include "gtp.h" #include #include #include #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x void input_char(char &c) { std::cin.get(c); if (!std::cin) throw io_error(); } void output_char(char c) { std::cout.put(c); if (!std::cout) throw io_error(); } void output_flush() { std::cout << std::flush; if (!std::cout) throw io_error(); } // Input line ignoring newline void input_line(std::string &str) { // Loop until line is neither empty // nor containing only white spaces for ( ; ; ) { str.erase(); // Loop until we have a complete line for ( ; ; ) { char c; input_char(c); if (c == '#') { do { input_char(c); } while (c != '\n'); break; // Exit loop } else if (c == '\t') c = ' '; else if (c == '\n') break; // Exit loop else if ((c >= 0 && c <= 31) || c == 127) continue; // Ignore \r and // control chars str += c; } for (size_t i = 0; i < str.size(); ++i) if (!isspace(str[i])) return; // Exit outer loop } } // Output line togetherwith newline void output_line(const std::string &str) { int found_newline = 0; for (size_t i = 0; i < str.size(); ++i) { output_char(str[i]); if (str[i] == '\n') found_newline++; else found_newline = 0; } // Output newline of necessary if (found_newline < 2) output_char('\n'); if (found_newline < 1) output_char('\n'); output_flush(); } // Output line togetherwith newline void output_line(const char *str) { int found_newline = 0; while (*str) { output_char(*str); if (*str == '\n') found_newline++; else found_newline = 0; ++str; } // Output newline of necessary if (found_newline < 2) output_char('\n'); if (found_newline < 1) output_char('\n'); output_flush(); } size_t parse_id(const std::string &str, bool &has_id, unsigned &id) { size_t i; bool found_number = false; id = 0; for (i = 0; i < str.size(); ++i) { if (str[i] == ' ') { if (found_number) { has_id = true; return i; } else continue; } else if (str[i] >= '0' && str[i] <= '9') { id = id*10 + str[i]-'0'; found_number = true; } else { if (found_number) // Ex: 10x throw id_error(); else { // No id has_id = false; return i; } } } if (!found_number) // Empty line throw id_error(); // Reach here for line with // only id has_id = true; return i; } size_t skip_space(const std::string &str, size_t i) { while (i < str.size() && str[i] == ' ') ++i; return i; } size_t skip_non_space(const std::string &str, size_t i) { while (i < str.size() && str[i] != ' ') ++i; return i; } size_t read_unsigned(const std::string &str, size_t i, unsigned &num) { num = 0; if (i == str.size() || str[i] < '0' || str[i] > '9') throw syntax_error(); while (i < str.size() && str[i] >= '0' && str[i] <= '9') { num = num*10 + str[i]-'0'; ++i; } if (i < str.size() && str[i] != ' ') throw syntax_error(); return i; } size_t read_float(const std::string &str, size_t i, double &num) { num = 0.0; double mult = 1.0; bool found_decimal = false; if (i == str.size()) throw syntax_error(); if (str[i] == '+') ++i; else if (str[i] == '-') { ++i; mult *= -1.0; } if (i == str.size() || ((str[i] < '0' || str[i] > '9') && str[i] != '.')) throw syntax_error(); while (i < str.size() && ((str[i] >= '0' && str[i] <= '9') || str[i] == '.')) { if (str[i] == '.') { if (found_decimal) throw syntax_error(); found_decimal = true; } else { num = num*10 + str[i]-'0'; if (found_decimal) mult /= 10.0; } ++i; } if (i < str.size() && str[i] != ' ') throw syntax_error(); num *= mult; return i; } size_t read_color(const std::string &str, size_t i, int &color) { size_t j = skip_non_space(str, i); if (j-i == 1 && toupper(str[i]) == 'B') color = BLACK; else if (j-i == 1 && toupper(str[i]) == 'W') color = WHITE; else if (j-i == 5 && toupper(str[i]) == 'B' && toupper(str[i+1]) == 'L' && toupper(str[i+2]) == 'A' && toupper(str[i+3]) == 'C' && toupper(str[i+4]) == 'K') color = BLACK; else if (j-i == 5 && toupper(str[i]) == 'W' && toupper(str[i+1]) == 'H' && toupper(str[i+2]) == 'I' && toupper(str[i+3]) == 'T' && toupper(str[i+4]) == 'E') color = WHITE; else throw syntax_error(); return j; } void throw_command_error_if_end_of_line(const std::string &str, size_t i) { if (i == str.size()) throw command_error(); } void throw_syntax_error_if_end_of_line(const std::string &str, size_t i) { if (i == str.size()) throw syntax_error(); } void throw_if_extra_argument(const std::string &str, size_t i) { i = skip_space(str, i); if (i != str.size()) throw syntax_error(); } void output_response(const std::string &str, bool has_id, unsigned id) { gtstream bufstr; if (has_id) { if (str.size()) { gtout(bufstr, "=%$ %$") << id << str; output_line(bufstr.str()); } else { gtout(bufstr, "=%$") << id; output_line(bufstr.str()); } } else { if (str.size()) { gtout(bufstr, "= %$") << str; output_line(bufstr.str()); } else { output_line("="); } } } void output_error(const std::string &str, bool has_id, unsigned id) { gtstream bufstr; if (has_id) { gtout(bufstr, "?%$ %$") << id << str; output_line(bufstr.str()); } else { gtout(bufstr, "? %$") << str; output_line(bufstr.str()); } } bool process_unsigned_option(int argc, char *argv[], const std::string &arg, int &i, const std::string &short_name, const std::string &long_name, unsigned min, unsigned max, unsigned &val) { std::string long_name_eq = long_name; long_name_eq += '='; if (arg != short_name && arg != long_name && arg.compare(0, long_name_eq.size(), long_name_eq)) return false; std::string arg_name; std::string arg_val; if (!arg.compare(0, long_name_eq.size(), long_name_eq)) { arg_name = long_name; arg_val = arg.substr(long_name_eq.size()); if (!arg_val.size()) { gtstream bufstr; gtout(bufstr, _("missing argument for option `%$\'")) << arg_name; throw std::runtime_error(bufstr.str()); } } else { arg_name = arg; ++i; if (i == argc) { gtstream bufstr; gtout(bufstr, _("missing argument for option `%$\'")) << arg_name; throw std::runtime_error(bufstr.str()); } arg_val = argv[i]; } unsigned new_val; try { size_t j = read_unsigned(arg_val, 0, new_val); throw_if_extra_argument(arg_val, j); } catch (...) { gtstream bufstr; gtout(bufstr, _("invalid argument for option `%$\'")) << arg_name; throw std::runtime_error(bufstr.str()); } if (new_val < min || new_val > max) { gtstream bufstr; gtout(bufstr, _("invalid argument for option `%$\'")) << arg_name; throw std::runtime_error(bufstr.str()); } val = new_val; return true; } grhino-0.16.1/hash.cc0000644000175000017500000001115511436423224014561 0ustar lerdsuwalerdsuwa/* hash.cc Transposition Hash Table Copyright (c) 2000, 2001, 2002, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "hash.h" #include "iter.h" #include #include // Initialize hash_pos_table in readable form. // Computation efficient one will be calculated in trans_table_init(). // Assume at least 32-bit int. unsigned int hash_pos_table[64] = { 0, 1, 2, 3, 4, 5, 6, 15, 1, 7, 8, 9, 10, 11, 12, 6, 2, 8, 12, 13, 14, 7, 11, 5, 3, 9, 13, 15, 0, 14, 10, 4, 4, 10, 14, 0, 15, 13, 9, 3, 5, 11, 7, 14, 13, 12, 8, 2, 6, 12, 11, 10, 9, 8, 7, 1, 15, 6, 5, 4, 3, 2, 1, 0 }; trans_board *trans_used_table[NUM_MOVE][NUM_HASH]; trans_board *trans_tail_table[NUM_MOVE][NUM_HASH]; trans_board *trans_free_list; /* Initialize variables required for proper transposition table operations. */ void trans_table_init() { // Initialize computation efficient // version of hash_pos_table. for (int i = 0; i < 64; ++i) hash_pos_table[i] = 1 << hash_pos_table[i]; // Empty trans_used_table. for (int i = 0; i < NUM_MOVE; ++i) for (int j = 0; j < NUM_HASH; ++j) trans_used_table[i][j] = 0; // Allocate nodes for hash table. for (int i = 0; i < NUM_TRANS_BOARD; ++i) { trans_board *t = new trans_board; t->next = trans_free_list; trans_free_list = t; } } /* Compute hash from entire board. */ int get_hash(byte_board_info *board) { int hash = 0; board_iterator iter; iter.init_pos(); do { hash ^= get_hash_piece(board->board[iter.pos], iter.pos); } while (iter.next()); return hash; } /* Compute hash from entire board. */ #if 0 int get_hash(bit_byte_board_info * /*board*/) { throw 0; // Not implemented return 0; } #endif int max_hash_move = 50; int hash_hit = 0; int hash_miss = 0; void set_max_hash_move(int move) { max_hash_move = move; } void free_hash_move(int move) { for (int i = 0; i < NUM_HASH; ++i) { trans_board *front = trans_used_table[move][i]; if (front) { // Move entire list to free list trans_tail_table[move][i]->next = trans_free_list; trans_free_list = trans_used_table[move][i]; trans_used_table[move][i] = 0; } } } void free_hash_all_move() { for (int i = 0; i < NUM_MOVE; ++i) free_hash_move(i); } trans_board *get_hash_board(byte_board_info *board, int player) { int move = board->get_num_move(); if (move > max_hash_move) // It's wasteful to hash moves // that are too deep. Benefit // from tree pruning is small. return 0; int hash = board->hash; int hash_index = hash % (NUM_HASH-1); trans_board *t = trans_used_table[move][hash_index]; while (t) { if (t->board.hash == hash && !memcmp(t->board.board, board->board, sizeof(byte_board_type)) && (t->player == player)) { hash_hit++; return t; } t = t->next; } hash_miss++; t = get_temp_board(board); t->next = trans_used_table[move][hash_index]; // Empty list // Also record tail of list if (!trans_used_table[move][hash_index]) trans_tail_table[move][hash_index] = t; trans_used_table[move][hash_index] = t; t->score = INVALID_SCORE; t->player = player; return t; } trans_board *get_temp_board(byte_board_info *board) { while (!trans_free_list) { free_hash_move(max_hash_move); max_hash_move--; } trans_board *t = trans_free_list; trans_free_list = t->next; t->board = *board; return t; } #define NUM_HASH_COUNT 30 void get_hash_info(int move) { int count[NUM_HASH_COUNT]; for (int i = 0; i < NUM_HASH_COUNT; ++i) count[i] = 0; for (int i = 0; i < NUM_HASH; ++i) { trans_board *t = trans_used_table[move][i]; int cur_count = 0; while (t) { t = t->next; cur_count++; } if (cur_count >= NUM_HASH_COUNT) count[NUM_HASH_COUNT-1]++; else count[cur_count]++; } std::cout << '['; for (int i = 0; i < NUM_HASH_COUNT; ++i) std::cout << ' ' << count[i]; std::cout << " ]"; int sum = 0; for (int i = 0; i < NUM_HASH_COUNT; ++i) sum += count[i]; std::cout << ' ' << sum << "\n"; } grhino-0.16.1/hash.h0000644000175000017500000000371411436423224014425 0ustar lerdsuwalerdsuwa/* hash.h Transposition Hash Table Copyright (c) 2000, 2001, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef HASH_H #define HASH_H #include "board.h" #define NUM_TRANS_BOARD 100000 #define NUM_HASH (1024*16) struct trans_board { byte_board_info board; int score; int player; trans_board *next; }; extern unsigned int hash_pos_table[64]; /* Hash value for color at pos */ inline int get_hash_piece(int color, int pos) { switch (color) { case BLACK: return hash_pos_table[pos] + (hash_pos_table[pos] << 16); case WHITE: return hash_pos_table[pos] << 16; } /* case EMPTY */ return 0; } /* Hash value update when flipping piece at pos */ inline int get_hash_flip(int pos) { return hash_pos_table[pos]; } /* For hashing performance monitoring */ extern int hash_hit; extern int hash_miss; void trans_table_init(); int get_hash(byte_board_info *board); //int get_hash(bit_byte_board_info *board); trans_board *get_hash_board(byte_board_info *board, int player); trans_board *get_temp_board(byte_board_info *board); void set_max_hash_move(int move); inline void store_hash_board(trans_board *trans, int score) { if (trans) { trans->score = score; } } void free_hash_move(int move); void free_hash_all_move(); void get_hash_info(int move); #endif /* HASH_H */ grhino-0.16.1/proginfo.h0000644000175000017500000000170211436423225015321 0ustar lerdsuwalerdsuwa/* proginfo.h Program Information Copyright (c) 2002 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef PROGINFO_H #define PROGINFO_H extern const char *prog_name; extern const char *prog_ver; void use_private_files(bool b); bool get_use_private_files(); #endif grhino-0.16.1/ABOUT-NLS0000644000175000017500000023334011436423223014557 0ustar lerdsuwalerdsuwa1 Notes on the Free Translation Project *************************************** Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that free software will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work on translations can contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. 1.1 Quick configuration advice ============================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 1.2 INSTALL Matters =================== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the included GNU `gettext' library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will, respectively, bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might not be desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages usually have many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. 1.3 Using This Package ====================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your language by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. 1.4 Translating Teams ===================== For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skills are praised more than programming skills, here. 1.5 Available Packages ====================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of October 2006. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs cy da de el en en_GB eo +----------------------------------------------------+ GNUnet | [] | a2ps | [] [] [] [] [] | aegis | () | ant-phone | () | anubis | [] | ap-utils | | aspell | [] [] [] [] [] | bash | [] [] [] | batchelor | [] | bfd | | bibshelf | [] | binutils | [] | bison | [] [] | bison-runtime | | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | [] [] | coreutils | [] [] [] | cpio | | cpplib | [] [] [] | cryptonit | [] | darkstat | [] () [] | dialog | [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] () [] | fileutils | [] [] | findutils | [] [] [] | flex | [] [] [] | fslint | [] | gas | | gawk | [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] [] [] | gip | [] | gliv | [] | glunarclock | [] | gmult | [] [] | gnubiff | () | gnucash | () () [] | gnucash-glossary | [] () | gnuedu | | gnulib | [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | | gpe-edit | [] | gpe-filemanager | | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-package | | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | () () | gramadoir | [] [] | grep | [] [] [] [] [] [] | gretl | | gsasl | | gss | | gst-plugins | [] [] [] [] | gst-plugins-base | [] [] [] | gst-plugins-good | [] [] [] [] [] [] [] | gstreamer | [] [] [] [] [] [] [] | gtick | () | gtkam | [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] | id-utils | [] [] | impost | | indent | [] [] [] | iso_3166 | [] [] | iso_3166_2 | | iso_4217 | [] | iso_639 | [] [] | jpilot | [] | jtag | | jwhois | | kbd | [] [] [] [] | keytouch | | keytouch-editor | | keytouch-keyboa... | | latrine | () | ld | [] | leafpad | [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] | libgpg-error | [] | libgphoto2 | [] [] | libgphoto2_port | [] [] | libgsasl | | libiconv | [] [] | libidn | [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] | make | [] [] | man-db | [] () [] [] | minicom | [] [] [] | mysecretdiary | [] [] | nano | [] [] [] | nano_1_0 | [] () [] [] | opcodes | [] | parted | | pilot-qof | [] | psmisc | [] | pwdutils | | python | | qof | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] [] | sed | [] [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] [] | sharutils | [] [] [] [] [] [] | shishi | | silky | | skencil | [] () | sketch | [] () | solfege | | soundtracker | [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] | texinfo | [] [] [] | textutils | [] [] [] | tin | () () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] | xchat | [] [] [] [] [] [] | xkeyboard-config | | xpad | [] [] | +----------------------------------------------------+ af am ar az be bg bs ca cs cy da de el en en_GB eo 10 0 1 2 9 22 1 42 41 2 60 95 16 1 17 16 es et eu fa fi fr ga gl gu he hi hr hu id is it +--------------------------------------------------+ GNUnet | | a2ps | [] [] [] () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] [] | aspell | [] [] [] | bash | [] [] [] | batchelor | [] [] | bfd | [] | bibshelf | [] [] [] | binutils | [] [] [] | bison | [] [] [] [] [] [] | bison-runtime | [] [] [] [] [] | bluez-pin | [] [] [] [] [] | cflow | [] | clisp | [] [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] | cpplib | [] [] | cryptonit | [] | darkstat | [] () [] [] [] | dialog | [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] | error | [] [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] [] | findutils | [] [] [] [] | flex | [] [] [] | fslint | [] | gas | [] [] | gawk | [] [] [] [] | gbiff | [] | gcal | [] [] | gcc | [] | gettext-examples | [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] | gip | [] [] [] | gliv | () | glunarclock | [] [] [] | gmult | [] [] [] | gnubiff | () () | gnucash | () () () | gnucash-glossary | [] [] | gnuedu | [] | gnulib | [] [] [] [] [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] [] | gpe-beam | [] [] | gpe-calendar | | gpe-clock | [] [] [] [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] [] [] | gpe-filemanager | [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] [] [] [] | gpe-package | [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] [] | gpsdrive | () () [] () | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] [] [] [] [] | gretl | [] [] [] | gsasl | [] [] | gss | [] | gst-plugins | [] [] [] | gst-plugins-base | [] [] | gst-plugins-good | [] [] [] | gstreamer | [] [] [] | gtick | [] | gtkam | [] [] [] [] | gtkorphan | [] [] | gtkspell | [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] [] | impost | [] [] | indent | [] [] [] [] [] [] [] [] [] [] | iso_3166 | [] [] [] | iso_3166_2 | [] | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] [] | jpilot | [] [] | jtag | [] | jwhois | [] [] [] [] [] | kbd | [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] [] | ld | [] [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] | libgpewidget | [] [] [] [] [] | libgpg-error | | libgphoto2 | [] [] [] | libgphoto2_port | [] [] | libgsasl | [] [] | libiconv | [] [] | libidn | [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] [] | lynx | [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] [] [] [] [] [] | man-db | () | minicom | [] [] [] [] | mysecretdiary | [] [] [] | nano | [] [] [] [] [] [] | nano_1_0 | [] [] [] [] [] | opcodes | [] [] [] [] | parted | [] [] [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | [] | radius | [] [] | recode | [] [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] | sed | [] [] [] [] [] | sh-utils | [] [] [] [] [] [] [] | shared-mime-info | [] [] [] [] [] [] | sharutils | [] [] [] [] [] [] [] [] | shishi | | silky | [] | skencil | [] [] | sketch | [] [] | solfege | [] | soundtracker | [] [] [] | sp | [] | stardict | [] | system-tools-ba... | [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] [] [] | texinfo | [] [] | textutils | [] [] [] [] [] | tin | [] () | tp-robot | [] [] [] [] | tuxpaint | [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] [] [] [] | vorbis-tools | [] [] | wastesedge | () | wdiff | [] [] [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] [] [] [] [] [] | xkeyboard-config | [] [] [] [] | xpad | [] [] [] | +--------------------------------------------------+ es et eu fa fi fr ga gl gu he hi hr hu id is it 88 22 14 2 40 115 61 14 1 8 1 6 59 31 0 52 ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no +-------------------------------------------------+ GNUnet | | a2ps | () [] [] () | aegis | () | ant-phone | [] | anubis | [] [] [] | ap-utils | [] | aspell | [] [] | bash | [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | | bison | [] [] [] | bison-runtime | [] [] [] | bluez-pin | [] [] [] | cflow | | clisp | [] | console-tools | | coreutils | [] | cpio | | cpplib | [] | cryptonit | [] | darkstat | [] [] | dialog | [] [] | diffutils | [] [] [] | doodle | | e2fsprogs | [] | enscript | [] | error | [] | fetchmail | [] [] | fileutils | [] [] | findutils | [] | flex | [] [] | fslint | [] [] | gas | | gawk | [] [] | gbiff | [] | gcal | | gcc | | gettext-examples | [] [] | gettext-runtime | [] [] [] | gettext-tools | [] [] | gimp-print | [] [] | gip | [] [] | gliv | [] | glunarclock | [] [] | gmult | [] [] | gnubiff | | gnucash | () () | gnucash-glossary | [] | gnuedu | | gnulib | [] [] [] [] | gnunet-gtk | | gnutls | | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] | gpe-clock | [] [] [] | gpe-conf | [] [] | gpe-contacts | [] | gpe-edit | [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] | gpe-ownerinfo | [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] | gphoto2 | [] [] | gprof | | gpsdrive | () () () | gramadoir | () | grep | [] [] [] [] | gretl | | gsasl | [] | gss | | gst-plugins | [] | gst-plugins-base | | gst-plugins-good | [] | gstreamer | [] | gtick | | gtkam | [] | gtkorphan | [] | gtkspell | [] [] | gutenprint | | hello | [] [] [] [] [] [] | id-utils | [] | impost | | indent | [] [] | iso_3166 | [] | iso_3166_2 | [] | iso_4217 | [] [] [] | iso_639 | [] [] | jpilot | () () () | jtag | | jwhois | [] | kbd | [] | keytouch | [] | keytouch-editor | | keytouch-keyboa... | | latrine | [] | ld | | leafpad | [] [] | libc | [] [] [] [] [] | libexif | | libextractor | | libgpewidget | [] | libgpg-error | | libgphoto2 | [] | libgphoto2_port | [] | libgsasl | [] | libiconv | | libidn | [] [] | lifelines | [] | lilypond | | lingoteach | [] | lynx | [] [] | m4 | [] [] | mailutils | | make | [] [] [] | man-db | () | minicom | [] | mysecretdiary | [] | nano | [] [] [] | nano_1_0 | [] [] [] | opcodes | [] | parted | [] [] | pilot-qof | | psmisc | [] [] [] | pwdutils | | python | | qof | | radius | | recode | [] | rpm | [] [] | screem | [] | scrollkeeper | [] [] [] [] | sed | [] [] | sh-utils | [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] | shishi | | silky | [] | skencil | | sketch | | solfege | | soundtracker | | sp | () | stardict | [] [] | system-tools-ba... | [] [] [] [] | tar | [] [] [] | texinfo | [] [] [] | textutils | [] [] [] | tin | | tp-robot | [] | tuxpaint | [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] | vorbis-tools | [] | wastesedge | [] | wdiff | [] [] | wget | [] [] | xchat | [] [] [] [] | xkeyboard-config | [] | xpad | [] [] [] | +-------------------------------------------------+ ja ko ku ky lg lt lv mk mn ms mt nb ne nl nn no 52 24 2 2 1 3 0 2 3 21 0 15 1 97 5 1 nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta +------------------------------------------------------+ GNUnet | | a2ps | () [] [] [] [] [] [] | aegis | () () | ant-phone | [] [] | anubis | [] [] [] | ap-utils | () | aspell | [] [] | bash | [] [] [] | batchelor | [] [] | bfd | | bibshelf | [] | binutils | [] [] | bison | [] [] [] [] [] | bison-runtime | [] [] [] [] | bluez-pin | [] [] [] [] [] [] [] [] [] | cflow | [] | clisp | [] | console-tools | [] | coreutils | [] [] [] [] | cpio | [] [] [] | cpplib | [] | cryptonit | [] [] | darkstat | [] [] [] [] [] [] | dialog | [] [] [] [] [] [] [] [] [] | diffutils | [] [] [] [] [] [] | doodle | [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] [] | error | [] [] [] [] | fetchmail | [] [] [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] [] | fslint | [] [] [] [] | gas | | gawk | [] [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext-examples | [] [] [] [] [] [] [] [] | gettext-runtime | [] [] [] [] [] [] [] [] | gettext-tools | [] [] [] [] [] [] [] | gimp-print | [] [] | gip | [] [] [] [] | gliv | [] [] [] [] | glunarclock | [] [] [] [] [] [] | gmult | [] [] [] [] | gnubiff | () | gnucash | () [] | gnucash-glossary | [] [] [] | gnuedu | | gnulib | [] [] [] [] [] | gnunet-gtk | [] | gnutls | [] [] | gpe-aerial | [] [] [] [] [] [] [] | gpe-beam | [] [] [] [] [] [] [] | gpe-calendar | [] | gpe-clock | [] [] [] [] [] [] [] [] | gpe-conf | [] [] [] [] [] [] [] | gpe-contacts | [] [] [] [] [] | gpe-edit | [] [] [] [] [] [] [] [] | gpe-filemanager | [] [] | gpe-go | [] [] [] [] [] [] | gpe-login | [] [] [] [] [] [] [] [] | gpe-ownerinfo | [] [] [] [] [] [] [] [] | gpe-package | [] [] | gpe-sketchbook | [] [] [] [] [] [] [] [] | gpe-su | [] [] [] [] [] [] [] [] | gpe-taskmanager | [] [] [] [] [] [] [] [] | gpe-timesheet | [] [] [] [] [] [] [] [] | gpe-today | [] [] [] [] [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] [] [] [] [] | gprof | [] [] [] | gpsdrive | [] [] [] | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] | gretl | [] | gsasl | [] [] [] | gss | [] [] [] | gst-plugins | [] [] [] [] | gst-plugins-base | [] | gst-plugins-good | [] [] [] [] | gstreamer | [] [] [] | gtick | [] | gtkam | [] [] [] [] | gtkorphan | [] | gtkspell | [] [] [] [] [] [] [] [] | gutenprint | [] | hello | [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] | impost | [] | indent | [] [] [] [] [] [] | iso_3166 | [] [] [] [] [] [] | iso_3166_2 | | iso_4217 | [] [] [] [] | iso_639 | [] [] [] [] | jpilot | | jtag | [] | jwhois | [] [] [] [] | kbd | [] [] [] | keytouch | [] | keytouch-editor | [] | keytouch-keyboa... | [] | latrine | [] [] | ld | [] | leafpad | [] [] [] [] [] [] | libc | [] [] [] [] [] | libexif | [] | libextractor | [] [] | libgpewidget | [] [] [] [] [] [] [] | libgpg-error | [] [] | libgphoto2 | [] | libgphoto2_port | [] [] [] | libgsasl | [] [] [] [] | libiconv | [] [] | libidn | [] [] () | lifelines | [] [] | lilypond | | lingoteach | [] | lynx | [] [] [] | m4 | [] [] [] [] [] | mailutils | [] [] [] [] | make | [] [] [] [] | man-db | [] [] | minicom | [] [] [] [] [] | mysecretdiary | [] [] [] [] | nano | [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] | parted | [] | pilot-qof | [] | psmisc | [] [] | pwdutils | [] [] | python | | qof | [] [] | radius | [] [] | recode | [] [] [] [] [] [] [] | rpm | [] [] [] [] | screem | | scrollkeeper | [] [] [] [] [] [] [] | sed | [] [] [] [] [] [] [] [] [] | sh-utils | [] [] [] | shared-mime-info | [] [] [] [] [] | sharutils | [] [] [] [] | shishi | [] | silky | [] | skencil | [] [] [] | sketch | [] [] [] | solfege | [] | soundtracker | [] [] | sp | | stardict | [] [] [] | system-tools-ba... | [] [] [] [] [] [] [] [] [] | tar | [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] | tin | () | tp-robot | [] | tuxpaint | [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] | vorbis-tools | [] [] | wastesedge | | wdiff | [] [] [] [] [] [] | wget | [] [] [] [] | xchat | [] [] [] [] [] [] [] | xkeyboard-config | [] [] | xpad | [] [] [] | +------------------------------------------------------+ nso or pa pl pt pt_BR rm ro ru rw sk sl sq sr sv ta 0 2 3 58 30 54 5 73 72 4 40 46 11 50 128 2 tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu +---------------------------------------------------+ GNUnet | [] | 2 a2ps | [] [] [] | 19 aegis | | 0 ant-phone | [] [] | 6 anubis | [] [] [] | 11 ap-utils | () [] | 4 aspell | [] [] [] | 15 bash | [] | 11 batchelor | [] [] | 9 bfd | | 1 bibshelf | [] | 7 binutils | [] [] [] | 9 bison | [] [] [] | 19 bison-runtime | [] [] [] | 15 bluez-pin | [] [] [] [] [] [] | 28 cflow | [] [] | 5 clisp | | 6 console-tools | [] [] | 5 coreutils | [] [] | 16 cpio | [] [] [] | 9 cpplib | [] [] [] [] | 11 cryptonit | | 5 darkstat | [] () () | 15 dialog | [] [] [] [] [] | 30 diffutils | [] [] [] [] | 28 doodle | [] | 6 e2fsprogs | [] [] | 10 enscript | [] [] [] | 16 error | [] [] [] [] | 18 fetchmail | [] [] | 12 fileutils | [] [] [] | 18 findutils | [] [] [] | 17 flex | [] [] | 15 fslint | [] | 9 gas | [] | 3 gawk | [] [] | 15 gbiff | [] | 5 gcal | [] | 5 gcc | [] [] [] | 6 gettext-examples | [] [] [] [] [] [] | 27 gettext-runtime | [] [] [] [] [] [] | 28 gettext-tools | [] [] [] [] [] | 19 gimp-print | [] [] | 12 gip | [] [] | 12 gliv | [] [] | 8 glunarclock | [] [] [] | 15 gmult | [] [] [] [] | 15 gnubiff | [] | 1 gnucash | () | 2 gnucash-glossary | [] [] | 9 gnuedu | [] | 2 gnulib | [] [] [] [] [] | 28 gnunet-gtk | | 1 gnutls | | 2 gpe-aerial | [] [] | 14 gpe-beam | [] [] | 14 gpe-calendar | [] | 3 gpe-clock | [] [] [] [] | 21 gpe-conf | [] [] | 14 gpe-contacts | [] [] | 10 gpe-edit | [] [] [] [] | 20 gpe-filemanager | [] | 6 gpe-go | [] [] | 15 gpe-login | [] [] [] [] [] | 21 gpe-ownerinfo | [] [] [] [] | 21 gpe-package | [] | 6 gpe-sketchbook | [] [] | 16 gpe-su | [] [] [] | 20 gpe-taskmanager | [] [] [] | 20 gpe-timesheet | [] [] [] [] | 18 gpe-today | [] [] [] [] [] | 21 gpe-todo | [] | 7 gphoto2 | [] [] [] [] | 20 gprof | [] [] | 11 gpsdrive | | 4 gramadoir | [] | 7 grep | [] [] [] [] | 34 gretl | | 4 gsasl | [] [] | 8 gss | [] | 5 gst-plugins | [] [] [] | 15 gst-plugins-base | [] [] [] | 9 gst-plugins-good | [] [] [] [] [] | 20 gstreamer | [] [] [] | 17 gtick | [] | 3 gtkam | [] | 13 gtkorphan | [] | 7 gtkspell | [] [] [] [] [] [] | 26 gutenprint | | 3 hello | [] [] [] [] [] | 37 id-utils | [] [] | 14 impost | [] | 4 indent | [] [] [] [] | 25 iso_3166 | [] [] [] [] | 16 iso_3166_2 | | 2 iso_4217 | [] [] | 14 iso_639 | [] | 14 jpilot | [] [] [] [] | 7 jtag | [] | 3 jwhois | [] [] [] | 13 kbd | [] [] | 12 keytouch | [] | 4 keytouch-editor | | 2 keytouch-keyboa... | [] | 3 latrine | [] [] | 8 ld | [] [] [] [] | 8 leafpad | [] [] [] [] | 23 libc | [] [] [] | 23 libexif | [] | 4 libextractor | [] | 5 libgpewidget | [] [] [] | 19 libgpg-error | [] | 4 libgphoto2 | [] | 8 libgphoto2_port | [] [] [] | 11 libgsasl | [] | 8 libiconv | [] | 7 libidn | [] [] | 10 lifelines | | 4 lilypond | | 2 lingoteach | [] | 6 lynx | [] [] [] | 15 m4 | [] [] [] | 18 mailutils | [] | 8 make | [] [] [] | 20 man-db | [] | 6 minicom | [] | 14 mysecretdiary | [] [] | 12 nano | [] [] | 17 nano_1_0 | [] [] [] | 18 opcodes | [] [] | 10 parted | [] [] [] | 10 pilot-qof | [] | 3 psmisc | [] | 10 pwdutils | [] | 3 python | | 0 qof | [] | 4 radius | [] | 6 recode | [] [] [] | 25 rpm | [] [] [] [] | 14 screem | [] | 2 scrollkeeper | [] [] [] [] | 26 sed | [] [] [] | 22 sh-utils | [] | 15 shared-mime-info | [] [] [] [] | 24 sharutils | [] [] [] | 23 shishi | | 1 silky | [] | 4 skencil | [] | 7 sketch | | 6 solfege | | 2 soundtracker | [] [] | 9 sp | [] | 3 stardict | [] [] [] [] | 11 system-tools-ba... | [] [] [] [] [] [] [] | 37 tar | [] [] [] [] | 20 texinfo | [] [] [] | 15 textutils | [] [] [] | 17 tin | | 1 tp-robot | [] [] [] | 10 tuxpaint | [] [] [] | 16 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] [] | 20 vorbis-tools | [] [] | 11 wastesedge | | 1 wdiff | [] [] | 22 wget | [] [] [] | 19 xchat | [] [] [] [] | 29 xkeyboard-config | [] [] [] [] | 11 xpad | [] [] [] | 14 +---------------------------------------------------+ 77 teams tg th tk tr uk ven vi wa xh zh_CN zh_HK zh_TW zu 170 domains 0 1 1 77 39 0 136 10 1 48 5 54 0 2028 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If October 2006 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. 1.6 Using `gettext' in new packages =================================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. grhino-0.16.1/aclocal.m40000644000175000017500000000353411436423224015171 0ustar lerdsuwalerdsuwa# generated automatically by aclocal 1.10 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) m4_include([acinclude.m4/cxxac.m4]) m4_include([acinclude.m4/gettext.m4]) m4_include([acinclude.m4/iconv.m4]) m4_include([acinclude.m4/lib-ld.m4]) m4_include([acinclude.m4/lib-link.m4]) m4_include([acinclude.m4/lib-prefix.m4]) m4_include([acinclude.m4/nls.m4]) m4_include([acinclude.m4/po.m4]) m4_include([acinclude.m4/progtest.m4]) grhino-0.16.1/NEWS0000644000175000017500000002016211436423224014024 0ustar lerdsuwalerdsuwaChanges in version 0.16.1 from 0.16.0 ------------------------------------- - Fix compilation error with newer GCC versions. - Backport changes from Debian by Vincent Legout, Martin Michlmayr. - Fix bad interaction between edit board and preference dialog box. - Fix bad interaction between edit board and toolbar. - Fix midgame search when the game finishes without filling the board. Changes in version 0.16.0 from 0.15.2 ------------------------------------- - Add Edit board feature. - Fix game log bug that prevents GRhino to open its own game log. - Fix help file installation issue. Report and patch from Michel Salim. - Add desktop icon. Patch from Michel Salim. - Add grhino.desktop (not installed automatically yet). Patch from Michel Salim. - Update to Autoconf 2.60, gettext 0.16. This should fixes gettext detection failure in configure script. Changes in version 0.15.2 from 0.15.1 ------------------------------------- - Regenerate Makefile.in. Report and patch from Ernani Azevedo. Changes in version 0.15.1 from 0.15.0 ------------------------------------- - GTP frontend command grhino-setup_board can begin game with black or white as first move. - New GTP command grhino-show_history. - Fix problem with random board when the first player must pass. - Merge in small changes from Fedora Extras 5 and NetBSD ports. Changes in version 0.15.0 from 0.14.0 ------------------------------------- - Change default AI level to 2. - Fix incorrect score in game logging. - Fix compilation error (Reported by Paul Pogonyshev). - Add Alternate and Random AI color mode in Preference dialog box. - Add new setting 'Show last move' in Preference dialog box. - Fix gen_pattern bug that fails to close pattern file. - Generate pattern and book from more GGS games. - Add random game support in GTP frontend. - Add driver to play two GTP against each other via 'aiai' executable. It is still not user friendly. You must modify 'cmd_black' and 'cmd_white' in the source code and build via 'make aiai' to try different AI parameters. Use 'aiai --help' to list all command line options. - Reduce race condition modifying game log. - Avoid wipe out during AI midgame evaluation. Changes in version 0.14.0 from 0.13.0 ------------------------------------- - Add experimental GTP frontend. This allows future AI tuning and game server support. It is tested with Quarry. Only 8x8 and no time limit games are supported. Use 'gtp-rhino --help' to list all command line options. - New configure options --enable-gnome (enabled by default) and --enable-gtp (also enabled by default). Changes in version 0.13.0 from 0.12.0 ------------------------------------- - Add game open function. - Transposition table is temporarily disabled as it seems to cause problem with AI calculation. - Improve program startup speed. - i18n fixes in various places. - Size of open book file is reduced. - Fix computer thread cancellation problem. - Change log file format to GGS. This supports random game logging. - Fix problem restarting game when board opening preference is changed. - Fix Game History window selection when window is opened during view mode. - Fix AI pattern data bug when data is processed from GGS games. Changes in version 0.12.0 from 0.11.0 ------------------------------------- - Fix AI level bug caused by i18n enabling. - Online help added. - Random game added. - Position of Main window, Pattern Evaluation and Game History windows are remembered. Windows are opened automatically based on the previous run. - Fix several problems in parity evaluator. - Fix game searching problem. Hashing across move is disabled. This slows down winning move and end game searching but gets correct result. - Fix problems with pattern score and open book generation. - Black AI first move is no longer fixed to C4. Changes in version 0.11.0 from 0.10.0 ------------------------------------- - Game History window added. - Forward/backward through game added. This is similar to undo/redo but does not affect existing board moves. - Don't allow opening more than one Pattern Evaluation window. - Preferences dialog box is no longer modal. So game can be played even when this dialog box is opened. - Switch computer color menu is inactive when computer or human plays both colors. - Add missing text domain binding for i18n. - Add en_GB locale messages. Changes in version 0.10.0 from 0.9.0 ------------------------------------ - GNOME 2 is now required. - Enable i18n. - Toolbar added. - GUI code reorganization. - Undo/redo menus become active/inactive according to current game state. - Customizing game graphics is supported. - Reorganize undo/redo mechanism. Changes in version 0.9.0 from 0.8.3 ----------------------------------- - Supports GNOME 2. - Fix bug where game may use wrong color when game is started from certain openings. - Fix delay problem when animate opening is off. - Add delay in Preferences to slow down animation. Changes in version 0.8.3 from 0.8.2 ----------------------------------- - Add missing mutex initialization. Changes in version 0.8.2 from 0.8.1 ----------------------------------- - Fix compilation failure. Changes in version 0.8.1 from 0.8.0 ----------------------------------- - Reduce open book file size. - Slightly improved AI speed. - Reorganize exception handling code. Changes in version 0.8.0 from 0.7.1 ----------------------------------- - Add experimental parity evaluator. Changes in version 0.7.1 from 0.7.0 ----------------------------------- - Install pattern data in datadir (usually /usr/share) instead of libdir (usually /usr/lib). - Add Preferences dialog box help. - Tweak pattern data for board symmetry. Pattern data files are now smaller. - Code cleanup. Changes in version 0.7.0 from 0.6.0 ----------------------------------- - Fix i18n message installation problem. - Fix gen_pattern segfault. - Fix pattern generation bug. - Improve edge, corner, and diagonal pattern data. - Add Pattern Evaluation menu (for AI development purpose). Changes in version 0.6.0 from 0.5.3 ----------------------------------- - Store configuration in file. - Fix open book variation bug. - Change open book variation scale in Preferences dialog box. - Fix opening selection display in Preferences dialog box. - Update to autoconf 2.53. - Add gettext 0.11.3 support. Changes in version 0.5.3 from 0.5.2 ----------------------------------- - Fix missing include bug. (Reported by Domenico Notarangelo) Changes in version 0.5.2 from 0.5.1 ----------------------------------- - Fix book move bug when an opening is specified. Changes in version 0.5.1 from 0.5.0 ----------------------------------- - Fix AI level setting bug in Preference dialog box. Changes in version 0.5.0 from 0.4.0 ----------------------------------- - Add AI open book with open book variation. - Add pattern from GGS games. - Store log file in user home directory. - Various bug fixes. - Update to autodep 1.1.5. Changes in version 0.4.0 from 0.3.1 ----------------------------------- - Support GCC 3.1. Changes in version 0.3.1 from 0.3.0 ----------------------------------- - Improved evaluator. Changes in version 0.3.0 from 0.2.0 ----------------------------------- - Support GCC 3.0. - Can display animation of opening moves. - Experimental pattern-based evaluator. - New log file format. - Fix game log bug. - "make install" implemented. - New computer level: 5. Changes in version 0.2.0 from 0.1.0 ----------------------------------- - Custom level where AI parameters can be arbitrary chosen. - Add randomness in board evaluation. - Undo and redo menu items moved to Edit menu. - Can display possible moves. - Can log game history to grhino.log in the current directory when the game ends. - Can start the game from any opening in Robert Gatliff's list. - Fix undo bug when the first player is AI. - Fix some thread problem. Changes in version 0.1.0 from 0.0.0 ----------------------------------- - Undo and Redo menu items fully implemented. - Preferences menu partially implemented. You can choose the color and the level computer plays. - Add status bar. - The program behaves better while the AI is working. Version 0.0.0 ------------- - First version. grhino-0.16.1/iter.h0000644000175000017500000001367311436423225014453 0ustar lerdsuwalerdsuwa/* iter.h Iterators Copyright (c) 2000, 2001, 2003, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef ITER_H #define ITER_H #include "board.h" #include "order.h" // A linked-list containing empty positions struct empty_endgame_entry { int pos; empty_endgame_entry* next; }; // Empty positions information during alpha-beta searching struct empty_endgame_info { int empty_endgame_size; empty_endgame_entry *empty_endgame_head; empty_endgame_entry empty_endgame_order[NUM_MOVE]; }; // Initialize empty_endgame_info from current board void init_endgame_iterator(byte_board_info *board, empty_endgame_info &info); // Directions #define DIR_N 0 #define DIR_NE 1 #define DIR_E 2 #define DIR_SE 3 #define DIR_S 4 #define DIR_SW 5 #define DIR_W 6 #define DIR_NW 7 /************************************************************************* Iterate positions from top-left to bottom-right *************************************************************************/ struct board_iterator { int pos; void init_pos(int pos_ = 0) { pos = pos_; } bool next() { pos++; if (pos == 64) return false; return true; } }; /************************************************************************* Iterate positions for mid-game searching *************************************************************************/ /************************************************************************* Iterate positions for end-game searching *************************************************************************/ struct board_full_endgame_iterator { int pos; int pos_real; void init_pos(int pos_ = 0) { pos_real = pos_; pos = endgame_order[pos_real]; } bool next() { pos_real++; // Only NUM_MOVE (60) since we exclude // center squares here if (pos_real == NUM_MOVE) return false; pos = endgame_order[pos_real]; return true; } }; /************************************************************************* Iterate positions for end-game searching *************************************************************************/ struct board_endgame_iterator { int pos; empty_endgame_info &info; empty_endgame_entry* pos_real; empty_endgame_entry* pos_prev; typedef empty_endgame_entry* save_type; board_endgame_iterator(empty_endgame_info &info_) : info(info_) { } void init_pos() { pos_real = info.empty_endgame_head; pos_prev = 0; // Don't check if pos_real == 0 here pos = pos_real->pos; } bool next() { if (pos_real && pos_real->next) { pos_prev = pos_real; pos_real = pos_real->next; pos = pos_real->pos; return true; } return false; } void remove_current() { if (pos_prev) pos_prev->next = pos_real->next; else info.empty_endgame_head = pos_real->next; } void restore_current() { if (pos_prev) pos_prev->next = pos_real; else info.empty_endgame_head = pos_real; } }; /************************************************************************* Iterate positions in any of eight directions *************************************************************************/ struct board_dir_iterator { int x; int y; int pos; void init_xy(int x_ = 0, int y_ = 0) { x = x_; y = y_; pos = xy_to_pos(x_, y_); } void init_pos(int pos_ = 0) { x = pos_to_x(pos_); y = pos_to_y(pos_); pos = pos_; } bool next_N() { if (y == 0) return false; y--; pos -= 8; return true; } bool next_NE() { if (x == 7 || y == 0) return false; x++; y--; pos -= 7; return true; } bool next_E() { if (x == 7) return false; x++; pos++; return true; } bool next_SE() { if (x == 7 || y == 7) return false; x++; y++; pos += 9; return true; } bool next_S() { if (y == 7) return false; y++; pos += 8; return true; } bool next_SW() { if (x == 0 || y == 7) return false; x--; y++; pos += 7; return true; } bool next_W() { if (x == 0) return false; x--; pos--; return true; } bool next_NW() { if (x == 0 || y == 0) return false; y--; x--; pos -= 9; return true; } bool next_dir(int dir) { switch (dir) { case DIR_N: return next_N(); case DIR_NE: return next_NE(); case DIR_E: return next_E(); case DIR_SE: return next_SE(); case DIR_S: return next_S(); case DIR_SW: return next_SW(); case DIR_W: return next_W(); case DIR_NW: return next_NW(); default: return false; } } void next_N_nocheck() { y--; pos -= 8; } void next_NE_nocheck() { x++; y--; pos -= 7; } void next_E_nocheck() { x++; pos++; } void next_SE_nocheck() { x++; y++; pos += 9; } void next_S_nocheck() { y++; pos += 8; } void next_SW_nocheck() { x--; y++; pos += 7; } void next_W_nocheck() { x--; pos--; } void next_NW_nocheck() { y--; x--; pos -= 9; } void next_dir_nocheck(int dir) { switch (dir) { case DIR_N: next_N_nocheck(); return; case DIR_NE: next_NE_nocheck(); return; case DIR_E: next_E_nocheck(); return; case DIR_SE: next_SE_nocheck(); return; case DIR_S: next_S_nocheck(); return; case DIR_SW: next_SW_nocheck(); return; case DIR_W: next_W_nocheck(); return; case DIR_NW: next_NW_nocheck(); return; } } }; #endif /* ITER_H */ grhino-0.16.1/randboard.h0000644000175000017500000000163611436423225015440 0ustar lerdsuwalerdsuwa/* randboard.h Random board generator Copyright (c) 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef RANDBOARD_H #define RANDBOARD_H #include "board.h" void random_board(byte_board_info *, int); #endif /* RANDBOARD_H */ grhino-0.16.1/black_last.xpm0000644000175000017500000000427511436423224016161 0ustar lerdsuwalerdsuwa/* XPM */ static char * black_last_xpm[] = { "40 40 28 1", " c None", ". c #000000", "+ c #3FDD18", "@ c #37C315", "# c #22780D", "$ c #113E06", "% c #061602", "& c #000200", "* c #39C915", "= c #195909", "- c #2B9810", "; c #051201", "> c #27890E", ", c #2D9F11", "' c #3DD617", ") c #081D03", "! c #1E690B", "~ c #3CD517", "{ c #020901", "] c #278A0F", "^ c #080808", "/ c #2E2E2E", "( c #164E08", "_ c #AAAAAA", ": c #0A2303", "< c #585858", "[ c #BCBCBC", "} c #C6C6C6", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++*=..........=*++++++++++++.", ".+++++++++++-;............;-+++++++++++.", ".++++++++++>................>++++++++++.", ".+++++++++,..................,+++++++++.", ".++++++++')..................)'++++++++.", ".++++++++!....................!++++++++.", ".+++++++~{....................{~+++++++.", ".+++++++].........^//^.........]+++++++.", ".+++++++(........./__/.........(+++++++.", ".+++++++:.......^/<[[................>++++++++++.", ".+++++++++++-;............;-+++++++++++.", ".++++++++++++*=..........=*++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/top.xcf0000644000175000017500000000427111436423225014635 0ustar lerdsuwalerdsuwagimp xcf filehBB/ gimp-commentCreated with The GIMPabh New Layer#2     Fhf=IUhgq;U989888Uq7U76U5U488MqU 8U88Uqq UUU ƪUU8UUU UUq8]q87865q5U5U5U5q566q8E q %%q%%%U8WqU888q88q$qq8U8Uƪ8qq   8q#U#U#U!!#U#U#U#U#8q Z-h New Layer     h/>JVhS*5 20/-,,,,,5 20/-,,,,,5 20/-,,,,,????    Z-h Background      h)hMYeq}   Z-grhino-0.16.1/theme/0000755000175000017500000000000011436423225014427 5ustar lerdsuwalerdsuwagrhino-0.16.1/theme/small/0000755000175000017500000000000011436423225015537 5ustar lerdsuwalerdsuwagrhino-0.16.1/theme/small/highlight_black.xpm0000644000175000017500000000166311436423225021376 0ustar lerdsuwalerdsuwa/* XPM */ static char * highlight_black_xpm[] = { "20 20 27 1", " c None", ". c #0A2104", "+ c #134307", "@ c #26860F", "# c #26830E", "$ c #164D09", "% c #081C03", "& c #010400", "* c #237A0D", "= c #071A02", "- c #000000", "; c #26850F", "> c #081D03", ", c #185309", "' c #092104", ") c #020701", "! c #000100", "~ c #051102", "{ c #0F3706", "] c #21730C", "^ c #010401", "/ c #164E09", "( c #1A5A0A", "_ c #040D01", ": c #25820E", "< c #1B5F0A", "[ c #144707", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@#$%&&%$#@@@@@+", "+@@@@*=------=*@@@@+", "+@@@;>-------->;@@@+", "+@@@,----------,@@@+", "+@@@'----------'@@@+", "+@@@)----------)@@@+", "+@@@!----------!@@@+", "+@@@~----------~@@@+", "+@@@{----------{@@@+", "+@@@]^--------^]@@@+", "+@@@@/--------/@@@@+", "+@@@@@(_----_(@@@@@+", "+@@@@@@:<[[<:@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/theme/small/bottom.xpm0000644000175000017500000000372311436423225017576 0ustar lerdsuwalerdsuwa/* XPM */ static char * bottom_xpm[] = { "185 10 4 1", " c None", ". c #C3C3C3", "+ c #929292", "@ c #626262", "..............+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+.........", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", "........................................................................................................................................................................................."}; grhino-0.16.1/theme/small/black_last.xpm0000644000175000017500000000171411436423225020367 0ustar lerdsuwalerdsuwa/* XPM */ static char * black_last_xpm[] = { "20 20 29 1", " c None", ". c #103706", "+ c #206E0C", "@ c #3FDD18", "# c #3ED817", "$ c #247E0E", "% c #0D2E05", "& c #020600", "* c #39C816", "= c #0C2A04", "- c #000000", "; c #3EDB18", "> c #0D2F05", ", c #27890F", "' c #0F3606", ") c #444444", "! c #030B01", "~ c #A6A6A6", "{ c #000200", "] c #081C03", "^ c #195A0A", "/ c #36BE14", "( c #020701", "_ c #25810E", ": c #2A9410", "< c #061602", "[ c #3DD617", "} c #2C9C11", "| c #21740C", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@#$%&&%$#@@@@@+", "+@@@@*=------=*@@@@+", "+@@@;>-------->;@@@+", "+@@@,----------,@@@+", "+@@@'----))----'@@@+", "+@@@!---)~~)---!@@@+", "+@@@{---)~~)---{@@@+", "+@@@]----))----]@@@+", "+@@@^----------^@@@+", "+@@@/(--------(/@@@+", "+@@@@_--------_@@@@+", "+@@@@@:<----<:@@@@@+", "+@@@@@@[}||}[@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/theme/small/highlight_empty.xpm0000644000175000017500000000113111436423225021446 0ustar lerdsuwalerdsuwa/* XPM */ static char * highlight_empty_xpm[] = { "20 20 4 1", " c None", ". c #0A2104", "+ c #134307", "@ c #26860F", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/theme/small/left.xpm0000644000175000017500000000631011436423225017217 0ustar lerdsuwalerdsuwa/* XPM */ static char * left_xpm[] = { "15 160 12 1", " c None", ". c #C3C3C3", "+ c #626262", "@ c #6D6D6D", "# c #AEAEAE", "$ c #828282", "% c #161616", "& c #414141", "* c #2C2C2C", "= c #989898", "- c #000000", "; c #575757", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", ".......@@.....+", ".....#$%&.....+", ".....#$*&.....+", ".......&&.....+", ".......&&.....+", ".......&&.....+", ".......&&.....+", ".......@@.....+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "......@&=.....+", ".....*&@%=....+", ".....-$.$&....+", ".......#&@....+", ".......%*.....+", ".....$%@#.....+", ".....-@.......+", ".....&&&&@....+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "......@&=.....+", ".....*&@%#....+", ".....-$.&$....+", "......#@*#....+", "......#$*$....+", ".....$#.$&....+", ".....*;=%@....+", ".....=;&;#....+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", ".......=&.....+", ".......*-.....+", "......=*-.....+", ".....#&@-.....+", ".....&@$-.....+", ".....-**-@....+", ".......$-.....+", ".......=&.....+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", ".....@&&&=....+", ".....&*$$#....+", ".....&&.......+", ".....&%*%#....+", "........@;....+", ".....$#.$&....+", ".....-;=%@....+", ".....=;&;.....+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "......=&@.....+", ".....;%$&@....+", ".....-$.#=....+", ".....-&&@.....+", ".....-*#*$....+", ".....-$.$&....+", ".....&%=%$....+", ".....#;&;.....+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", ".....&&&&@....+", ".....$$$*;....+", ".......$-.....+", ".......*;.....+", "......=*#.....+", "......;;......+", ".....=%$......+", ".....=&.......+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+", "......=&=.....+", ".....@%@%#....+", ".....&&.&$....+", ".....$*@*#....+", ".....;*$*=....+", ".....-$.$&....+", ".....*;.;@....+", ".....=;&;#....+", "..............+", "..............+", "..............+", "..............+", "..............+", "..............+"}; grhino-0.16.1/theme/small/empty.xpm0000644000175000017500000000111711436423225017423 0ustar lerdsuwalerdsuwa/* XPM */ static char * empty_xpm[] = { "20 20 4 1", " c None", ". c #103706", "+ c #206E0C", "@ c #3FDD18", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/theme/small/right.xpm0000644000175000017500000000444111436423225017405 0ustar lerdsuwalerdsuwa/* XPM */ static char * right_xpm[] = { "10 160 3 1", " c None", ". c #626262", "+ c #C3C3C3", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++", ".+++++++++"}; grhino-0.16.1/theme/small/hint_black.xpm0000644000175000017500000000114311436423225020362 0ustar lerdsuwalerdsuwa/* XPM */ static char * hint_black_xpm[] = { "20 20 5 1", " c None", ". c #103706", "+ c #206E0C", "@ c #3FDD18", "# c #22780C", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@##@@@@@@@@+", "+@@@@@@@@##@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/theme/small/hint_white.xpm0000644000175000017500000000114311436423225020426 0ustar lerdsuwalerdsuwa/* XPM */ static char * hint_white_xpm[] = { "20 20 5 1", " c None", ". c #103706", "+ c #206E0C", "@ c #3FDD18", "# c #93EA7D", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@##@@@@@@@@+", "+@@@@@@@@##@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/theme/small/white.xpm0000644000175000017500000000165111436423225017410 0ustar lerdsuwalerdsuwa/* XPM */ static char * white_xpm[] = { "20 20 27 1", " c None", ". c #103706", "+ c #206E0C", "@ c #3FDD18", "# c #43DE1D", "$ c #91EC7B", "% c #D7F8CF", "& c #F9FEF8", "* c #51E02E", "= c #DAF8D2", "- c #FFFFFF", "; c #40DD1A", "> c #D6F8CE", ", c #87EA6F", "' c #D0F6C6", ") c #F5FDF3", "! c #FDFEFC", "~ c #E6FAE1", "{ c #B0F1A0", "] c #59E138", "^ c #F8FEF7", "/ c #8EEB77", "( c #7EE863", "_ c #ECFCE8", ": c #44DE1F", "< c #77E75C", "[ c #99ED85", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@#$%&&%$#@@@@@+", "+@@@@*=------=*@@@@+", "+@@@;>-------->;@@@+", "+@@@,----------,@@@+", "+@@@'----------'@@@+", "+@@@)----------)@@@+", "+@@@!----------!@@@+", "+@@@~----------~@@@+", "+@@@{----------{@@@+", "+@@@]^--------^]@@@+", "+@@@@/--------/@@@@+", "+@@@@@(_----_(@@@@@+", "+@@@@@@:<[[<:@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/theme/small/highlight_white.xpm0000644000175000017500000000166311436423225021442 0ustar lerdsuwalerdsuwa/* XPM */ static char * highlight_white_xpm[] = { "20 20 27 1", " c None", ". c #0A2104", "+ c #134307", "@ c #26860F", "# c #298712", "$ c #588F4B", "% c #83977E", "& c #979A97", "* c #31881C", "= c #859780", "- c #9B9B9B", "; c #278610", "> c #82977D", ", c #528E43", "' c #7E9678", ") c #959A94", "! c #9A9A99", "~ c #8C9889", "{ c #6B9261", "] c #368922", "^ c #979A96", "/ c #568F48", "( c #4D8D3C", "_ c #8F998D", ": c #298713", "< c #488C38", "[ c #5D9051", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@#$%&&%$#@@@@@+", "+@@@@*=------=*@@@@+", "+@@@;>-------->;@@@+", "+@@@,----------,@@@+", "+@@@'----------'@@@+", "+@@@)----------)@@@+", "+@@@!----------!@@@+", "+@@@~----------~@@@+", "+@@@{----------{@@@+", "+@@@]^--------^]@@@+", "+@@@@/--------/@@@@+", "+@@@@@(_----_(@@@@@+", "+@@@@@@:<[[<:@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/theme/small/white_last.xpm0000644000175000017500000000171411436423225020433 0ustar lerdsuwalerdsuwa/* XPM */ static char * white_last_xpm[] = { "20 20 29 1", " c None", ". c #103706", "+ c #206E0C", "@ c #3FDD18", "# c #43DE1D", "$ c #91EC7B", "% c #D7F8CF", "& c #F9FEF8", "* c #51E02E", "= c #DAF8D2", "- c #FFFFFF", "; c #40DD1A", "> c #D6F8CE", ", c #87EA6F", "' c #D0F6C6", ") c #BBBBBB", "! c #F5FDF3", "~ c #585858", "{ c #FDFEFC", "] c #E6FAE1", "^ c #B0F1A0", "/ c #59E138", "( c #F8FEF7", "_ c #8EEB77", ": c #7EE863", "< c #ECFCE8", "[ c #44DE1F", "} c #77E75C", "| c #99ED85", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@#$%&&%$#@@@@@+", "+@@@@*=------=*@@@@+", "+@@@;>-------->;@@@+", "+@@@,----------,@@@+", "+@@@'----))----'@@@+", "+@@@!---)~~)---!@@@+", "+@@@{---)~~)---{@@@+", "+@@@]----))----]@@@+", "+@@@^----------^@@@+", "+@@@/(--------(/@@@+", "+@@@@_--------_@@@@+", "+@@@@@:<----<:@@@@@+", "+@@@@@@[}||}[@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/theme/small/top.xpm0000644000175000017500000000603011436423225017066 0ustar lerdsuwalerdsuwa/* XPM */ static char * top_xpm[] = { "185 15 14 1", " c None", ". c #C3C3C3", "+ c #828282", "@ c #000000", "# c #414141", "$ c #6D6D6D", "% c #2C2C2C", "& c #161616", "* c #989898", "= c #AEAEAE", "- c #575757", "; c #929292", "> c #626262", ", c #717171", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", "........................+@+................#@@@@$...............%@@&*.............+@@@@%..............+@@@@#...............#@@@@+..............*&@@%.............+@...+#.................", "........................%%#................##..+&..............%#*=$&.............+@..*#-.............+@...................##.................*&$=*#-............+@...+#.................", "........................@+@+...............##...@.............+@=.................+@...=@+............+@...................##.................#%.................+@...+#.................", ".......................+#.##...............#&##&-.............+@..................+@....@+............+@###*...............#&###..............##..+++=...........+@###%#.................", ".......................#+.+@...............##...%*............+@..................+@....@+............+@...................##.................##..++@+...........+@...+#.................", "......................*&###&*..............##...#+............*@*...#.............+@...*&*............+@...................##.................-&...=@+...........+@...+#.................", "......................-%...$-..............##..#@=.............-&$*%%.............+@..$&$.............+@...................##.................=%%*$&@+...........+@...+#.................", "......................$$...*$..............$####*...............$##-=.............*####$..............*#####...............$$..................=-##+-*...........*#...*$.................", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", ".........................................................................................................................................................................................", "..............;>>>>>>>,>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;........."}; grhino-0.16.1/theme/small/black.xpm0000644000175000017500000000165111436423225017344 0ustar lerdsuwalerdsuwa/* XPM */ static char * black_xpm[] = { "20 20 27 1", " c None", ". c #103706", "+ c #206E0C", "@ c #3FDD18", "# c #3ED817", "$ c #247E0E", "% c #0D2E05", "& c #020600", "* c #39C816", "= c #0C2A04", "- c #000000", "; c #3EDB18", "> c #0D2F05", ", c #27890F", "' c #0F3606", ") c #030B01", "! c #000200", "~ c #081C03", "{ c #195A0A", "] c #36BE14", "^ c #020701", "/ c #25810E", "( c #2A9410", "_ c #061602", ": c #3DD617", "< c #2C9C11", "[ c #21740C", ".++++++++++++++++++.", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@#$%&&%$#@@@@@+", "+@@@@*=------=*@@@@+", "+@@@;>-------->;@@@+", "+@@@,----------,@@@+", "+@@@'----------'@@@+", "+@@@)----------)@@@+", "+@@@!----------!@@@+", "+@@@~----------~@@@+", "+@@@{----------{@@@+", "+@@@]^--------^]@@@+", "+@@@@/--------/@@@@+", "+@@@@@(_----_(@@@@@+", "+@@@@@@:<[[<:@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", "+@@@@@@@@@@@@@@@@@@+", ".++++++++++++++++++."}; grhino-0.16.1/highlight_empty.xpm0000644000175000017500000000351211436423225017241 0ustar lerdsuwalerdsuwa/* XPM */ static char * highlight_empty_xpm[] = { "40 40 3 1", " c None", ". c #000000", "+ c #26860F", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/left.xpm0000644000175000017500000001733111436423225015012 0ustar lerdsuwalerdsuwa/* XPM */ static char * left_xpm[] = { "20 320 11 1", " c None", ". c #C3C3C3", "+ c #000000", "@ c #575757", "# c #828282", "$ c #414141", "% c #6D6D6D", "& c #161616", "* c #989898", "= c #2C2C2C", "- c #AEAEAE", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "..........@+.......+", "........#$++.......+", "........++++.......+", "..........$+.......+", "..........$+.......+", "..........$+.......+", "..........$+.......+", "..........$+.......+", "..........$+.......+", "..........%$.......+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", ".........###.......+", "........&++++*.....+", ".......%+&#$+=.....+", ".......$+%..++.....+", ".......*#..*+&.....+", "..........-$+@.....+", ".........*&+@......+", "........#+&%.......+", ".......*++*........+", ".......$++++++.....+", ".......%$$$$$$.....+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", ".........###.......+", "........&++++*.....+", ".......%+@#@+@.....+", ".......$+...+$.....+", "..........#$+#.....+", "..........++=-.....+", "...........%+&.....+", ".......%$...++.....+", ".......$+*.#+&.....+", "........&++++#.....+", "........*$$$#......+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "..........-##......+", "..........@++......+", ".........-+++......+", ".........+@$+......+", "........%+-$+......+", "........&@.$+......+", ".......$=..$+......+", ".......$++++++.....+", ".......%$$$&+$.....+", "...........$+......+", "...........%$......+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "........*####-.....+", "........$++++#.....+", "........==###-.....+", "........+$.........+", "........+&++$-.....+", "........+&$&+%.....+", "...........#+$.....+", ".......*#..-+$.....+", ".......$+*.%+@.....+", "........&+++=-.....+", "........*$$@-......+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", ".........-##.......+", "........@++++*.....+", "........&&#%+$.....+", ".......$+..........+", ".......$+%++$-.....+", ".......$++$&+%.....+", ".......$+*.-+$.....+", ".......$+...+$.....+", ".......%+=.%+@.....+", "........$+++=-.....+", "........-%$@-......+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", ".......*######.....+", ".......$++++++.....+", ".......*###%+=.....+", "...........%+*.....+", "..........%+@......+", "..........=+-......+", ".........*+$.......+", ".........@+%.......+", ".........++#.......+", "........#+$........+", "........*$%........+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", ".........###.......+", "........&++++*.....+", ".......%+@.#+@.....+", ".......$+...+$.....+", ".......*&&#$+#.....+", "........=++++-.....+", ".......&+*.-+&.....+", ".......+$...$+.....+", ".......&+#.*+&.....+", ".......*&++++*.....+", "........*$$$#......+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+", "...................+"}; grhino-0.16.1/gtstream.cc0000644000175000017500000000424711436423224015470 0ustar lerdsuwalerdsuwa/* gtstream.cc C++ Stream Supporting gettext Usage Copyright (c) 2000, 2001, 2002, 2004, 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "gtstream.h" gtout::gtout(std::ostream &os_, const std::string &fmt) : os(os_), format(fmt), need_flush(false) { } gtout::gtout(std::ostream &os_, const char *fmt) : os(os_), format(fmt), need_flush(false) { } void gtout::finish() { size_t cur_idx = 0; size_t size = format.size(); for (size_t i = 0; i < size; ++i) { if (format[i] == '%' && i != size-1) { switch (format[i+1]) { case '%': // Found "%%" os << '%'; ++i; // Skip the first '%' break; case '$': // Found "%$" if (cur_idx < str_vec.size()) { os << str_vec[cur_idx]; str_flag[cur_idx] = true; } ++cur_idx; ++i; // Skip the first '%' break; default: // Should be in the form "%n$" { size_t idx = 0; for (++i ; i < size && format[i] >= '0' && format[i] <= '9'; ++i) { idx = idx * 10 + format[i] - '0'; } if (i < size && format[i] == '$') { if (idx-1 < str_vec.size()) { os << str_vec[idx-1]; str_flag[idx-1] = true; } ++cur_idx; } else { // Error if (need_flush) os.flush(); return; } } } } else { os << format[i]; } } // size = str_vec.size(); // Print remaining strings // for (size_t i = 0; i < size; ++i) { // if (! str_flag[i]) // os << str_vec[i]; // } if (need_flush) os.flush(); } grhino-0.16.1/gpref.cc0000644000175000017500000006355011436423224014747 0ustar lerdsuwalerdsuwa/* gpref.cc GRhino Gnome Frontend Preferences Dialog Box Copyright (c) 2004, 2005, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* #define GNOME_DISABLE_DEPRECATED #define GTK_DISABLE_DEPRECATED */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "board.h" #include "hash.h" #include "alphabeta.h" #include "opening.h" #include "pattern.h" #include "parity.h" #include "book.h" #include "game.h" #include "gpref.h" #include "gutil.h" #include "gtstream.h" /************************************************************************* Configurations - GNOME specific *************************************************************************/ int toolbar_icon_size; GtkIconSize toolbar_icon_map[NUM_TOOLBAR_ICON_SIZE] = { GTK_ICON_SIZE_SMALL_TOOLBAR, GTK_ICON_SIZE_LARGE_TOOLBAR }; const char *toolbar_icon_name[NUM_TOOLBAR_ICON_SIZE] = { N_("Small"), N_("Large") }; /************************************************************************* Preferences dialog box signals *************************************************************************/ GtkWidget *combo_player; GtkWidget *combo_level; GtkWidget *spin_depth; GtkWidget *spin_winlossdraw; GtkWidget *spin_exact; GtkWidget *spin_randomness; GtkWidget *combo_opening_var; GtkWidget *check_hint_move; GtkWidget *check_show_last_move; GtkWidget *check_show_border; GtkWidget *check_log_move; GtkWidget *check_redo_ai_move; GtkWidget *combo_start_mode; GtkWidget *combo_opening; GtkWidget *spin_start_pieces; GtkWidget *combo_theme; GtkWidget *combo_toolbar_icon_size; GtkWidget *check_animate_opening; GtkWidget *spin_animate_delay; void update_menu_and_toolbar_pref(); void preferences_closed(GtkWidget *widget, GtkWidget **data) { gtk_widget_destroy(widget); *data = NULL; } void preferences_apply(GnomePropertyBox * /*propertybox*/, gint page, gpointer /*data*/) { if (page >= 0) return; // Prevent running AI thread twice cancel_input(); bool need_draw_board = false; bool need_load_theme = false; bool need_new_game = false; std::string entry = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_player)->entry)); for (int i = 0; i < NUM_GAME_MODE; ++i) { if (entry == _(game_mode_name[i])) { game_mode_type new_mode = static_cast(i); if (new_mode != get_game_mode()) { maybe_set_ai_tampered(); set_game_mode(new_mode); } break; } } entry = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_level)->entry)); for (int i = 0; i < NUM_LEVEL_INFO+1; ++i) { if (entry == _(level_name[i])) { computer_level = i; break; } } int midgame_depth; int num_empty_winlossdraw; int num_empty_exact; if (computer_level == LEVEL_CUSTOM) { midgame_depth = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_depth)); num_empty_winlossdraw = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_winlossdraw)); num_empty_exact = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_exact)); } else { midgame_depth = level_info[computer_level].midgame_depth; num_empty_winlossdraw = level_info[computer_level].num_empty_winlossdraw; num_empty_exact = level_info[computer_level].num_empty_exact; } int randomness = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_randomness)); entry = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_opening_var)->entry)); for (int i = 0; i < NUM_OPENING_VAR; ++i) { if (entry == _(opening_var_name[i])) { if (opening_var != i) maybe_set_ai_tampered(); opening_var = i; break; } } set_book_random(opening_var); // Flush hashed data if necessary if (current_level_info.midgame_depth != midgame_depth || current_level_info.num_empty_winlossdraw != num_empty_winlossdraw || current_level_info.num_empty_exact != num_empty_exact || randomness != get_eval_random()) { free_hash_all_move(); maybe_set_ai_tampered(); } // Change parameters current_level_info.midgame_depth = midgame_depth; current_level_info.num_empty_winlossdraw = num_empty_winlossdraw; current_level_info.num_empty_exact = num_empty_exact; set_eval_random(randomness); log_move = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_log_move)); redo_ai_move = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_redo_ai_move)); bool old_animate_opening = animate_opening; animate_opening = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_animate_opening)); animate_delay = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_animate_delay)); entry = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_start_mode)->entry)); for (int i = 0; i < NUM_START_GAME_MODE; ++i) { if (entry == _(start_game_mode_name[i])) { start_game_mode = static_cast(i); break; } } start_random_game_pieces = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin_start_pieces)); entry = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_opening)->entry)); if (entry != _(opening_name.c_str()) || old_animate_opening != animate_opening) { for (int i = 0; i < get_num_opening(); ++i) { if (entry == _(get_opening_name(i))) { opening_name = get_opening_name(i); get_opening_move_sequence(i, opening_move_queue); break; } } if (view_mode == VIEW_MODE_NONE) { need_draw_board = true; // Check if all moves are AI's int i = cur_game_info.num_history; // Skip AI's turns while (i > cur_game_info.min_num_history && is_computer_player(cur_game_info.player_history[i-2])) i--; if (i == cur_game_info.min_num_history) need_new_game = true; } } // Add/remove hints if necessary bool old_hint_move = hint_move; hint_move = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_hint_move)); if (hint_move != old_hint_move) { need_load_theme = true; need_draw_board = true; } // Add/remove hints if necessary bool old_show_last_move = show_last_move; show_last_move = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_show_last_move)); if (show_last_move != old_show_last_move) { need_load_theme = true; need_draw_board = true; } // Add/remove border if necessary bool old_show_border = show_border; show_border = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_show_border)); if (show_border != old_show_border) { need_load_theme = true; need_draw_board = true; } std::string old_theme_name = theme_name; entry = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_theme)->entry)); if (entry == _("DEFAULT")) entry = ""; if (theme_name != entry) { theme_name = entry; need_load_theme = true; need_draw_board = true; } entry = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_toolbar_icon_size)->entry)); for (int i = 0; i < NUM_TOOLBAR_ICON_SIZE; ++i) { if (entry == _(toolbar_icon_name[i])) { if (toolbar_icon_size != i) { need_load_theme = true; toolbar_icon_size = i; } break; } } if (need_load_theme) { try { if (theme_name.size()) load_pixmaps(false); else load_pixmaps(true); } catch (std::exception &e) { gtstream bufstr; gtout(bufstr, _("Theme problem: %$. Revert to previous theme settings.")) << e.what(); error_message_box(bufstr); // Restore old options show_border = old_show_border; theme_name = old_theme_name; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_show_border), show_border); if (theme_name.size()) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_theme)->entry), theme_name.c_str()); else gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_theme)->entry), _("DEFAULT")); // Reload old theme if (theme_name.size()) load_pixmaps(false); else load_pixmaps(true); } resize_board_widget(); } if (view_mode) { if (need_draw_board) draw_board(); update_menu_and_toolbar_pref(); } else if (need_new_game) { new_game(); // This must come after need_load_theme // so that dimensions are properly computed update_menu_and_toolbar_pref(); } else { if (need_draw_board) draw_board(); update_move.update(UPDATE_NONE); // In case computer player // is switched // This must come after need_load_theme // so that dimensions are properly computed update_menu_and_toolbar_pref(); // FIXME: Update clock here // Need to start running clock if (cur_game_info.is_game_play()) { if (get_wait_player()) human_move(); else computer_move(); } } } void preferences_set_depth() { int level = 0; std::string entry = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo_level)->entry)); for (int i = 0; i < NUM_LEVEL_INFO+1; ++i) { if (entry == _(level_name[i])) { level = i; break; } } if (level != LEVEL_CUSTOM) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_depth), level_info[level].midgame_depth); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_winlossdraw), level_info[level].num_empty_winlossdraw); gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin_exact), level_info[level].num_empty_exact); gtk_widget_set_sensitive(spin_depth, FALSE); gtk_widget_set_sensitive(spin_winlossdraw, FALSE); gtk_widget_set_sensitive(spin_exact, FALSE); } else { gtk_widget_set_sensitive(spin_depth, TRUE); gtk_widget_set_sensitive(spin_winlossdraw, TRUE); gtk_widget_set_sensitive(spin_exact, TRUE); } } void preferences_help(GnomePropertyBox * /*propertybox*/, gint page, gpointer /*data*/) { if (page == 0) gnome_help_display("grhino.xml", "grhino-prefs-ai", 0); else if (page == 1) gnome_help_display("grhino.xml", "grhino-prefs-board", 0); else gnome_help_display("grhino.xml", "grhino-prefs-theme", 0); } void preferences_changed(GtkEditable * /*editable*/, gpointer data) { gnome_property_box_changed(GNOME_PROPERTY_BOX(data)); } void preferences_level_changed(GtkEditable * /*editable*/, gpointer data) { preferences_set_depth(); gnome_property_box_changed(GNOME_PROPERTY_BOX(data)); } /************************************************************************* Preferences dialog box *************************************************************************/ void preferences() { static GtkWidget *propertybox = NULL; if (propertybox) { gtk_window_present(GTK_WINDOW(propertybox)); return; } propertybox = gnome_property_box_new(); gtk_window_set_title(GTK_WINDOW(propertybox), _("Preferences")); // // Setup first page // GtkWidget *vbox = gtk_vbox_new(TRUE, 5); gtk_widget_show(vbox); GtkWidget *page_label = gtk_label_new(_("AI")); gtk_widget_show(page_label); GtkWidget *hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); GtkWidget *label = gtk_label_new(_("Computer player")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); GList *options = NULL; for (int i = 0; i < NUM_GAME_MODE; ++i) options = g_list_append(options, const_cast(_(game_mode_name[i]))); combo_player = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO(combo_player), options); gtk_combo_set_value_in_list(GTK_COMBO(combo_player), TRUE, FALSE); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_player)->entry), get_game_mode_string()); gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo_player)->entry), FALSE); g_signal_connect(G_OBJECT(GTK_COMBO(combo_player)->entry), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(combo_player); gtk_box_pack_start(GTK_BOX(hbox), combo_player, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Computer level")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); options = NULL; for (int i = 0; i < NUM_LEVEL_INFO+1; ++i) options = g_list_append(options, const_cast(_(level_name[i]))); combo_level = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO(combo_level), options); gtk_combo_set_value_in_list(GTK_COMBO(combo_level), TRUE, FALSE); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_level)->entry), _(level_name[computer_level])); gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo_level)->entry), FALSE); g_signal_connect(G_OBJECT(GTK_COMBO(combo_level)->entry), "changed", G_CALLBACK(preferences_level_changed), propertybox); gtk_widget_show(combo_level); gtk_box_pack_start(GTK_BOX(hbox), combo_level, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Mid game search depth")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); GtkAdjustment * adj_depth = GTK_ADJUSTMENT(gtk_adjustment_new( current_level_info.midgame_depth, 1.0, 20.0, 1.0, 1.0, 1.0)); spin_depth = gtk_spin_button_new(adj_depth, 1.0, 0); gtk_entry_set_editable(GTK_ENTRY(spin_depth), FALSE); g_signal_connect(G_OBJECT(spin_depth), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(spin_depth); gtk_box_pack_start(GTK_BOX(hbox), spin_depth, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Winning move search empties")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); adj_depth = GTK_ADJUSTMENT(gtk_adjustment_new( current_level_info.num_empty_winlossdraw, 1.0, 20.0, 1.0, 1.0, 1.0)); spin_winlossdraw = gtk_spin_button_new(adj_depth, 1.0, 0); gtk_entry_set_editable(GTK_ENTRY(spin_winlossdraw), FALSE); g_signal_connect(G_OBJECT(spin_winlossdraw), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(spin_winlossdraw); gtk_box_pack_start(GTK_BOX(hbox), spin_winlossdraw, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Perfect end game search empties")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); adj_depth = GTK_ADJUSTMENT(gtk_adjustment_new( current_level_info.num_empty_exact, 1.0, 20.0, 1.0, 1.0, 1.0)); spin_exact = gtk_spin_button_new(adj_depth, 1.0, 0); gtk_entry_set_editable(GTK_ENTRY(spin_exact), FALSE); g_signal_connect(G_OBJECT(spin_exact), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(spin_exact); gtk_box_pack_start(GTK_BOX(hbox), spin_exact, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Randomness")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); adj_depth = GTK_ADJUSTMENT(gtk_adjustment_new( get_eval_random(), 0.0, 10.0, 1.0, 1.0, 1.0)); spin_randomness = gtk_spin_button_new(adj_depth, 1.0, 0); gtk_entry_set_editable(GTK_ENTRY(spin_randomness), FALSE); g_signal_connect(G_OBJECT(spin_randomness), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(spin_randomness); gtk_box_pack_start(GTK_BOX(hbox), spin_randomness, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Open book variation")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); options = NULL; for (int i = 0; i < NUM_OPENING_VAR; ++i) options = g_list_append(options, const_cast(_(opening_var_name[i]))); combo_opening_var = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO(combo_opening_var), options); gtk_combo_set_value_in_list(GTK_COMBO(combo_opening_var), TRUE, FALSE); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_opening_var)->entry), _(opening_var_name[opening_var])); gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo_opening_var)->entry), FALSE); g_signal_connect(G_OBJECT(GTK_COMBO(combo_opening_var)->entry), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(combo_opening_var); gtk_box_pack_start(GTK_BOX(hbox), combo_opening_var, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); gnome_property_box_append_page(GNOME_PROPERTY_BOX(propertybox), vbox, page_label); // // Setup second page // vbox = gtk_vbox_new(TRUE, 5); gtk_widget_show(vbox); page_label = gtk_label_new(_("Board")); gtk_widget_show(page_label); check_log_move = gtk_check_button_new_with_label(_("Log game moves")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_log_move), log_move); g_signal_connect(G_OBJECT(check_log_move), "toggled", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(check_log_move); gtk_box_pack_start(GTK_BOX(vbox), check_log_move, TRUE, TRUE, 2); check_redo_ai_move = gtk_check_button_new_with_label(_("Redo also repeat same AI moves")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_redo_ai_move), redo_ai_move); g_signal_connect(G_OBJECT(check_redo_ai_move), "toggled", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(check_redo_ai_move); gtk_box_pack_start(GTK_BOX(vbox), check_redo_ai_move, TRUE, TRUE, 2); check_animate_opening = gtk_check_button_new_with_label(_("Animate opening")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_animate_opening), animate_opening); g_signal_connect(G_OBJECT(check_animate_opening), "toggled", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(check_animate_opening); gtk_box_pack_start(GTK_BOX(vbox), check_animate_opening, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Animation delay")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); adj_depth = GTK_ADJUSTMENT(gtk_adjustment_new( animate_delay, 1.0, NUM_ANIMATE_DELAY, 1.0, 1.0, 1.0)); spin_animate_delay = gtk_spin_button_new(adj_depth, 1.0, 0); gtk_entry_set_editable(GTK_ENTRY(spin_animate_delay), FALSE); g_signal_connect(G_OBJECT(spin_animate_delay), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(spin_animate_delay); gtk_box_pack_start(GTK_BOX(hbox), spin_animate_delay, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Start game from")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); options = NULL; for (int i = 0; i < NUM_START_GAME_MODE; ++i) options = g_list_append(options, const_cast(_(start_game_mode_name[i]))); combo_start_mode = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO(combo_start_mode), options); gtk_combo_set_value_in_list(GTK_COMBO(combo_start_mode), TRUE, FALSE); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_start_mode)->entry), _(start_game_mode_name[start_game_mode])); gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo_start_mode)->entry), FALSE); g_signal_connect(G_OBJECT(GTK_COMBO(combo_start_mode)->entry), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(combo_start_mode); gtk_box_pack_start(GTK_BOX(hbox), combo_start_mode, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(FALSE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Opening")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); options = NULL; for (int i = 0; i < get_num_opening(); ++i) options = g_list_append(options, const_cast(_(get_opening_name(i)))); combo_opening = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO(combo_opening), options); gtk_combo_set_value_in_list(GTK_COMBO(combo_opening), TRUE, FALSE); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_opening)->entry), opening_name.c_str()); gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo_opening)->entry), FALSE); g_signal_connect(G_OBJECT(GTK_COMBO(combo_opening)->entry), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(combo_opening); gtk_box_pack_start(GTK_BOX(hbox), combo_opening, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Random game pieces")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); adj_depth = GTK_ADJUSTMENT(gtk_adjustment_new( start_random_game_pieces, 4.0, 32.0, 2.0, 2.0, 2.0)); spin_start_pieces = gtk_spin_button_new(adj_depth, 1.0, 0); gtk_entry_set_editable(GTK_ENTRY(spin_start_pieces), FALSE); g_signal_connect(G_OBJECT(spin_start_pieces), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(spin_start_pieces); gtk_box_pack_start(GTK_BOX(hbox), spin_start_pieces, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); gnome_property_box_append_page(GNOME_PROPERTY_BOX(propertybox), vbox, page_label); // // Setup third page // vbox = gtk_vbox_new(TRUE, 5); gtk_widget_show(vbox); page_label = gtk_label_new(_("Theme")); gtk_widget_show(page_label); check_hint_move = gtk_check_button_new_with_label(_("Show possible moves")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_hint_move), hint_move); g_signal_connect(G_OBJECT(check_hint_move), "toggled", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(check_hint_move); gtk_box_pack_start(GTK_BOX(vbox), check_hint_move, TRUE, TRUE, 2); check_show_last_move = gtk_check_button_new_with_label(_("Show last move")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_show_last_move), show_last_move); g_signal_connect(G_OBJECT(check_show_last_move), "toggled", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(check_show_last_move); gtk_box_pack_start(GTK_BOX(vbox), check_show_last_move, TRUE, TRUE, 2); check_show_border = gtk_check_button_new_with_label(_("Show board border")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_show_border), show_border); g_signal_connect(G_OBJECT(check_show_border), "toggled", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(check_show_border); gtk_box_pack_start(GTK_BOX(vbox), check_show_border, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Theme directory")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); options = NULL; options = g_list_append(options, const_cast(_("DEFAULT"))); DIR *dir = opendir(THEMEDIR); if (dir) { struct dirent *dir_entry; while ((dir_entry = readdir(dir)) != NULL) { // Skip . and .. if (strcmp(dir_entry->d_name, ".") != 0 && strcmp(dir_entry->d_name, "..") != 0) { std::string pathname = THEMEDIR; pathname.append(dir_entry->d_name); struct stat buf; if (stat(pathname.c_str(), &buf) == 0 && S_ISDIR(buf.st_mode)) { // Allocate new buffer to permanently // store option options = g_list_append(options, g_strdup(dir_entry->d_name)); } } } closedir(dir); } combo_theme = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO(combo_theme), options); gtk_combo_set_value_in_list(GTK_COMBO(combo_theme), TRUE, FALSE); if (theme_name.size()) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_theme)->entry), theme_name.c_str()); else gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_theme)->entry), _("DEFAULT")); gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo_theme)->entry), FALSE); g_signal_connect(G_OBJECT(GTK_COMBO(combo_theme)->entry), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(combo_theme); gtk_box_pack_start(GTK_BOX(hbox), combo_theme, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); hbox = gtk_hbox_new(TRUE, 5); gtk_widget_show(hbox); label = gtk_label_new(_("Toolbar icon size")); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 2); options = NULL; for (int i = 0; i < NUM_TOOLBAR_ICON_SIZE; i++) options = g_list_append(options, const_cast(_(toolbar_icon_name[i]))); combo_toolbar_icon_size = gtk_combo_new(); gtk_combo_set_popdown_strings(GTK_COMBO(combo_toolbar_icon_size), options); gtk_combo_set_value_in_list(GTK_COMBO(combo_toolbar_icon_size), TRUE, FALSE); gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo_toolbar_icon_size)->entry), _(toolbar_icon_name[toolbar_icon_size])); gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(combo_toolbar_icon_size)->entry), FALSE); g_signal_connect(G_OBJECT(GTK_COMBO(combo_toolbar_icon_size)->entry), "changed", G_CALLBACK(preferences_changed), propertybox); gtk_widget_show(combo_toolbar_icon_size); gtk_box_pack_start(GTK_BOX(hbox), combo_toolbar_icon_size, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 2); gnome_property_box_append_page(GNOME_PROPERTY_BOX(propertybox), vbox, page_label); // // Done with all pages // preferences_set_depth(); g_signal_connect(G_OBJECT(propertybox), "apply", G_CALLBACK(preferences_apply), NULL); g_signal_connect(G_OBJECT(propertybox), "help", G_CALLBACK(preferences_help), NULL); g_signal_connect(G_OBJECT(propertybox), "destroy", G_CALLBACK(preferences_closed), &propertybox); gtk_widget_show(propertybox); } grhino-0.16.1/gameinfo.cc0000644000175000017500000001224111436423224015420 0ustar lerdsuwalerdsuwa/* gameinfo.cc Game States Copyright (c) 2004, 2005, 2006 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include "gameinfo.h" #include "game.h" game_info::game_info() { board_ptr = 0; game_play = false; use_clock = false; } game_info::~game_info() { delete board_ptr; } void game_info::new_game_remaining(int queue_size) { // player must be set before this set_game_play_from_board(); // Update history for undo board_history[0] = *board_ptr; player_history[0] = player; num_history = 1; max_num_history = 1; // When move queue is used min_num_history = 1 + queue_size; } void game_info::set_game_play_from_board() { game_play = board_ptr->can_play(); if (!game_play) game_result = game_result_end; } void game_info::new_game_from_begin(int queue_size) { random_game = false; first_play_is_pass = false; if (!board_ptr) board_ptr = new byte_board_info; *board_ptr = &board_begin; player = BLACK; new_game_remaining(queue_size); } void game_info::new_game_from_board(const byte_board_info *b, int p) { random_game = true; random_game_pieces = b->get_num_move() + 4; first_play_is_pass = false; if (!board_ptr) board_ptr = new byte_board_info; *board_ptr = *b; player = p; // First move is a pass if (!board_ptr->can_play(player) && board_ptr->can_play(switch_color(player))) { player = switch_color(player); first_play_is_pass = true; } new_game_remaining(0); } bool game_info::is_undoable() const { int i = num_history; if (i <= min_num_history) // Already at the beginning of the game // Use <= to support move queue return false; return true; } bool game_info::is_redoable() const { int i = num_history; if (i == max_num_history) // Already at the end of the game return false; return true; } void game_info::undo() { int i = num_history; // Skip AI's turns while (i > min_num_history && is_computer_player(player_history[i-2])) i--; if (i > min_num_history) // Undo human move i--; *board_ptr = board_history[i-1]; player = player_history[i-1]; // player must be set before this set_game_play_from_board(); num_history = i; } void game_info::redo() { int i = num_history; // Skip AI's turns while (i < max_num_history && is_computer_player(player_history[i-1])) i++; if (i < max_num_history) // Redo human move i++; if (redo_ai_move) { // Skip AI's turns while (i < max_num_history && is_computer_player(player_history[i-1])) i++; } *board_ptr = board_history[i-1]; player = player_history[i-1]; // player must be set before this set_game_play_from_board(); num_history = i; } void game_info::place_piece(int pos, int time) { if (use_clock && ((player == BLACK && time > clock_history_black[num_history-1]) || (player == WHITE && time > clock_history_white[num_history-1]))) { player_timeout(); return; } board_ptr->place_piece(player, pos); int old_player = player; if (board_ptr->can_play(switch_color(player))) { player = switch_color(player); } else if (!board_ptr->can_play(player)) { game_play = false; game_result = game_info::game_result_end; } // Update history for undo bool keep_history = false; board_history[num_history] = *board_ptr; // Repeat same move if (num_history < max_num_history && move_history[num_history-1] == pos) keep_history = true; move_history[num_history-1] = pos; time_history[num_history-1] = time; if (use_clock) { if (old_player == BLACK) { clock_history_black[num_history] = clock_history_black[num_history-1] - time; clock_history_white[num_history] = clock_history_white[num_history-1]; } else { clock_history_black[num_history] = clock_history_black[num_history-1]; clock_history_white[num_history] = clock_history_white[num_history-1] - time; } } // Next move player_history[num_history] = player; num_history++; // Remove redo capability if (!keep_history) max_num_history = num_history; } void game_info::player_timeout() { game_play = false; if (player == BLACK) game_result = game_result_timeout_black; else game_result = game_result_timeout_white; } void game_info::player_resign() { game_play = false; if (player == BLACK) game_result = game_result_resign_black; else game_result = game_result_resign_white; } void game_info::game_end() { game_play = false; game_result = game_result_end; } int game_info::get_clock() { if (player == BLACK) return clock_history_black[num_history-1]; else return clock_history_white[num_history-1]; } grhino-0.16.1/gevalwin.cc0000644000175000017500000002374311436423224015460 0ustar lerdsuwalerdsuwa/* gevalwin.cc GRhino Gnome Frontend Evaluation Window Copyright (c) 2005, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* #define GNOME_DISABLE_DEPRECATED #define GTK_DISABLE_DEPRECATED */ #include "config.h" #include #include #include "board.h" #include "pattern.h" #include "parity.h" #include "game.h" /************************************************************************* Tools menu - Pattern evaluation *************************************************************************/ int pattern_x, pattern_y; GtkWidget *clist_eval; GtkWidget *label_score; GtkWidget *label_move_index; GtkWidget *label_parity; extern GnomeUIInfo menu_tools_info[]; void evaluate_position_fill_entry(pattern_t p, int index, int row, int col) { static gchar s[5]; // Enough space for -127 .. 127 and string // termination int i = 0; // pattern_eval returns a signed char (-127 .. 127) int score = pattern_eval(view_board_ptr, p, index); if (score < 0) { s[i++] = '-'; score = -score; } int score_left = score; if (score >= 100) { s[i++] = '1'; score_left -= 100; } if (score >= 10) { s[i++] = score_left/10 + '0'; score_left %= 10; } s[i++] = score_left + '0'; s[i] = '\0'; gtk_clist_set_text(GTK_CLIST(clist_eval), row, col, s); } void evaluate_position_fill() { static gchar s[10]; snprintf(s, 10, "%d", static_cast(pattern_eval(view_board_ptr))); gtk_label_set_text(GTK_LABEL(label_score), s); snprintf(s, 10, "%d", static_cast(to_move_index(view_board_ptr->get_num_move()))); gtk_label_set_text(GTK_LABEL(label_move_index), s); snprintf(s, 10, "%d", view_board_ptr->can_play() ? static_cast(parity_eval(view_board_ptr, view_player)) : 0); gtk_label_set_text(GTK_LABEL(label_parity), s); evaluate_position_fill_entry(PATTERN_ROW1, 0, 0, 2); evaluate_position_fill_entry(PATTERN_ROW1, 1, 0, 4); evaluate_position_fill_entry(PATTERN_ROW1, 2, 1, 2); evaluate_position_fill_entry(PATTERN_ROW1, 3, 1, 4); evaluate_position_fill_entry(PATTERN_ROW2, 0, 2, 2); evaluate_position_fill_entry(PATTERN_ROW2, 1, 2, 4); evaluate_position_fill_entry(PATTERN_ROW2, 2, 3, 2); evaluate_position_fill_entry(PATTERN_ROW2, 3, 3, 4); evaluate_position_fill_entry(PATTERN_ROW3, 0, 4, 2); evaluate_position_fill_entry(PATTERN_ROW3, 1, 4, 4); evaluate_position_fill_entry(PATTERN_ROW3, 2, 5, 2); evaluate_position_fill_entry(PATTERN_ROW3, 3, 5, 4); evaluate_position_fill_entry(PATTERN_ROW4, 0, 6, 2); evaluate_position_fill_entry(PATTERN_ROW4, 1, 6, 4); evaluate_position_fill_entry(PATTERN_ROW4, 2, 7, 2); evaluate_position_fill_entry(PATTERN_ROW4, 3, 7, 4); evaluate_position_fill_entry(PATTERN_DIAG1, 0, 8, 2); evaluate_position_fill_entry(PATTERN_DIAG1, 1, 8, 4); evaluate_position_fill_entry(PATTERN_DIAG2, 0, 9, 2); evaluate_position_fill_entry(PATTERN_DIAG2, 1, 9, 4); evaluate_position_fill_entry(PATTERN_DIAG2, 2, 10, 2); evaluate_position_fill_entry(PATTERN_DIAG2, 3, 10, 4); evaluate_position_fill_entry(PATTERN_DIAG3, 0, 11, 2); evaluate_position_fill_entry(PATTERN_DIAG3, 1, 11, 4); evaluate_position_fill_entry(PATTERN_DIAG3, 2, 12, 2); evaluate_position_fill_entry(PATTERN_DIAG3, 3, 12, 4); evaluate_position_fill_entry(PATTERN_DIAG4, 0, 13, 2); evaluate_position_fill_entry(PATTERN_DIAG4, 1, 13, 4); evaluate_position_fill_entry(PATTERN_DIAG4, 2, 14, 2); evaluate_position_fill_entry(PATTERN_DIAG4, 3, 14, 4); evaluate_position_fill_entry(PATTERN_DIAG5, 0, 15, 2); evaluate_position_fill_entry(PATTERN_DIAG5, 1, 15, 4); evaluate_position_fill_entry(PATTERN_DIAG5, 2, 16, 2); evaluate_position_fill_entry(PATTERN_DIAG5, 3, 16, 4); evaluate_position_fill_entry(PATTERN_CORNER5X2, 0, 17, 2); evaluate_position_fill_entry(PATTERN_CORNER5X2, 1, 17, 4); evaluate_position_fill_entry(PATTERN_CORNER5X2, 2, 18, 2); evaluate_position_fill_entry(PATTERN_CORNER5X2, 3, 18, 4); evaluate_position_fill_entry(PATTERN_CORNER5X2, 4, 19, 2); evaluate_position_fill_entry(PATTERN_CORNER5X2, 5, 19, 4); evaluate_position_fill_entry(PATTERN_CORNER5X2, 6, 20, 2); evaluate_position_fill_entry(PATTERN_CORNER5X2, 7, 20, 4); } void evaluate_position_update(update_state_type /*u*/, void *) { gtk_clist_freeze(GTK_CLIST(clist_eval)); evaluate_position_fill(); gtk_clist_thaw(GTK_CLIST(clist_eval)); } gint evaluate_position_configure_event(GtkWidget *widget, GdkEventConfigure * /*e*/, gpointer /*data*/) { gtk_window_get_position(GTK_WINDOW(widget), &pattern_x, &pattern_y); return FALSE; // Propagate signal to child so that it // can resize itself } void evaluate_position_closed(GtkWidget *widget, GtkWidget **data) { update_move.remove(evaluate_position_update, 0); gtk_widget_destroy(widget); *data = NULL; show_pattern_evaluation = false; gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (menu_tools_info[2].widget), show_pattern_evaluation); } void evaluate_position() { static gchar empty[] = ""; static gchar *row[5]; static GtkWidget *evalbox; if (evalbox) { if (show_pattern_evaluation) gtk_window_present(GTK_WINDOW(evalbox)); else evaluate_position_closed(evalbox, &evalbox); return; } if (!show_pattern_evaluation) return; row[0] = _("Pattern name"); row[1] = _("Position"); row[2] = _("Score"); row[3] = _("Position"); row[4] = _("Score"); evalbox = gtk_window_new(GTK_WINDOW_TOPLEVEL); if (pattern_x != -1 && pattern_y != -1) gtk_window_move(GTK_WINDOW(evalbox), pattern_x, pattern_y); gtk_window_set_title(GTK_WINDOW(evalbox), _("Pattern Evaluation")); gtk_container_set_border_width(GTK_CONTAINER(evalbox), 5); g_signal_connect(G_OBJECT(evalbox), "destroy", G_CALLBACK(evaluate_position_closed), &evalbox); g_signal_connect(G_OBJECT(evalbox), "configure_event", G_CALLBACK(evaluate_position_configure_event), NULL); GtkWidget *vbox = gtk_vbox_new(FALSE, 5); GtkWidget *hbox1 = gtk_hbox_new(TRUE, 5); GtkWidget *label1 = gtk_label_new(_("Total score")); gtk_box_pack_start(GTK_BOX(hbox1), label1, TRUE, TRUE, 2); label_score = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(hbox1), label_score, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox1, TRUE, TRUE, 2); GtkWidget *hbox2 = gtk_hbox_new(TRUE, 5); GtkWidget *label2 = gtk_label_new(_("Move index")); gtk_box_pack_start(GTK_BOX(hbox2), label2, TRUE, TRUE, 2); label_move_index = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(hbox2), label_move_index, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox2, TRUE, TRUE, 2); GtkWidget *hbox3 = gtk_hbox_new(TRUE, 5); GtkWidget *label3 = gtk_label_new(_("Parity score")); gtk_box_pack_start(GTK_BOX(hbox3), label3, TRUE, TRUE, 2); label_parity = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(hbox3), label_parity, TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(vbox), hbox3, TRUE, TRUE, 2); clist_eval = gtk_clist_new_with_titles(5, row); gtk_box_pack_start(GTK_BOX(vbox), clist_eval, TRUE, TRUE, 2); gtk_container_add(GTK_CONTAINER(evalbox), vbox); gtk_clist_column_titles_passive(GTK_CLIST(clist_eval)); row[2] = empty; row[4] = empty; row[0] = _("Row 1"); row[1] = _("A1-H1"); row[3] = _("A8-H8"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = empty; row[1] = _("A1-A8"); row[3] = _("H1-H8"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = _("Row 2"); row[1] = _("A2-H2"); row[3] = _("A7-H7"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = empty; row[1] = _("B1-B8"); row[3] = _("G1-G8"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = _("Row 3"); row[1] = _("A3-H3"); row[3] = _("A6-H6"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = empty; row[1] = _("C1-C8"); row[3] = _("F1-F8"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = _("Row 4"); row[1] = _("A4-H4"); row[3] = _("A5-H5"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = empty; row[1] = _("D1-D8"); row[3] = _("E1-E8"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = _("Diag 1"); row[1] = _("A1-H8"); row[3] = _("H1-A8"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = _("Diag 2"); row[1] = _("A2-G8"); row[3] = _("B1-H7"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = empty; row[1] = _("H2-B8"); row[3] = _("G1-A7"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = _("Diag 3"); row[1] = _("A3-F8"); row[3] = _("C1-H6"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = empty; row[1] = _("H3-C8"); row[3] = _("F1-A6"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = _("Diag 4"); row[1] = _("A4-E8"); row[3] = _("D1-H5"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = empty; row[1] = _("H4-D8"); row[3] = _("E1-A5"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = _("Diag 5"); row[1] = _("A5-D8"); row[3] = _("E1-H4"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = empty; row[1] = _("H5-E8"); row[3] = _("D1-A4"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = _("Corner 5x2"); row[1] = _("A1-E2"); row[3] = _("H1-D2"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[0] = empty; row[1] = _("A8-E7"); row[3] = _("H8-D7"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[1] = _("A1-B5"); row[3] = _("A8-B4"); gtk_clist_append(GTK_CLIST(clist_eval), row); row[1] = _("H1-G5"); row[3] = _("H8-G4"); gtk_clist_append(GTK_CLIST(clist_eval), row); evaluate_position_fill(); update_move.add(evaluate_position_update, 0); gtk_widget_show_all(evalbox); } grhino-0.16.1/ggamewin.h0000644000175000017500000000251111436423224015272 0ustar lerdsuwalerdsuwa/* ggamewin.h GRhino Gnome Frontend Game Library Window Copyright (c) 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "load.h" /************************************************************************* Configurations - GNOME specific *************************************************************************/ extern int gamelib_width, gamelib_height, gamelib_x, gamelib_y; /************************************************************************* Functions *************************************************************************/ bool game_library_opened(const char *f); void game_library(std::vector *v, const char *f); grhino-0.16.1/row3.bin0000600000175000017500000020011211436423225014675 0ustar lerdsuwalerdsuwagrhino-0.16.1/game.cc0000644000175000017500000004101211436423224014542 0ustar lerdsuwalerdsuwa/* game.cc Game States Copyright (c) 2004, 2005, 2006, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include "game.h" #include "opening.h" #include "proginfo.h" #include "iter.h" #include "randboard.h" #include "rand.h" #include "alphabeta.h" #include "pattern.h" #include "book.h" #include "hash.h" #include "fdstream.h" #include "boardio.h" #include #include #include #include #include #ifdef _ # undef _ #endif #ifdef N_ # undef N_ #endif #include #define _(x) gettext(x) #define N_(x) (x) /************************************************************************* AI variables *************************************************************************/ pthread_t ai_thread; pthread_attr_t ai_thread_attr; bool ai_running; bool ai_tampered; pthread_mutex_t input_lock = PTHREAD_MUTEX_INITIALIZER; volatile int input_pos; // Lock required for access /************************************************************************* Game states *************************************************************************/ void new_game_game_mode(); void new_game(game_info &g) { new_game_game_mode(); if (start_game_mode == START_GAME_RANDOM) { byte_board_info b; random_board(&b, start_random_game_pieces); move_queue.clear(); g.new_game_from_board(&b, BLACK); } else { move_queue = opening_move_queue; g.new_game_from_begin(move_queue.size()); } } void new_game(game_info &g, const byte_board_info &b, int color) { new_game_game_mode(); move_queue.clear(); g.new_game_from_board(&b, color); } game_info cur_game_info; std::deque move_queue; int time_player; int clock_player; int time_player_animate_delay; /************************************************************************* Configurations - Not front-end specific *************************************************************************/ // Must be COMPUTER_NONE for proper // working of the first call to // set_game_mode during program start up game_mode_type game_mode = COMPUTER_NONE; bool black_ai = false; bool white_ai = false; const char *game_mode_name[NUM_GAME_MODE] = { N_("None"), N_("Black"), N_("White"), N_("Both"), N_("Alternate"), N_("Random") }; level_info_type level_info[NUM_LEVEL_INFO] = { { 2, 6, 4 }, { 4, 8, 6 }, { 6, 12, 10 }, { 8, 16, 14 }, { 10, 20, 18 } }; int computer_level = 2; level_info_type current_level_info; const char *level_name[NUM_LEVEL_INFO+1] = { N_("1"), N_("2"), N_("3"), N_("4"), N_("5"), N_("Custom") }; int opening_var; const char *opening_var_name[NUM_OPENING_VAR] = { N_("None"), N_("Very low"), N_("Low"), N_("Medium"), N_("High"), N_("Very high") }; bool hint_move; bool show_last_move; bool log_move; bool animate_opening; bool redo_ai_move; int animate_delay; std::string opening_name; int opening_player; std::deque opening_move_queue; const char *start_game_mode_name[NUM_START_GAME_MODE] = { N_("Initial board"), N_("Random board") }; start_game_mode_type start_game_mode; int start_random_game_pieces; bool show_border; bool show_toolbar; bool show_pattern_evaluation; bool show_game_history; std::string theme_name; byte_board_info *view_board_ptr; view_mode_type view_mode; int view_position; int view_player; /************************************************************************* Game mode functions *************************************************************************/ game_mode_type get_game_mode() { return game_mode; } void set_game_mode(game_mode_type game_mode_) { game_mode_type old_mode = game_mode; game_mode = game_mode_; switch (game_mode) { case COMPUTER_NONE: black_ai = false; white_ai = false; break; case COMPUTER_BLACK: black_ai = true; white_ai = false; break; case COMPUTER_WHITE: black_ai = false; white_ai = true; break; case COMPUTER_BOTH: black_ai = true; white_ai = true; break; case COMPUTER_ALTERNATE: case COMPUTER_RANDOM: // This avoid changing AI // color while game is in // progress if (old_mode != COMPUTER_BLACK && old_mode != COMPUTER_WHITE) { if (get_random(2) & 1) { black_ai = true; white_ai = false; } else { black_ai = false; white_ai = true; } } break; } } const char *get_game_mode_string() { return _(game_mode_name[static_cast(game_mode)]); } bool is_computer_player(int color) { if (color == BLACK) return black_ai; else return white_ai; } void switch_computer_game_mode() { switch (get_game_mode()) { case COMPUTER_BLACK: set_game_mode(COMPUTER_WHITE); break; case COMPUTER_WHITE: set_game_mode(COMPUTER_BLACK); break; case COMPUTER_ALTERNATE: case COMPUTER_RANDOM: { bool temp_ai = black_ai; black_ai = white_ai; white_ai = temp_ai; } break; default: // COMPUTER_NONE or COMPUTER_BOTH break; } } void new_game_game_mode() { if (game_mode == COMPUTER_ALTERNATE || (game_mode == COMPUTER_RANDOM && (get_random(2) & 1))) { bool temp_ai = black_ai; black_ai = white_ai; white_ai = temp_ai; } } bool get_wait_player() { return cur_game_info.is_game_play() && !is_computer_player(cur_game_info.get_player()) && !move_queue.size(); } void maybe_set_ai_tampered() { // No move played yet if (cur_game_info.num_history <= cur_game_info.min_num_history) return; // Any first move is equivalent and // doesn't affect the game if (cur_game_info.num_history <= 2 && !cur_game_info.is_random_game()) ai_tampered = true; } int get_computer_move(double komi) { int pos; // Computer strategy selection if (cur_game_info.board_ptr->get_num_move() >= NUM_MOVE - current_level_info.num_empty_exact) { eval_endgame(cur_game_info.board_ptr, cur_game_info.get_player(), &pos); free_hash_move(cur_game_info.board_ptr->get_num_move()); } else if (cur_game_info.board_ptr->get_num_move() >= NUM_MOVE - current_level_info.num_empty_winlossdraw) { eval_winlossdraw(cur_game_info.board_ptr, cur_game_info.get_player(), &pos, komi); free_hash_move(cur_game_info.board_ptr->get_num_move()); } else if (cur_game_info.is_random_game()) eval_midgame(cur_game_info.board_ptr, cur_game_info.get_player(), &pos); else { int book_pos = book_move(cur_game_info.board_ptr, cur_game_info.move_history, cur_game_info.player_history); if (book_pos != POS_INVALID) { pos = book_pos; } else eval_midgame(cur_game_info.board_ptr, cur_game_info.get_player(), &pos); } return pos; } int get_computer_winlossdraw_move(double komi) { int pos; eval_winlossdraw(cur_game_info.board_ptr, cur_game_info.get_player(), &pos, komi); free_hash_move(cur_game_info.board_ptr->get_num_move()); return pos; } int get_computer_exact_move() { int pos; eval_endgame(cur_game_info.board_ptr, cur_game_info.get_player(), &pos); free_hash_move(cur_game_info.board_ptr->get_num_move()); return pos; } /************************************************************************* Home directory functions *************************************************************************/ static std::string home_dir; static void user_home_dir_init() { struct passwd *p; // Get passwd entry for current user p = getpwuid(getuid()); if (p == NULL) { char *env = getenv("HOME"); if (env == NULL) { // Give up throw std::runtime_error(_("error obtaining the user home directory")); } home_dir = env; } else { // Store home directory home_dir = p->pw_dir; } } const std::string &get_user_home_dir() { static bool init = false; if (!init) user_home_dir_init(); return home_dir; } /************************************************************************* Logging function *************************************************************************/ static const char *get_computer_player_name() { if (ai_tampered) return "grhino-X"; switch (computer_level) { case 0: return "grhino-1"; case 1: return "grhino-2"; case 2: return "grhino-3"; case 3: return "grhino-4"; case 4: return "grhino-5"; case 5: default: return "grhino-C"; } } #if 0 static void log_history_ios_old(const std::string &filename, const std::string &black_name, const std::string &white_name) { // Random game not supported yet if (cur_game_info.is_random_game()) return; std::string file = get_user_home_dir(); file += '/'; file += filename; std::ofstream of(file.c_str(), std::ios::app); if (!of) return; of << std::setw(10) << time(0) << ' '; int black_score = cur_game_info.board_history[cur_game_info.num_history-1].board_black_score(); int white_score = cur_game_info.board_history[cur_game_info.num_history-1].board_white_score(); switch (cur_game_info.get_game_result()) { case game_info::game_result_end: of << "e "; adjust_score(black_score, white_score); break; case game_info::game_result_timeout_black: of << "t "; black_score = 0; white_score = 64; break; case game_info::game_result_timeout_white: of << "t "; black_score = 64; white_score = 0; break; case game_info::game_result_resign_black: of << "r "; black_score = 0; white_score = 64; break; case game_info::game_result_resign_white: of << "r "; black_score = 64; white_score = 0; break; } of << std::setw(8) << std::left << (is_computer_player(BLACK) ? get_computer_player_name() : black_name) << std::right << ' ' << std::setw(2) << black_score << " ( 30 0 0) "; of << std::setw(8) << std::left << (is_computer_player(WHITE) ? get_computer_player_name() : white_name) << std::right << ' ' << std::setw(2) << white_score << " ( 30 0 0) "; for (int i = 1; i < cur_game_info.max_num_history; ++i) { if (cur_game_info.player_history[i-1] == BLACK) of << '+'; else of << '-'; of << static_cast('1' + pos_to_x(cur_game_info.move_history[i-1])) << static_cast('1' + pos_to_y(cur_game_info.move_history[i-1])); } of << " +0\n"; } #endif static void log_history_GGS(const std::string &filename, const std::string &black_name, const std::string &white_name, bool v2 = true) { std::string file = get_user_home_dir(); file += '/'; file += filename; std::ofstream of(file.c_str(), std::ios::app); if (!of) return; if (v2) // GGS v2 supports synchro rand of << "1 "; of << "(;GM[Othello]PC[" << prog_name << '-' << prog_ver << "]DT["; char buffer[80]; time_t t = time(0); if (strftime(buffer, 80, "%Y.%m.%d_%H:%M:%S.%Z", localtime(&t))) of << buffer; else of << t; of << "]PB[" << (is_computer_player(BLACK) ? get_computer_player_name() : black_name); of << "]PW[" << (is_computer_player(WHITE) ? get_computer_player_name() : white_name); of << "]TI[30:00//02:00]TY[8"; if (cur_game_info.is_random_game()) of << 'r' << cur_game_info.get_random_game_pieces(); of << "]RE["; int black_score = cur_game_info.board_history[cur_game_info.max_num_history-1].board_black_score(); int white_score = cur_game_info.board_history[cur_game_info.max_num_history-1].board_white_score(); const char *flag; switch (cur_game_info.get_game_result()) { case game_info::game_result_end: adjust_score(black_score, white_score); flag = ""; break; case game_info::game_result_timeout_black: flag = ":t"; black_score = 0; white_score = 64; break; case game_info::game_result_timeout_white: flag = ":t"; black_score = 64; white_score = 0; break; case game_info::game_result_resign_black: flag = ":r"; black_score = 0; white_score = 64; break; case game_info::game_result_resign_white: flag = ":r"; black_score = 64; white_score = 0; break; default: flag = ":r"; black_score = 64; white_score = 0; break; } of << std::showpos << black_score-white_score << std::noshowpos << ".00" << flag << "]BO[8 "; board_iterator iter; iter.init_pos(); int col = 0; do { switch (cur_game_info.board_history[0].board[iter.pos]) { case EMPTY: of << '-'; break; case BLACK: of << '*'; break; case WHITE: of << 'O'; break; } col++; if (col == 8) { of << ' '; col = 0; } } while (iter.next()); of << "*]"; of << std::setprecision(2) << std::fixed << std::showpoint; for (int i = 1; i < cur_game_info.max_num_history; ++i) { if (i > 1 && (cur_game_info.player_history[i-1] == cur_game_info.player_history[i-2])) { // Pass if (cur_game_info.player_history[i-1] == BLACK) of << "W[pass]"; else of << "B[pass]"; } if (cur_game_info.player_history[i-1] == BLACK) of << "B["; else of << "W["; of << static_cast('A' + pos_to_x(cur_game_info.move_history[i-1])) << static_cast('1' + pos_to_y(cur_game_info.move_history[i-1])); if (cur_game_info.time_history[i-1]) { of << "//"; of << (cur_game_info.time_history[i-1]/100.0); } of << ']'; } of << ";)\n"; } void log_history(const std::string &filename, const std::string &black_name, const std::string &white_name) { // No need to do i18n here if (!log_move) return; std::string file1 = get_user_home_dir(); file1 += "/.grhino.lock"; std::string file2 = file1 + ".link"; int h; for (int i = 0; ; i++) { h = open(file1.c_str(), O_CREAT | O_EXCL, S_IRWXU); if (h != -1) { // Require for NFS // Create hardlink in the same // file system if (link(file1.c_str(), file2.c_str()) == 0) break; struct stat s; if (fstat(h, &s) == 0 && s.st_nlink == 2) break; // Hardlink fails, cleanup close(h); unlink(file1.c_str()); } if (i == 5) { // Stale lock // Remove files unlink(file1.c_str()); unlink(file2.c_str()); i = 0; } usleep(100); // Wait 0.1 sec } close(h); log_history_GGS(filename, black_name, white_name, true); unlink(file1.c_str()); unlink(file2.c_str()); } /************************************************************************* State update *************************************************************************/ update_hook update_move; update_hook update_game_list; void update_hook::update(update_state_type u) { for (size_t i = 0; i < vec.size(); ++i) vec[i].func(u, vec[i].data); } void update_hook::update_except(update_state_type u, update_func f, void *d) { for (size_t i = 0; i < vec.size(); ++i) { if (vec[i].func != f || vec[i].data != d) vec[i].func(u, vec[i].data); } } void update_hook::add(update_func f, void *d) { vec.push_back(update_item(f, d)); } void update_hook::remove(update_func f, void *d) { size_t i = 0; size_t size = vec.size(); for ( ; i < size; ++i) { if (vec[i].func == f && vec[i].data == d) break; } // Not found if (i == size) return; if (i != size-1) { vec[i].func = vec[size-1].func; vec[i].data = vec[size-1].data; } vec.pop_back(); } /************************************************************************* Utility functions *************************************************************************/ const char *find_opening_name(byte_board_info *b) { for (int i = 0; i < get_num_opening(); ++i) { // Wrong number of moves if (b->get_num_move() != get_opening_num_move(i)) continue; int j, k; // Straightforward compare for (j = 0, k = 0; j < 64; ++j, ++k) { if (b->board[j] != (*get_opening_board(i))[k]) break; } if (j == 64) return get_opening_name(i); // Transpose for (j = 0, k = 0; j < 64; ++j, k = (k>=56 ? (k%8)+1: k+8)) { if (b->board[j] != (*get_opening_board(i))[k]) break; } if (j == 64) return get_opening_name(i); // Rotate for (j = 0, k = 63; j < 64; ++j, --k) { if (b->board[j] != (*get_opening_board(i))[k]) break; } if (j == 64) return get_opening_name(i); // Rotate and transpose for (j = 0, k = 63; j < 64; ++j, k = (k<8 ? (k%8)+55: k-8)) { if (b->board[j] != (*get_opening_board(i))[k]) break; } if (j == 64) return get_opening_name(i); } return 0; } const char *find_opening_name() { return find_opening_name(cur_game_info.board_ptr); } grhino-0.16.1/empty.xpm0000644000175000017500000000350011436423224015206 0ustar lerdsuwalerdsuwa/* XPM */ static char * empty_xpm[] = { "40 40 3 1", " c None", ". c #000000", "+ c #3FDD18", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/TODO0000644000175000017500000000335611436423224014023 0ustar lerdsuwalerdsuwaTODO Current infrastructures: Priority o Alpha-beta pruning - Store the best move sequence low - Interact better with transposition table HIGH - Mid game and end game board low - Reentrant low - Search speed MEDIUM - Verify anti wipe out HIGH o Transposition table - Reentrant low - Make hash class HIGH o Move ordering - Reentrant low o GNOME front end - Display last move with number for passes low - Display current score (with lookahead) low - Display timer low - Load SGF game MEDIUM - Load Thor game MEDIUM - Save game low - Edit board function in menu HIGH - End game solver HIGH - More themes low - Theme preview low - Flipping graphics low - Sound low - Option applicable to current game only MEDIUM - Undo to here HIGH o Packaging o Pattern-based evaluation - Compress pattern file low - Improve pattern data low - Evaluation speed MEDIUM o Opening book - Based on win-loss scores low - Book browser MEDIUM o Learning tool - Explain parity situation low - Add comment in game history low o Configuration file for preferences - Use GConf low o Online help (Use Sans 14px for text) - Glossary low - Document gen_* tools low o Configuration/build o i18n o Logging - Support multiple log format low - Support SGF file format low o AI vs AI infrastructure - GTP time game support MEDIUM o Other Future infrastructures: o Different move ordering during opening, midgame low o Multi prob-cut low o Think in opponent's time low o KDE front end low o l10n low o Pattern learning low o Book learning low o Use bitboard low grhino-0.16.1/randboard.cc0000644000175000017500000001155511436423225015577 0ustar lerdsuwalerdsuwa/* rand.cc Random board number generator Copyright (c) 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include "rand.h" #include "randboard.h" #include "order.h" #include "gtstream.h" #include #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x // Pieces are randomly placed according to the following steps: // All '0' position must be placed before a piece is added on // any '1' position, and so on. // . . . . . . . . // . . 3 2 2 3 . . // . 3 2 1 1 2 3 . // . 2 1 0 0 1 2 . // . 2 1 0 0 1 2 . // . 3 2 1 1 2 3 . // . . 3 2 2 2 . . // . . . . . . . . static const int NUM_RANDOM_STEP0 = 4; static const int NUM_RANDOM_STEP1 = 8; static const int NUM_RANDOM_STEP2 = 12; static const int NUM_RANDOM_STEP3 = 8; static const int TOTAL_NUM_RANDOM_STEP = NUM_RANDOM_STEP0 + NUM_RANDOM_STEP1 + NUM_RANDOM_STEP2 + NUM_RANDOM_STEP3; static const int MAX_NUM_RANDOM_STEP = 12; static int random_step0[NUM_RANDOM_STEP0] = { D4, E4, D5, E5 }; static int random_step1[NUM_RANDOM_STEP1] = { D3, E3, C4, F4, C5, F5, D6, E6 }; static int random_step2[NUM_RANDOM_STEP2] = { D2, E2, C3, F3, B4, G4, B5, G5, C6, F6, D7, E7 }; static int random_step3[NUM_RANDOM_STEP3] = { C2, F2, B3, G3, B6, G6, C7, F7 }; // Valid values for num are 4, 6, 8, ..., 32 // Reentrant: only write to local variable void random_board(byte_board_info *b, int num) { if (num < NUM_RANDOM_STEP0 || num > TOTAL_NUM_RANDOM_STEP || (num & 1)) { gtstream bufstr; gtout(bufstr, _("invalid number of pieces %$ in random_board")) << num; throw std::range_error(bufstr.str()); } byte_board_type init; for (int i = 0; i < 64; ++i) init[i] = EMPTY; int pos_array_step[MAX_NUM_RANDOM_STEP]; int pos_array[TOTAL_NUM_RANDOM_STEP]; int cur_pos_array = 0; // Do step 0 int cur_step = NUM_RANDOM_STEP0; int cur_step_left = NUM_RANDOM_STEP0; int num_left = num - cur_step; for (int i = 0; i < NUM_RANDOM_STEP0; ++i) pos_array_step[i] = random_step0[i]; while (cur_step) { int pos = (cur_step_left > 1) ? get_random(cur_step_left) : 0; pos_array[cur_pos_array++] = pos_array_step[pos]; --cur_step; --cur_step_left; pos_array_step[pos] = pos_array_step[cur_step_left]; } // Do step 1 if (num_left) { if (num_left < NUM_RANDOM_STEP1) cur_step = num_left; else cur_step = NUM_RANDOM_STEP1; cur_step_left = NUM_RANDOM_STEP1; num_left -= cur_step; for (int i = 0; i < NUM_RANDOM_STEP1; ++i) pos_array_step[i] = random_step1[i]; while (cur_step) { int pos = (cur_step_left > 1) ? get_random(cur_step_left) : 0; pos_array[cur_pos_array++] = pos_array_step[pos]; --cur_step; --cur_step_left; pos_array_step[pos] = pos_array_step[cur_step_left]; } } // Do step 2 if (num_left) { if (num_left < NUM_RANDOM_STEP2) cur_step = num_left; else cur_step = NUM_RANDOM_STEP2; cur_step_left = NUM_RANDOM_STEP2; num_left -= cur_step; for (int i = 0; i < NUM_RANDOM_STEP2; ++i) pos_array_step[i] = random_step2[i]; while (cur_step) { int pos = (cur_step_left > 1) ? get_random(cur_step_left) : 0; pos_array[cur_pos_array++] = pos_array_step[pos]; --cur_step; --cur_step_left; pos_array_step[pos] = pos_array_step[cur_step_left]; } } // Do step 3 if (num_left) { if (num_left < NUM_RANDOM_STEP3) cur_step = num_left; else cur_step = NUM_RANDOM_STEP3; cur_step_left = NUM_RANDOM_STEP3; num_left -= cur_step; for (int i = 0; i < NUM_RANDOM_STEP3; ++i) pos_array_step[i] = random_step3[i]; while (cur_step) { int pos = (cur_step_left > 1) ? get_random(cur_step_left) : 0; pos_array[cur_pos_array++] = pos_array_step[pos]; --cur_step; --cur_step_left; pos_array_step[pos] = pos_array_step[cur_step_left]; } } cur_step = cur_pos_array; int color = BLACK; while (cur_step) { int pos = (cur_step > 1) ? get_random(cur_step) : 0; init[pos_array[pos]] = color; color = switch_color(color); --cur_step; pos_array[pos] = pos_array[cur_step]; } *b = &init; } grhino-0.16.1/bottom.xcf0000644000175000017500000000156511436423224015341 0ustar lerdsuwalerdsuwagimp xcf filehBB/ gimp-commentCreated with The GIMPh New Layer     Hhhh,????    Z-h Background     hQ]ih !-9E   Z-grhino-0.16.1/icon_empty.xpm0000644000175000017500000000500711436423225016223 0ustar lerdsuwalerdsuwa/* XPM */ static char * icon_empty_xpm[] = { "48 48 1 1", " c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; grhino-0.16.1/pattern.h0000644000175000017500000000551311436423225015157 0ustar lerdsuwalerdsuwa/* pattern.h Pattern database Copyright (c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef PATTERN_H #define PATTERN_H #include "board.h" #include "proginfo.h" typedef signed char pattern_info; struct raw_pattern_info { long black_win; long white_win; }; const int max_num_pattern = 8; const int num_move_index = 15; struct pattern_data_t { int piece; bool symmetry; int num_pattern; const char *pattern_file; const char *data_file; const char *pattern[max_num_pattern]; }; enum pattern_t { PATTERN_ROW1, PATTERN_ROW2, PATTERN_ROW3, PATTERN_ROW4, PATTERN_DIAG1, PATTERN_DIAG2, PATTERN_DIAG3, PATTERN_DIAG4, PATTERN_DIAG5, PATTERN_EDGE_X, PATTERN_CORNER5X2, PATTERN_UNKNOWN // Must be the last item }; extern const pattern_data_t pattern_data[PATTERN_UNKNOWN]; // Power of 3 const int pow_3[] = { 1, 3, 3*3, 3*3*3, 3*3*3*3, 3*3*3*3*3, 3*3*3*3*3*3, 3*3*3*3*3*3*3, 3*3*3*3*3*3*3*3, 3*3*3*3*3*3*3*3*3, 3*3*3*3*3*3*3*3*3*3, 3*3*3*3*3*3*3*3*3*3*3, 3*3*3*3*3*3*3*3*3*3*3*3, 3*3*3*3*3*3*3*3*3*3*3*3*3 }; extern pattern_info *pattern_table[PATTERN_UNKNOWN][num_move_index]; // Map EMPTY, BLACK, WHITE constants to indices for pattern lookup inline int to_pattern_index(int color) { return color+1; } inline int to_board_index(int color) { return color-1; } inline int extract_index(int index, int i) { return (index / pow_3[i]) % 3; } inline int extract_color(int index, int i) { return to_board_index((index / pow_3[i]) % 3); } inline int get_pattern_piece(pattern_t p) { return pattern_data[p].piece; } inline int get_num_pattern(pattern_t p) { return pattern_data[p].num_pattern; } inline int get_pattern_size(pattern_t p) { return pow_3[get_pattern_piece(p)]; } inline bool get_pattern_symmetry(pattern_t p) { return pattern_data[p].symmetry; } const char *get_pattern_file(pattern_t p); const char *get_pattern_data_file(pattern_t p); void pattern_table_init(); int pattern_eval(byte_board_info *board); int pattern_eval(byte_board_info *board, pattern_t p, int index); void pattern_eval_debug(byte_board_info *board); void show_pattern(pattern_t p, int i); int to_move_index(int pos); #endif /* PATTERN_H */ grhino-0.16.1/rand.h0000644000175000017500000000162711436423225014430 0ustar lerdsuwalerdsuwa/* rand.h Random number generator Copyright (c) 2002, 2004, 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef RAND_H #define RAND_H int get_random(int max); void random_on(); void random_off(); #endif /* RAND_H */ grhino-0.16.1/gtstream.h0000644000175000017500000000421011436423224015320 0ustar lerdsuwalerdsuwa/* gtstream.h C++ Stream Supporting gettext Usage Copyright (c) 2000, 2001, 2002, 2004, 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __K_GTSTREAM_H #define __K_GTSTREAM_H #include "config.h" #include #include #include #include typedef std::ostringstream gtstream; class gtout { gtout(const gtout &); private: std::vector str_vec; std::vector str_flag; std::ostream &os; std::string format; bool need_flush; void finish(); public: gtout(std::ostream &os_, const std::string &fmt); gtout(std::ostream &os_, const char *fmt); ~gtout() { finish(); } int opfx() { return 1; } void osfx() {} gtout& flush() { need_flush = true; return *this; } gtout& put(char c) { return *this << c; } gtout& write(const char *s, std::streamsize n) { return *this << std::string(s, n); } template gtout& operator<<(T t); gtout& operator<<(gtout& (*f)(gtout&)) { return (*f)(*this); } gtout& operator<<(std::ios& (*f)(std::ios&)) { (*f)(os); return *this; } }; template gtout& gtout::operator<<(T t) { gtstream buffer; // Do not copy locale for speed reason // buffer.copyfmt(*this); // Transfer states to buffer // buffer.clear(rdstate()); buffer << t; // copyfmt(buffer); // Transfer states from buffer // clear(buffer.rdstate()); str_vec.push_back(buffer.str()); str_flag.push_back(false); return *this; } #endif /* __K_GTSTREAM_H */ grhino-0.16.1/configure.in0000644000175000017500000001267411436423224015647 0ustar lerdsuwalerdsuwadnl dnl configure.in dnl Copyright (c) 2000, 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij dnl email: lerdsuwa@users.sourceforge.net dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, dnl but WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the dnl GNU General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. dnl AC_REVISION($Revision: 1.36 $) AC_PREREQ(2.53) AC_INIT AC_CONFIG_SRCDIR([board.cc]) dnl ***************************************************************** dnl Initialization dnl ***************************************************************** PACKAGE=grhino . $srcdir/scripts/version AH_TEMPLATE([PACKAGE], [Define to the name of the distribution.]) AH_TEMPLATE([VERSION], [Define to the version of the distribution.]) AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE") AC_DEFINE_UNQUOTED(VERSION, "$VERSION") AC_SUBST(PACKAGE) AC_SUBST(VERSION) ALL_LINGUAS="en_GB" LINGUAS="$ALL_LINGUAS" top_builddir=`pwd` AC_SUBST(top_builddir) dnl ***************************************************************** dnl Set header output file dnl ***************************************************************** AC_CONFIG_HEADER(config.h) AC_CONFIG_AUX_DIR(scripts) dnl ***************************************************************** dnl Read configure options dnl ***************************************************************** dnl Default settings GRHINO_gnome="yes" GRHINO_gtp="yes" DEFTARGETLIST="" AC_ARG_ENABLE(gnome, [ --disable-gnome do not build GNOME frontend (grhino)], [ if test "$enableval" = "yes"; then GRHINO_gnome="yes" elif test "$enableval" = "no"; then GRHINO_gnome="no" else { _AS_ECHO([configure: error: invalid argument for --enable-gnome],[2]); exit 1; } fi ]) AC_ARG_ENABLE(gtp, [ --disable-gtp do not build GTP frontend (gtp-rhino)], [ if test "$enableval" = "yes"; then GRHINO_gtp="yes" elif test "$enableval" = "no"; then GRHINO_gtp="no" else { _AS_ECHO([configure: error: invalid argument for --enable-gtp],[2]); exit 1; } fi ]) if test "$GRHINO_gnome" = yes; then DEFTARGETLIST="$DEFTARGETLIST grhino" fi if test "$GRHINO_gtp" = yes; then DEFTARGETLIST="$DEFTARGETLIST gtp-rhino" fi AC_SUBST(DEFTARGETLIST) dnl ***************************************************************** dnl Checks for programs dnl ***************************************************************** AC_PROG_CC AC_ISC_POSIX AC_PROG_CC_STDC AC_PROG_CPP AC_PROG_CXX AC_PROG_CXXCPP dnl Add -W -Wall (produce all warnings) if gcc is used if test "$GXX" = yes; then CFLAGS="$CFLAGS -W -Wall" CXXFLAGS="$CXXFLAGS -W -Wall" fi AC_PROG_INSTALL AC_PROG_MAKE_SET AC_LANG([C++]) dnl ***************************************************************** dnl Add include/libraries dnl ***************************************************************** dnl ----------------------------------------------------------------- dnl pthread library dnl ----------------------------------------------------------------- AC_CHECK_LIB(pthread, pthread_create, [LIBS="$LIBS -lpthread"], [ AC_MSG_ERROR(pthread library is required) ]) dnl ----------------------------------------------------------------- dnl gnome libraries dnl ----------------------------------------------------------------- if test "$GRHINO_gnome" = yes; then AC_CHECK_PROG(GRHINO_pkg_config, pkg-config, pkg-config, no) if test "$GRHINO_pkg_config" = no; then AC_MSG_ERROR(pkg_config is missing -- GNOME 2 is required) else if "$GRHINO_pkg_config" --exists libgnomeui-2.0; then GRHINO_gnome=2 else AC_MSG_ERROR(libgnomeui-2.0 is missing -- GNOME 2 is required) fi fi echo "GNOME version $GRHINO_gnome found" if test "$GRHINO_gnome" = 2; then LIBS="$LIBS `$GRHINO_pkg_config --libs libgnomeui-2.0`" GNOME_CONFIG="`$GRHINO_pkg_config --cflags libgnomeui-2.0`" fi dnl Remove some system include directories that cause GCC 3.x problem dnl but avoid their subdirectories changequote(<<, >>)dnl GNOME_CONFIG="`echo $GNOME_CONFIG | sed 'sx-I/usr/include x x'`" GNOME_CONFIG="`echo $GNOME_CONFIG | sed 'sx-I/usr/local/include x x'`" changequote([, ])dnl CPPFLAGS="$CPPFLAGS $GNOME_CONFIG" fi dnl ***************************************************************** dnl Checks for C++ features dnl ***************************************************************** CXXAC_TYPE_BOOL if test "$cxxac_cv_have_bool" = no; then AC_MSG_ERROR(C++ compiler that supports bool is required) fi CXXAC_BAD_ALLOC CXXAC_HAVE_EXPLICIT CXXAC_HAVE_MUTABLE CXXAC_HAVE_ARRAY_NEW CXXAC_BAD_DELETE CXXAC_DEFAULT_EXCEPTION CXXAC_HAVE_TYPENAME CXXAC_NO_GUIDE_DECL CXXAC_HEADER_ALL dnl ***************************************************************** dnl I18n, l10n dnl ***************************************************************** AM_GNU_GETTEXT([external]) dnl ***************************************************************** dnl Done dnl ***************************************************************** AC_CONFIG_FILES([Makefile po/Makefile.in desktop/grhino.desktop]) AC_OUTPUT grhino-0.16.1/binfile.h0000644000175000017500000000436711436423224015117 0ustar lerdsuwalerdsuwa/* binfile.h Binary File I/O Copyright (c) 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef BINFILE_H #define BINFILE_H #include "config.h" #include "board.h" #include class binary_file_input { private: std::string file; int handle; bool end_of_file; std::size_t buffer_ptr; std::size_t buffer_size; static const std::size_t max_buffer_size = 10000; unsigned char buffer[max_buffer_size]; void fill_buffer(); void fill_buffer_if_required(std::size_t s); unsigned char read_unsigned_char_nocheck() { return buffer[buffer_ptr++]; } public: binary_file_input(const std::string &f); ~binary_file_input(); unsigned char read_unsigned_char(); int read_int(); unsigned read_unsigned_compress(); int read_int_compress() { return static_cast(read_unsigned_compress()); } void read_board(byte_board_info& b); }; class binary_file_output { private: std::string file; int handle; std::size_t buffer_size; static const std::size_t max_buffer_size = 10000; unsigned char buffer[max_buffer_size]; void flush_buffer(); void flush_buffer_if_required(std::size_t s); void write_unsigned_char_nocheck(unsigned char c) { buffer[buffer_size++] = c; } public: binary_file_output(const std::string &f); ~binary_file_output(); void write_unsigned_char(unsigned char c); void write_int(int i); void write_unsigned_compress(unsigned i); void write_int_compress(unsigned i) { write_unsigned_compress(static_cast(i)); } void write_board(const byte_board_info& b); }; #endif /* BINFILE_H */ grhino-0.16.1/binfile.cc0000644000175000017500000001363411436423224015252 0ustar lerdsuwalerdsuwa/* binfile.cc Binary File I/O Copyright (c) 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "binfile.h" #include "gtstream.h" #include #include #include #include #include #include #include #include #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) (x) const std::size_t binary_file_input::max_buffer_size; binary_file_input::binary_file_input(const std::string &f) { file = f; handle = open(f.c_str(), O_RDONLY); if (handle == -1) { gtstream bufstr; gtout(bufstr, _("cannot open file %$\n")) << f; throw std::runtime_error(bufstr.str()); } buffer_size = 0; buffer_ptr = 0; end_of_file = false; } binary_file_input::~binary_file_input() { if (handle != -1) { close(handle); handle = -1; } } void binary_file_input::fill_buffer() { std::size_t size_in_buffer = buffer_size - buffer_ptr; if (size_in_buffer) memmove(buffer, buffer+buffer_ptr, size_in_buffer); // Make sure state is sane because // code below may throw exception buffer_ptr = 0; buffer_size = size_in_buffer; if (end_of_file) return; int size_to_read = max_buffer_size - size_in_buffer; int size_read = read(handle, buffer+size_in_buffer, size_to_read); if (size_read == -1) { gtstream bufstr; gtout(bufstr, _("cannot read file %$\n")) << file; throw std::runtime_error(bufstr.str()); } if (size_read != size_to_read) end_of_file = true; buffer_size += size_read; } void binary_file_input::fill_buffer_if_required(std::size_t s) { if (buffer_size - buffer_ptr < s) fill_buffer(); if (buffer_size - buffer_ptr < s) { gtstream bufstr; gtout(bufstr, _("cannot read file %$\n")) << file; throw std::runtime_error(bufstr.str()); } } unsigned char binary_file_input::read_unsigned_char() { // Fixed by data file format const std::size_t count = 1; fill_buffer_if_required(count); return read_unsigned_char_nocheck(); } int binary_file_input::read_int() { // Fixed by data file format const std::size_t count = 4; fill_buffer_if_required(count); int i = 0; for (std::size_t j = 0; j < count; ++j) { i |= (static_cast(read_unsigned_char_nocheck()) << (j*8)); } return i; } unsigned binary_file_input::read_unsigned_compress() { unsigned i = 0; for (std::size_t j = 0; ; ++j) { unsigned char c = read_unsigned_char(); i |= (static_cast(c & 0x7F) << (j*7)); if ((c & 0x80) == 0) break; } return i; } void binary_file_input::read_board(byte_board_info& b) { // Fixed by data file format const std::size_t count = 16; fill_buffer_if_required(count); char buf[16]; for (int i = 0; i < 16; ++i) buf[i] = read_unsigned_char_nocheck(); byte_board_type bb; for (int i = 0; i < 8; ++i) { for (int j = 0; j < 8; ++j) { int pos = xy_to_pos(i, j); if (buf[i] & (1<(buffer_size)) { // Make sure we don't flush in destructor close(handle); handle = -1; gtstream bufstr; gtout(bufstr, _("cannot write file %$\n")) << file; throw std::runtime_error(bufstr.str()); } buffer_size = 0; } void binary_file_output::flush_buffer_if_required(std::size_t s) { if (max_buffer_size - buffer_size < s) flush_buffer(); } void binary_file_output::write_unsigned_char(unsigned char c) { // Fixed by data file format const std::size_t count = 1; flush_buffer_if_required(count); write_unsigned_char_nocheck(c); } void binary_file_output::write_int(int i) { // Fixed by data file format const std::size_t count = 4; flush_buffer_if_required(count); for (std::size_t j = 0; j < count; ++j) { write_unsigned_char_nocheck(static_cast(i & 0xFF)); i >>= 8; } } void binary_file_output::write_unsigned_compress(unsigned i) { do { unsigned char buf = static_cast(i & 0x7F); if (i > 0x7F) buf |= 0x80; write_unsigned_char(buf); i >>= 7; } while (i); } void binary_file_output::write_board(const byte_board_info& b) { // Fixed by data file format const std::size_t count = 16; flush_buffer_if_required(count); unsigned char buf[16]; for (int i = 0; i < 16; ++i) buf[i] = 0; for (int i = 0; i < 8; ++i) { for (int j = 0; j < 8; ++j) { int pos = xy_to_pos(i, j); switch(b.board[pos]) { case BLACK: buf[i] |= 1< // FIXME: Iterator data are shared and not thread-safe. struct parity_data { int x; int y; int area; }; const bool DEBUG_PARITY = false; int parity_eval_alpha_beta(search_info &info, int player) { parity_data data[NUM_MOVE]; parity_data *ptr[NUM_MOVE]; int count[NUM_MOVE/4]; // Max number of area possible int num_data = 0; if (info.board->get_num_move() == 0 || info.board->get_num_move() == NUM_MOVE) return 0; bool even_move_left = true; if (info.board->get_num_move() & 1) even_move_left = false; // Obtain a list of empty squares board_endgame_iterator iter(info.empties); iter.init_pos(); do { int pos = iter.pos; data[num_data].x = pos_to_x(pos); data[num_data].y = pos_to_y(pos); data[num_data].area = -1; ptr[num_data] = &data[num_data]; num_data++; } while (iter.next()); for (int i = 0; i < NUM_MOVE/4; ++i) count[i] = 0; // Separate empties into different // areas int cur_area = 0; int cur_done = 0; for (int i = 0; i < num_data; ++i) { // Not previously assigned number if(ptr[i]->area == -1) { // New area ptr[i]->area = cur_area; cur_area++; } // Look for neighbor empties for (int j = cur_done+1; j < num_data; ++j) { int xdiff = ptr[j]->x - ptr[i]->x; if (xdiff >= -1 && xdiff <= 1) { int ydiff = ptr[j]->y - ptr[i]->y; if (ydiff >= -1 && ydiff <= 1) { // This is a // neighbor // Record area ptr[j]->area = ptr[i]->area; // Move to front // for next round of // processing parity_data *tmp = ptr[cur_done+1]; ptr[cur_done+1] = ptr[j]; ptr[j] = tmp; cur_done++; } } } } int score = 0; if (cur_area == 1) { if (DEBUG_PARITY) std::cout << "Area=" << cur_area << '\n'; return score; } if (DEBUG_PARITY) { for (int i = 0; i < num_data; ++i) { std::cout << char(data[i].x+'A') << char(data[i].y+'1') << '-' << data[i].area << ' '; } std::cout << '\n'; std::cout << "Area=" << cur_area; } for (int i = 0; i < NUM_MOVE/4; ++i) count[i] = 0; for (int i = 0; i < num_data; ++i) { count[data[i].area]++; } int odd_up_for_grab = 0; for (int i = 0; i < cur_area; ++i) { if (count[i] <= 8) { bool black_playable = false; bool white_playable = true; // Check playable for (int j = 0; j < num_data; ++j) { if (ptr[j]->area == i && info.board->can_play_nocheck(BLACK, xy_to_pos(ptr[j]->x, ptr[j]->y))) { black_playable = true; break; } } for (int j = 0; j < num_data; ++j) { if (ptr[j]->area == i && info.board->can_play_nocheck(WHITE, xy_to_pos(ptr[j]->x, ptr[j]->y))) { white_playable = true; break; } } if (DEBUG_PARITY) std::cout << " area" << i << '=' << count[i] << (black_playable?'B':'-') << (white_playable?'W':'-'); if (count[i] == 1) { // Hole with 1 empty if (black_playable && !white_playable) // Free move for black or force white to pass score += 8; else if (!black_playable && white_playable) // Free move for white or force black to pass score -= 8; else if (black_playable && white_playable) odd_up_for_grab++; } else if (count[i] & 1) { // Odd hole if (black_playable && !white_playable) // Force white to pass score += 4; else if (!black_playable && white_playable) // Force black to pass score -= 4; else if (black_playable && white_playable) odd_up_for_grab++; } else { // Even hole // Swindle analysis is done via searching // since playing swindle hole produces // one-empty hole with +/- 8 score if (black_playable && !white_playable) // Force white to pass but lose parity score += 1; else if (!black_playable && white_playable) // Force black to pass but lose parity score -= 1; } } else { // Hole with > 8 empties if (count[i] & 1) odd_up_for_grab++; } } if (odd_up_for_grab & 1) { // Odd number of holes left // Next player can take the last move if (player == BLACK) score += 4; else score -= 4; } else { // Odd number of holes left // Next player can take the last move if (player == BLACK) score -= 4; else score += 4; } if (DEBUG_PARITY) std::cout << " odd=" << odd_up_for_grab << " score=" << score << '\n'; return score; } int parity_eval(byte_board_info *board, int player) { search_info info; info.board = board; init_endgame_iterator(board, info.empties); return parity_eval_alpha_beta(info, player); } grhino-0.16.1/ghistwin.cc0000644000175000017500000002174711436423224015502 0ustar lerdsuwalerdsuwa/* ghistwin.cc GRhino Gnome Frontend History Window Copyright (c) 2005, 2006, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* #define GNOME_DISABLE_DEPRECATED #define GTK_DISABLE_DEPRECATED */ #include "config.h" #include #include #include "board.h" #include "game.h" #include "gutil.h" const #include "icon_empty.xpm" const #include "icon_black.xpm" const #include "icon_white.xpm" /************************************************************************* Tools menu - Game history *************************************************************************/ int gamehist_width, gamehist_height, gamehist_x, gamehist_y; GtkWidget *tree_view_history; GtkListStore *list_store_history; int list_store_size; extern GnomeUIInfo menu_tools_info[]; void game_history_fill() { static gchar m[NUM_MOVE][3]; // Enough space for A1 .. H8 and string // termination static gchar p[NUM_MOVE][3]; static const gchar *pos_table_x = "ABCDEFGH"; static const gchar *pos_table_y = "12345678"; static GdkPixbuf *color_table[3]; static GdkPixbuf *empty_player_pixbuf; static GdkPixbuf *black_player_pixbuf; static GdkPixbuf *white_player_pixbuf; static bool init = false; if (!init) { for (int i = 0; i < NUM_MOVE; ++i) { // String termination m[i][2] = '\0'; if (i+1 < 10) p[i][0] = ' '; else p[i][0] = (i+1)/10+'0'; p[i][1] = (i+1)%10+'0'; p[i][2] = '\0'; } int player_size = 12; empty_player_pixbuf = scale_pixbuf_from_xpm_data(const_cast(icon_empty_xpm), player_size, player_size); black_player_pixbuf = scale_pixbuf_from_xpm_data(const_cast(icon_black_xpm), player_size, player_size); white_player_pixbuf = scale_pixbuf_from_xpm_data(const_cast(icon_white_xpm), player_size, player_size); color_table[0] = white_player_pixbuf; color_table[2] = black_player_pixbuf; init = true; } GtkTreeIter iter; if (list_store_size == 0) { gtk_list_store_append(list_store_history, &iter); gtk_list_store_set(list_store_history, &iter, 0, 0, 1, " ", 2, empty_player_pixbuf, 3, _("Begin"), -1); ++list_store_size; } if (list_store_size < cur_game_info.num_history) for (int i = list_store_size; i < cur_game_info.num_history; ++i) { int pos = cur_game_info.move_history[i-1]; m[i-1][0] = pos_table_x[pos_to_x(pos)]; m[i-1][1] = pos_table_y[pos_to_y(pos)]; // WHITE (-1) => 0 // BLACK (1) => 2 GdkPixbuf *c = color_table[cur_game_info.player_history[i-1]+1]; gtk_list_store_append(list_store_history, &iter); gtk_list_store_set(list_store_history, &iter, 0, i, 1, p[i-1], 2, c, 3, m[i-1], -1); ++list_store_size; } else if (list_store_size > cur_game_info.num_history) { GtkTreePath *path = gtk_tree_path_new(); gtk_tree_path_append_index(path, cur_game_info.num_history); gtk_tree_model_get_iter(GTK_TREE_MODEL(list_store_history), &iter, path); gtk_tree_path_free(path); while (list_store_size > cur_game_info.num_history) { gtk_list_store_remove(list_store_history, &iter); --list_store_size; } } } void game_history_update(update_state_type u, void *) { switch (u) { case UPDATE_NONE: break; // Just update selection case UPDATE_BACKWARD: case UPDATE_FORWARD: game_history_fill(); break; case UPDATE_ALL: gtk_list_store_clear(list_store_history); list_store_size = 0; game_history_fill(); break; } GtkTreePath *path = gtk_tree_path_new(); if (view_mode == VIEW_MODE_HISTORY) gtk_tree_path_append_index(path, view_position); else gtk_tree_path_append_index(path, cur_game_info.num_history-1); GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view_history)); gtk_tree_selection_select_path(selection, path); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree_view_history), path, NULL, FALSE, 0, 0); gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view_history), path, NULL, FALSE); gtk_tree_path_free(path); // Scroll problem when scrollbar appears } gint game_history_configure_event(GtkWidget *widget, GdkEventConfigure *e, gpointer /*data*/) { gtk_window_get_position(GTK_WINDOW(widget), &gamehist_x, &gamehist_y); gamehist_width = e->width; gamehist_height = e->height; return FALSE; // Propagate signal to child so that it // can resize itself } void game_history_closed(GtkWidget *widget, GtkWidget **data) { update_move.remove(game_history_update, 0); gtk_widget_destroy(widget); *data = NULL; show_game_history = false; gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (menu_tools_info[3].widget), show_game_history); } void game_history_selected(GtkTreeSelection *selection, gpointer /*data*/) { GtkTreeIter iter; GtkTreeModel *model; if (gtk_tree_selection_get_selected(selection, &model, &iter)) { int pos; gtk_tree_model_get(model, &iter, 0, &pos, -1); if (pos != cur_game_info.num_history-1) { set_view_mode(VIEW_MODE_HISTORY); view_position = pos; view_player = cur_game_info.player_history[view_position]; *view_board_ptr = cur_game_info.board_history[view_position]; draw_board(); update_move.update(UPDATE_NONE); } else if (view_mode == VIEW_MODE_HISTORY) { // pos == cur_game_info.num_history-1 set_view_mode(VIEW_MODE_NONE); *view_board_ptr = *cur_game_info.board_ptr; draw_board(); update_move.update(UPDATE_NONE); } } } void game_history() { static GtkWidget *gamehist = NULL; if (gamehist) { if (show_game_history) gtk_window_present(GTK_WINDOW(gamehist)); else game_history_closed(gamehist, &gamehist); return; } if (!show_game_history) return; gamehist = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(gamehist), _("Game History")); gtk_container_set_border_width(GTK_CONTAINER(gamehist), 5); g_signal_connect(G_OBJECT(gamehist), "destroy", G_CALLBACK(game_history_closed), &gamehist); g_signal_connect(G_OBJECT(gamehist), "configure_event", G_CALLBACK(game_history_configure_event), NULL); // Reuse old list_store_history if (list_store_history) { gtk_list_store_clear(list_store_history); } else { list_store_history = gtk_list_store_new( 4, G_TYPE_INT, G_TYPE_STRING, G_TYPE_OBJECT, G_TYPE_STRING); } list_store_size = 0; GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); if (gamehist_x != -1 && gamehist_y != -1) gtk_window_move(GTK_WINDOW(gamehist), gamehist_x, gamehist_y); gtk_window_set_default_size(GTK_WINDOW(gamehist), gamehist_width, gamehist_height); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_ETCHED_IN); gtk_container_add(GTK_CONTAINER(gamehist), scroll); tree_view_history = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store_history)); GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL); // Right aligned GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes( "Number", renderer, "text", 1, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view_history), column); column = gtk_tree_view_column_new_with_attributes( "Color", gtk_cell_renderer_pixbuf_new(), "pixbuf", 2, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view_history), column); column = gtk_tree_view_column_new_with_attributes( "Move", gtk_cell_renderer_text_new(), "text", 3, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view_history), column); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view_history), FALSE); // This may cause lots of flicker gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_view_history), TRUE); GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view_history)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); gtk_container_add(GTK_CONTAINER(scroll), tree_view_history); game_history_fill(); update_move.add(game_history_update, 0); gtk_widget_show_all(gamehist); game_history_update(UPDATE_NONE, 0); // Highlight current view // Start tracking user selection g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(game_history_selected), NULL); } grhino-0.16.1/diag4.bin0000600000175000017500000000457611436423224015012 0ustar lerdsuwalerdsuwagrhino-0.16.1/right.xpm0000644000175000017500000001714111436423225015174 0ustar lerdsuwalerdsuwa/* XPM */ static char * right_xpm[] = { "20 320 3 1", " c None", ". c #000000", "+ c #C3C3C3", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++", ".+++++++++++++++++++"}; grhino-0.16.1/left.xcf0000644000175000017500000000613011436423225014761 0ustar lerdsuwalerdsuwagimp xcf file@BB/ gimp-commentCreated with The GIMP @ New Layer     H@h @e'UqU8qUq8U88Uq88qU8qUUU qq8UU8UUUqq  q8UUUUq U8U8q8UU8Uqqq8qqq8UU8UUq q8q8qUU8qU8qU8UU8U8888U P(@ Background      @ 4 @ L@    ( P(grhino-0.16.1/parity.h0000644000175000017500000000176111436423225015013 0ustar lerdsuwalerdsuwa/* parity.h Parity Calculation Copyright (c) 2003, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef PARITY_H #define PARITY_H #include "board.h" #include "alphabeta.h" int parity_eval_alpha_beta(search_info &info, int player); int parity_eval(byte_board_info *board, int player); #endif /* PATTERN_H */ grhino-0.16.1/gtp.h0000644000175000017500000000406111436423224014270 0ustar lerdsuwalerdsuwa/* gtp-rhino.h GRhino GTP Frontend Copyright (c) 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GTP_H #define GTP_H #include class id_error {}; class command_error {}; class syntax_error {}; class command_quit {}; class io_error {}; void input_char(char &c); void output_char(char c); void output_flush(); void input_line(std::string &str); void output_line(const std::string &str); void output_line(const char *str); size_t parse_id(const std::string &str, bool &has_id, unsigned &id); size_t skip_space(const std::string &str, size_t i); size_t skip_non_space(const std::string &str, size_t i); size_t read_unsigned(const std::string &str, size_t i, unsigned &num); size_t read_float(const std::string &str, size_t i, double &num); size_t read_color(const std::string &str, size_t i, int &color); void throw_command_error_if_end_of_line(const std::string &str, size_t i); void throw_syntax_error_if_end_of_line(const std::string &str, size_t i); void throw_if_extra_argument(const std::string &str, size_t i); void output_response(const std::string &str, bool has_id, unsigned id); void output_error(const std::string &str, bool has_id, unsigned id); bool process_unsigned_option(int argc, char *argv[], const std::string &arg, int &i, const std::string &short_name, const std::string &long_name, unsigned min, unsigned max, unsigned &val); #endif /* GTP_H */ grhino-0.16.1/grhino.png0000644000175000017500000000772711436423224015335 0ustar lerdsuwalerdsuwaPNG  IHDR00WbKGDT?ؓ*? pHYs  tIME 0 QdIDATh͚{g]?y9잳={.()#T$!" QEQ!AŘ@/D%b[kivg9sy/󏙳]2HLx̼]x2YjFL};Q 筃Ā4Ճ%09 q a|[LVk$oHy mB̋')W7$-5yz_ߩ(m#!kǣ;lVǮN%iK{>"NM͏~QwŲO Z~FӡK9E!仲G SDZQ` pN,}%sɿY-' hks}Q=jҲMr]``/usF!,pD Ȳh, @ OЈ `U#`PŅn4i491wɓ.TAK8nJ)XɎuC+{B@kM9_Kk%3كcUDC%'^8]â % Jմf-ҸNi,e/ sa9a#؎WMnL8{&Ed$91X{";}wحh)Eb8+b:(jء(DJ/?iQ>(|5ܙ[s-Gt˼Ԟxmw=ޅN&BÅPEg E{3T%'M`y*i*1`P L)5- ,"QN؆'DF!C` .0/ *% N?+Ct%y.x* B(Ae*HH' >G$afF^(: A0s0@Qi̬ӕ) 3Ӽ\\*s2cB@dʖ^x)B9ZdzP)B!bzw[Vgnp2P?;tGvafmaB=>FTGgO0Gytn<YX9!w$/wEy1xָ)˻k^89=s,'<˴_rbyIbtc$c#JT+\1&"z\QOz^#_gAeZD vp:(|\}<;(;(hv5/?/ KdqMpvc @yYY:82echi.FRBe.sF)FTJuMP[]#2h+5bL aY*7X+s.q/⮝gu5`YQ2bc2WAa Wh~.ed³bfP@kĈX.,u z" #include #include #if 0 class fdoutbuf : public std::streambuf { int fd; public: fdoutbuf(int _fd) : fd(_fd) {} protected: virtual int_type overflow(int_type c = std::char_traits::eof()) { if (c != EOF) { char z = c; if (write(fd, &z, 1) != 1) return EOF; } return c; } virtual std::streamsize xsputn(const char *s, std::streamsize n) { return write(fd, s, n); } }; class fdostream : private fdoutbuf, public std::ostream { public: fdostream(int fd) : fdoutbuf(fd), std::ostream(this) {} }; #endif /* 0 */ #endif /* __K_FDSTREAM_H */ grhino-0.16.1/book.cc0000644000175000017500000001432611436423224014573 0ustar lerdsuwalerdsuwa/* book.cc Open book database Copyright (c) 2001, 2002, 2003, 2004, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "binfile.h" #include "book.h" #include "order.h" #include "proginfo.h" #include "rand.h" #include "gtstream.h" #include #include #include #include #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) (x) #define BOOK_FILE "book.bin" #define BOOK_DATA_FILE "book.raw" struct book_next { int pos; int index; book_next(int pos_ = 0, int index_ = 0) : pos(pos_), index(index_) {} }; struct book_node { std::vector next; }; // Book is normalized so that the first move is C4. typedef std::vector book_move_info; typedef std::vector book_info; int symmetry_identity[64] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 }; int symmetry_transpose[64] = { 0, 8, 16, 24, 32, 40, 48, 56, 1, 9, 17, 25, 33, 41, 49, 57, 2, 10, 18, 26, 34, 42, 50, 58, 3, 11, 19, 27, 35, 43, 51, 59, 4, 12, 20, 28, 36, 44, 52, 60, 5, 13, 21, 29, 37, 45, 53, 61, 6, 14, 22, 30, 38, 46, 54, 62, 7, 15, 23, 31, 39, 47, 55, 63 }; int symmetry_rotate[64] = { 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; int symmetry_rotate_transpose[64] = { 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 59, 51, 43, 35, 27, 19, 11, 3, 58, 50, 42, 34, 26, 18, 10, 2, 57, 49, 41, 33, 25, 17, 9, 1, 56, 48, 40, 32, 24, 16, 8, 0 }; const char *get_book_file() { if (get_use_private_files()) return BOOK_FILE; else return BOOK_PATH BOOK_FILE; } const char *get_book_data_file() { if (get_use_private_files()) return BOOK_DATA_FILE; else return BOOK_PATH BOOK_DATA_FILE; } symmetry_type get_symmetry(int first_move) { switch(first_move) { case C4: return symmetry_identity; case D3: return symmetry_transpose; case E6: return symmetry_rotate_transpose; case F5: return symmetry_rotate; default: abort(); } } book_info book; int book_depth; static size_t book_random = 0; void book_init() { binary_file_input b(get_book_file()); book_depth = b.read_int_compress(); for (int i = 0; i < book_depth; ++i) { book.push_back(book_move_info()); } for (int i = 0; i < book_depth; ++i) { int num_entry = b.read_int_compress(); for (int j = 0; j < num_entry; ++j) { book_node *n = new book_node; int next_moves = b.read_unsigned_char(); for (int k = 0; k < next_moves; ++k) { int pos = b.read_unsigned_char(); int index; if (i != book_depth-1) index = b.read_int_compress(); else index = 0; n->next.push_back(book_next(pos, index)); } book[i].push_back(n); } } // Check EOF Marker if (b.read_int() != 12345) { gtstream bufstr; gtout(bufstr, _("invalid file format in %$\n")) << get_book_file(); throw std::runtime_error(bufstr.str()); } } void set_book_random(size_t r) { book_random = r; } size_t get_book_random() { return book_random; } int book_random_index(size_t size) { switch (book_random) { case 5: // Very high if (size > 3) { // 9:7:5:3 ratio int i = get_random(24); return (i < 9) ? 0 : ((i < 16) ? 1 : ((i < 21) ? 2 : 3)); } // Fall through case 4: // High if (size > 2) { // 7:5:3 ratio int i = get_random(15); return (i < 7) ? 0 : ((i < 12) ? 1 : 2); } // Fall through case 3: // Medium if (size > 2) { // 5:3:1 ratio int i = get_random(9); return (i < 5) ? 0 : ((i < 8) ? 1 : 2); } // Fall through case 2: // Low if (size > 1) { // 3:1 ratio int i = get_random(4); return (i < 3) ? 0 : 1; } // Fall through case 1: // Very low if (size > 1) { // 5:1 ratio int i = get_random(6); return (i < 5) ? 0 : 1; } // Fall through } // None return 0; } int book_move(byte_board_info *board, int move_history[NUM_MOVE+1], int player_history[NUM_MOVE+1]) { if (board->get_num_move() < 0 || board->get_num_move() >= book_depth+1) return POS_INVALID; if (board->get_num_move() == 0) { int i = get_random(4); switch (i) { case 0: return C4; case 1: return D3; case 2: return E6; case 3: return F5; } } symmetry_type sym = get_symmetry(move_history[0]); int index = 0; // Required for second move int move_left = board->get_num_move() -1; for (int i = 0; i < book_depth; ++i, --move_left) { // Need to pass if (player_history[i] == player_history[i+1]) return POS_INVALID; // Found if (move_left == 0) { if (book[i][index]->next.size() == 0) return POS_INVALID; int idx = book_random_index(book[i][index]->next.size()); //std::cout << book_random << ' ' << book[i][index]->next.size() << ' ' << idx << '\n'; return sym[book[i][index]->next[idx].pos]; } int pos = sym[move_history[i+1]]; int num = book[i][index]->next.size(); int j = 0; for ( ; j < num; ++j) { if (book[i][index]->next[j].pos == pos) { index = book[i][index]->next[j].index; break; } } if (j == num) return POS_INVALID; } return POS_INVALID; } grhino-0.16.1/bitboard.h0000644000175000017500000000455111436423224015270 0ustar lerdsuwalerdsuwa/* bitboard.h Game Board Operations for BitBoard Copyright (c) 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef BITBOARD_H #define BITBOARD_H #include "config.h" #include "board.h" struct bit_board_type { int black[2]; // Row 1-4, 5-8 int white[2]; // Row 1-4, 5-8 }; extern bit_board_type bit_board_begin; inline int pos_to_index_pos(int pos) { return pos / 32; } inline int pos_to_bit_pos(int pos) { return pos % 32; } inline int xy_to_index_pos(int x, int y) { return y / 4; } inline int xy_to_bit_pos(int x, int y) { return (y % 4) * 8 + x; } int count_bits(int x); struct bit_board_info { private: char move; public: bit_board_type board; int hash; bit_board_info(); bit_board_info(const bit_board_type *board_init); bit_board_info& operator=(const bit_board_type *board_init); bit_board_info& operator=(const bit_board_info &src); bool is_empty(int x, int y) const { int mask = 0x80000000 >> xy_to_bit_pos(x, y); int index_pos = xy_to_index_pos(x, y); return ((board.black[index_pos] | board.white[index_pos]) & mask) == 0; } bool is_empty(int pos) const { int mask = 0x80000000 >> pos_to_bit_pos(pos); int index_pos = pos_to_index_pos(pos); return ((board.black[index_pos] | board.white[index_pos]) & mask) == 0; } int board_black_score() const { return count_bits(board.black[0])+count_bits(board.black[1]); } int board_white_score() const { return count_bits(board.white[0])+count_bits(board.white[1]); } int board_diff_score() const { return board_black_score(board) - board_white_score(board); } }; bool operator==(const bit_board_info &board1, const bit_board_info &board2); #endif /* BITBOARD_H */ grhino-0.16.1/alphabeta.cc0000644000175000017500000004656311436423224015572 0ustar lerdsuwalerdsuwa/* alphabeta.cc Alpha-Beta Pruning Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "boardio.h" #include "hash.h" #include "alphabeta.h" #include "iter.h" #include "pattern.h" #include "parity.h" #include #include #include #include #include using namespace std; /************************************************************************* Evaluator randomness *************************************************************************/ static int randomness = 0; static int randomness_mod = 1; const bool DEBUG_ALPHA_BETA = false; ofstream *debug_stream; int debug_indent = 0; string debug_file; void set_eval_random(int r) { randomness = r; randomness_mod = 2 * r + 1; } int get_eval_random() { return randomness; } inline int get_random() { if (randomness) return (rand() % randomness_mod) - randomness; else return 0; } /************************************************************************* Mid game strategy *************************************************************************/ class midgame_strategy { public: static int board_score(search_info &info, int player) { pthread_testcancel(); if (info.board->board_black_score() == 0 || info.board->board_white_score() == 0) return end_board_score(info); return pattern_eval(info.board) + parity_eval_alpha_beta(info, player); } static int end_board_score(search_info &info) { pthread_testcancel(); int score = info.board->board_diff_score(); if (score > 0) return MAX_SCORE-1; // Required to store move for alphabeta else if (score < 0) return MIN_SCORE+1; // Required to store move for alphabeta return 0; } static void log_position(int /*pos*/) {} typedef midgame_strategy next_strategy; typedef board_endgame_iterator iterator; }; /************************************************************************* End game strategy *************************************************************************/ class endgame_strategy { public: static int board_score(search_info &info, int /*player*/) { pthread_testcancel(); return info.board->board_diff_score(); } static int end_board_score(search_info &info) { pthread_testcancel(); return info.board->board_diff_score(); } static void log_position(int /*pos*/) {} typedef endgame_strategy next_strategy; typedef board_endgame_iterator iterator; }; /************************************************************************* Mid game strategy with randomness *************************************************************************/ class midgame_strategy_with_random { public: static int board_score(search_info &info, int player) { pthread_testcancel(); if (info.board->board_black_score() == 0 || info.board->board_white_score() == 0) return end_board_score(info); return get_random() + pattern_eval(info.board) + parity_eval_alpha_beta(info, player); } static int end_board_score(search_info &info) { pthread_testcancel(); int score = info.board->board_diff_score()+get_random(); if (score > 0) return MAX_SCORE-1; // Required to store move for alphabeta else if (score < 0) return MIN_SCORE+1; // Required to store move for alphabeta return 0; } static void log_position(int /*pos*/) {} typedef midgame_strategy_with_random next_strategy; typedef board_endgame_iterator iterator; }; /************************************************************************* End game strategy with randomness *************************************************************************/ class endgame_strategy_with_random { public: static int board_score(search_info &info, int /*player*/) { pthread_testcancel(); return info.board->board_diff_score()+get_random(); } static int end_board_score(search_info &info) { pthread_testcancel(); return info.board->board_diff_score()+get_random(); } static void log_position(int /*pos*/) {} typedef endgame_strategy_with_random next_strategy; typedef board_endgame_iterator iterator; }; /************************************************************************* Alpha-beta pruning *************************************************************************/ static byte_board_info board_buffer[NUM_MOVE]; // color = color to play template int temp_alpha_beta(search_info &info, int alpha, int beta, int color, int depth, int *store_pos = 0) { static int dir_count[NUM_DIR]; if (DEBUG_ALPHA_BETA) print_board(*debug_stream, info.board, debug_indent); int move = info.board->get_num_move(); if (move == NUM_MOVE) { int score = info.board->board_diff_score(); if (DEBUG_ALPHA_BETA) { print_indent(*debug_stream, debug_indent); *debug_stream << "*** Diff score " << score << "***\n"; } return score; } if (depth <= 0 && !store_pos) { int score = strategy::board_score(info, color); if (DEBUG_ALPHA_BETA) { print_indent(*debug_stream, debug_indent); *debug_stream << "*** Leaf score " << score << "***\n"; } return score; } depth--; int a = alpha, b = beta; typename strategy::iterator iter(info.empties); // move >= 0 && move <= 59 byte_board_info *board_new = board_buffer+move; int best_pos = POS_PASS, last_pos = POS_PASS; trans_board *t = 0; // FIXME: Disable caching for now since // pruned score may be stored instead of // real one if (!store_pos) { t = get_hash_board(info.board, color); // if (t && t->score != INVALID_SCORE) // return t->score; } if (color == BLACK) { // Max black's score iter.init_pos(); // FIXME: Optimize speed int max_a = MIN_SCORE; do { if (info.board->can_play(color, iter.pos, dir_count)) { strategy::log_position(iter.pos); last_pos = iter.pos; if (DEBUG_ALPHA_BETA) { *debug_stream << '\n'; print_indent(*debug_stream, debug_indent); *debug_stream << "Player BLACK Move "; print_pos(*debug_stream, iter.pos); *debug_stream << '\n'; debug_indent += 4; } *board_new = *info.board; board_new->place_piece(color, iter.pos, dir_count); byte_board_info *save_board = info.board; info.board = board_new; iter.remove_current(); int new_a = temp_alpha_beta (info, a, b, WHITE, depth); iter.restore_current(); info.board = save_board; if (DEBUG_ALPHA_BETA) { debug_indent -= 4; print_indent(*debug_stream, debug_indent); *debug_stream << "Score " << new_a << '\n'; } if (new_a > a) { a = new_a; max_a = new_a; best_pos = iter.pos; if (a >= b) break; } else if (new_a > max_a) { max_a = new_a; best_pos = iter.pos; } } } while (iter.next()); if (last_pos != POS_PASS) { // At least one valid moves // found if (store_pos) { *store_pos = best_pos; } store_hash_board(t, max_a); return a; } else if (info.board->can_play(switch_color(color))) { // FIXME: Optimize speed // Have to pass. // Game not over yet. if (store_pos) { *store_pos = POS_PASS; } if (DEBUG_ALPHA_BETA) { *debug_stream << '\n'; print_indent(*debug_stream, debug_indent); *debug_stream << "Player BLACK PASS\n"; debug_indent += 4; } int score = temp_alpha_beta (info, a, b, switch_color(color), depth+1, 0); store_hash_board(t, score); if (DEBUG_ALPHA_BETA) { debug_indent -= 4; } return score; } else { // No one can play. Game over if (store_pos) { *store_pos = POS_PASS; } int score = strategy::end_board_score(info); store_hash_board(t, score); return score; } } else { // Min black's score iter.init_pos(); int min_b = MAX_SCORE; do { if (info.board->can_play(color, iter.pos, dir_count)) { strategy::log_position(iter.pos); last_pos = iter.pos; if (DEBUG_ALPHA_BETA) { *debug_stream << '\n'; print_indent(*debug_stream, debug_indent); *debug_stream << "Player WHITE Move "; print_pos(*debug_stream, iter.pos); *debug_stream << '\n'; debug_indent += 4; } *board_new = *info.board; board_new->place_piece(color, iter.pos, dir_count); byte_board_info *save_board = info.board; info.board = board_new; iter.remove_current(); int new_b = temp_alpha_beta (info, a, b, BLACK, depth); iter.restore_current(); info.board = save_board; if (DEBUG_ALPHA_BETA) { debug_indent -= 4; print_indent(*debug_stream, debug_indent); *debug_stream << "Score " << new_b << '\n'; } if (new_b < b) { b = new_b; min_b = new_b; best_pos = iter.pos; if (a >= b) break; } else if (new_b < min_b) { min_b = new_b; best_pos = iter.pos; } } } while (iter.next()); if (last_pos != POS_PASS) { // At least one valid moves // found if (store_pos) { *store_pos = best_pos; } store_hash_board(t, min_b); return b; } else if (info.board->can_play(switch_color(color))) { // Have to pass. // Game not over yet. if (store_pos) { *store_pos = POS_PASS; } if (DEBUG_ALPHA_BETA) { *debug_stream << '\n'; print_indent(*debug_stream, debug_indent); *debug_stream << "Player WHITE PASS\n"; debug_indent += 4; } int score = temp_alpha_beta (info, a, b, switch_color(color), depth+1, 0); store_hash_board(t, score); if (DEBUG_ALPHA_BETA) { debug_indent -= 4; } return score; } else { // No one can play. Game over if (store_pos) { *store_pos = POS_PASS; } int score = strategy::end_board_score(info); store_hash_board(t, score); return score; } } } // color = color to play template int temp_alpha_beta_new(search_info &info, int alpha, int beta, int color, int depth, int *store_pos = 0) { static int dir_count[NUM_DIR]; if (DEBUG_ALPHA_BETA) print_board(*debug_stream, info.board, debug_indent); int move = info.board->get_num_move(); if (move == NUM_MOVE) { int score = info.board->board_diff_score(); if (DEBUG_ALPHA_BETA) { print_indent(*debug_stream, debug_indent); *debug_stream << "*** Diff score " << score << "***\n"; } return score; } if (depth <= 0 && !store_pos) { int score = strategy::board_score(info, color); if (DEBUG_ALPHA_BETA) { print_indent(*debug_stream, debug_indent); *debug_stream << "*** Leaf score " << score << "***\n"; } return score; } depth--; int a = alpha, b = beta; typename strategy::iterator iter(info.empties); // move >= 0 && move <= 59 byte_board_info *board_new = board_buffer+move; int best_pos = POS_PASS, last_pos = POS_PASS; trans_board *t = 0; // FIXME: Disable caching for now since // pruned score may be stored instead of // real one if (!store_pos) { t = get_hash_board(info.board, color); if (t && t->score != INVALID_SCORE) return t->score; } if (color == BLACK) { // Max black's score iter.init_pos(); // FIXME: Optimize speed int max_a = MIN_SCORE; do { if (info.board->can_play(color, iter.pos, dir_count)) { strategy::log_position(iter.pos); last_pos = iter.pos; if (DEBUG_ALPHA_BETA) { *debug_stream << '\n'; print_indent(*debug_stream, debug_indent); *debug_stream << "Player BLACK Move "; print_pos(*debug_stream, iter.pos); *debug_stream << '\n'; debug_indent += 4; } *board_new = *info.board; board_new->place_piece(color, iter.pos, dir_count); byte_board_info *save_board = info.board; info.board = board_new; iter.remove_current(); int new_a = temp_alpha_beta (info, a, b, WHITE, depth); iter.restore_current(); info.board = save_board; if (DEBUG_ALPHA_BETA) { debug_indent -= 4; print_indent(*debug_stream, debug_indent); *debug_stream << "Score " << new_a << '\n'; } if (new_a > a) { a = new_a; max_a = new_a; best_pos = iter.pos; if (a >= b) break; } else if (new_a > max_a) { max_a = new_a; best_pos = iter.pos; } } } while (iter.next()); if (last_pos != POS_PASS) { // At least one valid moves // found if (store_pos) { *store_pos = best_pos; } store_hash_board(t, max_a); return a; } else if (info.board->can_play(switch_color(color))) { // FIXME: Optimize speed // Have to pass. // Game not over yet. if (store_pos) { *store_pos = POS_PASS; } if (DEBUG_ALPHA_BETA) { *debug_stream << '\n'; print_indent(*debug_stream, debug_indent); *debug_stream << "Player BLACK PASS\n"; debug_indent += 4; } int score = temp_alpha_beta (info, a, b, switch_color(color), depth+1, 0); store_hash_board(t, score); if (DEBUG_ALPHA_BETA) { debug_indent -= 4; } return score; } else { // No one can play. Game over if (store_pos) { *store_pos = POS_PASS; } int score = strategy::end_board_score(info); store_hash_board(t, score); return score; } } else { // Min black's score iter.init_pos(); int min_b = MAX_SCORE; do { if (info.board->can_play(color, iter.pos, dir_count)) { strategy::log_position(iter.pos); last_pos = iter.pos; if (DEBUG_ALPHA_BETA) { *debug_stream << '\n'; print_indent(*debug_stream, debug_indent); *debug_stream << "Player WHITE Move "; print_pos(*debug_stream, iter.pos); *debug_stream << '\n'; debug_indent += 4; } *board_new = *info.board; board_new->place_piece(color, iter.pos, dir_count); byte_board_info *save_board = info.board; info.board = board_new; iter.remove_current(); int new_b = temp_alpha_beta (info, a, b, BLACK, depth); iter.restore_current(); info.board = save_board; if (DEBUG_ALPHA_BETA) { debug_indent -= 4; print_indent(*debug_stream, debug_indent); *debug_stream << "Score " << new_b << '\n'; } if (new_b < b) { b = new_b; min_b = new_b; best_pos = iter.pos; if (a >= b) break; } else if (new_b < min_b) { min_b = new_b; best_pos = iter.pos; } } } while (iter.next()); if (last_pos != POS_PASS) { // At least one valid moves // found if (store_pos) { *store_pos = best_pos; } store_hash_board(t, min_b); return b; } else if (info.board->can_play(switch_color(color))) { // Have to pass. // Game not over yet. if (store_pos) { *store_pos = POS_PASS; } if (DEBUG_ALPHA_BETA) { *debug_stream << '\n'; print_indent(*debug_stream, debug_indent); *debug_stream << "Player WHITE PASS\n"; debug_indent += 4; } int score = temp_alpha_beta (info, a, b, switch_color(color), depth+1, 0); store_hash_board(t, score); if (DEBUG_ALPHA_BETA) { debug_indent -= 4; } return score; } else { // No one can play. Game over if (store_pos) { *store_pos = POS_PASS; } int score = strategy::end_board_score(info); store_hash_board(t, score); return score; } } } /************************************************************************* Entry for alpha-beta code *************************************************************************/ int midgame_alpha_beta(search_info &info, int alpha, int beta, int color, int depth, int *store_pos) { if (get_eval_random()) return temp_alpha_beta (info, alpha, beta, color, depth, store_pos); else return temp_alpha_beta (info, alpha, beta, color, depth, store_pos); } int endgame_alpha_beta(search_info &info, int alpha, int beta, int color, int depth, int *store_pos) { if (get_eval_random()) return temp_alpha_beta (info, alpha, beta, color, depth, store_pos); else return temp_alpha_beta (info, alpha, beta, color, depth, store_pos); } /************************************************************************* Mid game parameter *************************************************************************/ static int midgame_depth; void set_midgame_depth(int depth) { midgame_depth = depth; } /************************************************************************* Control hashed data flushing *************************************************************************/ // FIXME last_eval not thread-safe enum last_eval_type { last_eval_none, last_eval_midgame, last_eval_winlossdraw, last_eval_endgame } last_eval; void eval_new_game() { last_eval = last_eval_none; } int eval_midgame(byte_board_info *board, int color, int *store_pos) { // Don't cache results from previous move free_hash_all_move(); last_eval = last_eval_midgame; search_info info; info.board = board; init_endgame_iterator(board, info.empties); if (DEBUG_ALPHA_BETA) { debug_indent = 0; debug_file = "midgame-"; debug_file += (board->get_num_move()/10 + '0'); debug_file += (board->get_num_move()%10 + '0'); debug_file += ".log"; debug_stream = new ofstream(debug_file.c_str()); } int score = midgame_alpha_beta(info, MIN_SCORE, MAX_SCORE, color, midgame_depth, store_pos); if (DEBUG_ALPHA_BETA) delete debug_stream; return score; } int eval_endgame(byte_board_info *board, int color, int *store_pos) { // if (last_eval != last_eval_endgame) { free_hash_all_move(); // last_eval = last_eval_endgame; // } search_info info; info.board = board; init_endgame_iterator(board, info.empties); if (DEBUG_ALPHA_BETA) { debug_indent = 0; debug_file = "endgame-"; debug_file += (board->get_num_move()/10 + '0'); debug_file += (board->get_num_move()%10 + '0'); debug_file += ".log"; debug_stream = new ofstream(debug_file.c_str()); } int score = endgame_alpha_beta(info, MIN_SCORE, MAX_SCORE, color, 30, store_pos); if (DEBUG_ALPHA_BETA) delete debug_stream; return score; } int eval_winlossdraw(byte_board_info *board, int color, int *store_pos, double komi) { // if (last_eval != last_eval_winlossdraw) { free_hash_all_move(); // last_eval = last_eval_winlossdraw; // } search_info info; info.board = board; init_endgame_iterator(board, info.empties); if (DEBUG_ALPHA_BETA) { debug_indent = 0; debug_file = "wld-"; debug_file += (board->get_num_move()/10 + '0'); debug_file += (board->get_num_move()%10 + '0'); debug_file += ".log"; debug_stream = new ofstream(debug_file.c_str()); } int score = endgame_alpha_beta(info, static_cast(komi - 1), static_cast(komi + 1), color, 30, store_pos); if (DEBUG_ALPHA_BETA) delete debug_stream; return score; } grhino-0.16.1/corner5x2.bin0000600000175000017500000220123211436423224015637 0ustar lerdsuwalerdsuwa@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@grhino-0.16.1/desktop/0000755000175000017500000000000011436423224014775 5ustar lerdsuwalerdsuwagrhino-0.16.1/desktop/grhino.desktop.in0000644000175000017500000000042311436423224020262 0ustar lerdsuwalerdsuwa[Desktop Entry] Name=GRhino GenericName=GTP-compliant Reversi game Comment=Reversi game for GNOME, supporting the Go/Game Text Protocol Exec=grhino Icon=grhino.png Terminal=false Type=Application Version=0.16.1 Categories=Application;GNOME;Game;BoardGame; StartupNotify=true grhino-0.16.1/rand.cc0000644000175000017500000000227311436423225014564 0ustar lerdsuwalerdsuwa/* rand.cc Random number generator Copyright (c) 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "rand.h" #include bool is_random = true; // Random 0 .. num-1 int get_random(int num) { if (!is_random) return 0; int r = rand(); // Cast num to double to avoid overflow // during multiplication int a = static_cast(static_cast(num) * r/(RAND_MAX+1.0)); return a; } void random_on() { is_random = true; } void random_off() { is_random = false; } grhino-0.16.1/diag3.bin0000600000175000017500000001617211436423224015004 0ustar lerdsuwalerdsuwagrhino-0.16.1/log_proc.h0000644000175000017500000003511311436423225015305 0ustar lerdsuwalerdsuwa/* log_proc.h Log file processing Copyright (c) 2001, 2002, 2004, 2005, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include #include #include #include "board.h" #include "order.h" #include "proginfo.h" #include "gtstream.h" #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x struct game_log { int move_queue[60]; int move_queue_color[60]; int time_queue[60]; // Unit 0.01 sec int num_move_queue; int time_pass_queue[60]; int num_pass_queue; byte_board_info board; int black_score; int white_score; bool timeout; bool resign; bool mutual; enum game_format { format_IOS, format_GGS }; game_format format; game_log(int bs, int ws): num_move_queue(0), num_pass_queue(0), board(), black_score(bs), white_score(ws), timeout(false), resign(false), mutual(false) {} void copy_board(const byte_board_type *b) { board = b; } void copy_board(const byte_board_info &b) { board = b; } void push_move(int pos, int color, int time = 0) { move_queue[num_move_queue] = pos; move_queue_color[num_move_queue] = color; time_queue[num_move_queue] = time; num_move_queue++; } void push_pass(int time) { time_pass_queue[num_pass_queue] = time; num_pass_queue++; } void reset_move() { num_move_queue = 0; } void set_random() {} void set_black_name(const std::string&, int /*idx*/, int /*len*/) {} void set_white_name(const std::string&, int /*idx*/, int /*len*/) {} }; #define VAL_BLANK -1 #define VAL_WHITE -2 #define VAL_BLACK -3 inline int from_ascii(const std::string &s, int i) { if (s[i] == ' ') { if (s[i+1] == ' ') return VAL_BLANK; else return s[i+1]-'0'; } else if (s[i] == '(' && s[i+1] == ')') return VAL_WHITE; else if (s[i] == '#' && s[i+1] == '#') return VAL_BLACK; else { return (s[i]-'0')*10 + s[i+1]-'0'; } } template void process_line_IOS(const std::string &s, T &t, bool need_end) { int black_score = from_ascii(s, 22); int white_score = from_ascii(s, 48); bool timeout = false; bool resign = false; if (s[11] == 't') timeout = true; else if (s[11] == 'r') resign = true; if (s[11] != 'e' && need_end) // Game not properly ended return; // Old IOS format if (s[65] == '+') { int index = 65; game_log_T game(black_score, white_score); game.format = game_log::format_IOS; if (timeout) game.timeout = true; if (resign) game.resign = true; game.copy_board(&board_begin); game.set_black_name(s, 13, 8); game.set_white_name(s, 39, 8); do { int player = (s[index] == '+') ? BLACK : WHITE; int ipos = from_ascii(s, index+1); int pos = xy_to_pos(ipos/10 -1, ipos%10 -1); game.push_move(pos, player); index += 3; } while (s[index] == '+' || s[index] == '-'); process_game(t, game); } // Old IOS format, resigned game else if (s[66] == '+') ; // Old IOS format with 'K' else if (s[65] == 'K' && s[70] == '+') { int index = 70; game_log_T game(black_score, white_score); game.format = game_log::format_IOS; if (timeout) game.timeout = true; if (resign) game.resign = true; game.copy_board(&board_begin); game.set_black_name(s, 13, 8); game.set_white_name(s, 39, 8); do { int player = (s[index] == '+') ? BLACK : WHITE; int ipos = from_ascii(s, index+1); int pos = xy_to_pos(ipos/10 -1, ipos%10 -1); game.push_move(pos, player); index += 3; } while (s[index] == '+' || s[index] == '-'); process_game(t, game); } // New IOS format else if (s[65] == 'K' && s[72] == ' ') { byte_board_type init_board; int num_move_queue = 0; int move_queue[60]; int index = 73; // New IOS format support random games // Setup the initial board for (int pos = 0; pos < 64; ++pos, index += 2) { int val = from_ascii(s, index); switch (val) { case VAL_WHITE: init_board[pos] = WHITE; break; case VAL_BLACK: init_board[pos] = BLACK; break; case VAL_BLANK: init_board[pos] = EMPTY; break; default: init_board[pos] = EMPTY; move_queue[val-1] = pos; num_move_queue++; } } byte_board_info board(&init_board); bool random = false; if (board.get_num_move() == 0) { if (init_board[D4] != WHITE) return; if (init_board[D5] != BLACK) return; if (init_board[E4] != BLACK) return; if (init_board[E5] != WHITE) return; } else random = true; // Scores will be filled later game_log_T game(0, 0); game.format = game_log::format_IOS; if (timeout) game.timeout = true; if (resign) game.resign = true; game.copy_board(board); if (random) game.set_random(); game.set_black_name(s, 13, 8); game.set_white_name(s, 39, 8); // Assume that black moves first int init_player = BLACK; int player = init_player; int i; for (i = 0; i < num_move_queue; ++i) { // Fail, wrong assumption about to get // the first move if (!board.can_play(player, move_queue[i])) { break; } game.push_move(move_queue[i], player); board.place_piece(player, move_queue[i]); if (board.can_play(switch_color(player))) player = switch_color(player); } if (i == num_move_queue) { black_score = board.board_black_score(); white_score = board.board_white_score(); adjust_score(black_score, white_score); } else { // Assume that white moves first game.reset_move(); board = game.board; init_player = WHITE; player = init_player; for (int i = 0; i < num_move_queue; ++i) { if (!board.can_play(player, move_queue[i])) abort(); game.push_move(move_queue[i], player); board.place_piece(player, move_queue[i]); if (board.can_play(switch_color(player))) player = switch_color(player); } black_score = board.board_black_score(); white_score = board.board_white_score(); adjust_score(black_score, white_score); } // Now collect pattern info game.black_score = black_score; game.white_score = white_score; process_game(t, game); } } // Input i = position after "(;" // Return position after ";)" or -1 upon error template int process_game_GGS(const std::string &s, int i, T &t, bool need_end, int /*game_number*/) { byte_board_type init_board; int size = s.size(); bool result = false; // No result yet // Scores will be filled later game_log_T game(0, 0); game.format = game_log::format_GGS; try { while (i < size) { char c1 = s.at(i); char c2 = s.at(i+1); if (c1 == ';' && c2 == ')') { // No result ??? if (!result) return -1; process_game(t, game); return i+2; } char c3 = s.at(i+2); // At least 3 chars needed // Sorted according to // order of appearance if (c1 == 'G' && c2 == 'M' && c3 == '[') { i += 3; if (s.compare(i, 8, "Othello]")) return -1; i += 8; } else if (c1 == 'P' && c2 == 'B' && c3 == '[') { i += 3; int j = i; while (s.at(i) != ']') i++; game.set_black_name(s, j, i-j); i++; } else if (c1 == 'P' && c2 == 'W' && c3 == '[') { i += 3; int j = i; while (s.at(i) != ']') i++; game.set_white_name(s, j, i-j); i++; } else if (c1 == 'T' && c2 == 'Y' && c3 == '[') { i += 3; char c; bool found8 = false; while ((c = s.at(i)) != ']') { if (c == 'a') // Anti game return -1; else if (c == '8') { if (found8) // 88 game return -1; else found8 = true; i++; } else if (c == 'r') { // Random game game.set_random(); break; // skip remaining } else if (c >= '0' && c <= '9') // Not 8x8 board return -1; else i++; } while (s.at(i) != ']') i++; i++; } else if (c1 == 'R' && c2 == 'E' && c3 == '[') { i += 3; // Read score difference int diff_sign = (s.at(i) == '-') ? -1: 1; if (s.at(i) == '-' || s.at(i) == '+') i++; int diff = 0; while (s.at(i) >= '0' && s.at(i) <= '9') { diff = diff*10 + (s.at(i)-'0'); i++; } diff = diff * diff_sign; // Check game result while (s.at(i) != ']') { if (s.at(i) == 't') { // Timeout game.timeout = true; if (need_end) return -1; } if (s.at(i) == 'r') { // Resign game.resign = true; if (need_end) return -1; } if (s.at(i) == 's') { // Mutual score game.mutual = true; if (need_end) return -1; } i++; } while (s.at(i) != ']') i++; i++; // Correct when diff == 0 game.black_score = diff > 0 ? diff : 0; game.white_score = diff < 0 ? -diff : 0; //std::cout << diff << ' ' << game.black_score << ' ' << game.white_score << std::endl; result = true; } else if (c1 == 'B' && c2 == 'O' && c3 == '[') { i += 3; if (s.at(i) != '8' || s.at(i+1) != ' ') // Bad board size return -1; i += 2; // GGS format support random games // Setup the initial board for (int pos = 0; pos < 64; ++pos) { while (s.at(i) == ' ') i++; switch (s.at(i)) { case 'O': init_board[pos] = WHITE; break; case '*': init_board[pos] = BLACK; break; case '-': init_board[pos] = EMPTY; break; default: return -1; // Unknown character } i++; } game.copy_board(&init_board); // No need to process color // to move. It's handled by // B[...] or W[...] while (s.at(i) != ']') i++; i++; } else if (c1 == 'B' && c2 == '[') { i += 2; // FIXME: More strict check int pos = -1; if (s.at(i) == 'P' || s.at(i) == 'p') ; // Pass else if (s.at(i) >= 'A' && s.at(i) <= 'H') pos = xy_to_pos(s.at(i)-'A', s.at(i+1)-'1'); else if (s.at(i) >= 'a' && s.at(i) <= 'h') pos = xy_to_pos(s.at(i)-'a', s.at(i+1)-'1'); else return -1; int time = 0; while (s.at(i) != ']' && s.at(i) != '/') i++; if (s.at(i) == '/') { // Score i++; while (s.at(i) != ']' && s.at(i) != '/') i++; if (s.at(i) == '/') { // Time i++; double mult = 100.0; bool found_decimal = false; while ((s.at(i) >= '0' && s.at(i) <= '9') || s.at(i) == '.') { if (s.at(i) == '.') { if (found_decimal) return -1; found_decimal = true; } else { time = time*10 + s.at(i)-'0'; if (found_decimal) mult /= 10.0; } i++; } time = static_cast(time * mult +0.5); while (s.at(i) != ']') i++; } } if (pos != -1) game.push_move(pos, BLACK, time); else game.push_pass(time); i++; // Skip past ']' } else if (c1 == 'W' && c2 == '[') { i += 2; // FIXME: More strict check int pos = -1; if (s.at(i) == 'P' || s.at(i) == 'p') ; // Pass else if (s.at(i) >= 'A' && s.at(i) <= 'H') pos = xy_to_pos(s.at(i)-'A', s.at(i+1)-'1'); else if (s.at(i) >= 'a' && s.at(i) <= 'h') pos = xy_to_pos(s.at(i)-'a', s.at(i+1)-'1'); else return -1; int time = 0; while (s.at(i) != ']' && s.at(i) != '/') i++; if (s.at(i) == '/') { // Score i++; while (s.at(i) != ']' && s.at(i) != '/') i++; if (s.at(i) == '/') { // Time i++; double mult = 100.0; bool found_decimal = false; while ((s.at(i) >= '0' && s.at(i) <= '9') || s.at(i) == '.') { if (s.at(i) == '.') found_decimal = true; else { time = time*10 + s.at(i)-'0'; if (found_decimal) mult /= 10.0; } i++; } time = static_cast(time * mult +0.5); while (s.at(i) != ']') i++; } } if (pos != -1) game.push_move(pos, WHITE, time); else game.push_pass(time); i++; // Skip past ']' } else { if (isspace(c1)) i++; else { // Skip the remaining property // also ignore garbage char after // ']' like W[a2]//5.53] while (s.at(i) != '[' && s.at(i) != ']') i++; if (s.at(i) == '[') { // Skip property i++; // Move after '[' while (s.at(i) != ']') i++; i++; // Move after ']' } else i++; // Move after ']' } } } // Premature end-of-line return -1; } catch (std::out_of_range &) { return -1; } } template void process_line_GGS(const std::string &s, T &t, bool need_end) { int i = 0; int size = s.size(); int game_number = 0; // Synchro-rand games have // 2 games per line while (i+1 < size) { if (s[i] == '(' && s[i+1] == ';') { ++game_number; i = process_game_GGS(s, i+2, t, need_end, game_number); if (i == -1) // Erroneous line return; } else i++; } } template void process_line(const std::string &s, T &t, bool need_end) { if ((s[0] == '(' && s[1] == ';') // Old GGS || (s[2] == '(' && s[3] == ';')) // New GGS supporting synchro rand process_line_GGS(s, t, need_end); else process_line_IOS(s, t, need_end); } template void process_file(const char *f, T &t, bool need_end = true, bool output = true) { if (output) gtout(std::cout, _("Processing %$\n")) << f; std::ifstream ifs(f); if (!ifs) { gtstream bufstr; gtout(bufstr, _("cannot open file %$")) << f; throw std::runtime_error(bufstr.str()); } int line = 0; for ( ; ; ) { if (output && line % 100 == 99) { std::cout << '.'; std::cout.flush(); } line++; std::string buffer; getline(ifs, buffer); // End of file if (!ifs) break; try { process_line(buffer, t, need_end); } catch (...) { if (output) gtout(std::cerr, _("\n%$: fail at line %$\n")) << prog_name << line; } } if (output) std::cout << '\n'; } #undef _ #undef N_ grhino-0.16.1/board.h0000644000175000017500000000667711436423224014604 0ustar lerdsuwalerdsuwa/* board.h Game Board Operations Copyright (c) 2000-2004, 2006, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef BOARD_H #define BOARD_H #include "config.h" // Board squares #define EMPTY 0 #define BLACK 1 #define WHITE -1 // Total number of moves #define NUM_MOVE 60 // Directions #define NUM_DIR 8 #define DIR_START 0 #define DIR_END 7 // Impossible score to signal position evaluation #define INVALID_SCORE 1000 #define MAX_SCORE 999 #define MIN_SCORE -999 // Impossible position to signal a pass #define POS_PASS 64 // Impossible position #define POS_INVALID 65 // Board data types typedef signed char piece_type; typedef piece_type byte_board_type[64]; extern byte_board_type board_begin; // x, y are 0-based. Returns position in the 64-element array inline int xy_to_pos(int x, int y) { return y * 8 + x; } inline int pos_to_x(int pos) { return pos % 8; } inline int pos_to_y(int pos) { return pos / 8; } struct byte_board_info { private: char move; public: byte_board_type board; int hash; byte_board_info(); byte_board_info(const byte_board_type *board_init); byte_board_info& operator=(const byte_board_type *board_init); byte_board_info& operator=(const byte_board_info &src); void set_pos(int color, int pos); bool is_empty(int x, int y) const { return board[xy_to_pos(x, y)] == EMPTY; } bool is_empty(int pos) const { return board[pos] == EMPTY; } int get_num_move() const { return move; } bool can_play_nocheck(int color, int pos) const; bool can_play(int color, int pos) const { // This seems to be get the // fastest code if (!is_empty(pos)) return false; return can_play_nocheck(color, pos); } bool can_play_nocheck(int color, int pos, int dir_count[NUM_DIR]) const; bool can_play(int color, int pos, int dir_count[NUM_DIR]) const { // This seems to be get the // fastest code if (!is_empty(pos)) return false; return can_play_nocheck(color, pos, dir_count); } bool can_play(int color) const; bool can_play() const { return can_play(BLACK) || can_play(WHITE); } void place_piece(int color, int pos); void place_piece(int color, int pos, int dir_count[NUM_DIR]); int board_diff_score() const; int board_black_score() const; int board_white_score() const; }; bool operator==(const byte_board_info &board1, const byte_board_info &board2); inline void adjust_score(int &black_score, int &white_score) { if (black_score + white_score < 64) { if (black_score > white_score) black_score = 64 - white_score; else if (black_score < white_score) white_score = 64 - black_score; else { // FIXME: Get the scoring right } } } // Switch BLACK <-> WHITE inline int switch_color(int color) { return -color; } #endif /* BOARD_H */ grhino-0.16.1/configure0000755000175000017500000103630111436423224015237 0ustar lerdsuwalerdsuwa#! /bin/sh # From configure.in Revision: 1.36 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.60. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /usr/bin/posix$PATH_SEPARATOR/bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell autoconf@gnu.org about your system, echo including any error possibly output before this echo message } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # Find out whether ``test -x'' works. Don't use a zero-byte file, as # systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then as_executable_p="test -x" else as_executable_p=: fi rm -f conf$$.file # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="board.cc" gt_needs= ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datarootdir datadir sysconfdir sharedstatedir localstatedir includedir oldincludedir docdir infodir htmldir dvidir pdfdir psdir libdir localedir mandir DEFS ECHO_C ECHO_N ECHO_T LIBS build_alias host_alias target_alias PACKAGE VERSION top_builddir DEFTARGETLIST CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CPP CXX CXXFLAGS ac_ct_CXX CXXCPP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA SET_MAKE GRHINO_pkg_config mkdir_p USE_NLS MSGFMT GMSGFMT MSGFMT_015 GMSGFMT_015 XGETTEXT XGETTEXT_015 MSGMERGE build build_cpu build_vendor build_os host host_cpu host_vendor host_os INTL_MACOSX_LIBS LIBICONV LTLIBICONV INTLLIBS LIBINTL LTLIBINTL POSUB LIBOBJS LTLIBOBJS' ac_subst_files='' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval enable_$ac_feature=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval enable_$ac_feature=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` eval with_$ac_package=\$ac_optarg ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval with_$ac_package=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute directory names. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { echo "$as_me: error: Working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$0" || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-gnome do not build GNOME frontend (grhino) --disable-gtp do not build GTP frontend (gtp-rhino) --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld default=no --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib --without-libintl-prefix don't search for libintl in includedir and libdir Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.60 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.60. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then set x "$CONFIG_SITE" elif test "x$prefix" != xNONE; then set x "$prefix/share/config.site" "$prefix/etc/config.site" else set x "$ac_default_prefix/share/config.site" \ "$ac_default_prefix/etc/config.site" fi shift for ac_site_file do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi gt_needs="$gt_needs " # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu PACKAGE=grhino . $srcdir/scripts/version cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF ALL_LINGUAS="en_GB" LINGUAS="$ALL_LINGUAS" top_builddir=`pwd` ac_config_headers="$ac_config_headers config.h" ac_aux_dir= for ac_dir in scripts "$srcdir"/scripts; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in scripts \"$srcdir\"/scripts" >&5 echo "$as_me: error: cannot find install-sh or install.sh in scripts \"$srcdir\"/scripts" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. GRHINO_gnome="yes" GRHINO_gtp="yes" DEFTARGETLIST="" # Check whether --enable-gnome was given. if test "${enable_gnome+set}" = set; then enableval=$enable_gnome; if test "$enableval" = "yes"; then GRHINO_gnome="yes" elif test "$enableval" = "no"; then GRHINO_gnome="no" else { echo "configure: error: invalid argument for --enable-gnome" >&2; exit 1; } fi fi # Check whether --enable-gtp was given. if test "${enable_gtp+set}" = set; then enableval=$enable_gtp; if test "$enableval" = "yes"; then GRHINO_gtp="yes" elif test "$enableval" = "no"; then GRHINO_gtp="no" else { echo "configure: error: invalid argument for --enable-gtp" >&2; exit 1; } fi fi if test "$GRHINO_gnome" = yes; then DEFTARGETLIST="$DEFTARGETLIST grhino" fi if test "$GRHINO_gtp" = yes; then DEFTARGETLIST="$DEFTARGETLIST gtp-rhino" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; } ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # # List of possible output files, starting from the most likely. # The algorithm is not robust to junk in `.', hence go to wildcards (a.*) # only as a last resort. b.out is created by i960 compilers. ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' # # The IRIX 6 linker writes into existing files which may not be # executable, retaining their permissions. Remove them first so a # subsequent execution test works. ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6; } # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6; } { echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext { echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; } GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking for library containing strerror" >&5 echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6; } if test "${ac_cv_search_strerror+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strerror (); int main () { return strerror (); ; return 0; } _ACEOF for ac_lib in '' cposix; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_strerror=$ac_res else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_strerror+set}" = set; then break fi done if test "${ac_cv_search_strerror+set}" = set; then : else ac_cv_search_strerror=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 echo "${ECHO_T}$ac_cv_search_strerror" >&6; } ac_res=$ac_cv_search_strerror if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi case $ac_cv_prog_cc_stdc in no) ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; *) { echo "$as_me:$LINENO: checking for $CC option to accept ISO C99" >&5 echo $ECHO_N "checking for $CC option to accept ISO C99... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c99+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c99=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include #include struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict(ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\0'; ++i) continue; return 0; } // Check varargs and va_copy work. static void test_varargs(const char *format, ...) { va_list args; va_start(args, format); va_list args_copy; va_copy(args_copy, args); const char *str; int number; float fnumber; while (*format) { switch (*format++) { case 's': // string str = va_arg(args_copy, const char *); break; case 'd': // int number = va_arg(args_copy, int); break; case 'f': // float fnumber = (float) va_arg(args_copy, double); break; default: break; } } va_end(args_copy); va_end(args); } int main () { // Check bool and long long datatypes. _Bool success = false; long long int bignum = -1234567890LL; unsigned long long int ubignum = 1234567890uLL; // Check restrict. if (test_restrict("String literal") != 0) success = true; char *restrict newvar = "Another string"; // Check varargs. test_varargs("s, d' f .", "string", 65, 34.234); // Check incomplete arrays work. struct incomplete_array *ia = malloc(sizeof(struct incomplete_array) + (sizeof(double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = (double) i * 1.234; // Check named initialisers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[43] = 543; // work around unused variable warnings return bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'; ; return 0; } _ACEOF for ac_arg in '' -std=gnu99 -c99 -qlanglvl=extc99 do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_c99=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c99" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c99" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c99" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c99" >&6; } ;; esac if test "x$ac_cv_prog_cc_c99" != xno; then ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 else { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_c89=$ac_arg else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; xno) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 else ac_cv_prog_cc_stdc=no fi fi ;; esac { echo "$as_me:$LINENO: checking for $CC option to accept ISO Standard C" >&5 echo $ECHO_N "checking for $CC option to accept ISO Standard C... $ECHO_C" >&6; } if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi case $ac_cv_prog_cc_stdc in no) { echo "$as_me:$LINENO: result: unsupported" >&5 echo "${ECHO_T}unsupported" >&6; } ;; '') { echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6; } ;; *) { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_c_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&5 echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. echo "$as_me:$LINENO: checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } if test -z "$CXXCPP"; then if test "${ac_cv_prog_CXXCPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { echo "$as_me:$LINENO: result: $CXXCPP" >&5 echo "${ECHO_T}$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test "$GXX" = yes; then CFLAGS="$CFLAGS -W -Wall" CXXFLAGS="$CXXFLAGS -W -Wall" fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. { echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done IFS=$as_save_IFS fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } SET_MAKE= else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for pthread_create in -lpthread" >&5 echo $ECHO_N "checking for pthread_create in -lpthread... $ECHO_C" >&6; } if test "${ac_cv_lib_pthread_pthread_create+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_pthread_pthread_create=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { echo "$as_me:$LINENO: result: $ac_cv_lib_pthread_pthread_create" >&5 echo "${ECHO_T}$ac_cv_lib_pthread_pthread_create" >&6; } if test $ac_cv_lib_pthread_pthread_create = yes; then LIBS="$LIBS -lpthread" else { { echo "$as_me:$LINENO: error: pthread library is required" >&5 echo "$as_me: error: pthread library is required" >&2;} { (exit 1); exit 1; }; } fi if test "$GRHINO_gnome" = yes; then # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_prog_GRHINO_pkg_config+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$GRHINO_pkg_config"; then ac_cv_prog_GRHINO_pkg_config="$GRHINO_pkg_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_GRHINO_pkg_config="pkg-config" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_GRHINO_pkg_config" && ac_cv_prog_GRHINO_pkg_config="no" fi fi GRHINO_pkg_config=$ac_cv_prog_GRHINO_pkg_config if test -n "$GRHINO_pkg_config"; then { echo "$as_me:$LINENO: result: $GRHINO_pkg_config" >&5 echo "${ECHO_T}$GRHINO_pkg_config" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test "$GRHINO_pkg_config" = no; then { { echo "$as_me:$LINENO: error: pkg_config is missing -- GNOME 2 is required" >&5 echo "$as_me: error: pkg_config is missing -- GNOME 2 is required" >&2;} { (exit 1); exit 1; }; } else if "$GRHINO_pkg_config" --exists libgnomeui-2.0; then GRHINO_gnome=2 else { { echo "$as_me:$LINENO: error: libgnomeui-2.0 is missing -- GNOME 2 is required" >&5 echo "$as_me: error: libgnomeui-2.0 is missing -- GNOME 2 is required" >&2;} { (exit 1); exit 1; }; } fi fi echo "GNOME version $GRHINO_gnome found" if test "$GRHINO_gnome" = 2; then LIBS="$LIBS `$GRHINO_pkg_config --libs libgnomeui-2.0`" GNOME_CONFIG="`$GRHINO_pkg_config --cflags libgnomeui-2.0`" fi GNOME_CONFIG="`echo $GNOME_CONFIG | sed 'sx-I/usr/include x x'`" GNOME_CONFIG="`echo $GNOME_CONFIG | sed 'sx-I/usr/local/include x x'`" CPPFLAGS="$CPPFLAGS $GNOME_CONFIG" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for C++ bool keyword" >&5 echo $ECHO_N "checking for C++ bool keyword... $ECHO_C" >&6; } if test "${cxxac_cv_have_bool+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { bool ba = true, bb = false; bool bc = bb; int ia = 1, ib = 2; int ic = (int)ba; bool bd = (ia == ib); if (bd) { ia = 0; } if (!bd) { ia = 0; } if (ba && bb) { ia = 0; } if (ba || bb) { ia = 0; } ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_have_bool=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_have_bool=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $cxxac_cv_have_bool = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test $cxxac_cv_have_bool = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__HAVE_BOOL 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "$cxxac_cv_have_bool" = no; then { { echo "$as_me:$LINENO: error: C++ compiler that supports bool is required" >&5 echo "$as_me: error: C++ compiler that supports bool is required" >&2;} { (exit 1); exit 1; }; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for C++ namespace" >&5 echo $ECHO_N "checking for C++ namespace... $ECHO_C" >&6; } if test "${cxxac_cv_have_namespace+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ namespace N1 { int a; } // original-namespace-definition namespace N1 { int b; } // extension-namespace-definition namespace { int c; } // unnamed-namespace-definition namespace N2 = N1; // namespace-alias-definition namespace N3 { int d; } namespace N4 { typedef int e; typedef long f; } namespace N5 { namespace N6 { int g; } } int ia = N1::a; // qualified-namespace-specifier int ib = ::N1::a; // qualified-namespace-specifier w/ ::(opt) int ic = N5::N6::g; // qualified-namespace-specifier w/ // nested-name-specifier(opt) using namespace N3; // using-directive using N4::e; // using-declaration using ::N4::f; // using-declaration w/ ::(opt) e ea; f fa; int main () { // Nothing in function body ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_have_namespace=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_have_namespace=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $cxxac_cv_have_namespace = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test $cxxac_cv_have_namespace = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__HAVE_NAMESPACE 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if eval "test \"\$cxxac_done_header_iostream\" != yes"; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "" != quiet; then { echo "$as_me:$LINENO: checking for C++ library header iostream" >&5 echo $ECHO_N "checking for C++ library header iostream... $ECHO_C" >&6; } fi if test "${cxxac_cv_have_header_iostream+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "cxxac_cv_have_header_iostream=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "cxxac_cv_have_header_iostream=need_h" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "cxxac_cv_have_header_iostream=no" fi rm -f conftest.err conftest.$ac_ext fi rm -f conftest.err conftest.$ac_ext; fi eval "cxxac_cv_have_header=\$cxxac_cv_have_header_iostream" if test $cxxac_cv_have_header = yes; then cxxac_result=yes eval "cxxac_cv_header_iostream=iostream" cat >>confdefs.h <<_ACEOF #define CXX__HAVE_HEADER_iostream 1 _ACEOF cat >>confdefs.h <<_ACEOF #define CXX__HEADER_iostream _ACEOF elif test $cxxac_cv_have_header = need_h; then cxxac_result="need .h" eval "cxxac_cv_header_iostream=iostream.h" cat >>confdefs.h <<_ACEOF #define CXX__HAVE_HEADER_iostream 0 _ACEOF cat >>confdefs.h <<_ACEOF #define CXX__HEADER_iostream _ACEOF else cxxac_result=no eval "cxxac_cv_header_iostream=" fi if test "" != quiet; then { echo "$as_me:$LINENO: result: $cxxac_result" >&5 echo "${ECHO_T}$cxxac_result" >&6; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu eval "cxxac_done_header_iostream=yes" fi { echo "$as_me:$LINENO: checking if using namespace std supported by C++ library" >&5 echo $ECHO_N "checking if using namespace std supported by C++ library... $ECHO_C" >&6; } if test "${cxxac_cv_lib_need_using_std+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test $cxxac_cv_have_namespace = yes; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include CXX__HEADER_iostream using namespace std; int main () { cout << '\n'; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_lib_need_using_std=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_lib_need_using_std=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cxxac_cv_lib_need_using_std=no fi fi { echo "$as_me:$LINENO: result: $cxxac_cv_lib_need_using_std" >&5 echo "${ECHO_T}$cxxac_cv_lib_need_using_std" >&6; } if test $cxxac_cv_lib_need_using_std = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__LIB_NEED_USING_STD 1 _ACEOF cxxac_using_namespace_std="using namespace std;" else cat >>confdefs.h <<\_ACEOF #define USING_NAMESPACE_STD 1 _ACEOF cxxac_using_namespace_std="" fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking if exception handling is on by default" >&5 echo $ECHO_N "checking if exception handling is on by default... $ECHO_C" >&6; } if test "${cxxac_cv_default_exception+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { try { throw 1; } catch (...) { throw; } ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_default_exception=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_default_exception=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $cxxac_cv_default_exception" >&5 echo "${ECHO_T}$cxxac_cv_default_exception" >&6; } if test $cxxac_cv_default_exception = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__DEFAULT_EXCEPTION 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "x$cxxac_cv_have_header_new" = x; then if eval "test \"\$cxxac_done_header_new\" != yes"; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "" != quiet; then { echo "$as_me:$LINENO: checking for C++ library header new" >&5 echo $ECHO_N "checking for C++ library header new... $ECHO_C" >&6; } fi if test "${cxxac_cv_have_header_new+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "cxxac_cv_have_header_new=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "cxxac_cv_have_header_new=need_h" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "cxxac_cv_have_header_new=no" fi rm -f conftest.err conftest.$ac_ext fi rm -f conftest.err conftest.$ac_ext; fi eval "cxxac_cv_have_header=\$cxxac_cv_have_header_new" if test $cxxac_cv_have_header = yes; then cxxac_result=yes eval "cxxac_cv_header_new=new" cat >>confdefs.h <<_ACEOF #define CXX__HAVE_HEADER_new 1 _ACEOF cat >>confdefs.h <<_ACEOF #define CXX__HEADER_new _ACEOF elif test $cxxac_cv_have_header = need_h; then cxxac_result="need .h" eval "cxxac_cv_header_new=new.h" cat >>confdefs.h <<_ACEOF #define CXX__HAVE_HEADER_new 0 _ACEOF cat >>confdefs.h <<_ACEOF #define CXX__HEADER_new _ACEOF else cxxac_result=no eval "cxxac_cv_header_new=" fi if test "" != quiet; then { echo "$as_me:$LINENO: result: $cxxac_result" >&5 echo "${ECHO_T}$cxxac_result" >&6; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu eval "cxxac_done_header_new=yes" fi fi { echo "$as_me:$LINENO: checking for bad_alloc" >&5 echo $ECHO_N "checking for bad_alloc... $ECHO_C" >&6; } if test "${cxxac_cv_bad_alloc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test $cxxac_cv_default_exception = yes; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$cxxac_cv_header_new> $cxxac_using_namespace_std bad_alloc b; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_bad_alloc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_bad_alloc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cxxac_cv_bad_alloc=no fi fi if test $cxxac_cv_bad_alloc = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test $cxxac_cv_bad_alloc = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__BAD_ALLOC 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for C++ explicit keyword" >&5 echo $ECHO_N "checking for C++ explicit keyword... $ECHO_C" >&6; } if test "${cxxac_cv_have_explicit+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ class obj_a { private: int b; public: explicit obj_a(int _b) { b = _b; } }; int main () { // Nothing in function body ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ class obj_a { private: int b; public: explicit obj_a(int _b) { b = _b; } void func(obj_a _a) { b = _a.b; } }; int main () { int i = 0; obj_a a(1); a.func(i); // Must error here, attempt to convert // from type int to class obj_a ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_have_explicit=no else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_have_explicit=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_have_explicit=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $cxxac_cv_have_explicit = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test $cxxac_cv_have_explicit = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__HAVE_EXPLICIT 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for C++ mutable keyword" >&5 echo $ECHO_N "checking for C++ mutable keyword... $ECHO_C" >&6; } if test "${cxxac_cv_have_mutable+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ class obj_a { private: mutable int b; // Must OK here public: obj_a() : b(0) {} // Must OK here void setb(int _b) const { b = _b; } }; int main () { obj_a a; a.setb(1); // Must OK here ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_have_mutable=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_have_mutable=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $cxxac_cv_have_mutable = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test $cxxac_cv_have_mutable = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__HAVE_MUTABLE 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for C++ array new replacement" >&5 echo $ECHO_N "checking for C++ array new replacement... $ECHO_C" >&6; } if test "${cxxac_cv_have_array_new+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include void *operator new[](size_t /*n*/) throw() // Must OK here { return 0; } int main () { // Nothing in function body ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_have_array_new=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_have_array_new=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $cxxac_cv_have_array_new = yes; then { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi if test $cxxac_cv_have_array_new = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__HAVE_ARRAY_NEW 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for C++ exception specification for delete" >&5 echo $ECHO_N "checking for C++ exception specification for delete... $ECHO_C" >&6; } if test "${cxxac_cv_bad_delete+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ void operator delete(void * /*p*/) throw() // Must OK here { } int main () { // Nothing in function body ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_bad_delete=no else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_bad_delete=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $cxxac_cv_bad_delete = yes; then { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } else { echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6; } fi if test $cxxac_cv_bad_delete = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__DELETE_NO_THROW 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking if exception handling is on by default" >&5 echo $ECHO_N "checking if exception handling is on by default... $ECHO_C" >&6; } if test "${cxxac_cv_default_exception+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { try { throw 1; } catch (...) { throw; } ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_default_exception=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_default_exception=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $cxxac_cv_default_exception" >&5 echo "${ECHO_T}$cxxac_cv_default_exception" >&6; } if test $cxxac_cv_default_exception = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__DEFAULT_EXCEPTION 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for C++ typename keyword" >&5 echo $ECHO_N "checking for C++ typename keyword... $ECHO_C" >&6; } if test "${cxxac_cv_have_typename+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ class A { public: typedef int type; int value; }; template class C { public: int f () { typename T::type p; return sizeof p; } }; int main () { C c; c.f(); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_have_typename=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_have_typename=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $cxxac_cv_have_typename" >&5 echo "${ECHO_T}$cxxac_cv_have_typename" >&6; } if test $cxxac_cv_have_typename = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__HAVE_TYPENAME 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking if C++ guided declaration for template function disabled" >&5 echo $ECHO_N "checking if C++ guided declaration for template function disabled... $ECHO_C" >&6; } if test "${cxxac_cv_no_guide_decl+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ template int f(T &t); template class C { int value; public: friend int f<>(T &); }; int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest.$ac_objext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cxxac_cv_no_guide_decl=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cxxac_cv_no_guide_decl=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { echo "$as_me:$LINENO: result: $cxxac_cv_no_guide_decl" >&5 echo "${ECHO_T}$cxxac_cv_no_guide_decl" >&6; } if test $cxxac_cv_no_guide_decl = yes; then cat >>confdefs.h <<\_ACEOF #define CXX__NO_GUIDE_DECL 1 _ACEOF fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for all C++ library header" >&5 echo "$as_me: checking for all C++ library header" >&6;} cxxac_file="algorithm bitset complex deque exception fstream functional" cxxac_file="$cxxac_file iomanip ios iosfwd iostream istream iterator limits" cxxac_file="$cxxac_file list locale map memory new numeric" cxxac_file="$cxxac_file ostream queue set sstream stack stdexcept" cxxac_file="$cxxac_file streambuf string typeinfo utility valarray vector" cxxac_file="$cxxac_file cassert cctype cerrno cfloat" cxxac_file="$cxxac_file ciso646 climits clocale cmath" cxxac_file="$cxxac_file csetjmp csignal cstdarg cstddef" cxxac_file="$cxxac_file cstdio cstdlib cstring ctime cwchar cwctype" cxxac_cv_have_all_header=yes cxxac_cv_header_need_ext= cxxac_cv_header_missing= for cxxac_f in $cxxac_file; do if eval "test \"\$cxxac_done_header_$cxxac_f\" != yes"; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test "" != quiet; then { echo "$as_me:$LINENO: checking for C++ library header $cxxac_f" >&5 echo $ECHO_N "checking for C++ library header $cxxac_f... $ECHO_C" >&6; } fi if { as_var=cxxac_cv_have_header_$cxxac_f; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$cxxac_f> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "cxxac_cv_have_header_$cxxac_f=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$cxxac_f.h> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_cxx_preproc_warn_flag ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then eval "cxxac_cv_have_header_$cxxac_f=need_h" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "cxxac_cv_have_header_$cxxac_f=no" fi rm -f conftest.err conftest.$ac_ext fi rm -f conftest.err conftest.$ac_ext; fi eval "cxxac_cv_have_header=\$cxxac_cv_have_header_$cxxac_f" if test $cxxac_cv_have_header = yes; then cxxac_result=yes eval "cxxac_cv_header_$cxxac_f=$cxxac_f" cat >>confdefs.h <<_ACEOF #define CXX__HAVE_HEADER_$cxxac_f 1 _ACEOF cat >>confdefs.h <<_ACEOF #define CXX__HEADER_$cxxac_f <$cxxac_f> _ACEOF elif test $cxxac_cv_have_header = need_h; then cxxac_result="need .h" eval "cxxac_cv_header_$cxxac_f=$cxxac_f.h" cat >>confdefs.h <<_ACEOF #define CXX__HAVE_HEADER_$cxxac_f 0 _ACEOF cat >>confdefs.h <<_ACEOF #define CXX__HEADER_$cxxac_f <$cxxac_f.h> _ACEOF else cxxac_result=no eval "cxxac_cv_header_$cxxac_f=" fi if test "" != quiet; then { echo "$as_me:$LINENO: result: $cxxac_result" >&5 echo "${ECHO_T}$cxxac_result" >&6; } fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu eval "cxxac_done_header_$cxxac_f=yes" fi if test $cxxac_cv_have_header != yes; then cxxac_cv_have_all_header=no if test $cxxac_cv_have_header = need_h; then cxxac_cv_header_need_ext="$cxxac_cv_header_need_ext $cxxac_f" else cxxac_cv_header_missing="$cxxac_cv_header_missing $cxxac_f" fi fi done cxxac_cv_header_need_ext="$cxxac_cv_header_need_ext " cxxac_cv_header_missing="$cxxac_cv_header_missing " ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { echo "$as_me:$LINENO: result: $MKDIR_P" >&5 echo "${ECHO_T}$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac { echo "$as_me:$LINENO: checking whether NLS is requested" >&5 echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { echo "$as_me:$LINENO: result: $USE_NLS" >&5 echo "${ECHO_T}$USE_NLS" >&6; } # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_MSGFMT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case "$MSGFMT" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != ":"; then { echo "$as_me:$LINENO: result: $MSGFMT" >&5 echo "${ECHO_T}$MSGFMT" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_GMSGFMT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { echo "$as_me:$LINENO: result: $GMSGFMT" >&5 echo "${ECHO_T}$GMSGFMT" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;; *) MSGFMT_015=$MSGFMT ;; esac case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;; *) GMSGFMT_015=$GMSGFMT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_XGETTEXT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case "$XGETTEXT" in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { echo "$as_me:$LINENO: result: $XGETTEXT" >&5 echo "${ECHO_T}$XGETTEXT" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi rm -f messages.po case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;; *) XGETTEXT_015=$XGETTEXT ;; esac # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Find out how to test for executable files. Don't use a zero-byte file, # as systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then ac_executable_p="test -x" else ac_executable_p="test -f" fi rm -f conf$$.file # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } if test "${ac_cv_path_MSGMERGE+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case "$MSGMERGE" in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$ac_save_IFS" test -z "$ac_dir" && ac_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then echo "$as_me: trying $ac_dir/$ac_word..." >&5 if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" break 2 fi fi done done IFS="$ac_save_IFS" test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" ;; esac fi MSGMERGE="$ac_cv_path_MSGMERGE" if test "$MSGMERGE" != ":"; then { echo "$as_me:$LINENO: result: $MSGMERGE" >&5 echo "${ECHO_T}$MSGMERGE" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -n "$localedir" || localedir='${datadir}/locale' ac_config_commands="$ac_config_commands po-directories" if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking build system type" >&5 echo $ECHO_N "checking build system type... $ECHO_C" >&6; } if test "${ac_cv_build+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi { echo "$as_me:$LINENO: result: $ac_cv_build" >&5 echo "${ECHO_T}$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 echo "$as_me: error: invalid value of canonical build" >&2;} { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { echo "$as_me:$LINENO: checking host system type" >&5 echo $ECHO_N "checking host system type... $ECHO_C" >&6; } if test "${ac_cv_host+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { echo "$as_me:$LINENO: result: $ac_cv_host" >&5 echo "${ECHO_T}$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 echo "$as_me: error: invalid value of canonical host" >&2;} { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { echo "$as_me:$LINENO: checking for ld used by GCC" >&5 echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path of ld ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { echo "$as_me:$LINENO: checking for GNU ld" >&5 echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; } else { echo "$as_me:$LINENO: checking for non-GNU ld" >&5 echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; } fi if test "${acl_cv_path_LD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in *GNU* | *'with BFD'*) test "$with_gnu_ld" != no && break ;; *) test "$with_gnu_ld" != yes && break ;; esac fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { echo "$as_me:$LINENO: result: $LD" >&5 echo "${ECHO_T}$LD" >&6; } else { echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6; } fi test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} { (exit 1); exit 1; }; } { echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; } if test "${acl_cv_prog_gnu_ld+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. case `$LD -v 2>&1 &5 echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { echo "$as_me:$LINENO: checking for shared library run path origin" >&5 echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6; } if test "${acl_cv_rpath+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 echo "${ECHO_T}$acl_cv_rpath" >&6; } wl="$acl_cv_wl" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBICONV= LTLIBICONV= INCICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" \ && { test -f "$additional_libdir/lib$name.$shlibext" \ || { test "$shlibext" = dll \ && test -f "$additional_libdir/lib$name.dll.a"; }; }; then found_dir="$additional_libdir" if test -f "$additional_libdir/lib$name.$shlibext"; then found_so="$additional_libdir/lib$name.$shlibext" else found_so="$additional_libdir/lib$name.dll.a" fi if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" \ && { test -f "$dir/lib$name.$shlibext" \ || { test "$shlibext" = dll \ && test -f "$dir/lib$name.dll.a"; }; }; then found_dir="$dir" if test -f "$dir/lib$name.$shlibext"; then found_so="$dir/lib$name.$shlibext" else found_so="$dir/lib$name.dll.a" fi if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi { echo "$as_me:$LINENO: checking for CFPreferencesCopyAppValue" >&5 echo $ECHO_N "checking for CFPreferencesCopyAppValue... $ECHO_C" >&6; } if test "${gt_cv_func_CFPreferencesCopyAppValue+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { CFPreferencesCopyAppValue(NULL, NULL) ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then gt_cv_func_CFPreferencesCopyAppValue=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gt_cv_func_CFPreferencesCopyAppValue=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { echo "$as_me:$LINENO: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5 echo "${ECHO_T}$gt_cv_func_CFPreferencesCopyAppValue" >&6; } if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_CFPREFERENCESCOPYAPPVALUE 1 _ACEOF fi { echo "$as_me:$LINENO: checking for CFLocaleCopyCurrent" >&5 echo $ECHO_N "checking for CFLocaleCopyCurrent... $ECHO_C" >&6; } if test "${gt_cv_func_CFLocaleCopyCurrent+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else gt_save_LIBS="$LIBS" LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { CFLocaleCopyCurrent(); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then gt_cv_func_CFLocaleCopyCurrent=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gt_cv_func_CFLocaleCopyCurrent=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$gt_save_LIBS" fi { echo "$as_me:$LINENO: result: $gt_cv_func_CFLocaleCopyCurrent" >&5 echo "${ECHO_T}$gt_cv_func_CFLocaleCopyCurrent" >&6; } if test $gt_cv_func_CFLocaleCopyCurrent = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_CFLOCALECOPYCURRENT 1 _ACEOF fi INTL_MACOSX_LIBS= if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" fi LIBINTL= LTLIBINTL= POSUB= case " $gt_needs " in *" need-formatstring-macros "*) gt_api_version=3 ;; *" need-ngettext "*) gt_api_version=2 ;; *) gt_api_version=1 ;; esac gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc" gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl" if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no if test $gt_api_version -ge 3; then gt_revision_test_code='[ #ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; ]' else gt_revision_test_code= fi if test $gt_api_version -ge 2; then gt_expression_test_code=' + * ngettext ("", "", 0)' else gt_expression_test_code= fi { echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5 echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6; } if { as_var=$gt_func_gnugettext_libc; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$gt_func_gnugettext_libc=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$gt_func_gnugettext_libc=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval echo '${'$gt_func_gnugettext_libc'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { echo "$as_me:$LINENO: checking for iconv" >&5 echo $ECHO_N "checking for iconv... $ECHO_C" >&6; } if test "${am_cv_func_iconv+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_func_iconv=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_lib_iconv=yes am_cv_func_iconv=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 echo "${ECHO_T}$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_ICONV 1 _ACEOF fi if test "$am_cv_lib_iconv" = yes; then { echo "$as_me:$LINENO: checking how to link with libiconv" >&5 echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $LIBICONV" >&5 echo "${ECHO_T}$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libintl-prefix was given. if test "${with_libintl_prefix+set}" = set; then withval=$with_libintl_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" fi fi fi LIBINTL= LTLIBINTL= INCINTL= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='intl ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" else : fi else found_dir= found_la= found_so= found_a= if test $use_additional = yes; then if test -n "$shlibext" \ && { test -f "$additional_libdir/lib$name.$shlibext" \ || { test "$shlibext" = dll \ && test -f "$additional_libdir/lib$name.dll.a"; }; }; then found_dir="$additional_libdir" if test -f "$additional_libdir/lib$name.$shlibext"; then found_so="$additional_libdir/lib$name.$shlibext" else found_so="$additional_libdir/lib$name.dll.a" fi if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$shlibext" \ && { test -f "$dir/lib$name.$shlibext" \ || { test "$shlibext" = dll \ && test -f "$dir/lib$name.dll.a"; }; }; then found_dir="$dir" if test -f "$dir/lib$name.$shlibext"; then found_so="$dir/lib$name.$shlibext" else found_so="$dir/lib$name.dll.a" fi if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" fi if test "$hardcode_minus_L" != no; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" else LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBINTL; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" ;; esac done fi else LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" done fi { echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5 echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6; } if { as_var=$gt_func_gnugettext_libintl; eval "test \"\${$as_var+set}\" = set"; }; then echo $ECHO_N "(cached) $ECHO_C" >&6 else gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$gt_func_gnugettext_libintl=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$gt_func_gnugettext_libintl=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $gt_revision_test_code extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (const char *); int main () { bindtextdomain ("", ""); return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("") ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; } && { ac_try='test -s conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 (eval "$ac_try") 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" eval "$gt_func_gnugettext_libintl=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS" fi ac_res=`eval echo '${'$gt_func_gnugettext_libintl'}'` { echo "$as_me:$LINENO: result: $ac_res" >&5 echo "${ECHO_T}$ac_res" >&6; } fi if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \ || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= fi if test -n "$INTL_MACOSX_LIBS"; then if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then LIBINTL="$LIBINTL $INTL_MACOSX_LIBS" LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS" fi fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then cat >>confdefs.h <<\_ACEOF #define ENABLE_NLS 1 _ACEOF else USE_NLS=no fi fi { echo "$as_me:$LINENO: checking whether to use NLS" >&5 echo $ECHO_N "checking whether to use NLS... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $USE_NLS" >&5 echo "${ECHO_T}$USE_NLS" >&6; } if test "$USE_NLS" = "yes"; then { echo "$as_me:$LINENO: checking where the gettext function comes from" >&5 echo $ECHO_N "checking where the gettext function comes from... $ECHO_C" >&6; } if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then gt_source="external libintl" else gt_source="libc" fi else gt_source="included intl directory" fi { echo "$as_me:$LINENO: result: $gt_source" >&5 echo "${ECHO_T}$gt_source" >&6; } fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then { echo "$as_me:$LINENO: checking how to link with libintl" >&5 echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6; } { echo "$as_me:$LINENO: result: $LIBINTL" >&5 echo "${ECHO_T}$LIBINTL" >&6; } for element in $INCINTL; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done fi cat >>confdefs.h <<\_ACEOF #define HAVE_GETTEXT 1 _ACEOF cat >>confdefs.h <<\_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi POSUB=po fi INTLLIBS="$LIBINTL" ac_config_files="$ac_config_files Makefile po/Makefile.in desktop/grhino.desktop" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { echo "$as_me:$LINENO: updating cache $cache_file" >&5 echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) as_nl=' ' IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir fi echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # Find out whether ``test -x'' works. Don't use a zero-byte file, as # systems may use methods other than mode bits to determine executability. cat >conf$$.file <<_ASEOF #! /bin/sh exit 0 _ASEOF chmod +x conf$$.file if test -x conf$$.file >/dev/null 2>&1; then as_executable_p="test -x" else as_executable_p=: fi rm -f conf$$.file # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.60. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.60, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2006 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 CONFIG_SHELL=$SHELL export CONFIG_SHELL exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS # # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it # from automake < 1.5. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "desktop/grhino.desktop") CONFIG_FILES="$CONFIG_FILES desktop/grhino.desktop" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # # Set up the sed scripts for CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "$CONFIG_FILES"; then _ACEOF ac_delim='%!_!# ' for ac_last_try in false false false false false :; do cat >conf$$subs.sed <<_ACEOF SHELL!$SHELL$ac_delim PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim PACKAGE_NAME!$PACKAGE_NAME$ac_delim PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim PACKAGE_STRING!$PACKAGE_STRING$ac_delim PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim exec_prefix!$exec_prefix$ac_delim prefix!$prefix$ac_delim program_transform_name!$program_transform_name$ac_delim bindir!$bindir$ac_delim sbindir!$sbindir$ac_delim libexecdir!$libexecdir$ac_delim datarootdir!$datarootdir$ac_delim datadir!$datadir$ac_delim sysconfdir!$sysconfdir$ac_delim sharedstatedir!$sharedstatedir$ac_delim localstatedir!$localstatedir$ac_delim includedir!$includedir$ac_delim oldincludedir!$oldincludedir$ac_delim docdir!$docdir$ac_delim infodir!$infodir$ac_delim htmldir!$htmldir$ac_delim dvidir!$dvidir$ac_delim pdfdir!$pdfdir$ac_delim psdir!$psdir$ac_delim libdir!$libdir$ac_delim localedir!$localedir$ac_delim mandir!$mandir$ac_delim DEFS!$DEFS$ac_delim ECHO_C!$ECHO_C$ac_delim ECHO_N!$ECHO_N$ac_delim ECHO_T!$ECHO_T$ac_delim LIBS!$LIBS$ac_delim build_alias!$build_alias$ac_delim host_alias!$host_alias$ac_delim target_alias!$target_alias$ac_delim PACKAGE!$PACKAGE$ac_delim VERSION!$VERSION$ac_delim top_builddir!$top_builddir$ac_delim DEFTARGETLIST!$DEFTARGETLIST$ac_delim CC!$CC$ac_delim CFLAGS!$CFLAGS$ac_delim LDFLAGS!$LDFLAGS$ac_delim CPPFLAGS!$CPPFLAGS$ac_delim ac_ct_CC!$ac_ct_CC$ac_delim EXEEXT!$EXEEXT$ac_delim OBJEXT!$OBJEXT$ac_delim CPP!$CPP$ac_delim CXX!$CXX$ac_delim CXXFLAGS!$CXXFLAGS$ac_delim ac_ct_CXX!$ac_ct_CXX$ac_delim CXXCPP!$CXXCPP$ac_delim INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim INSTALL_DATA!$INSTALL_DATA$ac_delim SET_MAKE!$SET_MAKE$ac_delim GRHINO_pkg_config!$GRHINO_pkg_config$ac_delim mkdir_p!$mkdir_p$ac_delim USE_NLS!$USE_NLS$ac_delim MSGFMT!$MSGFMT$ac_delim GMSGFMT!$GMSGFMT$ac_delim MSGFMT_015!$MSGFMT_015$ac_delim GMSGFMT_015!$GMSGFMT_015$ac_delim XGETTEXT!$XGETTEXT$ac_delim XGETTEXT_015!$XGETTEXT_015$ac_delim MSGMERGE!$MSGMERGE$ac_delim build!$build$ac_delim build_cpu!$build_cpu$ac_delim build_vendor!$build_vendor$ac_delim build_os!$build_os$ac_delim host!$host$ac_delim host_cpu!$host_cpu$ac_delim host_vendor!$host_vendor$ac_delim host_os!$host_os$ac_delim INTL_MACOSX_LIBS!$INTL_MACOSX_LIBS$ac_delim LIBICONV!$LIBICONV$ac_delim LTLIBICONV!$LTLIBICONV$ac_delim INTLLIBS!$INTLLIBS$ac_delim LIBINTL!$LIBINTL$ac_delim LTLIBINTL!$LTLIBINTL$ac_delim POSUB!$POSUB$ac_delim LIBOBJS!$LIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim _ACEOF if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 84; then break elif $ac_last_try; then { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` if test -n "$ac_eof"; then ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` ac_eof=`expr $ac_eof + 1` fi cat >>$CONFIG_STATUS <<_ACEOF cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof /@[a-zA-Z_][a-zA-Z_0-9]*@/!b end _ACEOF sed ' s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g s/^/s,@/; s/!/@,|#_!!_#|/ :n t n s/'"$ac_delim"'$/,g/; t s/$/\\/; p N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n ' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF :end s/|#_!!_#|//g CEOF$ac_eof _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF fi # test -n "$CONFIG_FILES" for ac_tag in :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 echo "$as_me: error: Invalid tag $ac_tag." >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac ac_file_inputs="$ac_file_inputs $ac_f" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input="Generated from "`IFS=: echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} fi case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin";; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= case `sed -n '/datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' $ac_file_inputs` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s&@configure_input@&$configure_input&;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out"; rm -f "$tmp/out";; *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; esac ;; :H) # # CONFIG_HEADER # _ACEOF # Transform confdefs.h into a sed script `conftest.defines', that # substitutes the proper values into config.h.in to produce config.h. rm -f conftest.defines conftest.tail # First, append a space to every undef/define line, to ease matching. echo 's/$/ /' >conftest.defines # Then, protect against being on the right side of a sed subst, or in # an unquoted here document, in config.status. If some macros were # called several times there might be several #defines for the same # symbol, which is useless. But do not sort them, since the last # AC_DEFINE must be honored. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* # These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where # NAME is the cpp macro being defined, VALUE is the value it is being given. # PARAMS is the parameter list in the macro definition--in most cases, it's # just an empty string. ac_dA='s,^\\([ #]*\\)[^ ]*\\([ ]*' ac_dB='\\)[ (].*,\\1define\\2' ac_dC=' ' ac_dD=' ,' uniq confdefs.h | sed -n ' t rset :rset s/^[ ]*#[ ]*define[ ][ ]*// t ok d :ok s/[\\&,]/\\&/g s/^\('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p s/^\('"$ac_word_re"'\)[ ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p ' >>conftest.defines # Remove the space that was appended to ease matching. # Then replace #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. # (The regexp can be short, since the line contains either #define or #undef.) echo 's/ $// s,^[ #]*u.*,/* & */,' >>conftest.defines # Break up conftest.defines: ac_max_sed_lines=50 # First sed command is: sed -f defines.sed $ac_file_inputs >"$tmp/out1" # Second one is: sed -f defines.sed "$tmp/out1" >"$tmp/out2" # Third one will be: sed -f defines.sed "$tmp/out2" >"$tmp/out1" # et cetera. ac_in='$ac_file_inputs' ac_out='"$tmp/out1"' ac_nxt='"$tmp/out2"' while : do # Write a here document: cat >>$CONFIG_STATUS <<_ACEOF # First, check the format of the line: cat >"\$tmp/defines.sed" <<\\CEOF /^[ ]*#[ ]*undef[ ][ ]*$ac_word_re[ ]*\$/b def /^[ ]*#[ ]*define[ ][ ]*$ac_word_re[( ]/b def b :def _ACEOF sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail grep . conftest.tail >/dev/null || break rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines conftest.tail echo "ac_result=$ac_in" >>$CONFIG_STATUS cat >>$CONFIG_STATUS <<\_ACEOF if test x"$ac_file" != x-; then echo "/* $configure_input */" >"$tmp/config.h" cat "$ac_result" >>"$tmp/config.h" if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else rm -f $ac_file mv "$tmp/config.h" $ac_file fi else echo "/* $configure_input */" cat "$ac_result" fi rm -f "$tmp/out12" ;; :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "po-directories":C) for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac # Treat a directory as a PO directory if and only if it has a # POTFILES.in file. This allows packages to have multiple PO # directories under different names or in different locations. if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$OBSOLETE_ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. # Hide the ALL_LINGUAS assigment from automake < 1.5. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi # Compute POFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) # Compute UPDATEPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) # Compute DUMMYPOFILES # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) # Compute GMOFILES # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= UPDATEPOFILES= DUMMYPOFILES= GMOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi grhino-0.16.1/opening.cc0000644000175000017500000000401411436423225015272 0ustar lerdsuwalerdsuwa/* opening.cc Opening database Copyright (c) 2001, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "opening.h" #define N_(x) x #include "opening-dat.h" int get_num_opening() { return NUM_OPENING_DATA; } const char *get_opening_name(int id) { return opening_data[id].name; } int get_opening_id(const char *s) { for (int i = 0; i < get_num_opening(); ++i) { if (!strcmp(s, opening_data[i].name)) return i; } return 0; } int get_opening_player(int id) { return opening_data[id].next_player; } int get_opening_player(const char *s) { return get_opening_player(get_opening_id(s)); } int get_opening_num_move(int id) { return opening_data[id].num_move_sequence; } int get_opening_num_move(const char *s) { return get_opening_num_move(get_opening_id(s)); } const byte_board_type *get_opening_board(int id) { return &opening_data[id].board; } const byte_board_type *get_opening_board(const char *s) { return get_opening_board(get_opening_id(s)); } void get_opening_move_sequence(int id, std::deque &d) { if (d.size()) d.erase(d.begin(), d.end()); for (size_t i = 0; i < opening_data[id].num_move_sequence; ++i) d.push_back(static_cast( opening_data[id].move_sequence[i])); } void get_opening_move_sequence(const char *s, std::deque &d) { get_opening_move_sequence(get_opening_id(s), d); } grhino-0.16.1/ad.rule0000644000175000017500000000424311436423224014604 0ustar lerdsuwalerdsuwa# # For autodep # OUTPUT Makefile.in DEFTARGET default-target DEFTARGETLIST @DEFTARGETLIST@ SUBDIR po # config.h is generated by configure and is not in $(srcdir) CURDIR config.h TARGET test C++ test.cc alphabeta.cc board.cc boardio.cc hash.cc gtstream.cc iter.cc order.cc parity.cc pattern.cc -DPATTERN_PATH=\"${pattern_dir}/\" proginfo.cc TARGET grhino C++ grhino.cc -DPREFIX=\"${prefix}/\" -DSYSCONFDIR=\"${sysconfdir}/\" \ -DDATADIR=\"${datadir}/\" -DLIBDIR=\"${libdir}/\" \ -DTHEMEDIR=\"${theme_dir}/\" -DLOCALEDIR=\"${localedir}/\" \ -DICONDIR=\"${icon_dir}/\" alphabeta.cc binfile.cc board.cc boardio.cc book.cc -DBOOK_PATH=\"${book_dir}/\" game.cc gameinfo.cc gevalwin.cc ggamewin.cc ghistwin.cc gpref.cc -DTHEMEDIR=\"${theme_dir}/\" gtstream.cc gutil.cc hash.cc iter.cc load.cc opening.cc order.cc pattern.cc -DPATTERN_PATH=\"${pattern_dir}/\" parity.cc proginfo.cc rand.cc randboard.cc TARGET gtp-rhino C++ gtp-rhino.cc -DPREFIX=\"${prefix}/\" -DSYSCONFDIR=\"${sysconfdir}/\" \ -DDATADIR=\"${datadir}/\" -DLIBDIR=\"${libdir}/\" \ -DLOCALEDIR=\"${localedir}/\" alphabeta.cc binfile.cc board.cc boardio.cc book.cc -DBOOK_PATH=\"${book_dir}/\" game.cc gameinfo.cc gtp.cc gtstream.cc hash.cc iter.cc opening.cc order.cc pattern.cc -DPATTERN_PATH=\"${pattern_dir}/\" parity.cc proginfo.cc rand.cc randboard.cc TARGET aiai C++ aiai.cc alphabeta.cc binfile.cc board.cc boardio.cc book.cc -DBOOK_PATH=\"${book_dir}/\" game.cc gameinfo.cc gtp.cc gtstream.cc hash.cc iter.cc opening.cc order.cc pattern.cc -DPATTERN_PATH=\"${pattern_dir}/\" parity.cc proginfo.cc rand.cc randboard.cc TARGET gen_book C++ gen_book.cc binfile.cc board.cc book.cc -DBOOK_PATH=\"${book_dir}/\" gtstream.cc hash.cc proginfo.cc rand.cc TARGET gen_opening C++ gen_opening.cc board.cc gtstream.cc hash.cc TARGET gen_pattern C++ gen_pattern.cc board.cc gtstream.cc hash.cc pattern.cc -DPATTERN_PATH=\"${pattern_dir}/\" proginfo.cc TARGET gen_table C++ gen_table.cc gtstream.cc TARGET dump_pattern C++ dump_pattern.cc board.cc gtstream.cc hash.cc pattern.cc -DPATTERN_PATH=\"${pattern_dir}/\" proginfo.cc grhino-0.16.1/ChangeLog0000644000175000017500000065164211436423224015114 0ustar lerdsuwalerdsuwa2010-08-29 Kriang Lerdsuwanakij * NEWS: Update. 2010-08-29 Kriang Lerdsuwanakij * alphabeta.cc (midgame_strategy::end_board_score, midgame_strategy_with_random::end_board_score): Fix alphabeta search when the game ends. * grhino.cc (finish_edit_mode): Call eval_new_game. * test.cc (board_test3, main): New test. 2010-08-29 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc (update_toolbar): Rewrite. 2010-08-29 Kriang Lerdsuwanakij * gpref.cc: Update copyright year. (preferences_apply): Remove test code. 2010-08-29 Kriang Lerdsuwanakij * ghistwin.cc (game_history_update, game_history_selected): Only work when view_mode is VIEW_MODE_HISTORY. * gpref.cc (preferences_apply): Don't start game if in view_mode. 2010-08-28 Kriang Lerdsuwanakij * NEWS: Update. 2010-08-28 Kriang Lerdsuwanakij * gevalwin.cc (evaluate_position): Fix const char* warning. * scripts/version: Bump version number to 0.16.1. 2010-08-28 Kriang Lerdsuwanakij Change from Debian port by Vincent Legout * desktop/grhino.desktop.in: Remove Encoding field. 2010-08-28 Kriang Lerdsuwanakij * board.h: Update copyright year. * grhino.cc (menu_help_about): Update copyright year. 2010-08-28 Kriang Lerdsuwanakij * ggamewin.cc (game_library_fill): Fix size_t warning. * ghistwin.cc: Fix const warning with xpm includes. (game_history_fill): Fix const char* warning. 2010-08-28 Kriang Lerdsuwanakij * grhino.cc, gtp-rhino.cc (main_real): Update copyright year. 2010-08-28 Kriang Lerdsuwanakij * grhino.cc: Fix const warning with xpm includes. 2010-08-28 Kriang Lerdsuwanakij * board.h (adjust_score): Fix empty else warning. * grhino.cc, gtp-rhino.cc: Fix char * warning. 2010-08-28 Kriang Lerdsuwanakij * scripts/commit: Fix diff generation. 2010-08-28 Kriang Lerdsuwanakij Change from Debian port by Martin Michlmayr * book.cc, game.cc, log_proc.h: Include . 2007-10-16 Kriang Lerdsuwanakij * acinclude.m4/cxxac.m4 (CXXAC_SIZE_BOOL): Include to remove waring. (CXXAC_BAD_NEW): Don't rely on CXXAC_NEW_THROW_BAD_ALLOC test. Remove warning in test. (CXXAC_NEW_THROW_BAD_ALLOC): Remove. No longer work. * config.h.in: Regenerate. 2007-10-11 Kriang Lerdsuwanakij * acinclude.m4/cxxac.m4 (CXXAC_BAD_ALLOC): Fix incorrect description. 2006-11-26 Kriang Lerdsuwanakij * po/Makevars (MSGID_BUGS_ADDRESS): New variable. 2006-11-25 Kriang Lerdsuwanakij * po/POTFILES, po/POTFILES.in: Change table.dat to table-dat.h, opening.dat to opening-dat.h. 2006-11-25 Kriang Lerdsuwanakij * opening-dat.h: Rename from ... * opening.dat: ... this. * table-dat.h: Rename from ... * table.dat: ... this. * MANIFEST, board.cc, opening.cc: Adjust * gen_opening.cc (main_real): Likewise. * gen_table.cc (main_real): Likewise. * Makefile.in: Regenerate. 2006-11-25 Kriang Lerdsuwanakij * NEWS: Update. 2006-11-25 Kriang Lerdsuwanakij * configure.in: Create desktop/grhino.desktop. * desktop/grhino.desktop.in: Use variable in version number. * MANIFEST: Add desktop/grhino.desktop.in. 2006-11-25 Kriang Lerdsuwanakij From Michel Salim : * desktop/grhino.desktop.in: New file. 2006-11-25 Kriang Lerdsuwanakij * ad.append (install): Install theme/small/highlight_black.xpm, theme/small/highlight_empty.xpm, theme/small/highlight_empty.xpm. * Makefile.in: Regenerate. 2006-11-25 Kriang Lerdsuwanakij * ad.prepend (datarootdir, prefix): Switch order. * Makefile.in: Regenerate. 2006-11-25 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.16.0. 2006-11-25 Kriang Lerdsuwanakij * MANIFEST (po/Makevars.template): Remove. 2006-11-24 Kriang Lerdsuwanakij * TODO: Update. 2006-11-24 Kriang Lerdsuwanakij * help/C/grhino.xml: Update copyright year. Improve. 2006-11-24 Kriang Lerdsuwanakij * Makefile.in: Regenerate. 2006-11-24 Kriang Lerdsuwanakij * grhino.cc (button_press_signal): Handle middle click. * help/C/figures/toolbar-edit.png: New file. * MANIFEST, ad.append: Adjust. * help/C/grhino.xml: Document edit board. 2006-11-19 Kriang Lerdsuwanakij * NEWS: Update. 2006-11-19 Kriang Lerdsuwanakij * ad.prepend (datarootdir): New variable. * Makefile.in: Regenerate. 2006-11-19 Kriang Lerdsuwanakij * NEWS: Update. * ABOUT-NLS, po/ChangeLog, po/Makefile.in.in, po/Rules-quot, scripts/config.rpath: Updated by gettextize. * po/Makevars.template: Remove. * ad.rule: Use po instead of @POSUB@. * Makefile.in: Regenerate. 2006-11-19 Kriang Lerdsuwanakij * game.cc (get_computer_winlossdraw_move, get_computer_exact_move): New functions. * game.h (get_computer_winlossdraw_move, get_computer_exact_move): Declare. * acinclude.m4/codeset.m4, acinclude.m4/gettext.m4, acinclude.m4/glibc21.m4, acinclude.m4/iconv.m4, acinclude.m4/intdiv0.m4, acinclude.m4/lcmessage.m4, acinclude.m4/lib-ld.m4, acinclude.m4/lib-link.m4, acinclude.m4/lib-prefix.m4, acinclude.m4/progtest.m4: Import from gettext-0.16. * aclocal.m4: Renerate. 2006-11-17 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc (edit_toolbar, edit_toolbar_docked): New variables. (main_toolbar_docked): Rename from ... (toolbar_docked): ... this. (cancel_edit_mode, edit_board, update_toolbar, create_toolbar, update_menu_and_toolbar_pref, main_real): Split edit board buttons to separate toolbar. 2006-11-17 Kriang Lerdsuwanakij * grhino.cc (main_toolbar): Rename from ... (toolbar): ... this. (update_toolbar, create_toolbar, update_menu_and_toolbar_pref, main_real): Adjust. 2006-11-17 Kriang Lerdsuwanakij * grhino.cc (button_edit, icon_edit): New variables. (button_finish, icon_finish): Rename from ... (button_ok, icon_ok): ... these. (cancel_edit_mode, edit_board, load_pixmaps, init_pixmaps, create_toolbar): Adjust. 2006-11-16 Kriang Lerdsuwanakij * grhino.cc (MENU_INDEX_SHOW_TOOLBAR, MENU_INDEX_SWITCH_AI): New define. (update_menu_and_toolbar_pref): Use them. 2006-11-16 Kriang Lerdsuwanakij * grhino.cc: Move menu data structures earlier. (MENU_INDEX_EDIT_BOARD, MENU_INDEX_UNDO, MENU_INDEX_REDO, MENU_INDEX_BEGIN, MENU_INDEX_PREV, MENU_INDEX_NEXT, MENU_INDEX_END): New define. (cancel_edit_mode, edit_board): Enable/disable Edit board menu. (update_menu_and_toolbar): Adjust. 2006-11-16 Kriang Lerdsuwanakij From Michel Salim : * grhino.png: New file. * grhino.cc (main_real): Set default icon. * ad.append (install_mkdir): Create icon_dir if not exists. (install): Install grhino.png. * ad.prepend (icon_dir): New variable. * ad.rule: Define ICONDIR. * MANIFEST: Add grhino.png. * Makefile.in: Regenerate. * NEWS: Document. 2006-11-15 Kriang Lerdsuwanakij * Makefile.in: Regenerate. 2006-11-15 Kriang Lerdsuwanakij * NEWS: Document bugs in libraries. 2006-11-15 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. 2006-11-15 Kriang Lerdsuwanakij * game.cc (log_history_GGS): Fix off-by-one error. * grhino.cc (new_game): Simplify. (cancel_edit_mode): Can be called regardless of view mode. (finish_edit_mode): Issue error on invalid board. (edit_board): Ignore if already in edit mode. Use current board in view mode if available. No longer assume black with play first. * load.cc: Update copyright year. (cancel_edit_mode): Declare. (load_game): Use it. 2006-11-14 Kriang Lerdsuwanakij * grhino.cc: Include "icon_bw.xpm". (button_ok, icon_ok): New variables. (load_pixmaps, init_pixmaps, create_toolbar): Adjust. (cancel_edit_mode): New function. (new_game): Use it. (finish_edit_mode, menu_edit_player, menu_edit_finish): New function. (edit_board): New function. Split out from ... (menu_game_edit_board): ... here. 2006-11-14 Kriang Lerdsuwanakij * grhino.cc: Include "icon_empty.xpm", "icon_black.xpm", "icon_white.xpm". (button_empty, button_black, button_white, icon_empty, icon_black, icon_white, tooltips): New variables. (menu_game_edit_board): Support edit toolbar. (menu_edit_empty, menu_edit_black, menu_edit_white): New functions. (load_pixmaps, init_pixmaps): Initialize icon_empty, icon_black, icon_white. (create_toolbar_button, create_toolbar_radio_button): New functions replacing obsoleted gtk+ code in create_toolbar. (create_toolbar): Use them. 2006-11-14 Kriang Lerdsuwanakij * Add highlight_black.xpm, highlight_empty.xpm, highlight_white.xpm, icon_bw.xpm, theme/small/highlight_black.xpm, theme/small/highlight_empty.xpm, theme/small/highlight_white.xpm: Add. 2006-11-14 Kriang Lerdsuwanakij * highlight_black.xpm, highlight_empty.xpm, highlight_white.xpm, icon_black.xpm, icon_bw.xpm, icon_empty.xpm, icon_new.xpm, icon_white.xpm: Add to CVS. 2006-11-14 Kriang Lerdsuwanakij * theme/small/black.xpm, theme/small/black_last.xpm, theme/small/bottom.xpm, theme/small/empty.xpm, theme/small/highlight_black.xpm, theme/small/highlight_empty.xpm, theme/small/highlight_white.xpm, theme/small/hint_black.xpm, theme/small/hint_white.xpm, theme/small/left.xpm, theme/small/right.xpm, theme/small/top.xpm, theme/small/white.xpm, theme/small/white_last.xpm: Add to CVS. 2006-11-05 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc (init_game): Stop dragging. (switch_computer_color): Don't continue playing if edit is in progress. (menu_game_edit_board): Clear current game. 2006-11-04 Kriang Lerdsuwanakij * NEWS, TODO: Update. 2006-11-04 Kriang Lerdsuwanakij * grhino.cc: Include highlight_black.xpm, highlight_white.xpm, highlight_empty.xpm. (highlight_black_pixmap, highlight_white_pixmap, highlight_empty_pixmap, button_drag_to_x, button_drag_to_y): New variables. (draw_board, button_press_signal): Highlight drag during edit. (mouse_move_signal): New function. (load_pixmaps): Load highlight pixmaps. (main_real): Connect mouse move signal. 2006-11-04 Kriang Lerdsuwanakij * grhino.cc (edit_board_color, button_drag_state, button_drag_from_x, button_drag_from_y): New variable. (draw_board, update_menu_and_toolbar): Adjust view_mode. (update_status_bar, button_press_signal): Implement edit board. (menu_game_edit_board): Implement more. (menu_game_info): Add Edit board menu. (main_real): Add mouse release event. 2006-11-04 Kriang Lerdsuwanakij * game.h (find_opening_name(byte_board_info *)): New function. * game.h (find_opening_name(byte_board_info *)): New function. (find_opening_name): Use it. 2006-11-04 Kriang Lerdsuwanakij * board.h: Update copyright year. (byte_board_info::set_pos): New member. * board.cc: Update copyright year. (byte_board_info::set_pos): New member. 2006-11-04 Kriang Lerdsuwanakij * game.h (view_mode_type): New enum. (view_mode): Change type to view_mode_type. (set_view_mode): Declare. * game.cc (view_mode): Adjust. * ghistwin.cc (set_view_mode): Remove declaration. (game_history_selected): Adjust set_view_mode calls. * grhino.cc (set_view_mode, draw_board, update_status_bar): Adjust. (place_piece_and_update, new_game, undo, redo, menu_game_begin, menu_game_prev, menu_game_next, menu_game_end): Adjust set_view_mode calls. (menu_game_edit_board): New function. * load.cc (set_view_mode): Remove declaration. (load_game): Adjust set_view_mode call. 2006-11-04 Kriang Lerdsuwanakij * help/C/grhino.xml: Document unit of "Animation delay" option in preference. 2006-11-04 Kriang Lerdsuwanakij * ad.append (post_install): New target for installation script. (Makefile.in): Regenerate. 2006-11-04 Kriang Lerdsuwanakij * ad.append (default-intl): Remove. (install_mkdir): Create OMF directory if required. (install): Fix typo. Run scrollkeeper-update if not building package. * ad.prepend (omfdir): New variable. * Makefile.in: Regenerate. 2006-11-04 Kriang Lerdsuwanakij * grhino.cc (menu_help_about): Remove copyrighted name. Update copyright year. 2006-11-04 Kriang Lerdsuwanakij * help/C/grhino-C.omf.in, help/C/grhino.xml: Remove copyrighted name. 2006-10-30 Kriang Lerdsuwanakij Sun Oct 29 2006 Michel Salim - 0.15.2-3 * ad.append, Makefile.in, help/C/grhino-C.omf.in: Fix incorrect OMF path. ************************ rhino 0.15.2 released ************************ 2006-08-10 Kriang Lerdsuwanakij From Ernani Azevedo: * Makefile.in: Regenerate. * NEWS: Update. * scripts/version: Bump version to 0.15.2. ************************ rhino 0.15.1 released ************************ 2006-08-05 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.15.1. 2006-08-05 Kriang Lerdsuwanakij * NEWS: Update. 2006-08-05 Kriang Lerdsuwanakij * gtp-rhino.cc (gtpfunc_show_history): Show pass moves. 2006-08-05 Kriang Lerdsuwanakij * NEWS: Update. 2006-08-05 Kriang Lerdsuwanakij * game.cc, game.h: Update copyright year. * gameinfo.cc (game_info::new_game_from_begin): Initialize first_play_is_pass. (game_info::new_game_from_board): Handle when first move is a pass. * gameinfo.h (game_info::first_play_is_pass): New data member. * gtp-rhino.cc (gtpfunc_show_history): New function. (gtp_commands): Add grhino-show_history. 2006-08-04 Kriang Lerdsuwanakij * NEWS: Update. * gtp-rhino.cc (gtpfunc_setup_board): Accept optional player to play argument. 2006-08-03 Kriang Lerdsuwanakij * gtp-rhino.cc (gtpfunc_setup_board): Accept '-', '.' as empty. 'o', '0' as white, '*', 'X', 'x' as black. 2006-08-03 Kriang Lerdsuwanakij * game.cc (new_game(game_info &, const byte_board_info)): Add color parameter. * game.h (new_game(game_info &, const byte_board_info)): Adjust. * gtp-rhino.cc (gtp_new_game): Add color parameter. 2006-03-19 Kriang Lerdsuwanakij Change from Fedora Extras 5 (grhino-Makefile-in.patch in grhino-0.15.0-5.fc5.src.rpm) * ad.append (install_mkdir, install): Add $DESTDIR. 2005-05-01 Kriang Lerdsuwanakij Change from NetBSD port by kristerw * grhino.cc: Include . 2005-04-23 Kriang Lerdsuwanakij * help/C/grhino.xml: Use directory class in filename tags. ************************ rhino 0.15.0 released ************************ 2005-04-15 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.15.0. 2005-04-15 Kriang Lerdsuwanakij * NEWS: Update. * alphabeta.cc (midgame_strategy::end_board_score): New member. (midgame_strategy::board_score): Use it. (endgame_strategy::end_board_score): New member. (endgame_strategy::board_score): Use it. (midgame_strategy_with_random::end_board_score): New member. (midgame_strategy_with_random::board_score): Use it. (endgame_strategy_with_random::end_board_score): New member. (endgame_strategy_with_random::board_score): Use it. (temp_alpha_beta, temp_alpha_beta_new): Fix wipe out prevention logic. 2005-04-15 Kriang Lerdsuwanakij * NEWS: Update. 2005-04-15 Kriang Lerdsuwanakij * TODO: Update. * aiai.cc (fifo_black_to_client, fifo_black_to_server, fifo_white_to_client, fifo_white_to_server): Change to pointers. (synchro_rand, fifo1, fifo2, fifo3, fifo4): New variables. (init, connect_clients): Adjust. (game_loop): Add reverse parameter. (main_real): Support synchro rand. 2005-04-14 Kriang Lerdsuwanakij * TODO: Update. 2005-04-14 Kriang Lerdsuwanakij * NEWS: Update. * aiai.cc: Include "boardio.h". (game_loop): Use num_history. * game.cc: Include "boardio.h". (log_history_ios_old, log_history_GGS): Use num_history. * gameinfo.cc (place_piece): Correctly update max_num_history. 2005-04-14 Kriang Lerdsuwanakij * aiai (cmd_black, cmd_white): Change. (gtpcmd_setup_board): New variable. (game_loop): Support random game. (main_real): Output game type. 2005-04-13 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. 2005-04-13 Kriang Lerdsuwanakij * NEWS: Update. * aiai.cc (cmd_black, cmd_white): Change. * alphabeta.cc (midgame_strategy::board_score, midgame_strategy_with_random::board_score): Prevent wipe out. * grhino.cc (read_config): Default AI level to 2. * gtp-rhino.cc (init): Likewise. 2005-04-12 Kriang Lerdsuwanakij * TODO: Update. * aiai.cc (cmd_black, cmd_white): Change. 2005-04-12 Kriang Lerdsuwanakij * aiai.cc (main_real): Fix screeb output. Output game and score. 2005-04-12 Kriang Lerdsuwanakij * aiai.cc (cmd_black, cmd_white): New variables. Split out from ... (connect_clients): ... here. (game_win_black, game_win_white, game_draw, total_score_black, total_score_white, last_score_black, last_score_white): New variables. (game_loop): Use them. (main_real): Accept number of game argument. Log information to 'gtp-rhino.info'. * game.cc (log_history_GGS): Fix score adjustment for game_result_resign_white. 2005-04-12 Kriang Lerdsuwanakij * gtp.h, gtp.cc: New files. Split out from ... * gtp-rhino.cc: ... here. Include "gtp.h". * MANIFEST: Add gtp.h, gtp.cc. * ad.rule (gtp-rhino, aiai): Add gtp.cc * aiai.cc: Include "gtp.h". (init): Default log_move to true. (game_loop): Add FIXME. Call log_history. (main_real): Process arguments. * Makefile.in: Regenerate. 2005-04-11 Kriang Lerdsuwanakij * aiai.cc (read_move): Fix compiler warnings. (game_loop): New function. Split out from ... (main_real): ... here. 2005-04-11 Kriang Lerdsuwanakij * aiai.cc (gtpcmd_genmove_black, gtpcmd_genmove_white, gtpcmd_play_black, gtpcmd_play_white): New variables. (read_response, read_move): New functions. (connect_clients): Throw exception upon dup2 and execlp failure. Call read_response. (disconnect_clients): Call read_response. (main_real): Implement. 2005-04-11 Kriang Lerdsuwanakij * aiai.cc: Include , "alphabeta.h". (gtpcmd_boardsize, gtpcmd_clear_board, gtpcmd_quit): New variables. (connect_clients, disconnect_clients, main_real): Use them. 2005-04-11 Kriang Lerdsuwanakij * aiai.cc: Include , . (fifo_black_to_client, fifo_black_to_server, fifo_white_to_client, fifo_white_to_server, pid_black, pid_white): New variables. (connect_clients, disconnect_clients): New functions. (main_real): Use them. 2005-04-10 Kriang Lerdsuwanakij * ad.rule (aiai): Add alphabeta.cc, binfile.cc, boardio.cc, book.cc, gameinfo.cc, hash.cc, iter.cc, opening.cc, order.cc, pattern.cc, parity.cc, proginfo.cc. * aiai.cc (prog_name): Fix name. (init, main_real): New functions. * Makefile.in: Regenerate. 2005-04-10 Kriang Lerdsuwanakij * ad.append (all): Add aiai. * Makefile.in: New target. 2005-04-10 Kriang Lerdsuwanakij * aiai.cc: New file. * MANIFEST: Add aiai.cc. * ad.rule (aiai): New target. * Makefile.in: Regenerate. 2005-04-10 Kriang Lerdsuwanakij * TODO: Update. 2005-04-10 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. * fdstream.h: Comment out code. * game.cc: Include , , . (log_history_ios_old, log_history_GGS): Return upon file open error. (log_history): Lock game log file before update. 2005-04-10 Kriang Lerdsuwanakij * fdstream.h: New file. * MANIFEST (grhino): Add fdstream.h * Makefile.in: Regenerate. * game.cc: Include "fdstream.h". * gtstream.h, gtstream.cc: Fix comment. 2005-04-09 Kriang Lerdsuwanakij * grhino.cc (update_menu_and_toolbar_pref): Simplify. 2005-04-09 Kriang Lerdsuwanakij * grhino.cc (update_menu_and_toolbar_pref): Handle Alternate and Random AI color. 2005-04-09 Kriang Lerdsuwanakij * help/C/grhino.xml: Update. Restore menubar, statusbar. 2005-04-08 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. * board.cc: Include , , . (_, N_): Define. (byte_board_info::operator=): Throw exception for invalid initial board. * gtp-rhino.cc (gtp_new_game): Add const byte_board_info * parameter. (gtpfunc_setup_board): New function. (gtp_commands): Adjust. 2005-04-08 Kriang Lerdsuwanakij * help/C/grhino.xml: Document Show last move. Use menu bar, status bar. 2005-04-07 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. * gpref.cc (check_show_last_move): New variable. (preferences_apply): Reload theme when hint_move changes. Handle show_last_move. (preferences): Handle show_last_move. * grhino.cc (load_pixmaps): Set hint_black_pixmap, hint_white_pixmap only when hint_move is true. Set black_last_pixmap, white_last_pixmap only when show_last_move is true. 2005-04-07 Kriang Lerdsuwanakij * TODO: Update. * game.cc (show_last_move): New variable. * game.h (show_last_move): Declare. * grhino.cc: Include "black_last.xpm", "white_last.xpm". (black_last_pixmap, white_last_xpm): New variables. (load_pixmaps): Use them. (write_config, read_config, draw_board): Handle show_last_move. 2005-04-07 Kriang Lerdsuwanakij * Makefile.in: Regenerate. 2005-04-07 Kriang Lerdsuwanakij * black_last.xpm, white_last.xpm: New files. * MANIFEST: Add black_last.xpm, white_last.xpm, theme/small/black_last.xpm, theme/small/white_last.xpm. * ad.append (install): Install theme/small/black_last.xpm, theme/small/white_last.xpm. * hint_black.xpm, hint_white.xpm: Reduce hint size. 2005-04-07 Kriang Lerdsuwanakij * game.cc (new_game(game_info &, const_byte_board_info &)): New function. * game.h (new_game(game_info &, const_byte_board_info &)): Declare. 2005-04-07 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. * help/C/grhino.xml: Document new AI color settings. 2005-04-07 Kriang Lerdsuwanakij * game.cc (set_game_mode): Retain AI color while switching to COMPUTER_ALTERNATE or COMPUTER_RANDOM. 2005-04-07 Kriang Lerdsuwanakij * gpref.cc (preferences_apply): Call set_game_mode only when game mode is changed. 2005-04-06 Kriang Lerdsuwanakij * game.h (game_mode_type): Add COMPUTER_ALTERNATE, COMPUTER_RANDOM. (NUM_GAME_MODE): New constant. (game_mode_name): Use it. * game.cc: Include "rand.h". (new_game_game_mode): New function. (new_game): Use it. (game_mode_name, set_game_mode, get_game_mode_string): Adjust. * gpref.cc (preferences_apply, preferences): Use NUM_GAME_MODE. * grhino.cc (read_config): Likewise. 2005-04-06 Kriang Lerdsuwanakij * game.cc (switch_computer_game_mode): New function. Split out from ... * grhino.cc (switch_computer_color): ... here. * game.h (switch_computer_game_mode): Declare. 2005-04-06 Kriang Lerdsuwanakij * game.cc (game_mode): Initialize. (black_ai, white_ai): New variables. (set_game_mode, is_computer_player): Adjust. 2005-04-06 Kriang Lerdsuwanakij * gen_pattern.cc (init_file, load_file, generate_file, process_pattern): Fix compiler error on GCC 3.4. 2005-04-06 Kriang Lerdsuwanakij * Makefile.in: Regenerate. * TODO: Update. * game.h (game_mode): Remove declaration. * log_proc.h (game_log): Fix compiler warnings. 2005-03-28 Kriang Lerdsuwanakij * ad.prepend: Update copyright year. 2005-03-28 Kriang Lerdsuwanakij * log_proc.h (process_game_GGS): Add FIXME. 2005-03-28 Kriang Lerdsuwanakij * NEWS: Update. 2005-03-28 Kriang Lerdsuwanakij From Paul Pogonyshev: * game.cc: Include . 2005-03-28 Kriang Lerdsuwanakij * gen_pattern.cc (store_file): Close file upon exit. ************************ rhino 0.14.0 released ************************ 2005-03-27 Kriang Lerdsuwanakij * README: Document gtp-rhino. 2005-03-27 Kriang Lerdsuwanakij * TODO: Update. 2005-03-27 Kriang Lerdsuwanakij * game.cc (log_history_ios_old, log_history_GGS, log_history): Add filename, black_name, white_name parameters. * game.h (log_history): Adjust. * grhino.cc (place_piece_and_update, timeout_update): Likewise. * gtp-rhino.cc (gtp_maybe_log_game): Likewise. (gtpfunc_undo): Clear game_logged. 2005-03-27 Kriang Lerdsuwanakij * TODO: Update. * gtp-rhino.cc (gtp_commands): Enable grhino-auto_play. 2005-03-27 Kriang Lerdsuwanakij * gtp-rhino.c (prog_name): Use executable name. (process_unsigned_option): New function. (main_real): Use it. Add -b, -e, -m, -r, -w. 2005-03-26 Kriang Lerdsuwanakij * TODO: Update. 2005-03-26 Kriang Lerdsuwanakij * TODO: Update. 2005-03-26 Kriang Lerdsuwanakij * ad.append (install): Fix gtp-rhino install target. * Makefile.in: Regenerate. 2005-03-24 Kriang Lerdsuwanakij * TODO: Update. 2005-03-24 Kriang Lerdsuwanakij * gtp-rhino.cc (io_error): New class. (input_char, output_char, output_flush): Detect I/O error. (gtp_process_loop): Handle I/O error. 2005-03-24 Kriang Lerdsuwanakij * ad.append (install): Install gtp-rhino. * Makefile.in: Regenerate. * scripts/version: Bump version number to 0.14.0. 2005-03-24 Kriang Lerdsuwanakij * gtp-rhino.cc (main_time, byo_yomi_time, byo_yomi_stones, use_byo_yomi, time_left_black, stone_left_black, time_left_white, stone_left_white): New variables. (gtp_new_game, gtpfunc_play, gtpfunc_genmove): Adjust. (gtpfunc_time_settings, gtpfunc_time_left): New functions. (gtp_commands): Adjust. 2005-03-24 Kriang Lerdsuwanakij * TODO: Update. * gtp-rhino.cc (game_logged, is_log): New variables. (gtp_maybe_log_game): New function. (gtpfunc_play, gtpfunc_genmove, gtpfunc_auto_play): Use it. (init): Set is_log. (main_real): Handle --level, --level=, --log. Detect unknown option. 2005-03-23 Kriang Lerdsuwanakij * game.cc (log_history_GGS): Rename from ... (log_history_GGS_v1): ... this. (log_history_GGS_v2): Remove. (log_history): Adjust. 2005-03-23 Kriang Lerdsuwanakij * configure.in: Enable gtp-rhino by default. Check options before checking language features. * Makefile.in: Regenerate. 2005-03-23 Kriang Lerdsuwanakij * NEWS: Update. * gtp-rhino.cc (init): Split out from ... (main): ... here. (main_real): New function with code from ... (main): ... this. (set_level): New function. 2005-03-23 Kriang Lerdsuwanakij * TODO: Update. * gtp-rhino.cc (gtpfunc_genmove, gtpfunc_reg_genmove): Handle komi. (gtpfunc_auto_play): New function. 2005-03-23 Kriang Lerdsuwanakij * TODO: Update. * alphabeta.cc (eval_winlossdraw): Add komi parameter. * alphabeta.h (eval_winlossdraw): Adjust. * game.cc (get_computer_move): Add komi parameter. * game.h (get_computer_move): Adjust. * gtp-rhino.cc (komi): New variable. (read_float): New function. (gtpfunc_komi): Use it. (gtpfunc_final_score): Handle komi. * log_proc.h (process_game_GGS): Handle multiple '.'. 2005-03-23 Kriang Lerdsuwanakij * gtp-rhino.cc (gtpfunc_final_score): New function. (gtp_commands): Adjust. 2005-03-22 Kriang Lerdsuwanakij * TODO: Update. * gtp-rhino.cc: Include , "boardio.h". (output_line): Don't output newline chars if not necessary. (gtpfunc_showboard): New function. (gtp_commands): Adjust. (main): Call gtp_new_game. 2005-03-22 Kriang Lerdsuwanakij * rand.cc (random_off, random_on): New functions. (get_random): Adjust. * rand.h (random_off, random_on): Declare. * gtp-rhino.cc: Include "rand.h". (gtpfunc_reg_genmove): Use random_off, random_on. 2005-03-22 Kriang Lerdsuwanakij * gtp-rhino.cc (randomness): New variable. 2005-03-22 Kriang Lerdsuwanakij * gtp-rhino.cc (gtpfunc_reg_genmove): New function. (gtp_commands): Update. (main): Use randomness, opening_var. 2005-03-21 Kriang Lerdsuwanakij * game.cc: Include "alphabeta.h", "pattern.h", "book.h", "hash.h". (get_computer_move): New function. Split out from ... * grhino.cc (computer_thread): ... here. * gtp-rhino.cc (gtpfunc_genmove): ... and here. * game.h (get_computer_move): Declare. 2005-03-21 Kriang Lerdsuwanakij * NEWS: Update. 2005-03-21 Kriang Lerdsuwanakij * TODO: Update. 2005-03-21 Kriang Lerdsuwanakij * configure.in: Add --enable-gnome, --enable-gtp. Determine DEFTARGETLIST. Check GNOME libraries only if --enable-gnome. * ad.rule: Substitute DEFTARGETLIST. * Makefile.in: Regenerate. 2005-03-21 Kriang Lerdsuwanakij * NEWS: Update. 2005-03-21 Kriang Lerdsuwanakij * TODO: Update. 2005-03-20 Kriang Lerdsuwanakij * gtp-rhino.cc (gtp_new_game): New function. Split out from ... (gtpfunc_clear_board): ... this. (gtpfunc_boardsize): Rename from ... (gtpfunc_board_size): ... this. (gtpfunc_boardsize): Use gtp_new_game. (gtp_commands): Adjust. (main): Set default parameters. 2005-03-20 Kriang Lerdsuwanakij * gtp-rhino.cc (gtpfunc_clear_board): Set time_player. (gtpfunc_play): Use time_player. (gtpfunc_genmove): Output move. (main): Initialize transposition table, hash, pattern, book, and random seed. 2005-03-20 Kriang Lerdsuwanakij * gtp-rhino.cc (skip_non_space): Rename from ... (parse_command): ... this. (gtpfunc_known_command, gtpfunc_set_game, gtp_process_loop): Adjust. (read_color): New function. (gtpfunc_play, gtpfunc_genmove): Implement. (main): Set default level. 2005-03-20 Kriang Lerdsuwanakij * gtp-rhino.cc (gtpfunc_undo): Implement. (gtpfunc_set_game): Fix error output. 2005-03-20 Kriang Lerdsuwanakij * TODO: Update. * gtp-rhino.cc (syntax_error): New class. (read_unsigned, throw_if_extra_argument): Throw syntax_error. (throw_command_error_if_end_of_line): Rename from ... (throw_if_end_of_line): ... this. (throw_syntax_error_if_end_of_line, gtpfunc_set_game, gtpfunc_list_games): New functions. (gtp_commands, board_size, gtp_process_loop): Adjust. (gtpfunc_komi, gtpfunc_play): Throw on syntax error. 2005-03-20 Kriang Lerdsuwanakij * TODO: Update. * gtp-rhino.cc (command_quit): New class. (parse_id, output_response, output_error): Change id parameter type to unsigned. (gtp_func): New typedef. (gtp_command): New struct. (gtpfunc_protocol_version, gtpfunc_name, gtpfunc_version, gtpfunc_known_command, gtpfunc_list_commands, gtpfunc_quit, gtpfunc_board_size, gtpfunc_clear_board, gtpfunc_komi, gtpfunc_play, gtpfunc_genmove, gtpfunc_undo): New functions. Split out from ... (gtp_process_loop): ... here. (gtp_commands): Change type to gtp_command. 2005-03-20 Kriang Lerdsuwanakij * gtp-rhino.cc (skip_space, parse_command): Check index first. (read_unsigned, throw_if_extra_argument): New functions. (gtp_commands): New variable. (gtp_process_loop): Check all commands. Implement known_command, list_commands. 2005-03-19 Kriang Lerdsuwanakij * gtp-rhino.cc (input_char, output_char): Change to char. Use get and put. (command_error): New class. (output_flush, output_line(const char *), skip_space, parse_command, throw_if_end_of_line, output_response, output_error, main): New functions. (input_line): Change to char. (output_line): Call output_flush. (parse_id): Handle line with no id. (gtp_process_loop): Handle protocol_version, name, version, quit. 2005-03-19 Kriang Lerdsuwanakij * gtp-rhino.cc (input_char, output_char, input_line): Use unsigned char. (input_line): Use control char range according to GTP spec. (output_line): Output two newline char. (id_error): New class. (parse_id, gtp_process_loop): New functions. 2005-03-19 Kriang Lerdsuwanakij * gtp-rhino.cc (input_char, output_char, input_line, output_line): New functions. 2005-03-19 Kriang Lerdsuwanakij * gtp-rhino.cc: Rename from ... * gtp-grhino.cc: ... this. * MANIFEST, ad.rule, ad.append: Adjust. * Makefile.in: Regenerate. 2005-03-19 Kriang Lerdsuwanakij * ad.append (all): Add gtp-grhino. * Makefile.in: Regenerate. 2005-03-19 Kriang Lerdsuwanakij * gtp-grhino.cc: New file. * MANIFEST: Add gtp-grhino.cc. * ad.rule (gtp-grhino): New target. * Makefile.in: Regenerate. * TODO: Update. 2005-03-19 Kriang Lerdsuwanakij * grhino.cc (input_timeout_id): Move from ... * game.cc (input_timeout_id): ... here. * game.h: Don't include . (input_timeout_id): Remove. 2005-03-19 Kriang Lerdsuwanakij * game.h: Don't include , . Include . ************************ rhino 0.13.0 released ************************ 2005-03-05 Kriang Lerdsuwanakij * game.cc (maybe_set_ai_tampered): Use cur_game_info.is_random_game instead of start_game_mode. * grhino.cc (update_status_bar): Likewise. 2005-03-05 Kriang Lerdsuwanakij * grhino.cc (new_game): Update Game List window. * load.cc (load_game_list): Likewise. 2005-03-05 Kriang Lerdsuwanakij * game.cc (update_hook::update_except): New function. * game.h (update_hook::update_except): Declare. * ggamewin.cc (game_library_selected): Change parameter type. Update other game list windows. (game_library): Adjust. 2005-03-05 Kriang Lerdsuwanakij * game.cc (update_hook::remove): Add void * parameter. * game.h (update_hook::remove): Adjust. * gevalwin.cc (evaluate_position_closed): Likewise. * ggamewin.cc (game_library_update): Implement. (game_library_closed): Remove update hook. (game_library): Add update hook. * ghistwin.cc (game_history_closed): Adjust. 2005-03-05 Kriang Lerdsuwanakij * game.h (update_func): Add void * parameter. (update_item): New struct. (update_hook::vec): Change type to vector of update_item. (update_hook::add): Add void * parameter. * game.cc (update_hook::update, update_hook::add, update_hook::remove): Adjust. * gevalwin.cc (evaluate_position_update): Add void * parameter. (evaluate_position): Adjust. * ggamewin.cc (game_library_update): New function. * ghistwin.cc (game_history_update): Add void * parameter. (game_history): Adjust. * grhino.cc (update_status_bar, update_menu_and_toolbar): Add void * parameter. (init_game): Adjust. 2005-03-05 Kriang Lerdsuwanakij * game.h (update_hook): New class with member moved from ... (update_state, add_update_hook, remove_update_hook): ... these. (update_move, update_game_list): Declare. * game.cc (update_move, update_game_list): Declare. (update_hook::update, update_hook::add, update_hook::remove): Move code from ... (update_state, add_update_hook, remove_update_hook): ... these. * gevalwin.cc (evaluate_position_closed, evaluate_postion): Adjust. * ghistwin.cc (game_history_closed, game_history_selected, game_history): Likewise. * gpref.cc (preferences_apply): Likewise. * grhino.cc (place_piece_and_update, timeout_update, init_game, new_game, undo, redo, switch_computer_color, menu_game_begin, menu_game_prev, menu_game_next, menu_game_end): Likewise. * load.cc (load_game): Likewise. 2005-03-05 Kriang Lerdsuwanakij * game.cc (log_history_ios_old): Comment out. 2005-03-05 Kriang Lerdsuwanakij * log_proc.h (game_log::game_log): Initialize num_pass_queue. 2005-03-01 Kriang Lerdsuwanakij * game.cc (log_history_GGS_v1): Log the last move. Log passes. 2005-03-01 Kriang Lerdsuwanakij * NEWS: Update. 2005-03-01 Kriang Lerdsuwanakij * load.cc (load_game): Set move time. * log_proc.h (game_log::time_pass_queue, game_log::num_pass_queue): New fields. (game_log::push_pass): New member function. (process_game_GGS): Fix time parsing. Record time to pass. 2005-03-01 Kriang Lerdsuwanakij * game.cc (log_history_GGS_v1): Log move time only if available. * log_proc.h (process_game_GGS): Process move time. 2005-03-01 Kriang Lerdsuwanakij * alphabeta.cc (temp_alpha_beta): Disable transposition table. (temp_alpha_beta_new): New function. * gameinfo.h: Add comments. * hash.cc: Likewise. * log_proc.h (game_log::time_queue): New field. (game_log::push_move): Add int parameter. Adjust. 2005-02-28 Kriang Lerdsuwanakij * gameinfo.h (game_info::clock_history_black, game_info::clock_history_white): Make private. (game_info::get_clock): Declare. * gameinfo.cc (game_info::get_clock): New function. * grhino.cc (place_piece_and_update, undo, redo): Use it. 2005-02-28 Kriang Lerdsuwanakij * gameinfo.h (use_clock): Make private. (is_use_clock): New function. * grhino.cc (place_piece_and_update, input_check): Use it. 2005-02-28 Kriang Lerdsuwanakij * gameinfo.h (game_info::game_result): Make private. (game_info::get_game_result): New function. * grhino.cc (update_status_bar): Use it. * game.cc (log_history_ios_old, log_history_GGS_v1): Likewise. 2005-02-28 Kriang Lerdsuwanakij * gameinfo.h (game_info::game_play): Make private. (game_info::is_game_play): New function. * game.cc (get_wait_player): Use it. * gpref.cc (preferences_apply): Likewise. * grhino.cc (update_status_bar, place_piece_and_update, timeout_update, input_check, new_game, undo, redo, switch_computer_color): Likewise. * load.cc (load_game): Likewise. Handle timeout and resign game. 2005-02-28 Kriang Lerdsuwanakij * game_info.cc (game_info::game_end): New function. * game_info.h (game_info::player): Make private. (game_info::game_end): Declare. (game_info::get_player): New function. * game.cc (get_wait_player): Use it. * grhino.cc (draw_board, update_status_bar, place_piece_and_update, computer_thread, undo, redo, button_press_signal): Likewise. 2005-02-28 Kriang Lerdsuwanakij * TODO: Update. 2005-02-28 Kriang Lerdsuwanakij * help/C/grhino.xml: Update copyright year. Add game list sorting. 2005-02-28 Kriang Lerdsuwanakij * help/C/figures/gamelist.png: Don't put in CVS. 2005-02-28 Kriang Lerdsuwanakij * help/C/figures/gamelist.png: New file. * MANIFEST: Add help/C/figures/gamelist.png. * ad.append: Install help/C/figures/gamelist.png. * Makefile.in: Regenerate. * ggamewin.cc (game_library_fill): Adjust random piece output. * help/C/grhino.xml: Add Saved Games section. 2005-02-28 Kriang Lerdsuwanakij * NEWS: Update. * gen_book.cc (main_real): Update copyright year in message. * gen_pattern.cc (main_real): Likewise. * grhino.cc (menu_help_about): Likeise. 2005-02-28 Kriang Lerdsuwanakij * ggamewin.cc (game_library_fill): Fill game result. * log_proc.h (process_game_GGS): Fix GGS game score. 2005-02-28 Kriang Lerdsuwanakij * log_proc.h (game_log): Add game_format, format. (process_line_IOS): Use them. Set timeout, resign for newer IOS formats. (process_line_GGS): Use them. 2005-02-28 Kriang Lerdsuwanakij * log_proc.h (game_log): Add timeout, resign, mutual. (game_log::game_log): Initialize them. (process_line_IOS, process_game_GGS): Use them. 2005-02-28 Kriang Lerdsuwanakij * ggamewin.cc (game_library): Make column sortable. 2005-02-28 Kriang Lerdsuwanakij * ggamewin.cc (game_library): Fix initial highlight position. 2005-02-28 Kriang Lerdsuwanakij * NEWS: Update. * ghistwin.cc (game_history_update): Also set cursor. (game_history): Use game_history_update. Connect selection after update. 2005-02-28 Kriang Lerdsuwanakij * load.cc (load_game): Fix broken error message. 2005-02-28 Kriang Lerdsuwanakij * load.cc (load_game): Use cur_game_info member functions. 2005-02-28 Kriang Lerdsuwanakij * gameinfo.cc (game_info::game_info): Set use_clock. * gameinfo.h (game_info): Change to class. (game_info::random_game, game_info::random_game_pieces): Change to private. (game_info::is_random_game, game_info::get_random_game_pieces): New members. * game.cc (log_history_ios_old, log_history_GGS_v1): Use them. * grhino.cc (computer_thread): Likewise. 2005-02-28 Kriang Lerdsuwanakij * gameinfo.cc (game_info::place_piece): Split out from ... * grhino.cc (place_piece_and_update): ... here. * gameinfo.cc (game_info::player_resign): New member. * gameinfo.h (game_info::place_piece, game_info::player_resign): Declare. 2005-02-27 Kriang Lerdsuwanakij * TODO: Update. 2005-02-27 Kriang Lerdsuwanakij * game.cc (wait_player, get_game_play): Remove. (new_game): Don't set wait_player. (get_wait_player): Remove parameter. Check cur_game_info.game_play. * game.h (wait_player, get_game_play): Remove. (get_wait_player): Remove parameter. * gpref.cc (preferences_apply): Use get_wait_player. * grhino.cc (update_status_bar, input_check, new_game, button_press_signal): Likewise. (place_piece_and_update, timeout_update): Don't set wait_player. (undo, redo, switch_computer_color): Use get_wait_player. Don't set wait_player. 2005-02-27 Kriang Lerdsuwanakij * gameinfo.cc (new_game_remaining, new_game_from_begin): Add new int parameter to deal with move queue. (new_game_from_board): Adjust. * gameinfo.h (new_game_remaining, new_game_from_begin): Adjust. * game.cc (new_game): Don't set min_num_history here. 2005-02-27 Kriang Lerdsuwanakij * gameinfo.cc (game_info::player_timeout): Split out from ... * grhino.cc (timeout_update): ... here. * gameinfo.h (game_info::player_timeout): Declare. 2005-02-27 Kriang Lerdsuwanakij * gameinfo.cc (game_info::undo, game_info::redo): Use set_game_play_from_board. 2005-02-27 Kriang Lerdsuwanakij * game.cc (undo, redo): Actually remove functions. 2005-02-27 Kriang Lerdsuwanakij * gameinfo.cc (game_info::undo, game_info::redo): Move from ... * game.cc (undo, redo): ... here. * gameinfo.h (game_info::undo, game_info::redo): Declare. * game.h (undo, redo): Remove. * grhino.cc (undo, redo): Adjust. 2005-02-27 Kriang Lerdsuwanakij * gameinfo.cc (game_info::is_undoable, game_info::is_redoable): Move from ... * game.cc (is_undoable, is_redoable): ... here. * gameinfo.h (game_info::is_undoable, game_info::is_redoable): Declare. * game.h (is_undoable, is_redoable): Remove. * grhino.cc (is_undoable, is_redoable): Remove. (update_menu_and_toolbar): Adjust. 2005-02-26 Kriang Lerdsuwanakij * ggamewin.cc (game_library_fill, game_library): Display game type. * load.h (game_library_log::random): Correct logic. 2005-02-26 Kriang Lerdsuwanakij * load.cc (load_game): Display move that is invalid. 2005-02-24 Kriang Lerdsuwanakij * load.cc: Include "game.h". (load_game_list): Fix typo. (set_view_mode): Declare. (load_game): Implement. 2005-02-24 Kriang Lerdsuwanakij * grhino.cc (new_game): Call cancel_input. 2005-02-24 Kriang Lerdsuwanakij * game.h: Move include , from ... * game.cc: ... here. Don't include , , , , , , , , , , , . 2005-02-24 Kriang Lerdsuwanakij * ggamewin.cc: Include . (gamelib_map): New variable. (gamelib_resource::file): New field. (gamelib_resource::gamelib_resource): New constructor. (gamelib_library_closed, game_library): Remember if the file is already opened. (gamelib_library_opened): New function. * ggamewin.h (gamelib_library_opened): Declared. * load.cc (load_game_list): Don't process file if file is already opened. 2005-02-24 Kriang Lerdsuwanakij * ggamewin.cc: Include . (game_library): Add const char * parameter. Display file name in the window title. Don't use default position if it is not first window opened. * ggamewin.h (game_library): Adjust declaration. * load.cc (load_game_list): Adjust call to game_library. 2005-02-24 Kriang Lerdsuwanakij * ggamewin.cc (tree_view_gamelib, list_store_gamelib): No longer global. (gamelib_win_count): New variable. (gamelib_resource): New struct. (game_library_fill, game_library_configure_event, game_library_closed, game_library): Handle multiple tree view and list store. Only remember window size and position when one game list window is opened. 2005-02-23 Kriang Lerdsuwanakij * ggamewin.cc (game_library_fill): Filled data for column 0 start from 0. (game_library_selected): Implement. Change parameter type. (game_library): Pass vector to game_library_selected. 2005-02-23 Kriang Lerdsuwanakij * ggamewin.cc (game_library): Change 'ID' column to 'No'. 2005-02-23 Kriang Lerdsuwanakij * ggamewin.cc (game_library_fill, game_library_closed, game_library): Change parameter type. Handle release of vector. Allow multiple window. * ggamewin.h (game_library): Adjust parameter type. * load.cc (game_vec): No longer global. (load_game_list): Release memory if required. Return immediately in case of exception. (load_game): New function. * load.h (load_game): Declare. 2005-02-23 Kriang Lerdsuwanakij * ggamewin.cc (game_library): Right justify game ID. 2005-02-23 Kriang Lerdsuwanakij * ggamewin.cc: Include "ggamewin.h". (_, N_): Define. (gamelib_store_size): Remove. (game_library_fill, game_library): Implement. * grhino.cc: Include "ggamewin.h". (write_view_config, read_config): Save and restore Game List window size and position. * load.cc: Include "ggamewin.h". (load_game_list): Call game_library. 2005-02-23 Kriang Lerdsuwanakij * ggamewin.cc, ggamewin.h: New files. * MANIFEST: Add ggamewin.cc, ggamewin.h. * ad.rule: Add ggamewin.cc. * Makefile.in: Regenerate. * grhino.cc (_, N_): Define. 2005-02-23 Kriang Lerdsuwanakij * load.h: Move include , , game_library_log from ... * load.cc: ... here. (game_vec): New global variable. (load_game_list): Adjust. * log_proc.h (_, N_): Undefine at the end of file. (from_ascii): Inline. 2005-02-20 Kriang Lerdsuwanakij * TODO: Update. 2005-02-20 Kriang Lerdsuwanakij * TODO: Update. 2005-02-20 Kriang Lerdsuwanakij * ghistwin.cc (menu_tools_info): Declare. (game_history_closed): Move from ... * grhino.cc: ... here. 2005-02-20 Kriang Lerdsuwanakij * ghistwin.cc, ghistwin.h: New files. * MANIFEST: Add ghistwin.cc, ghistwin.h. * ad.rule: Add ghistwin.cc. * Makefile.in: Regenerate. * grhino.cc: Move include "icon_empty.xpm", "icon_black.xpm", "icon_white.xpm" to ghistwin.cc. Include "ghistwin.h", "gutil.h". (gamehist_width, gamehist_height, gamehist_x, gamehist_y, tree_view_history, list_store_history, list_store_size, game_history_fill, game_history_update, game_history_configure_event, game_history_selected, game_history): Move to ghistwin.cc. (scale_pixbuf_from_xpm_data): Move to gutil.cc. * gutil.h: Include , . (scale_pixbuf_from_xpm_data): Declare. 2005-02-20 Kriang Lerdsuwanakij * load.cc: Include "log_proc.h" later to avoid redeclaring _ and N_. 2005-02-20 Kriang Lerdsuwanakij * gevalwin.cc, gevalwin.h: New files. * MANIFEST: Add gevalwin.cc, gevalwin.h. * ad.rule: Add gevalwin.cc. * Makefile.in: Regenerate. * game.cc (view_board_ptr, view_mode, view_position, view_player): Move from ... * grhino.cc: ... here. * game.h (view_board_ptr, view_mode, view_position, view_player): Declare. * grhino.cc: Include "gevalwin.h". (pattern_x, pattern_y, clist_eval, label_score, label_move_index, label_parity, evaluate_position_fill_entry, evaluate_position_fill, evaluate_position_update, evaluate_position_configure_event, evaluate_position, evaluate_position_closed): Move to gevalwin.cc. 2005-02-20 Kriang Lerdsuwanakij * gpref.cc: Reorder code. 2005-02-20 Kriang Lerdsuwanakij * gutil.cc, gutil.h: New files. * MANIFEST: Add gutil.cc, gutil.h. * ad.rule: Add gutil.cc. * Makefile.in: Regenerate. * gpref.cc: Include "gutil.h". (preferences_apply): Use error_message_box. * grhino.cc (open_game): Don't display opened file. * load.cc: Include "load.h", "gutil.h". (game_library_log::set_black_name, game_library_log::set_white_name): Remove trailing spaces. (process_game): Remove testing code. (load_game_list): Show error message if fail. 2005-02-20 Kriang Lerdsuwanakij * load.h: New file. * MANIFEST: Add load.h. * Makefile.in: Regenerate. * grhino.cc: Include "load.h". (open_game): Call load_game_list. * load.cc (process_game): Add test code. 2005-02-20 Kriang Lerdsuwanakij * load.cc (game_library_log::set_black_name, game_library_log::set_white_name): Implement. * log_proc.h (process_game_GGS): Set player names. 2005-02-20 Kriang Lerdsuwanakij * load.cc (process_game): Implement. (load_game_list): New function. * log_proc.h (process_file): Add output parameter. 2005-02-20 Kriang Lerdsuwanakij * log_proc.h (game_log::random): Remove. (game_log::game_log): Adjust. (game_log::set_random, game_log::set_black_name, game_log::set_white_name): New functions. (process_line_IOS, process_line_GGS, process_line, process_file): Add game_log_T template parameter. (process_line_IOS): Set player names. Fix compilation error. (process_line_GGS): Use set_random. * gen_book.cc (main_real): Add template argument to process_file. * gen_pattern.cc (process_pattern): Likewise. * load.cc (game_library_log): Rename from ... (game_library_info): ... this. (process_game): New function. 2005-02-19 Kriang Lerdsuwanakij * load.cc: Include . (game_library_info): New struct. * log_proc.h (game_log::random): New field. (game_log::game_log): Adjust (process_line_IOS): Remove an unnecessary board copy. Set game.random. (process_line_GGS): Make sure result is available. Simplify TY[] handling. Set game.random. 2005-02-19 Kriang Lerdsuwanakij * MANIFEST, ad.rule: Add load.cc. * Makefile.in: Regenerate. * gen_book.cc, gen_pattern.cc: Don't include , . * log_proc.h: Include , . 2005-02-19 Kriang Lerdsuwanakij * grhino.cc (open_game): Simplify. 2005-01-04 Kriang Lerdsuwanakij * alphabeta.cc (midgame_strategy, endgame_strategy, midgame_strategy_with_random, endgame_strategy_with_random): Change next_iterator to iterator. (temp_alpha_beta): Remove board_iterator template parameter. (midgame_alpha_beta, endgame_alpha_beta): Adjust. 2004-07-06 Kriang Lerdsuwanakij * bitboard.h (xy_to_index_pos): Rename from ... (xy_to_byte_pos): ... here. (pos_to_index_pos): Rename from ... (pos_to_byte_pos): ... here. 2004-05-22 Kriang Lerdsuwanakij * bitboard.cc (bit_board_info::operator=): New members. (bit_board_info::bit_board_info): Use them. (copy_board): Remove. * bitboard.h (bit_board_info::operator=): Declare. (copy_board): Remove. * board.cc (byte_board_info::operator=): Return correctly. 2004-05-22 Kriang Lerdsuwanakij * board.cc (byte_board_info::operator=): New members. (byte_board_info::byte_board_info): Use them. (copy_board): Remove. * board.h (byte_board_info::operator=): Declare. (copy_board): Remove. * alphabeta.cc (temp_alpha_beta): Adjust. * binfile.cc (binary_file_input::read_board): Likewise. * game.cc (undo, redo): Likewise. * gameinfo.cc (game_info::new_game_remaining, game_info::new_game_from_begin, game_info::new_game_from_board): Likewise. * gen_book.cc (lookup_hash, process_game): Likewise. * gen_opening.cc (main_real): Likewise. * grhino.cc (place_piece_and_update, new_game, undo, redo, game_history_selected, menu_game_begin, menu_game_prev, menu_game_next, menu_game_end): Likewise. * hash.cc (get_temp_board): Likewise. * log_proc.h (game_log::copy_board, process_line_IOS): Likewise. * randboard.cc (random_board): Likewise. 2004-05-18 Kriang Lerdsuwanakij * board.h (byte_board_info): Rename from ... (board_info): ... this. * alphabeta.cc, alphabeta.h, binfile.cc, binfile.h, board.cc, boardio.cc, boardio.h, book.cc, book.h, game.cc, gameinfo.cc, gameinfo.h, gen_book.cc, gen_opening.cc, gen_pattern.cc, grhino.cc, hash.cc, hash.h, iter.cc, iter.h, log_proc.h, parity.cc, parity.h, pattern.cc, pattern.h, randboard.cc, randboard.h, test.cc: Adjust. 2004-05-18 Kriang Lerdsuwanakij * board.h (byte_board_info::can_play_nocheck): Move from ... (can_play_nocheck): ... here. (byte_board_info::can_play): Move from ... (can_play): ... here. * board.cc (byte_board_info::can_play_nocheck): Move from ... (can_play_nocheck): ... here. (byte_board_info::can_play): Move from ... (can_play): ... here. * alphabeta.cc (temp_alpha_beta): Adjust. * game.cc (get_game_play): Likewise. * gameinfo.cc (game_info::set_game_play_from_board): Likewise. * gen_book.cc (process_game): Likewise. * gen_opening.cc (main_real): Likewise. * gen_pattern.cc (process_game): Likewise. * grhino.cc (draw_board, place_piece_and_update, button_press_signal, evaluate_position_fill): Likewise. * log_proc.h (process_line_IOS): Likewise. * parity.cc (parity_eval_alpha_beta): Likewise. * test.cc (main): Likewise. 2004-05-18 Kriang Lerdsuwanakij * bitboard.h (bit_board_info::move): Make private. (bit_board_info::board_black_score): Move from ... (board_black_score): ... here. (bit_board_info::board_white_score): Move from ... (board_white_score): ... here. (bit_board_info::board_diff_score): Move from ... (board_diff_score): ... here. * board.h (byte_board_info::board_black_score): Move from ... (board_black_score): ... here. (byte_board_info::board_white_score): Move from ... (board_white_score): ... here. (byte_board_info::board_diff_score): Move from ... (board_diff_score): ... here. * board.cc (operator==(const board_info &, const board_info &), copy_board(board_info *, const board_info *)): Adjust. * alphabeta.cc (endgame_strategy::board_score, endgame_strategy_with_random::board_score, temp_alpha_beta): Likewise. * game.cc (log_history_ios_old, log_history_GGS_v1): Likewise. * grhino.cc (update_status_bar): Likewise. * log_proc.h (process_line_IOS): Likewise. 2004-05-16 Kriang Lerdsuwanakij * board.h (byte_board_info::get_num_move): Move from ... (get_num_move): ... here. (byte_board_info::move): Make private. (byte_board_info::place_piece): Move from ... (place_piece): ... here. * board.cc (byte_board_info::place_piece): Move from ... (place_piece): ... here. * alphabeta.cc (temp_alpha_beta, eval_midgame, eval_endgame, eval_winlossdraw): Adjust. * book.cc (book_move): Likewise. * game.cc (find_opening_name): Likewise. * gameinfo.cc (game_info::new_game_from_board): Likewise. * gen_book.cc (store_hash, lookup_hash, update_info, process_game): Likewise. * gen_opening.cc (main_real): Likewise. * gen_pattern.cc (update_info, process_game): Likewise. * grhino.cc (place_piece_and_update, computer_thread, evaluate_position_fill): Likewise. * hash.cc (get_hash_board): Likewise. * log_proc.h (process_line_IOS): Likewise. * parity.cc (parity_eval_alpha_beta): Likewise. * pattern.cc (pattern_eval, pattern_eval_debug): Likewise. * test.cc (main): Likewise. 2004-05-16 Kriang Lerdsuwanakij * bitboard.h (bit_board_info::is_empty): Move from ... (is_empty): ... here. * board.h (byte_board_info::is_empty): Move from ... (is_empty): ... here. (can_play): Adjust. * board.cc (board_info::board_info): Adjust. * iter.cc (init_endgame_iterator): Adjust. 2004-05-16 Kriang Lerdsuwanakij Change from FreeBSD ports by UMENO Takashi : * alphabeta.cc: Include , . 2004-05-16 Kriang Lerdsuwanakij * binfile.cc (binary_file_input::read_board): Change board_type to byte_board_type. 2004-05-16 Kriang Lerdsuwanakij * board.h (byte_board_type): Rename from ... (board_type): ... this. * board.h, board.cc, hash.cc, log_proc.h, opening.h, opening.cc, randboard.cc, test.cc: Adjust. 2004-05-16 Kriang Lerdsuwanakij * TODO: Update. 2004-05-09 Kriang Lerdsuwanakij * TODO: Update. * game.cc (new_game): Fix random_board change. 2004-05-09 Kriang Lerdsuwanakij * gameinfo.cc: New file * MANIFEST, ad.rule, po/POTFILES.in: Add gameinfo.cc. * Makefile.in, po/POTFILES: Regenerate. * game.cc (wait_player): Move from ... * gameinfo.h (game_info::wait_player): ... here. * game.h (wait_player): Declare. * gameinfo.h (game_info::init_board_ptr): Remove. (game_info::new_game_remaining, game_info::set_game_play_from_board, game_info::game_info, game_info::~game_info, game_info::new_game_from_begin, game_info::new_game_from_board): New members. * game.cc (new_game, undo, redo): Adjust. * gpref.cc (preferences_apply): Likewise. * grhino.cc (read_config, update_status_bar, place_piece_and_update, timeout_update, input_check, new_game, undo, redo, switch_computer_color, button_press_signal, main_real): Adjust. (open_game): Rename from ... (load_game): ... this. (menu_game_open): Adjust. 2004-05-09 Kriang Lerdsuwanakij * MANIFEST, po/POTFILES.in: Add gameinfo.h. * Makefile.in, po/POTFILES: Regenerate. 2004-05-09 Kriang Lerdsuwanakij * game.cc (new_game, is_undoable, undo, is_redoable, redo): Move from ... (game_info::new_game, game_info::is_undoable, game_info::undo, game_info::is_redoable, game_info::redo): ... here. * game.h: Add include guard. Include "gameinfo.h" instead of "board.h". (game_info): Move to gameinfo.h. * gameinfo.h: New file. * grhino.cc (new_game, is_undoable, undo, is_redoable, redo): Adjust. 2004-05-09 Kriang Lerdsuwanakij * game.cc: Move game_info comments from ... * grhino.cc: ... here. (load_game, menu_game_open): New functions. (menu_game_info): Adjust. 2004-05-08 Kriang Lerdsuwanakij * game.cc (game_info::undo, game_info::redo): New members, split out from ... * grhino.cc (undo, redo): ... here. (place_piece_and_update): Reorder code. * game.h (game_info::undo, game_info::redo): Declare. 2004-05-08 Kriang Lerdsuwanakij * grhino.cc (undo): Fix wait_player logic. 2004-05-08 Kriang Lerdsuwanakij * NEWS: Updated. * scripts/version: Bump version number to 0.13.0. 2004-05-08 Kriang Lerdsuwanakij * game.cc (game_info::is_undoable): Don't allow undo if move exists in move queue. * gpref.cc (preferences_apply): Fix new game logic when changing start game opening. 2004-05-08 Kriang Lerdsuwanakij * game.cc (game_info::is_undoable, game_info::is_redoable): New members, split out from ... * grhino.cc (is_undoable, is_redoable): ... here. * game.h (game_info::is_undoable, game_info::is_redoable): Declare. 2004-05-08 Kriang Lerdsuwanakij * game.cc: Include "randboard.h". (game_info::new_game): New member, split out from ... * grhino.cc (new_game): ... here. * game.h (game_info::new_game): Declare. 2004-05-08 Kriang Lerdsuwanakij * grhino.cc (undo): Simplify game_play logic. 2004-05-08 Kriang Lerdsuwanakij * game.h (game_info): New struct. (cur_game_info): New variable combined from ... (board_ptr, init_board_ptr, player, wait_player, game_play, random_game, random_game_pieces, use_clock, game_result_type, game_result, board_history, player_history, move_history, time_history, clock_history_black, clock_history_white, num_history, min_num_history, max_num_history, use_clock) ... these. * game.cc, grhino.cc, gpref.cc: Adjust. 2004-05-08 Kriang Lerdsuwanakij * binfile.h (binary_file_input::buffer): Change type to unsigned. (binary_file_input::read_unsigned_char_nocheck): New function. (binary_file_output::buffer): Change type to unsigned. (binary_file_output::write_unsigned_char_nocheck): New function. * binfile.cc (binary_file_input::fill_buffer_if_requred): Throw exception if file read error. (binary_file_input::read_unsigned_char): Don't throw exception here. Use read_unsigned_char_nocheck. (binary_file_input::read_int, binary_file_input::read_board): Use read_unsigned_char_nocheck. (binary_file_output::write_unsigned_char, binary_file_output::write_int, binary_file_output::write_board): Use write_unsigned_char_nocheck. 2004-05-08 Kriang Lerdsuwanakij * game.cc (maybe_set_ai_tampered): New function. * game.h (maybe_set_ai_tampered): Declare. * gpref.cc (preferences_apply): Use it. * grhino.cc (switch_computer_color): Likewise. * TODO: Update. 2004-05-04 Kriang Lerdsuwanakij * TODO: Update. * game.cc (log_history_GGS_v1): Fix time recording. * grhino.cc (place_piece_and_update): Fix time_history update. (input_check): Fix time_player calculation. (new_game): Don't set time_history[0]. 2004-05-04 Kriang Lerdsuwanakij * game.cc (log_history_GGS_v1): Fix compilation error. 2004-05-04 Kriang Lerdsuwanakij * game.cc (log_history_GGS_v1): Record time. 2004-05-04 Kriang Lerdsuwanakij * game.cc (time_history): New variable combined from ... (time_history_black, time_history_white): ... these. * game.h (time_history): Declare. (time_history_black, time_history_white): Remove. * grhino.cc (place_piece_and_update, new_game, undo, redo): Adjust. 2004-05-04 Kriang Lerdsuwanakij * game.cc (use_clock, clock_player): New variables. * game.h (use_clock, clock_player): Declare. * grhino.cc: Include . (start_time, stop_time): New variables. (place_piece_and_update): Adjust. (timeout_update): New function. (computer_thread, button_press_signal): Record stop_time. (input_check): Calculate time and check for time out condition. (human_move, computer_move): Record start_time. 2004-05-04 Kriang Lerdsuwanakij * NEWS: Update. * help/C/grhino.xml: Update. * gpref.cc (preferences_apply): Set ai_tampered only if game has been started. 2004-05-04 Kriang Lerdsuwanakij * game.cc (log_history): Only call log_history_GGS_v2. * grhino.cc (input_check): Guard against multiple scheduled calls. 2004-05-04 Kriang Lerdsuwanakij * game.cc (log_history_ios_old): Left-justify player name. (log_history_GGS_v1): Fix result output. (log_history_GGS_v2): Close stream. (log_history): Use log_history_GGS_v1, log_history_GGS_v2. 2004-05-04 Kriang Lerdsuwanakij * game.cc: Include "iter.h". (log_history_GGS_v1): Output initial board. 2004-05-04 Kriang Lerdsuwanakij * game.cc (log_history_GGS_v1): Fix compilation error and warning. 2004-05-04 Kriang Lerdsuwanakij * game.cc: Include "proginfo.h". (random_game_pieces): New variable. (get_computer_player_name): Don't pad name. (log_history_ios_old): Don't check log_move here. Check random_game instead of start_game_mode. Pad name here. Make function static. (log_history_GGS_v1, log_history_GGS_v2): New functions. (log_history): Check log_move here. * game.h (random_game_pieces): Declare. * grhino.cc (new_game): Set random_game_pieces. 2004-05-04 Kriang Lerdsuwanakij * log_proc.h (process_game_GGS): Add game_number paramter. (process_line_GGS): Adjust. 2004-05-04 Kriang Lerdsuwanakij * TODO: Update. 2004-05-04 Kriang Lerdsuwanakij * game.cc (get_computer_player_name): Reduce string length. (log_history_ios_old): Fix timestamp formatting. 2004-05-04 Kriang Lerdsuwanakij * game.cc (get_computer_player_name): Fix compilation warning. (log_history_ios_old): Record time. Fix compilation errors. 2004-05-04 Kriang Lerdsuwanakij * TODO: Update. 2004-05-04 Kriang Lerdsuwanakij * TODO: Update. * game.cc (log_history_ios_old): Support resigned and timeout game. * game.h (game_result_type): Add game_result_resign_black, game_result_resign_white. * grhino.cc (update_status_bar): Support resigned game. 2004-05-04 Kriang Lerdsuwanakij * game.cc (log_history_ios): Rename from log_history. (log_history, get_computer_player_name): New functions. 2004-05-04 Kriang Lerdsuwanakij * gpref.cc (preferences_apply): Set ai_tampered when AI parameter changes. 2004-05-04 Kriang Lerdsuwanakij * TODO: Update. 2004-05-04 Kriang Lerdsuwanakij * game.cc (clock_history_black, clock_history_white): New variables. * game.h (clock_history_black, clock_history_white): Declare. * grhino.cc: Update comment. 2004-05-04 Kriang Lerdsuwanakij * game.cc (game_result): New variable. * game.h (game_result_type): New enum. (game_result): Declare. * grhino.cc (update_status_bar, place_piece_and_update, new_game, undo, redo): Use them. 2004-05-04 Kriang Lerdsuwanakij * grhino.cc (input_check, computer_move, human_move): Adjust timeout period. 2004-05-04 Kriang Lerdsuwanakij * NEWS: Update. * game.cc (time_history): Remove. (time_history_black, time_history_white, time_player_animate_delay): New variables. * game.h (time_history): Remove. (time_history_black, time_history_white, time_player_animate_delay): Declare. * grhino.cc (place_piece_and_update, input_check, new_game, undo, redo): Use them. (record_clock_tick): Remove. (computer_move, human_move): Change timeout period. (computer_thread): Fix compilation error. 2004-05-03 Kriang Lerdsuwanakij * ad.append (all): Rename from ... (all-target): ... this. (default-target): Remove. * ad.rule (DEFTARGETLIST): Set to grhino. (DEFTARGET): Set to default-target. * Makefile.in: Regenerate. * gpref.cc (preferences_apply): Use human_move. * grhino.cc (computer_thread): Set asynchronous cancellation type. Set cancelability state to enable. (input_check): Unlock mutex after game state update. Use human_move. (human_move): Add timeout. (new_game, undo, redo, switch_computer_color): Use human_move. (button_press_signal): Set input_pos. 2004-05-03 Kriang Lerdsuwanakij * game.cc (ai_running): New variable. * game.h (ai_running): Declare. (cancel_input): Rename from ... (cancel_computer_thread): ... this. * gpref.cc (preferences_apply): Adjust. * grhino.cc (input_check): Rename from ... (computer_check): ... this. (computer_move): Adjust. (cancel_input): Rename from ... (cancel_computer_thread): ... this. (new_game, undo, redo, switch_computer_color): Adjust. 2004-05-03 Kriang Lerdsuwanakij * game.cc (input_lock): Rename from ... (ai_lock): ... this. (input_pos): Rename from ... (ai_pos): ... this. (input_timeout_id): Rename from ... (ai_timeout_id): ... this. * game.h (input_lock): Rename from ... (ai_lock): ... this. (input_pos): Rename from ... (ai_pos): ... this. (input_timeout_id): Rename from ... (ai_timeout_id): ... this. (human_move): Declare. * grhino.cc (computer_thread, computer_check, computer_move, cancel_computer_thread): Adjust. (human_move): New function. 2004-05-03 Kriang Lerdsuwanakij * game.cc (time_history, time_player): New variables. * grhino.cc (place_piece_and_update, new_game, undo, redo): Use them. (record_clock_tick): New function. * game.h (time_history, time_player): Declare. 2004-05-03 Kriang Lerdsuwanakij * TODO: Update. * NEWS: Update. 2004-05-03 Kriang Lerdsuwanakij * binfile.h (binary_file_input::read_int_compress, binary_file_output::write_int_compress): New members. * book.cc (book_init): Use them. * gen_book.cc (generate_file): Likewise. 2004-05-03 Kriang Lerdsuwanakij * binfile.cc: Include . (binary_file_input::~binary_file_input): Fix logic. (binary_file_input::read_board): New member. (binary_file_output): New class. * binfile.h: Include "board.h". (binary_file_input::max_buffer_size): Change to 10000. (binary_file_input::read_board): Declare. (binary_file_output): Declare. * book.cc: Don't include , , , . (read_int, write_int, read_char, write_char, read_unsigned_compress, write_unsigned_compress): Remove. * gen_book.cc: Don't include , , , . Include "binfile.h". (read_board, write_board): Remove. (init_file, load_file, generate_file, store_file): Use binary_file_input, binary_file_output. 2004-05-03 Kriang Lerdsuwanakij * NEWS: Update. * log_proc.h: Include "gtstream.h", . (_, N_): Define. (process_file): Mark string. 2004-05-03 Kriang Lerdsuwanakij * binfile.cc: Include "gtstream.h", , , , , , , , . (_, N_): Define. (binary_file_input): New class. * binfile.h: Include . (binary_file_input): Declare. * book.cc: Include "binfile.h", . (_): Use gettext. (book_init): Use binary_file_input. * dump_pattern.cc: Include . (_): Use gettext. * game.cc: Include . (_): Use gettext. * pattern.cc: Include . (_): Use gettext. * ad.rule (grhino, gen_book): Add binfile.cc. * TODO: Update. * Makefile.in: Regenerate. 2004-05-03 Kriang Lerdsuwanakij * binfile.h, binfile.cc: New files. * MANIFEST, po/POTFILES.in: Add binfile.h, binfile.cc. * po/POTFILES: Regenerate. 2004-05-03 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.12.1. 2004-05-03 Kriang Lerdsuwanakij * game.cc (home_dir, user_home_dir_init): Make static. (get_user_home_dir): New function. (log_history): Use it. * game.h (home_dir, user_home_dir_init): Remove. (get_user_home_dir): Declare. * grhino.cc (init_game_before_draw): Don't call user_home_dir_init. 2004-05-03 Kriang Lerdsuwanakij * game.cc: Reorganize code. (update_hook): Make static. * game.h: Reorganize code. (update_hook): Remove. 2004-05-03 Kriang Lerdsuwanakij * iter.h: Undo previous change. 2004-05-03 Kriang Lerdsuwanakij * iter.h (board_full_endgame_iterator): Remove. 2004-05-03 Kriang Lerdsuwanakij * ad.append (all-target): New target. * Makefile.in: Regenerate. * gtstream.cc: Update copyright year. * pattern.cc (pattern_eval, pattern_eval_debug): Remove compilation warnings. * pattern.h: Don't include . 2004-05-03 Kriang Lerdsuwanakij * gen_pattern.cc (update_info): Fix compilation warnings. 2004-05-03 Kriang Lerdsuwanakij * dump_pattern.cc (main_real, main): Fix compilation errors. * gen_pattern.cc (generate_file): Don't use endl; 2004-05-03 Kriang Lerdsuwanakij * boardio.cc, boardio.h, book.cc, dump_pattern.cc, game.cc, game.h, gen_book.cc, gen_opening.cc, gen_pattern.cc, gen_table.cc, gpref.cc, grhino.cc, gtstream.cc, gtstream.h, hash.cc, log_proc.h, opening.cc, opening.h, parity.cc, pattern.cc, randboard.cc, test.cc: Include C++ headers directory. Remove using namespace std. ************************ rhino 0.12.0 released ************************ 2004-05-03 Kriang Lerdsuwanakij * scripts/makepkg: Properly quote '@'. 2004-05-03 Kriang Lerdsuwanakij * TODO: Update. 2004-05-03 Kriang Lerdsuwanakij * help/C/preferences-0.html, help/C/preferences-1.html, help/C/preferences-2.html, help/C/topic.dat: Remove. 2004-05-03 Kriang Lerdsuwanakij * NEWS: Update. 2004-05-02 Kriang Lerdsuwanakij * NEWS: Update. 2004-05-02 Kriang Lerdsuwanakij * alphabeta.cc: Include "boardio.h" instead of "board.h". Include . Add using namespace std. (DEBUG_ALPHA_BETA, debug_stream, debug_indent, debug_file): New variables. (temp_alpha_beta): Add debugging code. Use hash. (eval_midgame): Add debugging code. (eval_endgame, eval_winlossdraw): Add debugging code. Free hash before evaluation. * boardio.cc (print_indent): New function. (print_board): Use it. * boardio.h (print_indent): Declare. * ad.rule (grhino): Add boardio.cc. * Makefile.in: Regenerate. 2004-05-02 Kriang Lerdsuwanakij * alphabeta.cc (midgame_strategy::board_score, midgame_strategy_with_random::board_score): Remove commented out code. 2004-05-02 Kriang Lerdsuwanakij * TODO: Update. 2004-05-02 Kriang Lerdsuwanakij * Makefile.in, po/POTFILES: Regenerate. * hash.cc (get_hash(bit_board_info*)): Comment out. * hash.h (get_hash(bit_board_info*)): Comment out. 2004-05-02 Kriang Lerdsuwanakij * bitboard.cc: New file, split out from ... * board.cc: ... here. * bitboard.h: New file, split out from ... * board.h: ... here. * MANIFEST, po/POTFILES.in: Add bitboard.cc, bitboard.h. 2004-05-02 Kriang Lerdsuwanakij * boardio.cc (print_board): New function, split out from ... (operator<<(ostream &, const board_info *)): ... here. * boardio.h (print_board): Declare. 2004-05-02 Kriang Lerdsuwanakij * boardio.h, boardio.cc: New files. * board.cc (operator<<(ostream&, const board_info*), print_pos): Move to boardio.cc * board.h (operator<<(ostream&, const board_info*), print_pos): Move to boardio.h. Don't include . * hash.cc, parity.cc: Include . * test.cc: Include "boardio.h" instead of "board.h". * MANIFEST, po/POTFILES.in: Add boardio.cc, boardio.h. * ad.rule (test): Add boardio.cc. * Makefile.in, po/POTFILES: Regenerate. 2004-05-02 Kriang Lerdsuwanakij * hash.h (store_hash_board): Change return type to void. * alphabeta.cc (temp_alpha_beta): Adjust. 2004-05-01 Kriang Lerdsuwanakij * NEWS: Update. 2004-05-01 Kriang Lerdsuwanakij * alphabeta.cc (temp_alpha_beta): Don't use hash. Fix alpha beta pruning logic. * hash.cc (get_hash_board): Add player parameter. * hash.h (trans_board): Add player field. (get_hash_board): Add player parameter. * test.cc (main): Add debugging code. 2004-04-27 Kriang Lerdsuwanakij * alphabeta.cc (opening_strategy, opening_strategy_with_random, opening_alpha_beta): Remove. 2004-04-25 Kriang Lerdsuwanakij * dump_pattern.cc (main_real): Fix compilation error. 2004-04-25 Kriang Lerdsuwanakij * gen_pattern.cc (update_info_table, process_game): Remove debugging code. (generate_file): Comment out debugging code. 2004-04-25 Kriang Lerdsuwanakij * TODO: Update. * gen_pattern.cc (num_update, update_list): Change type. (find_update): Add int parameter. (init_info, update_info_table, update_info): Adjust. 2004-04-25 Kriang Lerdsuwanakij * gen_pattern.cc (process_game, generate_file): Remove debugging code. 2004-04-25 Kriang Lerdsuwanakij * gen_book.cc (process_game): Ignore random board. * gen_pattern.cc (log_func): Add special case when black and white has equal score. Limit score to -7 .. 7. (num_update): Change type to array. (init_info, update_info): Adjust. (find_update): Don't add to update_list. (update_info_table): Add debugging code. Remove position check. (generate_file): Add debugging code. Don't call abort. 2004-04-24 Kriang Lerdsuwanakij * gen_pattern.cc (log_func): Adjust score in case low number of game is found. 2004-04-24 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. * book.cc (book_move): Random black first move. 2004-04-24 Kriang Lerdsuwanakij * NEWS: Update. * gen_book.cc (process_game): Throw exception instead of calling abort. (main_real): Update copyright year. * gen_pattern.cc (process_game): Throw runtime_error exception. 2004-04-24 Kriang Lerdsuwanakij * gen_pattern.cc (num_update, update_list, update_move_index): New variables. (init_info, find_update): New functions. (update_info_table, update_info, process_game): Use them. 2004-04-24 Kriang Lerdsuwanakij * log_proc.h (process_game_GGS): Handle mutual score. 2004-04-24 Kriang Lerdsuwanakij * gen_pattern.cc (process_game): Add debugging code. * log_proc.h (process_game_GGS): Handle junk ']' character. 2004-04-24 Kriang Lerdsuwanakij * gen_opening.cc (main_real): Display usage. (main): Pass argc, argv to main_real. * gen_pattern.cc (main_real): Update copyright year. 2004-04-24 Kriang Lerdsuwanakij * TODO: Update. * gen_pattern (process_game): Don't abort when fails. * log_proc.h (process_game_GGS): New function. (process_line_GGS): Use it. (process_file): Add exception handling. 2004-04-24 Kriang Lerdsuwanakij * TODO: Update. * log_proc.h (process_line): Handle new GGS format. 2004-04-18 Kriang Lerdsuwanakij * NEWS: Update. 2004-04-18 Kriang Lerdsuwanakij * README: Update. 2004-04-18 Kriang Lerdsuwanakij * NEWS: Update. * gpref.cc (preferences_set_depth): Use C++ string class. 2004-04-17 Kriang Lerdsuwanakij * TODO: Update. * game.cc: Remove commented out code. 2004-04-17 Kriang Lerdsuwanakij * help/C/grhino.xml: Fix bug tracker links. 2004-04-17 Kriang Lerdsuwanakij * TODO: Update. 2004-04-17 Kriang Lerdsuwanakij * help/C/grhino.xml: Document random opening. 2004-04-17 Kriang Lerdsuwanakij * grhino.cc (menu_tools_info): Update tooltip. 2004-04-17 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. * grhino.cc (evaluate_position): Don't create window if show_pattern_evaluation is false. (game_history): Don't create window if game_history is false. 2004-04-17 Kriang Lerdsuwanakij * TODO: Update. * game.cc (show_pattern_evaluation, show_game_history): New variables. * game.h (show_pattern_evaluation, show_game_history): Declare. * grhino.cc (gamehist_x, gamehist_y, pattern_x, pattern_y, main_x, main_y): New variables. (write_view_config, read_view_config, destroy_signal, evaluate_position, game_history_configure_event, game_history_closed, game_history, main_real): Use them. (evaluate_position_configure_event): New function. (menu_tools_info): Make Pattern evaluation, Game history toggle menu. (evaluate_position_closed, game_history_closed) Update toggle menu state. (menu_tools_evaluate_position, menu_tools_game_history): Read toggle menu state. 2004-04-17 Kriang Lerdsuwanakij * TODO: Update. 2004-04-17 Kriang Lerdsuwanakij * NEWS: Update. * parity.cc: Include (DEBUG_PARITY): New variable. (parity_eval_alpha_beta): Correctly compute count[]. Adjust score of different cases. Distinguish between hole with one empty and higher number odd empties. Give score for even hole. Add debugging code. 2004-04-17 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc (view_player): New variable. (evaluate_position_fill, game_history_selected, menu_game_begin, menu_game_prev, menu_game_next): Use it. 2004-04-17 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc (evaluate_position_fill): Fix parity score bug when using game history. 2004-04-16 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. * game.cc (start_game_mode_name): Use full name. (start_game_mode): Remove initialization. (start_random_game_pieces): Rename from ... (start_random_pieces): ... this. Remove initialization. * game.h (start_random_game_pieces): Rename from ... (start_random_pieces): ... this. * gpref.cc (combo_start_mode, combo_start_pieces): New variables. (preferences_apply, preferences): Support random game. * grhino.cc (read_config): Likewise. (write_config): Likewise. Remove redundant configuration data synchronization. (update_status_bar): Don't display opening name for random game. (new_game): Adjust. 2004-04-16 Kriang Lerdsuwanakij * TODO: Update. * game.cc (start_game_mode_name): New variable. (start_game_mode): Rename from ... (opening_random_game): ... here. Change type. (start_random_pieces): Rename from ... (opening_random_pieces): ... here. (log_history): Don't log random games. * game.h (NUM_START_GAME_MODE): New variable. (start_game_mode_type): New enum. (start_game_mode): Rename from ... (opening_random_game): ... here. Change type. (start_random_pieces): Rename from ... (opening_random_pieces): ... here. * grhino.cc (new_game): Adjust. 2004-04-16 Kriang Lerdsuwanakij * grhino.cc (switch_computer_color): Rename from ... (switch_color): ... this to avoid conflict with the one in board.h. (menu_settings_switch_color): Adjust. * randboard.cc: Include "config.h", "order.h", "gtstream.h", . Use namespace std. (_, N_): New macros. (NUM_RANDOM_STEP0, NUM_RANDOM_STEP1, NUM_RANDOM_STEP2, NUM_RANDOM_STEP3, TOTAL_NUM_RANDOM_STEP, NAX_NUM_RANDOM_STEP, random_step0, random_step1, random_step2, random_step3): New variables. (random_board): Implement. 2004-04-16 Kriang Lerdsuwanakij * grhino.cc (new_game): Set random_game. 2004-04-16 Kriang Lerdsuwanakij * grhino.cc: Don't include "rand.h". Include "randboard.h". * Makefile.in: Regenerate. 2004-04-16 Kriang Lerdsuwanakij * randboard.cc: New file, split out from ... * rand.cc: ... here. * randboard.h: New file, split out from ... * rand.h: ... here. * MANIFEST: Add randboard.cc, randboard.h. * po/POTFILES.in: Likewise. * po/POTFILES: Regenerate. * ad.rule (grhino): Add randboard.cc. * Makefile.in: Regenerate. 2004-04-16 Kriang Lerdsuwanakij * game.cc (opening_random_game, opening_random_pieces): New variables. * game.h (opening_random_game, opening_random_pieces): Declare. * grhino.cc: Include "rand.h". (read_config): Don't set init_board_ptr. (new_game): Support random game. * rand.cc (random_board): New function. * rand.h: Include "board.h". (random_board): Declare. 2004-04-16 Kriang Lerdsuwanakij * rand.cc: Don't include . Don't use namespace std. 2004-04-15 Kriang Lerdsuwanakij * alphabeta.cc (last_eval_type): Remove last_eval_opening. (eval_opening): Remove. * alphabeta.h (eval_opening): Remove. * grhino.cc (computer_thread): Support random game. 2004-04-15 Kriang Lerdsuwanakij * book.cc (get_move): Remove. (book_move): Use move_history parameter instead of board_history. * book.h (book_move): Adjust. * grhino.cc (computer_thread): Adjust. * game.cc (random_game): New variable. * game.h (random_game): Declare. 2004-04-15 Kriang Lerdsuwanakij * grhino.cc (game_history_fill): Use NUM_MOVE. * iter.cc (empty_endgame_order): Likewise. * iter.h (empty_endgame_info, board_full_endgame_iterator::next): Likewise. * order.cc (endgame_order): Likewise. * order.h: Include "board.h". (endgame_order): Use NUM_MOVE. * parity.cc (parity_eval_alpha_beta): Likewise. 2004-04-15 Kriang Lerdsuwanakij * help/C/grhino.xml: Add links to bug tracker, strategy guide. 2004-04-15 Kriang Lerdsuwanakij * help/C/grhino.xml: Use &app; throughout. Use @VERSION@ for theme directory example. 2004-04-15 Kriang Lerdsuwanakij * help/C/grhino.xml: Add AI Implementation. * README: Remove CURRENT STATUS section. * TODO: Update. 2004-04-14 Kriang Lerdsuwanakij * help/C/grhino.xml: Document passing. 2004-04-14 Kriang Lerdsuwanakij * TODO: Update. 2004-04-14 Kriang Lerdsuwanakij * help/C/grhino.xml: Use @VERSION@ for manual revision. Update content. 2004-04-14 Kriang Lerdsuwanakij * help/C/grhino.xml: Change rpcp replacable. Reindent file. * scripts/makepkg: Add new rpcp replacables. 2004-04-14 Kriang Lerdsuwanakij * MANIFEST: Process help/C/grhino.xml with rpcp. * ad.append (install_mkdir): Fix $(helpdir)/C/figures creation bug. * Makefile.in: Regenerate. * help/C/grhino.xml: Process with rpcp. Add Game History, Pattern Evaluation. * scripts/makepkg: Generate RELMMMYYYY for rpcp. * scripts/version: Bump version number to 0.12.0. 2004-04-14 Kriang Lerdsuwanakij * MANIFEST: Add help/C/figures/history.png, help/C/figures/pattern.png, help/C/figures/prefs-ai.png, help/C/figures/prefs-board.png, help/C/figures/prefs-theme.png. * ad.append (install_mkdir): Create $(helpdir)/C/figures. (install): Install help/C/figures/*.png. * help/C/grhino.xml: Add screen shot figures. * Makefile.in: Regenerate. 2004-04-14 Kriang Lerdsuwanakij * Makefile.in: Regenerate. 2004-04-14 Kriang Lerdsuwanakij * MANIFEST: Remove help/C/preferences-*.html, help/C/topic.dat. * ad.append: Likewise. * gpref.cc (preferences_help): Use grhino.xml. 2004-04-14 Kriang Lerdsuwanakij * grhino.cc (menu_game_info): Use GNOMEUIINFO_MENU_QUIT_ITEM. (menu_help_info): Add help. (create_toolbar): Change "Exit" to "Quit" for consistency. * ad.append: Install help/C/grhino.xml, help/C/legal.xml. * Makefile.in: Regenerate. * help/C/grhino.xml: Add Playing GRhino. * NEWS: Update. 2004-04-14 Kriang Lerdsuwanakij * help/C/grhino.xml: Add Preferences. 2004-04-14 Kriang Lerdsuwanakij * MANIFEST: Add help/C/figures/mainwindow.png, help/C/figures/mainwindow.xcf. 2004-04-14 Kriang Lerdsuwanakij * scripts/viewhelp: New file. 2004-04-14 Kriang Lerdsuwanakij * help/C/grhino.xml: Add Introduction, Getting Started, About GRhino. 2004-04-14 Kriang Lerdsuwanakij * help/C/grhino.xml: Update template. 2004-04-14 Kriang Lerdsuwanakij * NEWS: Reorganize. * scripts/makepkg: Prefix version number of prereleased versions. Copy NEWS file. * scripts/makepkg-release: Adjust. * scripts/uploadfile: Upload NEWS. * scripts/version: Bump version number to 0.11.1. 2004-04-12 Kriang Lerdsuwanakij * scripts/uploadfile: Fix upload filename. 2004-04-11 Kriang Lerdsuwanakij * ad.rule (grhino.cc): Don't define HELPDIR. * Makefile.in: Regenerate. 2004-04-11 Kriang Lerdsuwanakij * hash.cc (get_hash(bit_board_info *)): Remove compiler warning. ************************ rhino 0.11.0 released ************************ 2004-04-11 Kriang Lerdsuwanakij * MANIFEST: Reorder entries. * scripts/uploadfile: New file. 2004-04-11 Kriang Lerdsuwanakij * README: Update. 2004-04-11 Kriang Lerdsuwanakij * NEWS: Update. 2004-04-11 Kriang Lerdsuwanakij * TODO: Update. 2004-04-11 Kriang Lerdsuwanakij * configure.in: Add en_GB to ALL_LINGUAS. 2004-04-11 Kriang Lerdsuwanakij * ad.prepend: Document DESTDIR. * Makefile.in: Regenerate. 2004-04-11 Kriang Lerdsuwanakij * ad.append (default-target): Remove default-po. (install): Install po files. * Makefile.in: Regenerate. 2004-04-11 Kriang Lerdsuwanakij * configure.in: Don't add -I./intl to CPPFLAGS. 2004-04-11 Kriang Lerdsuwanakij * TODO: Update. 2004-04-11 Kriang Lerdsuwanakij * grhino.cc (gamehist_width, gamehist_height): New variables. (write_view_config): New function. (write_config, destroy_signal): Use it. (read_config): Read gamehist_width, gamehist_height. (game_history_configure_event): New function. (game_history): Use it. Never scroll horizontally. 2004-04-10 Kriang Lerdsuwanakij * grhino.cc (undo, redo): Update view_board_ptr correctly. (game_history): Set default size of window instead of scrolled widget. 2004-04-10 Kriang Lerdsuwanakij * ad.append (default-po): Don't issue warning when gmsgfmt is missing. * Makefile.in: Regenerate. 2004-04-10 Kriang Lerdsuwanakij * configure.in: Remove gnome-config check. 2004-04-09 Kriang Lerdsuwanakij * grhino.cc: Fix formatting. 2004-04-09 Kriang Lerdsuwanakij * TODO: Update. 2004-04-09 Kriang Lerdsuwanakij * ad.rule (grhino.cc): Define LOCALEDIR. * grhino.cc (main_real): Bind text domain. * Makefile.in: Regenerate. * NEWS: Update. 2004-04-09 Kriang Lerdsuwanakij * TODO: Update. 2004-04-09 Kriang Lerdsuwanakij * README: Update. 2004-04-09 Kriang Lerdsuwanakij * TODO: Update. 2004-04-09 Kriang Lerdsuwanakij * grhino.cc (view_cursor): New variable. (set_view_mode): New function. (place_piece_and_update, new_game, undo, redo, game_history_selected, menu_game_begin, menu_game_prev, menu_game_next, menu_game_end): Use it. 2004-04-09 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc: Remove commented out codes. (is_undoable, is_redoable): Return false when view_mode. 2004-04-07 Kriang Lerdsuwanakij * TODO: Update. 2004-04-06 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc (menu_edit_info, menu_tools_info): Add icon, tooltips. (create_toolbar): Adjust tooltips. 2004-04-06 Kriang Lerdsuwanakij * grhino.cc (game_history_fill): Use string for move number column. (game_history): Right align move number column. * TODO: Update. 2004-04-06 Kriang Lerdsuwanakij * grhino.cc (game_history_fill): Don't do i18n on position string. * TODO: Update. 2004-04-06 Kriang Lerdsuwanakij * TODO: Update. 2004-04-06 Kriang Lerdsuwanakij * grhino.cc (game_history_selected): New function. (game_history): Use it. (menu_game_next): Set view_mode before calling update_state. (menu_edit_info): Add Begin, Prev, Next, End. (update_menu_and_toolbar): Update. (create_toolbar): Use "Last". 2004-04-06 Kriang Lerdsuwanakij * NEWS: Update. 2004-04-06 Kriang Lerdsuwanakij * grhino.cc (view_mode): Remove initialization. 2004-04-06 Kriang Lerdsuwanakij * game.h: Update comments. * grhino.cc (view_board_ptr, view_mode, view_position): New variables. (draw_board, update_status_bar, place_piece_and_update, new_game, undo, redo, button_press_signal, evaluate_position_fill_entry, evaluate_position_fill, game_history_update, update_menu_and_toolbar, main_real): Use them. (menu_game_begin, menu_game_prev, menu_game_next, menu_game_end): Implement. 2004-04-06 Kriang Lerdsuwanakij * grhino.cc (button_begin, button_prev, button_next, button_end, icon_begin, icon_prev, icon_next, icon_end): New variables. (game_history_fill): Adjust message. (menu_game_begin, menu_game_prev, menu_game_next, menu_game_end): New functions. (load_pixmaps, init_pixmaps, create_toolbar): Update. 2004-04-06 Kriang Lerdsuwanakij * game.cc (update_state): Add enum parameter. * game.h (update_state_type): New enum. (update_state_type): Add enum parameter. (update_state): Adjust. * gpref.cc (preferences_apply): Adjust. * grhino.cc (update_status_bar, update_menu_and_toolbar, evaluate_position_update, game_history_update): Add enum parameter. (list_store_size): New variable. (game_history_fill): Handle removing rows. (game_history): Select current move. (place_piece_and_update, new_game, undo, redo, switch_color): Adjust. * TODO: Update. * Makefile.in: Regenerate. 2004-04-05 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.11.0. 2004-04-05 Kriang Lerdsuwanakij * TODO: Update. 2004-04-05 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc (scale_pixbuf_from_xpm_data): New function. (game_history_fill): Use it. (load_icon_image, load_pixmaps): Free no longer needed pixbuf. (init_default_pixmaps): Remove. (init_pixmaps): Don't use it. 2004-04-05 Kriang Lerdsuwanakij * MANIFEST: Add icon_black.xpm, icon_empty.xpm, icon_white.xpm. * grhino.cc: Include "icon_black.xpm", "icon_empty.xpm", "icon_white.xpm". (game_history_fill): Use them. (game_history): Adjust. * TODO: Update. * ad.append: Use ':' as marker when msgfmt is missing. * Makefile.in: Regenerate. 2004-04-05 Kriang Lerdsuwanakij * help/C/preferences-1.html: Update. 2004-04-05 Kriang Lerdsuwanakij * gen_book.cc: Include . (_): Use gettext. * gen_opening.cc: Include . (_): Use gettext. * gen_pattern.cc: Include . (_): Use gettext. * gen_table.cc: Include . (_): Use gettext. * TODO: Update. 2004-04-05 Kriang Lerdsuwanakij * TODO: Update. 2004-04-05 Kriang Lerdsuwanakij * game.cc (game_mode_name): Restore old order to preserve saved settings behavior. * game.h (game_mode_type): Likewise. * grhino.cc (game_history_fill): Fill init entry. 2004-04-05 Kriang Lerdsuwanakij * grhino.cc (menu_tools_info, menu_settings_info): Add menu short-cut key. * po/POTFILES: Regenerate. 2004-04-05 Kriang Lerdsuwanakij * gpref.cc (preferences_apply): Simplify. * po/POTFILES.in: Add opening.dat, table.dat. 2004-04-05 Kriang Lerdsuwanakij * game.cc (game_mode_name): Reorder entries. * game.h (game_mode_type): Reorder entries. * opening.cc (N_): New define. * gen_opening.cc (output_board): Add N_ to opening name. * opening.dat: Regenerate. * gpref.cc (preferences_apply): Adjust according to game_mode_name changes. Do i18n opening name. (preferences): Likewise. (preferences_set_depth): Simplify. * grhino.cc (update_status_bar): Do i18n opening name. 2004-04-05 Kriang Lerdsuwanakij * game.cc (log_opening): Remove. (log_history): Use player_history, move_history. 2004-04-04 Kriang Lerdsuwanakij * test.cc (board_test, board_test2, board_ffo_40, board_ffo_44, board_ffo_40_simp, board_ffo_44_simp): Move from ... * grhino.cc (board_test, board_test2, board_ffo_40, board_ffo_44, board_ffo_40_simp, board_ffo_44_simp): ... here. 2004-04-04 Kriang Lerdsuwanakij * grhino.cc (game_history_fill): Add initialiation. I18n color. 2004-04-04 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. 2004-04-03 Kriang Lerdsuwanakij * grhino.cc (evaluate_position): Bring window to top if it is already opened. (evaluate_position_closed): Set *data to NULL. * grhino.cc (tree_view_history, list_store_history): New variables. (game_history_fill, game_history_update, game_history_closed, game_history, menu_tools_game_history): New functions. (menu_tools_info): Update. 2004-04-03 Kriang Lerdsuwanakij * game.cc: Remove GTK+ 1 support. * gpref.cc: Remove GTK+ 1 support. (preferences_help): Remove GTK+ 1 version. 2004-04-03 Kriang Lerdsuwanakij * gpref.cc (preferences): Remove commented out code. * grhino.cc (computer_thread): Likewise. 2004-04-03 Kriang Lerdsuwanakij * gpref.cc (preferences): Use g_signal_connect, G_OBJECT, G_CALLBACK. * grhino.cc (evaluate_position, main_real): Likewise. 2004-04-03 Kriang Lerdsuwanakij * gpref.cc (preferences): Make sure dialog box is opened only once. (preferences_closed): Adjust. 2004-04-03 Kriang Lerdsuwanakij * grhino.cc (menu_help_about): Reorganize window handling code. 2004-04-03 Kriang Lerdsuwanakij * NEWS: Update. * scripts/version: Bump version number to 0.10.1. 2004-04-03 Kriang Lerdsuwanakij * gpref.cc (preferences): Remove modality. 2004-03-27 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc (update_toolbar_style): Move to ... (update_menu_and_toolbar_pref): ... this. Also update menu states. (main_real): Use it. * gpref (update_toolbar_style): Remove. (update_menu_and_toolbar_pref): Declare. (preferences_apply): Use it. 2004-03-27 Kriang Lerdsuwanakij * grhino.cc (evaluate_position_closed): Clear clist_eval. (evaluate_position): Ignore if clist_eval is set. ************************ rhino 0.10.0 released ************************ 2004-03-25 Kriang Lerdsuwanakij * TODO: Update. 2004-03-25 Kriang Lerdsuwanakij * gpref.cc (preferences): Change label for theme combobox. * help/C/preferences-2.html: Update. 2004-03-25 Kriang Lerdsuwanakij * gpref.cc (toolbar_icon_size): Change type to int. (toolbar_icon_map, toolbar_icon_name, combo_toolbar_icon_size): New variables. (update_toolbar_style): Declare. (preferences_apply, preferences): Handle toolbar_icon_size. * gpref.h (toolbar_icon_size): Change type to int. (toolbar_icon_map): Declare. (NUM_TOOLBAR_ICON_SIZE): New variable. * grhino.cc (button_new, button_exit): New variables. (icon_width, icon_height): Don't initialize. (icon_dummy): Remove. (read_config, write_config): Handle toolbar_icon_size. (load_stock_icon_and_compute_size): Remove. (load_icon_image): Change function signature. (load_pixmaps): Compute icon width and height here. (init_pixmaps): Initialize icon_new, icon_exit, icon_undo, icon_redo. (create_toolbar): Set button_new, button_exit. (update_toolbar_style): New function. 2004-03-25 Kriang Lerdsuwanakij * game.h, game.cc: Update comments. * gpref.cc (toolbar_icon_size): New variable. * gpref.h (toolbar_icon_size): Declare. 2004-03-25 Kriang Lerdsuwanakij * game.cc (redo_ai_move): New variable. * game.h (redo_ai_move): Declare. * gpref.cc (check_redo_ai_move): New variable. (preferences_apply, preferences): Use redo_ai_move. * grhino.cc (write_config, read_config, redo): Likewise. * help/C/preferences-1.html: Update. 2004-03-25 Kriang Lerdsuwanakij * gpref.cc (preferences_help): Update. * help/C/preferences-2.html: Fix markups. 2004-03-25 Kriang Lerdsuwanakij * gpref.cc (preferences_apply): Reorder theme preferences handling. (preferences): Split theme preferences to its own notebook tab. * grhino.cc (CFG_THEME_PATH): New define. (write_config, read_config): Move theme preferences to CFG_THEME_PATH. * help/C/preferences-2.html: New file. * help/C/preferences-1.html: Update link. * MANIFEST: Add help/C/preferences-2.html. * ad.append (install): Install help/C/preferences-2.html. * Makefile.in: Regenerate. 2004-03-25 Kriang Lerdsuwanakij * MANIFEST: Add icon_new.xpm. 2004-03-25 Kriang Lerdsuwanakij * grhino.cc: Include "icon_new.xpm". (icon_dummy, icon_width, icon_height): New variables. (button_press_signal): Handle board border. (load_stock_icon_and_compute_size): New function. (load_icon_image(const char *, const char *[], bool)): New function. (load_icon_image(const char *, const char *, bool)): Resize pixbuf. (load_pixmaps): Use icon_new_xpm. Compute icon size. * Makefile.in: Regenerate. 2004-03-25 Kriang Lerdsuwanakij * TODO: Update. 2004-03-25 Kriang Lerdsuwanakij * NEWS: Update. 2004-03-25 Kriang Lerdsuwanakij * grhino.cc (place_piece_and_update): Update board state after updating history. (new_game, is_undoable, undo, is_redoable, redo): Correct history logic. (update_menu_and_toolbar): Only call is_undoable and is_redoable once each. 2004-03-24 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc (button_undo, button_redo): New variables. (icon_exit): Rename from ... (icon_quit): ... this. (load_pixmaps, create_toolbar): Adjust. (update_menu_and_toolbar, is_undoable, is_redoable): New functions. (init_game): Adjust. 2004-03-24 Kriang Lerdsuwanakij * grhino.cc (CFG_VIEW_PATH): New define. (write_config, read_config): Handle show_toolbar. (menu_view_toolbar): Query menu state rather than toggle it. (main_real): Set toolbar menu item checked state. 2004-03-24 Kriang Lerdsuwanakij * game.cc (show_toolbar): New variable. * game.h (show_toolbar): Define. * grhino.cc (toolbar_docked): New variable. (update_toolbar): New function. (menu_view_toolbar): Implement. (main_real): Handle toolbar visibility. 2004-03-24 Kriang Lerdsuwanakij * grhino.cc (menu_game_new, menu_game_undo, menu_game_redo, menu_game_exit, menu_tools_evaluate_position, menu_settings_save, menu_settings_preferences, menu_settings_switch_color, menu_help_about): Change function signature. (menu_view_toolbar): New function. (menu_tools_info): Add Toolbar menu. (menu_main_info): Change Tools menu to View menu. (toolbar_game_new, toolbar_game_undo, toolbar_game_redo, toolbar_game_exit): Remove. (create_toolbar): Adjust. (load_icon_image): Use small icons. 2004-03-23 Kriang Lerdsuwanakij * grhino.cc (toolbar, icon_new, icon_quit, icon_undo, icon_redo): New variables. (toolbar_game_new, toolbar_game_exit, toolbar_game_undo, toolbar_game_redo, load_icon_image, create_toolbar): New functions. (load_pixmaps): Call load_icon_image. (main_real): Call create_toolbar. 2004-03-23 Kriang Lerdsuwanakij * help/C/preferences-1.html: Fix typo. 2004-03-23 Kriang Lerdsuwanakij * help/C/preferences-1.html: Fix typos. 2004-03-23 Kriang Lerdsuwanakij * help/C/preferences-1.html: Update. 2004-03-23 Kriang Lerdsuwanakij * help/C/preferences-0.html: Update. * help/C/preferences-1.html: Document board border and theme preferences. 2004-03-23 Kriang Lerdsuwanakij * MANIFEST: Add theme/small/*. 2004-03-23 Kriang Lerdsuwanakij * grhino.cc (default_pixmap_error): Remove trailing new line in error message. 2004-03-23 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. * gpref.cc: Include "gtstream.h". (preferences_apply): Report error in case of theme loading problem. 2004-03-23 Kriang Lerdsuwanakij * gpref.cc: Include , , . (combo_theme): New variable. (preferences_apply, preferences): Change type of entry to string. Handle theme preference. Reorder preference display order. * grhino.cc (load_pixmap): Simplify. * ad.rule (gpref.cc): Define THEMEDIR. * Makefile.in: Regenerate. 2004-03-23 Kriang Lerdsuwanakij * gpref.cc (preferences_apply): Fix pixmaps loading logic. * grhino.cc (main_window): Now a global variable. (resize_board_widget): Also resize main window. (main_real): Call init_game_before_draw before any widget creation. Don't call resize_board_widget. 2004-03-23 Kriang Lerdsuwanakij * game.cc (show_border, theme_name): Remove initialization. * gpref.cc (preferences_apply): Use resize_board_widget. Reload old theme upon error. * grhino.cc (write_config, read_config): Handle show_border, theme configurations. 2004-03-23 Kriang Lerdsuwanakij * gpref.cc (preferences_apply): Fix theme name restore logic. (preferences): Correct show border label. 2004-03-23 Kriang Lerdsuwanakij * gpref.cc (check_show_border): New variable. (preferences_apply, preferences): Add show border preference. * game.cc (draw_board, computer_move): Remove declaration. (show_border): Move from ... * grhino.cc (show_border): ... here. (resize_board_widget): Split out from ... (main_real): ... here. * game.h (show_border, load_pixmaps, resize_board_widget): Declare. 2004-03-22 Kriang Lerdsuwanakij * game.cc (theme_name): Move from ... * grhino.cc (theme_name): ... here. * game.h (theme_name): Declare. 2004-03-19 Kriang Lerdsuwanakij * ad.append: Install "small" theme. * Makefile.in: Regenerate. * grhino.cc (theme_name): Use "small" theme. (load_pixmap): Handle theme. (init_pixmaps): Load theme only when them name is available. 2004-03-19 Kriang Lerdsuwanakij * ad.prepend: Add datadir. * ad.rule (grhino.cc): Add DATADIR. * grhino.cc (load_pixmap): Don't add trailing slash. * Makefile.in: Regenerate. 2004-03-19 Kriang Lerdsuwanakij * ad.prepend: Add theme_dir. * ad.rule (grhino.cc): Use it. * Makefile.in: Regenerate. * grhino.cc (top_pixmap, bottom_pixmap, left_pixmap, right_pixmap, black_pixmap, white_pixmap, empty_pixmap, hint_black_pixmap, hint_white_pixmap): Change type to GdkPixbuf. (show_border): Default to true. (draw_board, load_pixmap, load_pixmaps, init_deault_pixmaps, init_pixmaps): Use GdkPixbuf. (main_real): Call init_pixmaps. 2004-03-19 Kriang Lerdsuwanakij * configure.in: Remove GTK-1, GNOME-1 support. * grhino.cc (draw_board, menu_help_about, main_real): Likewise. * config.h.in: Regenerate. 2004-03-19 Kriang Lerdsuwanakij * NEWS: Update. * README: Update. * scripts/version: Bump version number to 0.10.0. 2004-03-19 Kriang Lerdsuwanakij * configure.in: Require GNOME 2. * grhino.cc (load_pixmap): New function. 2004-03-19 Kriang Lerdsuwanakij * grhino.cc (load_pixmaps): Rename from ... (load_pixmap): ... this. (init_default_pixmaps): Rename from ... (init_default_pixmap): ... this. (init_pixmaps): Rename from ... (init_pixmap): ... this. (main_real): Adjust. 2004-03-19 Kriang Lerdsuwanakij * ad.append (install): Quote filenames used by scrollkeeper-preinstall. * Makefile.in: Regenerate. 2004-03-19 Kriang Lerdsuwanakij * help/C/grhino.xml: Add document header. 2004-03-19 Kriang Lerdsuwanakij * help/C/grhino.xml, help/C/legal.xml: New files. * help/C/grhino-C.omf.in: Don't fill in complete URL here. * MANIFEST: Add help/C/grhino.xml, help/C/legal.xml. * configure.in: Don't process help/C/grhino-C.omf.in. * ad.append (install): Use scrollkeeper-preinstall. * Makefile.in: Regenerate. 2004-03-19 Kriang Lerdsuwanakij * MANIFEST: Add help/C/grhino-C.omf.in. * makepkg: Support rpcp use. * grhino-C.omf.in: Add replacables. 2004-03-19 Kriang Lerdsuwanakij * help/C/grhino-C.omf.in: New file. * configure.in: Process help/C/grhino-C.omf.in. 2004-03-19 Kriang Lerdsuwanakij * hash.cc (get_hash(bit_board_info*)): Throw exception when used. * grhino.cc (init_game): Call trans_table_init, pattern_table_init, book_init here. (init_game_before_draw): Not here. 2004-03-19 Kriang Lerdsuwanakij * grhino.cc (load_pixmap): New function. Split out from ... (init_default_pixmap): .. here (init_pixmap): Use load_pixmap. * TODO: Update. 2004-03-19 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc (evaluate_position_fill_entry): Tidy. 2004-03-19 Kriang Lerdsuwanakij * MANIFEST: Add bottom.xcf, left.xcf, right.xcf, top.xcf. * bottom.xpm, left.xpm, right.xpm, top.xpm: Regenerated. * NEWS: Update. * TODO: Update. 2004-03-08 Kriang Lerdsuwanakij * grhino.cc (_, N_): Remove. (menu_help_about): Update copyright year. (menu_tools_info, menu_settings_info, menu_main_info): Use N_ instead of _. * po/POTFILES.in: Add game.cc, game.h, gen_table.cc, gpref.cc, gpref.h. * ad.append (default-po): Update po files correctly. * scripts/makepkg: Update po files. * po/POTFILES, Makefile.in: Regenerate. 2004-03-08 Kriang Lerdsuwanakij * TODO: Update. 2004-03-08 Kriang Lerdsuwanakij * gen_book: Add comments. (BOOK_WIDTH): Remove. 2004-03-08 Kriang Lerdsuwanakij * dump_pattern.cc (main): Output exception error to cerr. * gen_book (main): Likewise. * gen_opening (main): Likewise. * gen_pattern (main): Likewise. * gen_table (main): Likewise. 2004-03-06 Kriang Lerdsuwanakij * help/C/preferences-1.html: Document Animation delay option. 2004-03-06 Kriang Lerdsuwanakij * TODO: Update. 2004-03-06 Kriang Lerdsuwanakij * grhino.cc (show_border): New variable. (draw_board, init_default_pixmap, init_pixmap): Adjust. 2004-03-06 Kriang Lerdsuwanakij * top.xpm, bottom.xpm, left.xpm, right.xpm: New files. * MANIFEST: Update. * grhino.cc: Include "top.xpm", "bottom.xpm", "left.xpm", "right.xpm". (top_pixmap, bottom_pixmap, left_pixmap, right_pixmap, left_margin, top_margin, right_margin, bottom_margin): New variables. (init_default_pixmap, init_pixmap): Initialize them. (TOP_MARGIN, BOTTOM_MARGIN, LEFT_MARGIN, RIGHT_MARGIN): Remove. (draw_board): Draw border. (button_press_signal, main_real): Adjust. 2004-03-06 Kriang Lerdsuwanakij * grhino.cc (XPM_SIZE): Remove. (grid_width, grid_height): New variables. (draw_board, button_press_signal): Adjust. (default_pixmap_error, init_default_pixmap, init_pixmap): New functions. (main_real): Use init_default_pixmap. (main): Output exception error to cerr. 2004-03-06 Kriang Lerdsuwanakij * game.cc: Include "opening.h". 2004-03-06 Kriang Lerdsuwanakij * game.cc (user_home_dir_init, log_history, update_state, add_update_hook, remove_update_hook, find_opening_name): Move from * grhino.cc: ... here. * game.h (user_home_dir_init, log_history, update_state, add_update_hook, remove_update_hook, find_opening_name): Declare. 2004-03-06 Kriang Lerdsuwanakij * gpref.cc: Don't include "rhino.h". 2004-03-06 Kriang Lerdsuwanakij * rhino.h: Remove file. Content move to ... * game.h: ... here. * MANIFEST: Update. * Makefile.in: Regenerate. 2004-03-06 Kriang Lerdsuwanakij * game.h, game.cc, gpref.h, gpref.cc, rhino.h: New files. Split out from ... * grhino.cc: ... here. * MANIFEST: Update. * ad.rule: Add game.cc, gpref.cc. * Makefile.in: Regenerate. 2004-03-05 Kriang Lerdsuwanakij * ad.rule: Remove intl from SUBDIR. * Makefile.in: Regenerate. 2004-03-05 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.9.1. ************************ rhino 0.9.0 released ************************ 2004-03-01 Kriang Lerdsuwanakij * NEWS: Update. 2004-03-01 Kriang Lerdsuwanakij * grhino.cc (update_status_bar): Fix compilation error. 2004-02-29 Kriang Lerdsuwanakij * NEWS: Update. * README: Update. * configure.in: Check if GNOME is installed. * grhino.cc (NUM_ANIMATE_DELAY): New constant. (animate_delay, spin_animate_delay): New variables. (write_config, read_config, computer_move, preferences_apply, preferences): Add animate delay support. (update_status_bar): Display [Opening] during animate opening. (new_game): Don't use computer_move to process opening when animate opening is off. 2004-01-04 Kriang Lerdsuwanakij * grhino.cc (menu_help_about): Make authors and documenters arrays static. 2004-01-04 Kriang Lerdsuwanakij * ad.rule: Set HELPDIR in grhino.cc. * Makefile.in: Regenerated. * grhino.cc (evaluate_position): Remove commented out code. (preferences): Set window title. (menu_help_about): Remove type casts. (main_real): Use lower case for program name. Use gtk_widget_set_size_request. 2004-01-04 Kriang Lerdsuwanakij * ad.prepend: Update copyright year. * ad.rule: Set PREFIX, SYSCONFDIR, DATADIR, LIBDIR for grhino.cc target. * Makefile.in: Regenerate. * grhino.cc: Don't define GNOME_DISABLE_DEPRECATED, GTK_DISABLE_DEPRECATED. Include only for Gtk+ 1. (evaluate_position): Don't use GTK_WINDOW_DIALOG. (preferences_apply, preferences_set_depth): Add const. (help_entry_preferences): Only declared for Gtk+ 1. (preferences_help): Add new version for GNOME 2. (menu_help_about, main_real): Support GNOME 2. 2004-01-04 Kriang Lerdsuwanakij * configure.in: Correct GNOME 2 detection. 2004-01-04 Kriang Lerdsuwanakij * grhino.cc: Define GNOME_DISABLE_DEPRECATED, GTK_DISABLE_DEPRECATED if Gtk+ is version 2 or newer. 2004-01-04 Kriang Lerdsuwanakij * NEWS: Update. 2004-01-04 Kriang Lerdsuwanakij * grhino.cc (init_game_before_draw): Split out from ... (init_game): ... here. (main_real): Use init_game_before_draw. 2004-01-03 Kriang Lerdsuwanakij * configure.in: Check existence of GNOME 2. 2004-01-03 Kriang Lerdsuwanakij * TODO: Update. * configure.in: Check pkg-config. * grhino.cc (draw_board): Support Gtk+ 2. * config.h.in: Regenerated. * scripts/version: Bump version number to 0.9.0. 2003-12-28 Kriang Lerdsuwanakij * configure.in: Update autoconf version requirement. 2003-12-28 Kriang Lerdsuwanakij * configure.in: Check existence of libpthread and gnome-config. Tweak bool requirement error message. * TODO: Updated. 2003-09-28 Kriang Lerdsuwanakij * TODO: Update. ************************ rhino 0.8.3 released ************************ 2003-09-01 Kriang Lerdsuwanakij * scripts/makepkg: Revert previous change. 2003-09-01 Kriang Lerdsuwanakij * NEWS: Update. * scripts/version: Bump version number to 0.8.3. 2003-09-01 Kriang Lerdsuwanakij * grhino.cc (ai_lock): Initialize mutex. * board.cc (count_bits): Add return statement. 2003-08-24 Kriang Lerdsuwanakij * gen_table.cc (main_real): Use char for bit_count_table. 2003-08-24 Kriang Lerdsuwanakij * board.h (bit_board_type, bit_board_info): New type. (bit_board_begin, count_bits, operator==(const bit_board_info &, const bit_board_info &), copy_board(bit_board_info *, const bit_board_info *)): Declare. (xy_to_byte_pos, xy_to_bit_pos, pos_to_byte_pos, pos_to_bit_pos, is_empty(const bit_board_info *, int, int), is_empty(const bit_board_info *, int), copy_board(bit_board_info &, const bit_board_info &), copy_board(bit_board_info *, const bit_board_type *), copy_board(bit_board_info &, const bit_board_type *), board_black_score(const bit_board_info *), board_white_score(const bit_board_info *)): New functions. * board.cc: Include "table.dat". (bit_board_empty, bit_board_begin): New variables. (board_info::board_info): Remove commented out code. (bit_board_info::bit_board_info, count_bits, operator==(const bit_board_info &, const bit_board_info &) copy_board(bit_board_info *, const bit_board_info *)): New functions. * hash.cc (get_hash(bit_board_info *)): New function. * hash.h (get_hash(bit_board_info *)): Declare. 2003-08-24 Kriang Lerdsuwanakij * Makefile.in: Regenerate. 2003-08-24 Kriang Lerdsuwanakij * gen_table.cc: New file. * MANIFEST: Add gen_table.cc, table.dat. * ad.rule: Add gen_table. 2003-08-17 Kriang Lerdsuwanakij * scripts/makepkg: Set package to grhino-pre. ************************ rhino 0.8.2 released ************************ 2003-08-17 Kriang Lerdsuwanakij * book.cc: Include "gtstream.h", . (_, N_): New macros. * pattern.cc: Include "gtstream.h", , . (_, N_): New macros. * NEWS: Update. * scripts/version: Bump version number to 0.8.2. ************************ rhino 0.8.1 released ************************ 2003-08-14 Kriang Lerdsuwanakij * NEWS: Update. 2003-08-14 Kriang Lerdsuwanakij * TODO: Update. 2003-08-14 Kriang Lerdsuwanakij * book.cc (read_int, write_int, read_char, write_char, read_unsigned_compress, write_unsigned_compress, book_init): Throw runtime_error. * dump_pattern.cc (main_real): Likewise. * gen_book.cc (read_board, write_board): Likewise. Fix error message. (init_file, load_file, generate_file, store_file): Throw runtime_error. * gen_pattern.cc (init_file, load_file, store_file, generate_file): Likewise. * pattern.cc (pattern_table_init): Likewise. 2003-08-10 Kriang Lerdsuwanakij * gen_book.cc: Include , , , , "gtstream". (_, N_): New defines. (main_real): Rename from main. Use gtout. Throw runtime_error. Don't catch exceptions here. (main): New function. 2003-08-10 Kriang Lerdsuwanakij * dump_pattern.cc: Include , , , , "gtstream". (_, N_): New defines. (main_real): Use gtout. Throw runtime_error. (main): Catch exception. Flush cout before output to cerr. 2003-08-10 Kriang Lerdsuwanakij * gen_pattern.cc (generate_file): Comment out test code. (main_real): Use gtout. 2003-08-10 Kriang Lerdsuwanakij * gen_pattern.cc: Include , , , , "gtstream.h". (_, N_): New defines. (main_real): Rename from main. Throw runtime_error. Mark strings. (main): New function. 2003-08-10 Kriang Lerdsuwanakij * gen_opening.cc: Include , , , "gtstream.h". (_, N_): New defines. (main_real): Rename from main. Throw runtime_error. Return 0. (main): New function. 2003-08-10 Kriang Lerdsuwanakij * ad.rule (test, gen_book, gen_opening, gen_pattern, dump_pattern): Add gtstream.cc. * Makefile.in: Regenerate. 2003-08-10 Kriang Lerdsuwanakij * grhino.cc: Include . (main): Use gtout. 2003-08-10 Kriang Lerdsuwanakij * grhino.cc: Include . (user_home_dir_init): Throw runtime_error. (main_real): Check size of int. (main): Mark error strings. 2003-08-09 Kriang Lerdsuwanakij * grhino.cc: Include . (main): Catch exception. 2003-08-09 Kriang Lerdsuwanakij * TODO: Update. 2003-08-09 Kriang Lerdsuwanakij * acinclude.m4/cxxac.m4: Import changes from kcd. 2003-08-03 Kriang Lerdsuwanakij * test.cc (main): Remove call to init_endgame_iterator. 2003-08-03 Kriang Lerdsuwanakij * alphabeta.cc (opening_strategy::board_score, midgame_strategy::board_score, endgame_strategy::board_score, opening_strategy::board_score_with_random, midgame_strategy::board_score_with_random, endgame_strategy::board_score_with_random, temp_alpha_beta, opening_alpha_beta, midgame_alpha_beta, endgame_alpha_beta): Change board parameter to info. (eval_opening, eval_midgame, eval_endgame, eval_winlossdraw): Adjust. * alphabeta.h: Include "iter.h". (search_info): Add empties field. 2003-08-03 Kriang Lerdsuwanakij * Makefile.in: Regenerate. 2003-08-03 Kriang Lerdsuwanakij * parity.cc (parity_eval_alpha_beta): Change board paramter to info. (parity_eval): Adjust. * parity.h: Include "alphabeta.h". (parity_eval_alpha_beta): Adjust declaration. 2003-08-03 Kriang Lerdsuwanakij * iter.h (empty_endgame_size, empty_endgame_head, empty_endgame_order): Remove. (empty_endgame_info): New struct containing the removed variables. (init_endgame_iterator): Add info parameter. (board_endgame_iterator): Add info field, constructor. (board_endgame_iterator::init_pos, board_endgame_iterator::remove_current, board_endgame_iterator::restore_current): Adjust. * iter.cc (init_endgame_iterator): Add info parameter. 2003-08-03 Kriang Lerdsuwanakij * alphabeta.h (search_info): New struct. 2003-08-03 Kriang Lerdsuwanakij * NEWS: Update. 2003-08-03 Kriang Lerdsuwanakij * board.cc (FT3, FT3SE, FT3SW, FT3NE, FT3NW, FT5, FT5S, FT5E, FT5W, FT5N, FT8): New macros. (flip_table): New variable. (can_play_nocheck, place_piece): Use it. 2003-08-03 Kriang Lerdsuwanakij * ad.rule (test): Add parity.cc. * Makefile.in: Regenerate. 2003-08-03 Kriang Lerdsuwanakij * TODO: Update. 2003-08-02 Kriang Lerdsuwanakij * TODO: Update. 2003-08-02 Kriang Lerdsuwanakij * TODO: Update. 2003-07-29 Kriang Lerdsuwanakij * book.cc (read_char, write_char): New functions. (book_init): Use it. * gen_book.cc (generate_file): Likewise. * book.h (read_char, write_char): Declare. * NEWS: Update. * scripts/version: Bump version number to 0.8.1. ************************ rhino 0.8.0 released ************************ 2003-07-28 Kriang Lerdsuwanakij * README: Update. 2003-07-28 Kriang Lerdsuwanakij * parity.cc (even_playable_parity_score, even_not_playable_parity_score, odd_playable_parity_score, odd_not_playable_parity_score): Remove. * NEWS: Update. * scripts/version: Bump version number to 0.8.0. 2003-07-28 Kriang Lerdsuwanakij * parity.cc (parity_eval_alpha_beta): Correct parity calculation for odd holes. 2003-07-28 Kriang Lerdsuwanakij * alphabeta.cc (opening_strategy::board_score, midgame_strategy::board_score, endgame_strategy::board_score, opening_strategy_with_random::board_score, midgame_strategy_with_random::board_score, endgame_strategy_with_random::board_score): Add player parameter. (temp_alpha_beta): Adjust. * parity.cc (parity_eval_alpha_beta, parity_eval): Add player parameter. * parity.h (parity_eval_alpha_beta, parity_eval): Adjust declaration. * grhino.cc (evaluate_position_fill): Call parity_eval only when game_play is true. 2003-07-27 Kriang Lerdsuwanakij * alphabeta.cc: Update copyright year. Include "parity.h". (midgame_strategy::board_score): Use parity_eval_alpha_beta. 2003-07-27 Kriang Lerdsuwanakij * grhino.cc: Include "parity.h". (label_parity): New variable. (evaluate_position_fill, evaluate_position): Use it. 2003-07-27 Kriang Lerdsuwanakij * parity.h, parity.cc: New files. * MANIFEST, ad.rule: Update. * Makefile.in: Regenerate. 2003-07-27 Kriang Lerdsuwanakij * iter.h, iter.cc: Add comment. Update copyright year. ************************ rhino 0.7.1 released ************************ 2003-07-27 Kriang Lerdsuwanakij * NEWS: Update. * gen_pattern.cc (update_info_table): Fix symmetry problem. (generate_file): Compress table. * pattern.cc (pattern_table_init): Decompress table. 2003-07-27 Kriang Lerdsuwanakij * pattern.h (num_move_index): Revert back to 15. * pattern.cc (to_move_index): Adjust. * gen_pattern.cc (update_info): Likewise. * grhino.cc: Update copyright year. (menu_help_about): Likewise. 2003-07-27 Kriang Lerdsuwanakij * NEWS: Update. 2003-07-27 Kriang Lerdsuwanakij * help/C/preferences-0.html, help/C/preferences-1.html: Update. 2003-07-27 Kriang Lerdsuwanakij * gen_pattern.cc (update_info_table, update_info, store_file, generate_file): Use num_move_index, to_move_index. * grhino.cc (label_move_index): New variable. (evaluate_position_fill, evaluate_position): Use it. * pattern.cc (to_move_index): Move here ... * pattern.h (to_move_index): ... from here. Declare. (num_move_index): Adjust. 2003-07-27 Kriang Lerdsuwanakij * dump_pattern.cc (num_log_move_index): Rename from ... (num_log_pos): ... this. (log_move_index): Rename from ... (log_pos): ... this. (is_log_move_index): Rename from ... (is_log_pos): ... this. (main_real): Adjust. 2003-07-26 Kriang Lerdsuwanakij * TODO: Update. 2003-07-26 Kriang Lerdsuwanakij * pattern.cc (show_pattern): Use "." for empty square. 2003-07-26 Kriang Lerdsuwanakij * rand.cc: Add comment. 2003-07-26 Kriang Lerdsuwanakij * pattern.h (to_move_index): New function. * pattern.cc (pattern_eval, pattern_eval_debug): Use it. 2003-07-25 Kriang Lerdsuwanakij * gen_pattern.cc (store_file, generate_file): Fix recursion function calls. 2003-07-25 Kriang Lerdsuwanakij * gen_pattern (generate_file, store_file): Swap incorrect names. * pattern.h (num_move_index): Correct value. (pattern_table): Use it. 2003-07-25 Kriang Lerdsuwanakij * pattern.h (num_move_index): New variable. * dump_pattern.cc (log_pos, main_real): Use it. * gen_pattern.cc (init_file, load_file, generate_file, store_file, process_pattern): Likewise. * pattern.cc (pattern_table, pattern_table_init): Likewise. 2003-07-24 Kriang Lerdsuwanakij * gen_pattern.cc: Add comments. 2003-07-24 Kriang Lerdsuwanakij * gen_opening.cc: Update copyright year. Add comments. (VERSION): Initialized from "scripts/version". 2003-07-24 Kriang Lerdsuwanakij * dump_pattern.cc, gen_book.cc, gen_pattern.cc, grhino.cc, test.cc: Fix typo in comment. Update copyright year. 2003-07-24 Kriang Lerdsuwanakij * gen_pattern.cc: Add comments. (VERSION): Add const. (main): Update copyright year. 2003-04-30 Kriang Lerdsuwanakij * TODO: Update. 2002-09-29 Kriang Lerdsuwanakij * ad.prepend: Set pattern_dir, book_dir to their own dedicated directories. * Makefile.in: Regenerate. * TODO: Update. 2002-09-29 Kriang Lerdsuwanakij * NEWS: Update. 2002-09-29 Kriang Lerdsuwanakij * NEWS: Update. * README: Update. 2002-09-29 Kriang Lerdsuwanakij * MANIFEST: Add help/C/preferences-0.html, help/C/preferences-1.html, help/C/topic.dat. * ad.append: Remove help-browser symlink hack. * help/C/preferences-0.html: Add content. * help/C/preferences-1.html: Add content. 2002-09-29 Kriang Lerdsuwanakij * help/C/preferences-0.html, help/C/preferences-1.html, help/C/topic.dat: New files. * ad.append: Quote filenames. Install help files. * ad.prepend: Add helpdir. * Makefile.in: Regenerate. * grhino.cc (help_entry_preferences): New variable. (preferences_help): Implement. 2002-09-29 Kriang Lerdsuwanakij * ad.rule: Define GRHINO_PREFIX for grhino.cc target. * grhino.cc (main_real): Set GNOMEDIR environment variable. * Makefile.in: Regenerate. * scripts/version: Bump version number to 0.7.1. 2002-09-29 Kriang Lerdsuwanakij * ad.append, ad.rule, ad.prepend: Add book_dir. Set pattern_dir to inside datadir. * Makefile.in: Regenerate. * NEWS: Update. ************************ rhino 0.7.0 released ************************ 2002-09-24 Kriang Lerdsuwanakij * NEWS: Update. * scripts/version: Bump version number to 0.7.0. 2002-09-24 Kriang Lerdsuwanakij * gen_pattern.cc (update_info): Only adjust up to move 32. * grhino.cc (evaluate_position): Change window title. (menu_tools_info): Change menu name. * po/POTFILES: Regenerate. 2002-09-24 Kriang Lerdsuwanakij * dump_pattern.cc (main_real): Print number of wins for black and white. * gen_pattern.cc (update_info_table): Fix pattern update logic. 2002-09-24 Kriang Lerdsuwanakij * po/POTFILES.in: Add config.h. 2002-09-22 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc (label_score): New variable. (evaluation_fill, evaluation_position): Display total score. (menu_analyze_evaluate_position): Rename to ... (menu_tools_evaluate_position): ... this. (menu_analyze_info): Rename to ... (menu_tools_info): ... this. (menu_main_info): Change Analyze menu to Tools. * pattern.cc (pattern_eval(board_info *, pattern_t, int)): Remove unused code. (pattern_eval(board_info *)): Handle initial board case. 2002-09-22 Kriang Lerdsuwanakij * grhino.cc: Include . (update_func): New type. (update_hook): New variable. (update_state, add_update_hook, remove_update_hook): New functions. (place_piece_and_update, new_game, undo, redo, switch_color, preferences_apply): Call update_state instead of update_status_bar. (init_game, evaluate_position): Call add_update_hook. (evaluate_position_closed): Call remove_update_hook. * TODO: Update. 2002-09-22 Kriang Lerdsuwanakij * TODO: Update. 2002-09-22 Kriang Lerdsuwanakij * grhino.cc (evaluate_position_fill_entry): New function. (evaluate_position_fill): Implement. 2002-09-22 Kriang Lerdsuwanakij * grhino.cc (evaluate_position_closed, evaluate_position_fill, evaluate_position_update): New functions. (clist_eval): New variable. (evaluate_position): Implement. 2002-09-22 Kriang Lerdsuwanakij * pattern.cc (pattern_eval(board_info *, pattern_t, int)): New function. (row1_pattern, row2_pattern, row3_pattern, row4_pattern, edge_x_pattern, corner5x2_pattern): Reorder positions. * pattern.h (pattern_eval(board_info *, pattern_t, int)): Declare. 2002-09-21 Kriang Lerdsuwanakij * grhino.cc (NUM_MOVE_BEGINNING): Remove commented out code. (computer_thread): Likewise. 2002-09-21 Kriang Lerdsuwanakij * grhino.cc (evaluate_position, menu_analyze_evaluate_position): New function. (menu_analyze_info): New struct variable. (menu_main_info): Update. 2002-09-20 Kriang Lerdsuwanakij * TODO: Update. 2002-09-20 Kriang Lerdsuwanakij * gen_book.cc (main): Return 0 upon success. 2002-09-20 Kriang Lerdsuwanakij * NEWS: Update. * gen_pattern.cc (main): Return 0 upon success. 2002-09-20 Kriang Lerdsuwanakij * gen_pattern.cc (update_info): Add PATTERN_DIAG1 to list of patterns with data merged. Extend merged pattern to move 40. (process_pattern): Initialize elements of pat. 2002-09-20 Kriang Lerdsuwanakij * TODO: Update. 2002-09-20 Kriang Lerdsuwanakij * MANIFEST: Add scripts/copy-message. 2002-09-19 Kriang Lerdsuwanakij * gen_pattern.cc (process_pattern): Add comment. 2002-09-19 Kriang Lerdsuwanakij * gen_pattern.cc (process_pattern): Fix segfault freeing memory. 2002-09-19 Kriang Lerdsuwanakij * gen_pattern.cc (update_info_table): New function. (update_info): Use it. Combine edge patterns for move 1 to 32. * scripts/version: Bump version number to 0.6.1. ************************ rhino 0.6.0 released ************************ 2002-09-15 Kriang Lerdsuwanakij * TODO: Update. 2002-09-15 Kriang Lerdsuwanakij * acinclude.m4/cxxac.m4: Import from kcd. * aclocal.m4, config.h.in, configure: Regenerate. 2002-09-14 Kriang Lerdsuwanakij * acinclude.m4/cxxac.m4: Import from kcd. * aclocal.m4, config.h.in: Regenerate. 2002-09-13 Kriang Lerdsuwanakij * acconfig.h: Remove. * configure.in: Define PACKAGE, VERSION macros. * config.h.in, configure: Regenerate. * MANIFEST: Remove acconfig.h. 2002-09-13 Kriang Lerdsuwanakij * MANIFEST: Remove config.h.bot. 2002-09-13 Kriang Lerdsuwanakij * book.cc (book_random_index): New function. (book_move): Use it. * grhino.cc (opening_var_name): Add Very low, and Very high. (NUM_OPENING_VAR): Adjust. (read_config): Default opening_var to 2. * rand.cc (get_random): Add debugging code. * NEWS: Update. * README: Update. 2002-09-10 Kriang Lerdsuwanakij * grhino.cc (preferences): Change opening option hbox display. * NEWS: Update. 2002-09-10 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. 2002-09-10 Kriang Lerdsuwanakij * acinclude.m4/cxxac.m4: Import changes from kcd. * acconfig.h: Remove cxxac.m4 macros. * config.h.bot: Remove. * board.h, dump_pattern.cc, gen_book.cc, gen_opening.cc, gen_pattern.cc, grhino.cc, gtstream.h, log_proc.h, opening.h: Add semicolon after USING_NAMESPACE_STD. * aclocal.m4, config.h.in: Regenerate. 2002-09-08 Kriang Lerdsuwanakij * acconfig.h: Bump version number to 0.11.0. * config.h.in: Regenerate. 2002-09-08 Kriang Lerdsuwanakij * acconfig.h, acinclude.m4/cxxac.m4: Import CXXAC_BAD_NEW changes from kcd. * aclocal.m4, config.h.in, Makefile.in: Regenerate. * dump_pattern.cc, hash.cc, pattern.cc: Include . 2002-09-03 Kriang Lerdsuwanakij * ad.append: Adjust to new copy-message usage. 2002-09-03 Kriang Lerdsuwanakij * scripts/copy-message.pl: Import changes from kcd. * scripts/copy-message: Likewise. 2002-09-01 Kriang Lerdsuwanakij * TODO: Update. 2002-09-01 Kriang Lerdsuwanakij * gtstream.h, gtstream.cc: Import and dual support from kcd. 2002-09-01 Kriang Lerdsuwanakij * README: Update. 2002-08-04 Kriang Lerdsuwanakij * TODO: Update. 2002-08-04 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc (ai_tampered): New variable. (log_history): Record if player is AI log file. (new_game, switch_color, preferences_apply): Adjust. 2002-08-04 Kriang Lerdsuwanakij * book.cc: Include . (book_random): Initialize to 0. (book_init): Don't initialize book_init here. (book_move): Fix pass logic. * configure.in (ALL_LINGUAS): Remove en_GB for now. * grhino.cc (place_piece_and_update, new_game, preferences_apply): Also store board history even when not animate opening. * grhino.cc (same_move_queue): Remove. (move_history, min_num_history, random_opening): New variables. (log_history, place_piece_and_update, new_game, undo, preferences_apply): Use them. 2002-07-21 Kriang Lerdsuwanakij * po/Makefile, po/Makefile.in: Remove from CVS. 2002-07-21 Kriang Lerdsuwanakij * ABOUT-NLS: Update. * MANIFEST: Update. * acconfig.h: Add gettext defines. Remove ncurses.m4, zlib.m4 references. * ad.append: Remove default-intl from default-target. * Makefile.in, aclocal.m4, config.h.in, po/Makefile, po/Makefile.in: Regenerate. 2002-07-21 Kriang Lerdsuwanakij * scripts/config.rpath, scripts/mkinstalldirs, po/Makefile, po/Makefile.in, po/Makefile.in.in, po/Makevars, po/Makevars.template, po/POTFILES, po/remove-potcdate: New files. 2002-07-21 Kriang Lerdsuwanakij * acinclude.m4/codeset.m4, acinclude.m4/gettext.m4, acinclude.m4/glibc21.m4, acinclude.m4/iconv.m4, acinclude.m4/isc-posix.m4, acinclude.m4/lcmessage.m4: acinclude.m4/progtest.m4: Update from gettext-0.11.3. * acinclude.m4/lib-ld.m4, acinclude.m4/lib-link.m4, acinclude.m4/lib-prefix.m4: New file. 2002-07-21 Kriang Lerdsuwanakij * intl/*: Remove files. 2002-07-21 gettextize * configure.in (AC_CONFIG_FILES): Add po/Makefile.in. 2002-07-21 gettextize * configure.in (AC_CONFIG_FILES): Remove intl/Makefile. 2002-07-20 Kriang Lerdsuwanakij * po/POTFILES.in: New file. * MANIFEST: Add po/POTFILES.in. 2002-07-20 Kriang Lerdsuwanakij * Makefile.in: Regenerate. 2002-07-20 Kriang Lerdsuwanakij * ad.append: Add default-target, default-intl, default-po, aclocal.m4, config.h.in, configure, Makefile.in targets. * ad.rule: Add DEFTARGETLIST. 2002-07-20 Kriang Lerdsuwanakij * MANIFEST: Add new files. 2002-07-20 Kriang Lerdsuwanakij * scripts/copy-message.pl, scripts/en_GB.pl, scripts/utf-quotes.pl: New files. 2002-07-20 Kriang Lerdsuwanakij * MANIFEST: Add new files. * ad.rule: Add subdirectories intl and @POSUB@. * Makefile.in: Regenerate. 2002-07-20 Kriang Lerdsuwanakij * aclocal.m4: Regenerate. * config.guess, config.sub: Move to ... * scripts/config.guess, scripts/config.sub: ... here. * configure.in: Add gettext checks. 2002-07-20 Kriang Lerdsuwanakij * ABOUT-NLS, config.guess, config.sub, acinclude.m4/codeset.m4, acinclude.m4/gettext.m4, acinclude.m4/glibc21.m4, acinclude.m4/iconv.m4, acinclude.m4/isc-posix.m4, acinclude.m4/lcmessage.m4, acinclude.m4/progtest.m4, intl/ChangeLog, intl/Makefile.in, intl/VERSION, intl/bindtextdom.c, intl/config.charset, intl/dcgettext.c, intl/dcigettext.c, intl/dcngettext.c, intl/dgettext.c, intl/dngettext.c, intl/explodename.c, intl/finddomain.c, intl/gettext.c, intl/gettext.h, intl/gettextP.h, intl/hash-string.h, intl/intl-compat.c, intl/l10nflist.c, intl/libgettext.h, intl/libgnuintl.h, intl/loadinfo.h, intl/loadmsgcat.c, intl/localcharset.c, intl/locale.alias, intl/localealias.c, intl/ngettext.c, intl/plural.c, intl/plural.y, intl/ref-add.sin, intl/ref-del.sin, intl/textdomain.c, po/ChangeLog: New files. 2002-07-16 Kriang Lerdsuwanakij * TODO: Update. 2002-07-16 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc (menu_help_about): Update copyright year. 2002-07-16 Kriang Lerdsuwanakij * NEWS: Update. 2002-07-16 Kriang Lerdsuwanakij * grhino.cc (write_config, read_config): Read/write opening. (init_game): Don't set opening_name, opening_player, opening_move_queue here. 2002-07-16 Kriang Lerdsuwanakij * grhino.cc (opening_var, hint_move, log_move, animate_opening): Remove initialization. (read_config): Read opening_var, hint_move, log_move, animate_opening. (init_game): Don't call set_book_random here. 2002-07-16 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.6.0. 2002-07-16 Kriang Lerdsuwanakij * grhino.cc (NUM_MOVE_BEGINNING): Comment out. (computer_thread): Comment out code relating to NUM_MOVE_BEGINNING. * grhino.cc (LEVEL_CUSTOM_FILE): New variable. (CFG_AI_PATH, CFG_BOARD_PATH): New defines. (write_config, read_config, menu_settings_save): New functions. (init_game): Use read_config. (menu_settings_info): Add Save Settings menu. * grhino.cc (combo_opening_var): New variable. (preferences_apply, preferences): Use it. (preferences_set_depth): Simplify. 2002-07-16 Kriang Lerdsuwanakij * opening.dat: Add to CVS. 2002-07-16 Kriang Lerdsuwanakij * aclocal.m4, Makefile.in, hint_black.xpm, hint_white.xpm: Add to CVS. 2002-07-14 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.5.1. 2002-07-14 Kriang Lerdsuwanakij * README, acconfig.h, ad.prepend, configure.in, gen_pattern.cc, grhino.cc, pattern.cc, scripts/commit, scripts/makepkg: Change name from Rhino to GRhino. ************************ rhino 0.5.0 released ************************ 2002-07-14 Kriang Lerdsuwanakij * grhino.cc: Include . (init_game): Set random seed. * scripts/version: Bump version number to 0.5.0. 2002-07-14 Kriang Lerdsuwanakij * NEWS: Update. * book.cc (book_move): Handle when there is no next moves. * grhino.cc (opening_var): Default to 1. * rand.cc (get_random): Remove debuggin code. 2002-07-14 Kriang Lerdsuwanakij * README: Update. 2002-07-14 Kriang Lerdsuwanakij * README: Update. 2002-07-14 Kriang Lerdsuwanakij * TODO: Update. 2002-07-14 Kriang Lerdsuwanakij * MANIFEST: Add rand.h, rand.cc. * gen_pattern.cc (update_info): Update the right entry. 2002-07-14 Kriang Lerdsuwanakij * rand.h, rand.cc: New files. * ad.rule (grhino, gen_book): Add rand.cc. * book.cc: Include "rand.h". (book_random, set_book_random, get_book_random): Change type to size_t. (book_move): Use get_random. * book.h (set_book_random, get_book_random): Adjust declaration. * grhino.cc (game_mode_name, NUM_OPENING_VAR, opening_var, opening_var_name): New variables. (level_name): Correct entries. (init_game): Call set_book_random. (preferences_apply): Simplify. Add opening variation. (preferences): Simplify. Add opening variation. 2002-07-14 Kriang Lerdsuwanakij * NEWS: Update. 2002-07-14 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc: Include , . (home_dir): New variable. (user_home_dir_init): New function. (log_history): Store log file in user home directory. (init_game): Call user_home_dir_init. 2002-07-14 Kriang Lerdsuwanakij * log_proc.h (process_line_GGS): Make sure board size is indeed 8. 2002-07-14 Kriang Lerdsuwanakij * NEWS: Update. * log_proc.h (process_line_GGS): Correct init_board initialization. 2002-07-14 Kriang Lerdsuwanakij * gen_pattern.cc (update_info): Handle when diff is zero. (store_file): Don't free memory here. (process_pattern): Free memory here. Correct if conditions. 2002-07-14 Kriang Lerdsuwanakij * book.cc (book_init): Don't load index in last depth. * gen_book.cc (raw_book_next, raw_book_used): Add used field. (trim_book): New function. (generate_file): Use it. Compute and write the number of entries actually stored. Don't write index in last depth. 2002-07-07 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. 2002-07-07 Kriang Lerdsuwanakij * book.cc (get_move): New function. (book_move): Adjust parameter. Implement. * book.h (book_move): Adjust declaration. * grhino.cc (computer_thread): Adjust call to book_move. Add debugging code. * gen_book.cc (update_info): Add comment. (generate_file): Don't emit rarely used moves. * gtstream.h (gtout::operator<<): Don't terminate string. 2002-07-07 Kriang Lerdsuwanakij * book.cc (book_depth, book_random): New variables. (book_init): Initialize book_random. Use book_depth. (book_move): Rename from ... (book_eval): ... this. (set_book_random, get_book_random): New functions. * book.h (book_move): Rename from ... (book_eval): ... this. (set_book_random, get_book_random): Declare. * grhino.cc: Include "book.h". (computer_thread): Use book move if available. (init_game): Call book_init. 2002-07-07 Kriang Lerdsuwanakij * book.cc (book): New variable. (book_init): Implement. 2002-07-07 Kriang Lerdsuwanakij * NEWS: Update. * book.cc: Include , , , . (book_next, book_node, book_move_info, book_info): New types. (book_init, book_eval): New functions. * book.h (book_init, book_eval): Declare. * gen_book (PRINT): Don't define. (BOOK_WIDTH): New define. (swap_raw_book_next): New function. (update_info): Sort next move entries. (generate_file): Implement. 2002-06-16 Kriang Lerdsuwanakij * gen_book.cc (generate_file): New function. (main): Update usage message. Add "gen" argument processing. * gen_pattern.cc (generate_file): Split out from ... (store_file): ... here. (process_pattern): Add "gen" argument processing. (main): Update usage message. 2002-06-16 Kriang Lerdsuwanakij * log_proc.h (process_line_IOS, process_line_GGS, process_line, process_file): Add need_end parameter. * gen_book.cc (PRINT): Define. (lookup_hash, store_file): Add debugging code. (main): Process unfinished game too. 2002-06-16 Kriang Lerdsuwanakij * gen_book.cc (store_hash, lookup_hash, update_info): Simplify. (lookup_hash): Ignore when looking up last move. 2002-06-16 Kriang Lerdsuwanakij * gen_book.cc (init_file, store_hash, process_game, store_file): Add comments. (lookup_hash, update_info, load_file): Reorder code. 2002-06-16 Kriang Lerdsuwanakij * gen_book.cc: Don't include "pattern.h". 2002-06-16 Kriang Lerdsuwanakij * book.cc: Don't include "pattern.h". 2002-06-16 Kriang Lerdsuwanakij * ad.rule (gen_book): Remove pattern.cc. 2002-06-16 Kriang Lerdsuwanakij * NEWS: Update. 2002-06-16 Kriang Lerdsuwanakij * proginfo.cc: New file. * MANIFEST: Add proginfo.cc. * ad.rule (test, grhino, gen_book, gen_pattern, dump_pattern): Add proginfo.cc. * pattern.cc: Don't include "proginfo.h". (is_use_private_files, use_private_files, get_use_private_files): Move to proginfo.cc. (get_pattern_file, get_pattern_data_file): Adjust. * pattern.h: Include "proginfo.h". (use_private_files, get_use_private_files): Move to ... * proginfo.h (use_private_files, get_use_private_files): here ... ************************ rhino 0.4.0 released ************************ 2002-06-15 Kriang Lerdsuwanakij * NEWS: Update. 2002-06-15 Kriang Lerdsuwanakij * book.cc: Include "proginfo.h". (PROG_NAME, set_prog_name): Remove. (read_int, write_int, read_unsigned_compress, write_unsigned_compress): Use prog_name instead of PROG_NAME. * book.h (set_prog_name): Remove. * dump_pattern.cc (PROG_NAME): Remove. (prog_name, prog_ver): New variables. (main_real): Use prog_name instead of PROG_NAME. Use prog_ver instead of VERSION. * gen_book.cc (PROG_NAME): Remove. (prog_name, prog_ver): New variables. (read_board, write_board, init_file, load_file, store_file): Use prog_name instead of PROG_NAME. (main): Use prog_name instead of PROG_NAME. Use prog_ver instead of VERSION. * gen_opening.cc: Don't include , . Include , . (PROG_NAME): Remove. (prog_name, prog_ver): New variables. (main): Use prog_name instead of PROG_NAME. * gen_pattern.cc (PROG_NAME): Remove. (prog_name, prog_ver): New variables. (init_file, load_file, store_file): Use prog_name instead of PROG_NAME. (main): Use prog_name instead of PROG_NAME. Use prog_ver instead of VERSION. * grhino.cc: Don't include , . Include , . Add USING_NAMESPACE_STD. Undefine _, N_ if already defined. (PROG_NAME): Remove. (prog_name, prog_ver): New variables. (update_status_bar): Use ostringstream. (menu_help_about, main_real): Use prog_name instead of PROG_NAME. Use prog_ver instead of VERSION. * gtstream.h: Don't include . Include . (gtout::operator<<): Use ostringstream. * log_proc.h: Don't include , . Include , . * pattern.cc: Include "proginfo.h". (pattern_table_init): Use prog_name. * test.cc: Include "scripts/version". (prog_name, prog_ver): New variables. 2002-06-15 Kriang Lerdsuwanakij * hash.cc: Don't include . 2002-06-15 Kriang Lerdsuwanakij * proginfo.h: New file. * MANIFEST: Add proginfo.h. 2002-06-15 Kriang Lerdsuwanakij * board.h: Include "config.h". Include CXX__HEADER_iostream. * alphabeta.cc, board.cc, dump_pattern.cc, test.cc: Don't include . * configure.in: Add CXXAC_HAVE_MUTABLE. 2002-01-27 Kriang Lerdsuwanakij * configure.in: Add comment. 2002-01-27 Kriang Lerdsuwanakij * configure.in: Fix sed substitution logic. 2001-12-17 Kriang Lerdsuwanakij * book.cc (read_int, write_int): Call read/write only once. (read_unsigned_compress): Fix logic error. * gen_book.cc: Don't include "order.h". * log_proc.h: Include "order.h". (process_line_IOS): Ignore different opening boards. 2001-12-17 Kriang Lerdsuwanakij * book.cc (read_unsigned_compress, write_unsigned_compress): New functions. * book.h (read_unsigned_compress, write_unsigned_compress): Declare. 2001-12-17 Kriang Lerdsuwanakij * log_proc.h (process_file): Don't call load_file, store_file. * gen_pattern.cc (process_pattern): Call load_file, store_file here. * gen_book.cc (book_state::book_state): Change signature. (book_state::free_book, book_state::replace_book): New members. (book_state::~book_state): Use free_book. (update_info): Change signature. Don't lookup hash if not necessary. (process_game): Cache previous board index. (load_file): Remove debugging code. (store_file): Add debugging code. (main): Don't load file if not necessary. 2001-12-16 Kriang Lerdsuwanakij * gen_book.cc (book_state::~book_state): Free raw_book_node's. 2001-12-16 Kriang Lerdsuwanakij * gen_book.cc (book_state): Add destructor. 2001-12-16 Kriang Lerdsuwanakij * ad.append: Install book.bin. 2001-12-16 Kriang Lerdsuwanakij * gen_book.cc: Include "hash.h". (book_state): Add hash member. (store_hash, lookup_hash): New functions. (update_info): Change parameter type. Use lookup_hash. (load_file): Use store_hash. 2001-12-16 Kriang Lerdsuwanakij * MANIFEST: Add book.bin. 2001-12-16 Kriang Lerdsuwanakij * book.cc (BOOK_DATA_FILE): New define. (get_book_data_file): New function. * book.h (get_book_data_file): Declare. * gen_book.cc (BOOK_DEPTH): Change to 15. (read_board, write_board, init_file, load_file, store_file): Use get_book_data_file instead of get_book_file. 2001-12-16 Kriang Lerdsuwanakij * book.cc (read_int, write_int): Make buffer unsigned. (get_symmetry): Fix logic error. * gen_book.cc (raw_book_next): Add count member. (raw_book_node): Remove count member. (read_board): Fix black/white logic. (init_file): Write end of file symbol. (update_info): Adjust counting logic. Add debugging code. Don't write past vector size. (process_game): Remove b1, b2 variables. Fix next move logic error. Simplify. (load_file): Add debugging code. Adjust counting logic. Store read results. Check end of file symbol. (store_file): Adjust counting logic. Add debugging code. Write end of file symbol. 2001-12-14 Kriang Lerdsuwanakij * board.cc: Include . (operator==(const board_info &, const board_info &)): New function. * board.h (operator==(const board_info &, const board_info &)): New function. * gen_book.cc (update_info): Implement. (process_game): Keep new and old copies of game board. 2001-12-14 Kriang Lerdsuwanakij * gen_book.cc: Include "order.h". (update_info): New function. (process_game): Implement. 2001-12-14 Kriang Lerdsuwanakij * gen_book.cc (process_game): Ignore random games. (load_file, store_file): Comment out unused parameter. 2001-12-14 Kriang Lerdsuwanakij * book.cc: Include "order.h". (symmetry_identity, symmetry_transpose, symmetry_rotate, symmetry_rotate_transpose): New variables. (get_symmetry): New function. * book.h (symmetry_type): New type. (get_symmetry): Declare. 2001-12-13 Kriang Lerdsuwanakij * gen_book.cc (store_file): Implement. 2001-12-13 Kriang Lerdsuwanakij * gen_book.cc (read_board): Store result. (write_board): New function. 2001-12-13 Kriang Lerdsuwanakij * gen_book.cc (raw_book_next): Add constructor. (raw_book_node): Add board field. Change type of next. Add constructor. (read_board): New function. (load_file): Implement. 2001-12-13 Kriang Lerdsuwanakij * gen_book.cc (raw_book_node): Remove pos field. (load_file): More processing. 2001-12-13 Kriang Lerdsuwanakij * book.cc: Include . (PROG_NAME): New variable. (set_prog_name, read_int, write_int): New functions. * book.h (set_prog_name, read_int, write_int): Declare. * gen_book.cc (init_file): Use write_int. (load_file): Use read_int. (main): Call set_prog_name. 2001-12-13 Kriang Lerdsuwanakij * gen_book.cc (load_file): Fix syntax errors. 2001-12-13 Kriang Lerdsuwanakij * gen_book.cc: Don't include . Include . (raw_book_move_info, raw_book_next): New types. (raw_book_info, raw_book_node): Change type. (book_state): Add constructor. (process_game, load_file, store_file): New functions. (main): Call process file. 2001-12-13 Kriang Lerdsuwanakij * log_proc.h (board, init_board): Remove declarations. (process_line_IOS): Use local board, init_board. (process_line_GGS): Use local init_board. * gen_pattern.cc (board, init_board): Remove variables. (process_game): Use local board. * gen_pattern.cc (load_file): Fix error message. 2001-12-08 Kriang Lerdsuwanakij * gen_book.cc: Include , , , . (init_file): Fix syntax error. 2001-12-08 Kriang Lerdsuwanakij * gen_book.cc (BOOK_DEPTH): Define. (init_file): Implement. 2001-12-08 Kriang Lerdsuwanakij * grhino.cc (update_status_bar): Adjust opening display. 2001-12-08 Kriang Lerdsuwanakij * opening.cc (get_opening_num_move(int), get_opening_num_move(const char *)): New functions * opening.h (get_opening_num_move(int), get_opening_num_move(const char *)): Declare. * grhino.cc (find_opening_name): New function. (update_status_bar): Use it. 2001-12-08 Kriang Lerdsuwanakij * gen_book.cc: Include , "pattern.h". (raw_book_node, raw_book_info, book_state): New types. (init_file, main): New functions. 2001-12-08 Kriang Lerdsuwanakij * ad.rule (gen_book): Add pattern.cc. 2001-12-08 Kriang Lerdsuwanakij * gen_pattern.cc: Don't include , , . (move_queue, move_queue_color, num_move_queue): Remove. * log_proc.h: Include , . (board, init_board): Declare. (process_line_IOS): Use local num_move_queue, move_queue. 2001-12-08 Kriang Lerdsuwanakij * gen_book.cc: New file. * MANIFEST, ad.rule: Add gen_book.cc. 2001-12-08 Kriang Lerdsuwanakij * book.h, book.cc: New files. * MANIFEST: Add book.h, book.cc. * ad.rule (grhino): Add book.cc. 2001-12-08 Kriang Lerdsuwanakij * makepkg, makepkg-release: Add copyright, GPL information. 2001-12-08 Kriang Lerdsuwanakij * pattern.cc (get_use_private_files): New function. * pattern.h (get_use_private_files): Declare. 2001-12-08 Kriang Lerdsuwanakij * log_proc.h (process_file): Move from ... * gen_pattern.cc: ... here. 2001-12-08 Kriang Lerdsuwanakij * log_proc.h: New file. (game_log, VAL_BLANK, VAL_WHITE, VAL_BLACK, from_ascii, process_line_IOS, process_line_GGS, process_line): Move from ... * gen_pattern: ... here. Don't include "board.h". Include "log_proc.h". * MANIFEST: Add log_proc.h. 2001-12-08 Kriang Lerdsuwanakij * gen_pattern.cc (move_queue_color): New variable. (pattern_state, game_log): New struct's. (process_game): New function. (process_line_IOS, process_line_GGS, process_line): Convert to template functions. (load_file, store_file): Change parameters. (process_pattern): Allocate memory for pattern here. 2001-12-07 Kriang Lerdsuwanakij * dump_pattern.cc (main): Call use_private_files. Replace get_pattern_file_private with get_pattern_file. * gen_pattern.cc (init_file, load_file): Replace get_pattern_file_private with get_pattern_file. (store_file): Replace get_pattern_file_private with get_pattern_file. Replace get_pattern_file_private with get_pattern_file. (main): Call use_private_files. 2001-12-07 Kriang Lerdsuwanakij * pattern.cc (get_pattern_file_public): Rename from get_pattern_file. Moved from pattern.h. Remove inlineness. (get_pattern_data_file_public): Rename from get_pattern_data_file. Moved from pattern.h. Remove inlineness. (get_pattern_file_private, get_pattern_data_file_private): Moved from pattern.h. Remove inlineness. (get_pattern_file, get_pattern_data_file, use_private_files): New functions. * pattern.h (get_pattern_file, get_pattern_data_file, use_private_files): Declare. 2001-12-07 Kriang Lerdsuwanakij * gen_pattern.cc (board_ptr, init_board_ptr): Remove variables. (board): New variable. (process_line_IOS, process_line_GGS, main): Adjust. 2001-12-07 Kriang Lerdsuwanakij * board.h (copy_board(board_info *, const board_type *), copy_board(board_info &, const board_type *)): New functions. 2001-12-07 Kriang Lerdsuwanakij * board.h (copy_board(board_info &, const board_info &)): New function. 2001-12-07 Kriang Lerdsuwanakij * NEWS: Update. * scripts/version: Bump version number to 0.4.0. ************************ rhino 0.3.1 released ************************ 2001-12-06 Kriang Lerdsuwanakij * scripts/version: Change version to 0.3.1. 2001-12-04 Kriang Lerdsuwanakij * gen_pattern.cc (update_info): Remove draw game check. 2001-12-04 Kriang Lerdsuwanakij * gen_pattern.cc (process_line_GGS): Implement. 2001-12-04 Kriang Lerdsuwanakij * gen_pattern.cc (update_info): Revert today changes. Ignore draw games. Add comments. * pattern.cc (row1_pattern, row2_pattern, row3_pattern, row4_pattern, pattern_data): Revert today changes. (pattern_eval_debug): Tidy. 2001-12-04 Kriang Lerdsuwanakij * gen_pattern.cc (update_info): Rearrange symmetry code. (process_line_IOS): Rename from process_line. (process_line_GGS): New function. (process_line): New function. (store_file): Disable compression. * pattern.cc (row1_pattern, row2_pattern, row3_pattern, row4_pattern): Reorder for symmetry. (pattern_data): Make row*_pattern non-symmetric. (pattern_table_init): Disable compression. 2001-12-04 Kriang Lerdsuwanakij * gen_pattern.cc (store_file): Remove commented out code. 2001-12-04 Kriang Lerdsuwanakij * alphabeta.cc (midgame_strategy::board_score, midgame_strategy_with_random::board_score): Remove mobility evaluation and debugging code. (eval_midgame): Remove debugging code. 2001-12-04 Kriang Lerdsuwanakij * gen_pattern.cc (store_file): Remove commented out code. 2001-12-04 Kriang Lerdsuwanakij * pattern.cc (show_pattern): New function, split out from dump_pattern.cc. * pattern.h (show_pattern): Declare. * dump_pattern.cc (main_real): Use it. * gen_pattern.cc (update_info): Fix symmetry logic. (store_file): Fix overflow. Compress table. * pattern.cc (pattern_table_init): Decompress table. 2001-12-04 Kriang Lerdsuwanakij * gen_pattern.cc (process_line): Fix bug in previous change. 2001-12-03 Kriang Lerdsuwanakij * gen_pattern.cc (process_line): Add comments. Simplify. 2001-12-03 Kriang Lerdsuwanakij * NEWS: Update. * gen_pattern.cc (log_func): Force evaluation to be symmetry. (update_info): Rearrange board symmetry logic. (store_file): Simplify. Add debugging code. 2001-12-03 Kriang Lerdsuwanakij * MANIFEST: Add corner5x2.bin. * TODO: Update. * gen_pattern.cc (store_file): Initialize PATTERN_CORNER5x2 for interpolation. 2001-12-03 Kriang Lerdsuwanakij * ad.append: Add corner5x2.bin. * alphabeta.cc (midgame_strategy::board_score, midgame_strategy_with_random::board_score): Comment out corner score adjustment. * dump_pattern (main_real): Rename from main. (main): New function. * gen_pattern (main): Display caught exceptions. 2001-12-03 Kriang Lerdsuwanakij * dump_pattern.cc (main): Remove commented out code. * gen_pattern.cc (init_file, update_info, store_file): Likewise. * pattern.h (raw_pattern_inf): Likewise. * pattern.cc (pattern_table_init, pattern_eval, pattern_eval_debug): Add border5x2 pattern. 2001-12-03 Kriang Lerdsuwanakij * README: Update. * dump_pattern.cc (main): Move edge-x pattern. Add corner5x2 pattern. * gen_pattern.cc (main): Move edge-x pattern. Add corner5x2 pattern. 2001-12-03 Kriang Lerdsuwanakij * pattern.h (pattern_t): Move edge-x pattern. Add corner5x2 pattern. * pattern.cc (pattern_data): Move edge-x pattern. Add corner5x2 pattern. (corner5x2_pattern): New variable. (pattern_table_init): Close file on failure. 2001-12-03 Kriang Lerdsuwanakij * pattern.h (pow_3): Redefine. 2001-12-03 Kriang Lerdsuwanakij * dump_pattern.cc: Include "scripts/version". (main): Display command line syntax. 2001-12-03 Kriang Lerdsuwanakij * gen_pattern.cc: Include "scripts/version". (log_func): Adjust calculation. (store_file): Close file on exit. (main): Display command line syntax. 2001-12-01 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.4.0. * NEWS, README: Update. ************************ rhino 0.3.0 released ************************ 2001-12-01 Kriang Lerdsuwanakij * grhino.cc (log_move): Default to false. (log_history): Fix log format, player name. 2001-12-01 Kriang Lerdsuwanakij * ad.prepend (pattern_dir): Remove trailing '/'. * ad.rule (pattern.cc): Add trailing '/'. * gen_pattern.cc (store_file): Fix interpolation logic. 2001-12-01 Kriang Lerdsuwanakij * NEWS: Update. 2001-12-01 Kriang Lerdsuwanakij * MANIFEST, ad.append: Change edge.bin to row1.bin. * grhino.cc (NUM_LEVEL_INFO, level_info, preferences_apply, preferences_set_depth, preferences): Add new computer level. * NEWS, README: Update. 2001-12-01 Kriang Lerdsuwanakij * pattern.cc (pattern_eval): Change PATTERN_EDGE to PATTERN_ROW1. 2001-12-01 Kriang Lerdsuwanakij * alphabeta.cc (midgame_strategy::board_score, eval_midgame): Add debugging code. 2001-12-01 Kriang Lerdsuwanakij * pattern.h (PATTERN_ROW1): Rename from PATTERN_EDGE. * pattern.cc (row1_pattern): Rename from edge_pattern. (pattern_data, pattern_table_init, pattern_eval_debug): Adjust. * gen_pattern.cc (store_file, main): Adjust. * dump_pattern.cc (main): Adjust. 2001-12-01 Kriang Lerdsuwanakij * gen_pattern.cc (log_func): Adjust scale. (process_line): Ignore game not properly ended. (store_file): Initialize edge, edge-x, diag1 for all moves. 2001-12-01 Kriang Lerdsuwanakij * gen_pattern.cc (store_file): Fix a memory leak. 2001-12-01 Kriang Lerdsuwanakij * gen_pattern.cc (log_func): Handle when both b and w are zero. (store_file): Simplify. 2001-12-01 Kriang Lerdsuwanakij * gen_pattern.cc: Include . (log_func): New function. (load_file, store_file): New functions, split out from process_file. (init_file, update_info, process_file): Handle when p is PATTERN_UNKNOWN. Use new raw_pattern_type members. Use get_pattern_file_private, get_pattern_data_file_private. (process_pattern): New function, split out from main. (main): Accept all as a command line argument. 2001-12-01 Kriang Lerdsuwanakij * dump_pattern.cc (main): Change get_pattern_file to get_pattern_file_private. Use new raw_pattern_info members. 2001-12-01 Kriang Lerdsuwanakij * grhino.cc (NUM_MOVE_BEGINNING): Disable, define to -2. (main): Use return value from main_real. Return 1 upon failure. 2001-12-01 Kriang Lerdsuwanakij * pattern.cc (pattern_eval_debug(board_info *, int, pattern_t), pattern_eval_debug(board_info *)): New functions. 2001-12-01 Kriang Lerdsuwanakij * pattern.h (raw_pattern_info): Change members to black_win, white_win. (get_pattern_file_private, get_pattern_data_file_private): New functions. (pattern_eval_debug): Declare. 2001-11-26 Kriang Lerdsuwanakij * alphabeta.cc (temp_alpha_beta): Add braces in various places. 2001-11-26 Kriang Lerdsuwanakij * alphabeta.cc (opening_strategy, opening_strategy_with_random): New classes. (midgame_strategy::next_iterator, endgame_strategy::next_iterator, midgame_strategy_with_random::next_iterator, endgame_strategy_with_random::next_iterator): New member. (temp_alpha_beta): Add board_iterator template parameter. (opening_alpha_beta, eval_opening): New functions. (midgame_alpha_beta, endgame_alpha_beta): Adjust . (last_eval_type): Add last_eval_opening. (eval_midgame, eval_endgame, eval_winlossdraw): Initialize iterator here. * alphabeta.h (eval_opening): Declare. * grhino.cc: Don't include "iter.h". (NUM_MOVE_BEGINNING): New variable. (computer_thread): Don't initialize iterators here. Use eval_opening. 2001-11-25 Kriang Lerdsuwanakij * TODO: Update. 2001-11-25 Kriang Lerdsuwanakij * README: Update. 2001-11-25 Kriang Lerdsuwanakij * NEWS: Update. 2001-11-25 Kriang Lerdsuwanakij * README: Update. * ad.append: Add install, install_mkdir. * alphabeta.cc (midgame_strategy::board_score, midgame_strategy_with_random::board_score): Add corner scores. * grhino.cc (init_game): Default computer to white. 2001-11-25 Kriang Lerdsuwanakij * grhino.cc: #undef VERSION before including scripts/version. (main_real): Renamed from main. (main): New function. 2001-11-25 Kriang Lerdsuwanakij * scripts/version (VERSION): Rename from VER. * grhino.cc (menu_help_about, main): Adjust. * configure.in: Remove redundant scripts/version call. 2001-11-25 Kriang Lerdsuwanakij * ad.rule: Fix quoting problem. 2001-11-25 Kriang Lerdsuwanakij * configure.in: Define and substitute PACKAGE, VERSION. * acconfig.h: Add PACKAGE, VERSION. * config.h.in: Regenerate. 2001-11-25 Kriang Lerdsuwanakij * ad.prepend: Add brace around variables in pattern_dir. 2001-11-25 Kriang Lerdsuwanakij * ad.prepend: Rename patterndir to pattern_dir. * ad.rule: Adjust. 2001-11-25 Kriang Lerdsuwanakij * ad.prepend: Add trailing / to patterndir. * ad.rule: Define PATTERN_PATH. * pattern.cc: Use PATTERN_PATH. * configure.in: Remove system include directories from CPPFLAGS. 2001-11-25 Kriang Lerdsuwanakij * acconfig.h: Add comment for rhino portion of file. * config.h.in: Regenerate. * ad.prepend: Add patterndir. 2001-11-24 Kriang Lerdsuwanakij * TODO: Update. 2001-09-15 Kriang Lerdsuwanakij * configure.in: Add CXXAC_TYPE_BOOL, CXXAC_BAD_ALLOC, CXXAC_HAVE_EXPLICIT, CXXAC_HAVE_ARRAY_NEW, CXXAC_BAD_DELETE, CXXAC_DEFAULT_EXCEPTION, CXXAC_HAVE_TYPENAME, CXXAC_NO_GUIDE_DECL, CXXAC_HEADER_ALL. Remove CXXAC_LIB_NEED_USING_STD. * gtstream.h, gtstream.cc: Import from current kcd source tree. 2001-09-15 Kriang Lerdsuwanakij * configure.in: Move AC_ISC_POSIX earlier. Set LIBS, CPPFLAGS later. * opening.h: Include config.h. Add USING_NAMESPACE_STD. * grhino.cc (preferences): Cast away const. * pattern.cc (pattern_eval): Comment out DIAG4, DIAG5 evaluation. 2001-06-14 Kriang Lerdsuwanakij * scripts/commit: Add path to rpcp. * scripts/makepkg: Use package variable. 2001-03-11 Kriang Lerdsuwanakij * MANIFEST: Add diag1.bin, diag2.bin, diag3.bin, diag4.bin, diag5.bin, row2.bin, row3.bin, row4.bin. 2001-03-11 Kriang Lerdsuwanakij * alphabeta.cc (midgame_strategy::board_score, midgame_strategy_with_random::board_score): Comment out mobility score. 2001-03-11 Kriang Lerdsuwanakij * dump_pattern.cc (main): Display score of new patterns. 2001-03-11 Kriang Lerdsuwanakij * gen_pattern.cc (process_line): Add another IOS format. * pattern.cc (pattern_data): Fix error. 2001-03-11 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. 2001-03-11 Kriang Lerdsuwanakij * pattern.h (pattern_table): Declare. * dump_pattern.cc (PROG_NAME): Fix error. (main): Add pattern. Adjust to pattern.cc changes. 2001-03-11 Kriang Lerdsuwanakij * gen_pattern.cc (process_line): Works with new IOS format. 2001-03-11 Kriang Lerdsuwanakij * board.h (adjust_score): New function. * grhino.cc (log_history, update_status_bar): Use it. 2001-03-11 Kriang Lerdsuwanakij * pattern.cc (edge_x_pattern, edge_pattern): Change definition. (row2_pattern, row3_pattern, row4_pattern, diag1_pattern, diag2_pattern, diag3_pattern, diag4_pattern, diag5_pattern, pattern_data, pattern_table): New variables. (edge_x_pattern_table, edge_pattern_table): Remove. (pattern_table_init, pattern_eval): Adjust. Add inline function. * pattern.h: Include . (edge_x_pattern_piece, edge_x_pattern, num_edge_x_pattern, edge_pattern_piece, edge_pattern, num_edge_pattern): Remove. (max_num_pattern, pattern_data): New variables. (pattern_data_t): New struct. (pattern_t): Add patterns. (get_pattern_file, get_pattern_data_file, get_pattern_piece, get_num_pattern): Adjust. (get_pattern_symmetry): New function. (edge_x_pattern_table, edge_pattern_table): Remove declarations. * gen_pattern.cc (update_info, process_file, main): Add patterns. 2001-03-08 Kriang Lerdsuwanakij * NEWS: Update. * dump_pattern.cc: Include . (num_log_pos, log_pos): New variables. (is_log_pos, main): Adjust. * gen_pattern.cc (move_queue, num_move_queue, init_board): New variables. (VAL_BLANK, VAL_BLACK, VAL_WHITE): New defines. (from_ascii): Adjust. (process_line): Add new IOS format. 2001-03-08 Kriang Lerdsuwanakij * board.h (switch_color): New function. * test.cc (main): Use it. * grhino.cc (log_history, place_piece_and_update): Likewise. * alphabeta.cc (temp_alpha_beta): Likewise. 2001-03-08 Kriang Lerdsuwanakij * README: Update. * gen_pattern.cc (process_file): Reorganize. Interpolate score. * grhino.cc (place_piece_and_update): Call log_history after history update. (preferences): Add Both to combo_player. 2001-03-08 Kriang Lerdsuwanakij * grhino.cc (new_game): Fix syntax error. 2001-03-08 Kriang Lerdsuwanakij * NEWS: Update. * dump_pattern.cc: Include , , , . (main): Read *.pat. * grhino.cc (new_game): Fix osave_move_queue initialization. 2001-03-07 Kriang Lerdsuwanakij * gen_pattern.cc (update_info): Add color symmetry update. (process_file): Initialized unseen patterns with default scores. 2001-03-07 Kriang Lerdsuwanakij * grhino.cc: Include . (save_move_queue): New variable. (log_move): Default to true. (log_opening): New variable. (log_history): Use IOS format. (init_game): Set game mode to COMPUTER_BOTH. (new_game): Set save_move_queue. 2001-03-07 Kriang Lerdsuwanakij * pattern.h (extract_index, extract_color): New functions. 2001-03-06 Kriang Lerdsuwanakij * dump_pattern: Include "config.h". Add USING_NAMESPACE_STD. (PROG_NAME): New variable. 2001-03-06 Kriang Lerdsuwanakij * MANIFEST: Change edge-x.bin to edge.bin. 2001-03-06 Kriang Lerdsuwanakij * dump_pattern.cc (main): Handle multiple patterns. * gen_pattern.cc (pattern_t, get_pattern_file, get_pattern_data_file, get_pattern_piece, get_num_pattern, get_pattern_size): Move to... * pattern.h: ...here. 2001-03-06 Kriang Lerdsuwanakij * pattern.cc (edge_x_pattern): Use edge_x_pattern_piece. (edge_pattern, edge_pattern_table): New variables. (pattern_table_init): Use edge_x_pattern_piece. Comment out edge-x pattern. Add edge pattern. (pattern_eval): Likewise. * pattern.h (edge_x_pattern): Use edge_x_pattern_piece. (edge_x_pattern_piece, edge_pattern_piece, edge_pattern, num_edge_pattern, edge_pattern_table): New variables. 2001-03-06 Kriang Lerdsuwanakij * gen_pattern.cc (pattern_t): Add PATTERN_EDGE. (get_pattern_file, get_pattern_data_file): Likewise. (get_pattern_piece, get_num_pattern): New functions. (get_pattern_size): Rewrite. (update_info, main): Add PATTERN_EDGE. 2001-03-06 Kriang Lerdsuwanakij * MANIFEST: Add dump_pattern.cc. Change edge-x.pat to edge-x.bin. 2001-03-06 Kriang Lerdsuwanakij * ad.rule (test): Add pattern.cc. (dump_pattern): New target. * alphabeta.cc: Include "pattern.h". (midgame_strategy::board_score): Comment out corner logic. Add pattern score. (midgame_strategy_with_random::board_score): Likewise. * dump_pattern.cc: New file. * gen_pattern.cc (board_ptr, init_board_ptr): New variables. (gen_pattern_data_file, from_ascii, update_info, process_line): New functions. (init_file): Fix logic. (process_file): Implement. (main): Initialize board_ptr, init_board_ptr. * grhino.cc: Include "pattern.h". (init_game): Call pattern_table_init. * pattern.cc: Include "order.h", , , , . (edge_x_pattern, edge_x_pattern_table): New variables. (pattern_table_init, pattern_eval): New functions. * pattern.h: Include "board.h". (pattern_info, raw_pattern_info): Change types. (edge_x_pattern, edge_x_pattern_table, pattern_table_init, patter_eval): Declare. (num_edge_x_pattern): New variable. 2001-03-04 Kriang Lerdsuwanakij * MANIFEST: Add edge-x.pat. * gen_pattern.cc (init_file): Write to file. 2001-03-04 Kriang Lerdsuwanakij * ad.rule: Add gen_pattern target. * gen_opening.cc (main): Return 1 upon error. * pattern.h (pow_3): Add int. (pattern_info, raw_pattern_info): New types. 2001-03-04 Kriang Lerdsuwanakij * gen_pattern.cc: New file. * MANIFEST: Add gen_pattern.cc. 2001-03-04 Kriang Lerdsuwanakij * pattern.cc: Include pattern.h. 2001-03-04 Kriang Lerdsuwanakij * ad.rule: Add pattern.cc to grhino rule. 2001-03-04 Kriang Lerdsuwanakij * pattern.h, pattern.cc: New files. * MANIFEST: Add pattern.h, pattern.cc. 2001-03-04 Kriang Lerdsuwanakij * grhino.cc (place_piece_and_update): Remove entry from move_queue here. (computer_thread): Not here. * NEWS: Update. 2001-03-04 Kriang Lerdsuwanakij * grhino.cc (preferences_apply): Query check_animate_opening. (preferences): Create check_animate_opening. 2001-03-03 Kriang Lerdsuwanakij * grhino.cc (computer_thread): Remove usleep. Decrease num_history during opening animation. (computer_check): Join AI thread. (cancel_computer_thread): Tidy. (check_animate_opening): New variable. (preferences_apply): Deal with animate_opening properly. 2001-03-03 Kriang Lerdsuwanakij * grhino.cc (opening_move_queue): New variable. (init_game, preferences_apply): Set opening_move_queue. (new_game): Set move_queue. * opening.cc (push_move_sequence): Rename to... (get_opening_move_sequence): ...this. (get_opening_move_sequence): Use size_t. * opening.h (push_move_sequence): Rename to... (get_opening_move_sequence): ...this. (opening_info::num_move_sequence): Change type to size_t. 2001-03-03 Kriang Lerdsuwanakij * gen_opening.cc (output_board): Use size_t. 2001-03-03 Kriang Lerdsuwanakij * gen_opening.cc (output_board): Add d parameter. (to_hex): New variable. (main): Record move sequence. ************************ rhino 0.2.0 released ************************ 2001-03-03 Kriang Lerdsuwanakij * opening.cc (push_move_sequence): Fix syntax error. 2001-03-03 Kriang Lerdsuwanakij * opening.h (opening_info::move_sequence): Change type to const char *. * opening.cc (push_move_sequence): Add static_cast. * gen_opening.cc: Include "opening.h". 2001-03-03 Kriang Lerdsuwanakij * opening.h: Include . (opening_info): Add num_move_sequence, move_sequence fields. (get_opening_id, push_move_sequence): Declare. * opening.cc (get_opening_id, push_move_sequence): New functions. (get_opening_player, get_opening_board): Rewrite. 2001-03-03 Kriang Lerdsuwanakij * grhino.cc (animate_opening): New variable. (computer_thread): Check move_queue. 2001-03-03 Kriang Lerdsuwanakij * grhino.cc: Include . (move_queue): New variable. (get_wait_player): Check move_queue. (new_game): Check game_play. 2001-03-03 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.3.0. 2001-03-03 Kriang Lerdsuwanakij * grhino.cc (game_mode_type): Fix syntax error. 2001-03-01 Kriang Lerdsuwanakij * grhino.cc (game_mode_type): Add COMPUTER_BOTH. Remove enum value override. (get_game_mode_string): Reorganize. (is_computer_player, preferences_apply): Handle COMPUTER_BOTH. 2001-03-01 Kriang Lerdsuwanakij * grhino.cc (game_play_history): Remove. (get_game_play): New function. (place_piece_and_update, new_game, undo, redo): Adjust. 2001-02-28 Kriang Lerdsuwanakij * NEWS: Update. 2001-02-28 Kriang Lerdsuwanakij * alphabeta.cc: Include . (midgame_strategy::board_score, endgame_strategy::board_score, midgame_strategy_with_random::board_score, endgame_strategy_with_random::board_score): Add cancellation point. * grhino.cc (computer_thread): Set PTHREAD_CANCEL_DEFERRED. Add lock around ai_pos access. (computer_move): Add lock around ai_pos and ai_timeout_id access. (cancel_computer_thread): Likewise. Use pthread_join. (init_game): Don't set PTHREAD_CREATE_DETACHED. (undo): Restart computer thread if the first move is AI's. (preferences_apply): Only work when page < 0. 2001-02-28 Kriang Lerdsuwanakij * NEWS: Update. * grhino.cc (undo): Fix logic when the first player is AI. * grhino.cc (preferences_apply): Force new game if all previous moves are AI's. 2001-02-28 Kriang Lerdsuwanakij * gen_opening.cc (main): Fix player variable declaration. 2001-02-28 Kriang Lerdsuwanakij * MANIFEST: Add opening.dat. 2001-02-28 Kriang Lerdsuwanakij * NEWS: Update. * TODO: Update. 2001-02-28 Kriang Lerdsuwanakij * opening.cc (get_opening_player): Fix syntax error. 2001-02-28 Kriang Lerdsuwanakij * grhino.cc (preferences_apply): Fix missing code. 2001-02-28 Kriang Lerdsuwanakij * gen_opening.cc (output_board): Add player parameter. (main): Compute next player. * grhino.cc (opening_player): New variable. (init_game): Set opening_player. (new_game): Query opening_player. (preferences_apply): Set opening_player, need_new_game. * opening.cc (get_opening_player): New functions. * opening.h (opening_info::next_player): New field. (get_opening_player): Declare. 2001-02-28 Kriang Lerdsuwanakij * gen_opening.cc (main): Increment num_data only when new opening is encountered. * grhino.cc: Include , "opening.h". (opening_name, combo_opening): New variables. (init_game): Set opening_name. (preferences_apply): Add need_draw_board, need_new_game. Query combo_opening. (preferences): Create combo_opening. Increase the maximum value of randomness to 10.0. 2001-02-28 Kriang Lerdsuwanakij * gen_opening.cc (main): Output opening_data variable name. * opening.cc (get_opening_board(const char *)): Return 0 upon failure. 2001-02-28 Kriang Lerdsuwanakij * gen_opening: Include "config.h", , , . Add USING_NAMESPACE_STD. (PROG_NAME): New variable. (main): Process opening.txt. 2001-02-28 Kriang Lerdsuwanakij * ad.rule: Add board.cc, hash.cc to gen_opening target. * board.h (board_begin): Declare. * grhino.cc (board_begin): Remove declaration. * opening.cc: Include , "opening.dat". (get_num_opening, get_opening_name, get_opening_board): New functions. * opening.h (opening_info): Change type of board field to board_type. (get_opening_board): Change return type to board_type. * gen_opening.cc: Include , , "board.h". (num_data, board_ptr, init_board_ptr): New variables. (output_board): New function. (main): Implement. 2001-02-27 Kriang Lerdsuwanakij * opening.h, opening.cc, gen_opening.cc: New files. * MANIFEST: Add gen_opening.cc, opening.cc, opening.h. * ad.rule: Add opening.cc to grhino target. Add gen_opening target. * board.cc (board_info::board_info, copy_board, board_diff_score, board_black_score, board_white_score, can_play_nocheck, can_play, operator<<): Make parameters const board_info * * board.h (board_info::board_info, is_empty, copy_board, board_diff_score, board_black_score, board_white_score, can_play_nocheck, can_play, get_num_move, operator<<): Likewise. * TODO: Update. 2001-02-27 Kriang Lerdsuwanakij * grhino.cc: Include . (log_move, check_log_move): New variable. (log_history): New function. (place_piece_and_update): Call log_history when the game ends. (preferences_apply): Update log_move. (preferences): Create check_log_move. * NEWS: Update. 2001-02-26 Kriang Lerdsuwanakij * text.cc: Remove file. 2001-02-26 Kriang Lerdsuwanakij * NEWS: Update. 2001-02-26 Kriang Lerdsuwanakij * grhino.cc (hint_move): Default to false. (check_hint_move): New variable. (preferences_apply): Query hint check button. (preferences): Add hint check button. 2001-02-26 Kriang Lerdsuwanakij * grhino.cc (preferences): Add new notebook page. 2001-02-26 Kriang Lerdsuwanakij * hint_white.xpm: Rename from ... * hint.xpm: ... this. * hint_black.xpm: New file. * MANIFEST: Update. * grhino.cc: Include "hint_black.xpm", "hint_white.xpm". (hint_black_pixmap, hint_white_pixmap): New variables. (hint_move): New variable. (draw_board): Display hints. (main): Initialize hint_black_pixmap and hint_white_pixmap. 2001-02-26 Kriang Lerdsuwanakij * hint.xpm: New file. * MANIFEST: Add hint.xpm. 2001-02-26 Kriang Lerdsuwanakij * grhino.cc (menu_help_about, main): Change program name from Rhino to GRhino. 2001-02-15 Kriang Lerdsuwanakij * grhino.cc: Add comments. 2001-02-15 Kriang Lerdsuwanakij * grhino.cc (XPM_SIZE): Change to const int. (TOP_MARGIN, BOTTOM_MARGIN, LEFT_MARGIN, RIGHT_MARGIN): New variables. (draw_board, button_press_signal, main): Adjust. 2001-02-15 Kriang Lerdsuwanakij * NEWS: Update. 2001-02-15 Kriang Lerdsuwanakij * NEWS: Update. * README: Update. * grhino.cc (menu_edit_info): Split out from... (menu_game_info): ...here. (menu_main_info): Update. 2001-02-15 Kriang Lerdsuwanakij * alphabeta.cc (midgame_strategy_with_random::next_strategy, endgame_strategy_with_random::next_strategy): Fix type. 2001-02-15 Kriang Lerdsuwanakij * alphabeta.cc (get_random): Fix logic. 2001-02-15 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc (spin_randomness): New variable. (preferences_apply): Set randomness. (preferences): Create spin_randomness spin button. 2001-02-15 Kriang Lerdsuwanakij * alphabeta.cc: Add comments. (board_buffer): Make variable static. (randomness, randomness_mod): New variables. (set_eval_random, get_eval_random, get_random): New functions. (midgame_strategy_with_random, endgame_strategy_with_random): New classes. (midgame_alpha_beta): Use midgame_strategy_with_random when appropriate. (endgame_alpha_beta): Use endgame_strategy_with_random when appropriate. * alphabeta.h (set_eval_random, get_eval_random): Declare. 2001-02-15 Kriang Lerdsuwanakij * alphabeta.cc (endgame_strategy::board_score): Remove 1024 multiplier. 2001-02-15 Kriang Lerdsuwanakij * grhino.cc (preferences_apply): Call free_hash_all_moves if any computer parameter changes. 2001-02-14 Kriang Lerdsuwanakij * TODO: Update. * alphabeta.cc (temp_alpha_beta): Handle when depth < 0. * grhino.cc (spin_depth, spin_winlossdraw, spin_exact): New variables. (preferences_set_depth): New function. (preferences_apply): Implement custom level. (preferences_level_changes): Set spin button values. (preferences): Set all combo boxes not editable. Create spin buttons. 2001-02-14 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc (is_computer_player): New function. (get_wait_player, undo, redo): Use it. * grhino.cc (preferences): Uncomment custom level. * grhino.cc (switch_color, menu_settings_switch_color): New function. (menu_settings_info): Add switch color menu. 2001-02-14 Kriang Lerdsuwanakij * grhino.cc (get_game_mode, set_game_mode, get_game_mode_string): New functions. (get_wait_player, init_game, undo, redo, preferences_apply, preferences): Use them. 2001-02-13 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.2.0 ************************ rhino 0.1.0 released ************************ 2001-02-13 Kriang Lerdsuwanakij * TODO: Update. 2001-02-13 Kriang Lerdsuwanakij * NEWS, README: Update. 2001-02-13 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc (num_empty_winlossdraw, num_empty_exact, midgame_depth): Remove. (level_info_type): New struct. (NUM_LEVEL_INFO, level_info, LEVEL_CUSTOM, computer_level, current_level_info, level_name, combo_level): New variables. (computer_thread, computer_check, init_game): Adjust. (preferences_apply): Obtain computer level. (preferences_level_changed): New function. (preferences): Add computer level combo box. 2001-02-13 Kriang Lerdsuwanakij * TODO: Update. 2001-02-12 Kriang Lerdsuwanakij * grhino.cc (preferences_apply, preferences): Mark strings. 2001-02-12 Kriang Lerdsuwanakij * NEWS: Update. 2001-02-12 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc (COMPUTER_NONE, COMPUTER_BLACK, COMPUTER_WHITE): Redefine values. (wait_player_history, game_mode_history): Remove. (place_piece_and_update, new_game): Don't update wait_player_history, game_mode_history. (undo, redo): Don't use wait_player_history, game_mode_history. (preferences_closed, preferences_apply, preferences_help, preferences_changed, preferences): New functions. (combo_player): New variable. (menu_settings_preferences): Implement. 2001-02-10 Kriang Lerdsuwanakij * grhino.cc (redo): Fix off-by-one error. 2001-02-09 Kriang Lerdsuwanakij * TODO: Update. * hash.cc (store_hash_board): Move definition ... * hash.h (store_hash_board): ... here. 2001-02-09 Kriang Lerdsuwanakij * hash.cc (store_hash_board): Remove mode parameter. * hash.h (store_hash_board): Likewise. (trans_board): Remove mode field. * alphabeta.cc (temp_alpha_beta): Adjust. 2001-02-09 Kriang Lerdsuwanakij * grhino.cc: Add comments. 2001-02-09 Kriang Lerdsuwanakij * alphabeta.cc (last_eval_type): New type. (last_eval): New variable. (eval_new_game): New function. (eval_midgame, eval_endgame, eval_winlossdraw): Clear hash if necessary. * alphabeta.h (eval_new_game): Declare. * grhino.cc (computer_thread): Don't clear hash. (new_game): Call eval_new_game. 2001-02-08 Kriang Lerdsuwanakij * README: Update. * TODO: Update. 2001-02-08 Kriang Lerdsuwanakij * NEWS, TODO: Update. * grhino.cc: Add comments. (game_mode_type): New type. (board_history, player_history, wait_player_history, game_play_history, game_mode_history, num_history, max_num_history): New variables. (place_piece_and_update, new_game): Record history. (cancel_computer_thread, undo, redo, menu_game_redo): New functions. (menu_game_info): Add Redo menu item. (menu_game_undo): Call undo. (init_game): Fix typo in function name. 2001-02-08 Kriang Lerdsuwanakij * grhino.cc (ai_thread_attr): New variable. (computer_move): Use it. (init_game): Initialize ai_thread_attr. 2001-02-08 Kriang Lerdsuwanakij * grhino.cc (VERSION): Remove. (VER): New variable from including "scripts/version". (menu_help_about, main): Change VERSION to VER. 2001-02-08 Kriang Lerdsuwanakij * alphabeta.cc (midgame_strategy::board_score): Remove unused code. (midgame_depth): New static variable. (set_midgame_depth): New function. (eval_midgame): Use midgame_depth. * alphabeta.h (set_midgame_depth): Declare. * grhino.cc: Add comments. (midgame_depth): New variable. (computer_thread): Reorder free_hash_all_move function call. (computer_move): Call set_midgame_depth. 2001-02-08 Kriang Lerdsuwanakij * config.h.in: Regenerated. * grhino.cc: Include , "gtstream.h". (status_widget, ai_thread, ai_lock, ai_pos, ai_timeout_id): New variables. (update_status_bar, computer_thread, computer_check): New functions. (computer_move): Reimplement using pthreads. (place_piece_and_update, new_game): Call update_status_bar. (computer_move_signal): Remove. (main): Create status bar. 2001-02-08 Kriang Lerdsuwanakij * configure.in: Add -lpthread to LIBS. 2001-02-08 Kriang Lerdsuwanakij * board.h: Add POS_INVALID. 2001-02-08 Kriang Lerdsuwanakij * config.h.bot: New file. * MANIFEST: Add config.h.bot. 2001-02-08 Kriang Lerdsuwanakij * ad.rule: Add gtstream.cc. * configure.in: Use CXXAC_LIB_NEED_USING_STD. 2001-02-08 Kriang Lerdsuwanakij * NEWS: New file. * MANIFEST: Add NEWS, acconfig.h, acinclude.m4/cxxac.m4, aclocal.m4. 2001-02-08 Kriang Lerdsuwanakij * gtstream.h: Include . Update copyright year. 2001-02-08 Kriang Lerdsuwanakij * acconfig.h: New file. 2001-02-08 Kriang Lerdsuwanakij * acinclude.m4/cxxac.m4: Import from kcd. 2001-02-07 Kriang Lerdsuwanakij * gtstream.h, gtstream.cc: Import from kcd. * MANIFEST: Add gtstream.h, gtstream.cc. 2001-02-06 Kriang Lerdsuwanakij * scripts/version: Bump version number to 0.1.0. ************************ rhino 0.0.0 released ************************ 2001-02-06 Kriang Lerdsuwanakij * scripts/makepkg-release: New file. * MANIFEST: Add scripts/makepkg-release. 2001-02-06 Kriang Lerdsuwanakij * README: Update. 2001-02-06 Kriang Lerdsuwanakij * configure.in: Remove -pg from CXXFLAGS. 2001-02-06 Kriang Lerdsuwanakij * ad.prepend, board.cc, configure.in, hash.h, iter.cc, iter.h, order.cc, order.h, test.cc, text.cc: Update copyright year. * grhino.cc (menu_help_about): Likewise. 2001-02-06 Kriang Lerdsuwanakij * MANIFEST: Add README. * makepkg: Move tar ball to package directory. 2001-02-06 Kriang Lerdsuwanakij * README: New file. * TODO: Update. * alphabeta.cc (midgame_strategy::board_score): Use mobility. (endgame_strategy::board_score): Multiply results by 1024. * grhino.cc (computer_move_signal): Don't call free_hash_move. (computer_move): Call free_hash_move and free_hash_all_move. 2001-02-05 Kriang Lerdsuwanakij * grhino.cc (draw_board): Call gdk_flush. 2001-02-05 Kriang Lerdsuwanakij * alphabeta.cc (alpha_beta): Remove. (eval_midgame): New function. * alphabeta.h (eval_midgame): Declare. (midgame_alpha_beta, endgame_alpha_beta): Remove declaration. * grhino.cc (computer_move): Use eval_midgame. 2001-02-05 Kriang Lerdsuwanakij * grhino.cc (num_empty_winlossdraw, num_empty_exact): New variables. (computer_move): Use them. Really solve for win-loss-draw. 2001-02-05 Kriang Lerdsuwanakij * alphabeta.cc: Update copyright year. (temp_alpha_beta): Fix off-by-one error. * alphabeat.h: Likewise. * board.h: Likewise. * grhino.cc: Likewise. * grhino.cc (computer_move_signal): Call free_hash_move here. (computer_move): Not here. 2001-02-05 Kriang Lerdsuwanakij * hash.cc: Update copyright year. (free_hash_move): Remove freed node count. 2001-02-05 Kriang Lerdsuwanakij * grhino.cc (computer_move): Add end game solver. (init_game): Call trans_table_init, set_max_hash_move. (new_game): Call free_hash_all_move. 2001-02-05 Kriang Lerdsuwanakij * board.h (get_num_move): New function. 2001-02-05 Kriang Lerdsuwanakij * alphabeta.cc (alpha_beta): Commented out. (endgame_strategy): Add log_position, next_strategy. Make board_score static. (midgame_strategy): New class. (temp_alpha_beta): Use temp_alpha_beta for recursion. (midgame_alpha_beta, endgame_alpha_beta): New functions. * alphabeta.h (alpha_beta): Remove declaration. (midgame_alpha_beta, endgame_alpha_beta): Declare. 2001-02-05 Kriang Lerdsuwanakij * grhino.cc (computer_move): Declare. (computer_move_signal): Call computer_move if human can't play. 2000-12-04 Kriang Lerdsuwanakij * scripts/makepkg: Rewrite in Perl. 2000-11-28 Kriang Lerdsuwanakij * MANIFEST: New file. 2000-11-28 Kriang Lerdsuwanakij * TODO: Update. * grhino.cc: Add comments. * scripts/makepkg, scripts/version: New files. 2000-11-28 Kriang Lerdsuwanakij * alphabeta.cc (endgame_strategy): New class. (temp_alpha_beta): New function. * grhino.cc (game_play, game_mode): New variables. (get_wait_player, computer_move_signal, computer_move, init_game): New functions. (place_piece_and_update): Split out from ... (button_press_signal): ... here. Call computer_move. (new_game): Set wait_player, game_play. Call computer_move. (main): Call init_game. 2000-11-15 Kriang Lerdsuwanakij * alphabeta.h: Include "board.h". (eval_endgame, eval_winlossdraw): Declare. 2000-11-15 Kriang Lerdsuwanakij * test.cc (main.cc): Remove depth variable. Use eval_endgame, eval_winlossdraw. 2000-11-11 Kriang Lerdsuwanakij * iter.h (board_dir_iterator::next_*): Check position before increment. 2000-11-11 Kriang Lerdsuwanakij * TODO: Update. * configure.in: Add -pg to CXXFLAGS. * test.cc: Test board_ffo_44_simp. Display hash info. 2000-11-10 Kriang Lerdsuwanakij * grhino.cc (menu_game_undo): Don't exit. (menu_settings_preferences): New function. (menu_settings_info): Use menu_settings_preferences. 2000-11-10 Kriang Lerdsuwanakij * grhino.cc: Include "black.xpm", "white.xpm", "empty.xpm". (black_pixmap, white_pixmap, empty_pixmap, board_widget, board_ptr, init_board_ptr, player, waite_player): New variables. (board_begin): Declare. (menu_game_new): Implement. (expose_signal, button_press_signal, new_game, draw_board): New functions. (main): Setup drawing area and board. 2000-11-10 Kriang Lerdsuwanakij * grhino.cc (menu_help_about): Mark string. (menu): Remove. (main): Remove Gtk+ code. * black.xpm, empty.xpm, white.xpm: New files. 2000-11-10 Kriang Lerdsuwanakij * grhino.cc: New file. 2000-11-10 Kriang Lerdsuwanakij * ad.prepend: Remove @INTLLIBS@. * configure.in: Use gnome-config. 2000-11-09 Kriang Lerdsuwanakij * ad.append, ad.prepend: Use autoconf version. * ad.rule: Generate Makefile.in. Add grhino target. * configure.in, config.h.in, scripts/install-sh, scripts/rpcp: New files. * test.cc: Add more test boards. 2000-10-30 Kriang Lerdsuwanakij * hash.cc: Add comments. (trans_tail_table): New variable. (free_hash_move): Use trans_tail_table. (get_hash_board): Set trans_tail_table. * hash.h: Add comments. (NUM_HASH): Change to power of 2. * test.cc (main): Set maximum hashed move to 57. * TODO: Update. 2000-10-30 Kriang Lerdsuwanakij * board.cc: Include "hash.h". (board_info::board_info()): Don't initialize board. (board_info::board_info(board_type *)): Call get_hash. (place_piece(board_info *, int, int)): Update hash. (place_piece(board_info *, int, int[10])): Likewise. * board.h (board_info): Add hash member data. * hash.cc (hash_pos_table): New variable. (trans_table_init): Initialize hash_pos_table. (get_hash): Use get_hash_piece. (get_hash_board): Don't use get_hash. Compare stored hash. * hash.h (hash_pos_table): Declare. (get_hash_piece, get_hash_flip): New inline functions. * test.cc (main): Comment out hash test. * scripts/commit: Fix grep check. 2000-10-29 Kriang Lerdsuwanakij * scripts/commit: Detect unknown file. 2000-10-29 Kriang Lerdsuwanakij * TODO: Update. * test.cc (main): Call get_hash_info. 2000-10-29 Kriang Lerdsuwanakij * hash.cc (get_temp_board, get_hash_info): New functions. (NUM_HASH_COUNT): New define. (get_hash_board): Use get_temp_board. (get_hash): Use new hash function. * hash.h (NUM_HASH): Change to 10240. (get_temp_board, get_hash_info): Declare. 2000-10-29 Kriang Lerdsuwanakij * iter.cc (empty_endgame_head): New variable. (empty_endgame_order): Convert type to array of linked-list nodes. (init_endgame_iterator): Adjust. * iter.h (empty_endgame_head): Declare. (empty_endgame_order): Adjust declaration. (empty_endgame_entry): New struct. (board_endgame_iterator): Adjust. Add remove_current, restore_current member functions. 2000-10-26 Kriang Lerdsuwanakij * alphabeta.cc (alpha_beta): Call iterator remove_current and restore_current. 2000-10-25 Kriang Lerdsuwanakij * alphabeta.cc (alpha_beta): Use new can_play, place_piece. 2000-10-25 Kriang Lerdsuwanakij * board.cc (can_play_nocheck(board_info *, int, int, int[NUM_DIR]), can_play(board_info *, int, int, int[NUM_DIR]), place_piece(board_info *, int, int, int[NUM_DIR])): New functions. * board.h (NUM_DIR): New macro. (can_play_nocheck(board_info *, int, int, int[NUM_DIR]), can_play(board_info *, int, int, int[NUM_DIR]), place_piece(board_info *, int, int, int[NUM_DIR])): Declare. (DIR_START, DIR_END): Move from ... * iter.h (DIR_START, DIR_END): ... here. 2000-10-25 Kriang Lerdsuwanakij * scripts/commit: Fix PACKAGE. * ChangeLog: Add. 2000-10-25 Kriang Lerdsuwanakij * test: Remove file. * scripts/commit, scripts/commit-template, scripts/dircheck: New files. grhino-0.16.1/proginfo.cc0000644000175000017500000000173211436423225015462 0ustar lerdsuwalerdsuwa/* proginfo.cc Program Information Copyright (c) 2002 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "proginfo.h" static bool is_use_private_files = false; void use_private_files(bool b) { is_use_private_files = b; } bool get_use_private_files() { return is_use_private_files; } grhino-0.16.1/hint_black.xpm0000644000175000017500000000356211436423225016157 0ustar lerdsuwalerdsuwa/* XPM */ static char * hint_black_xpm[] = { "40 40 6 1", " c None", ". c #000000", "+ c #3FDD18", "@ c #3AC913", "# c #25850D", "$ c #030D01", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".+++++++++++++++++@##@+++++++++++++++++.", ".+++++++++++++++++#$$#+++++++++++++++++.", ".+++++++++++++++++#$$#+++++++++++++++++.", ".+++++++++++++++++@##@+++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/hint_white.xpm0000644000175000017500000000356211436423225016223 0ustar lerdsuwalerdsuwa/* XPM */ static char * hint_white_xpm[] = { "40 40 6 1", " c None", ". c #000000", "+ c #3FDD18", "@ c #4ADD27", "# c #88E86F", "$ c #F2FCF0", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".+++++++++++++++++@##@+++++++++++++++++.", ".+++++++++++++++++#$$#+++++++++++++++++.", ".+++++++++++++++++#$$#+++++++++++++++++.", ".+++++++++++++++++@##@+++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/order.cc0000644000175000017500000000223011436423225014744 0ustar lerdsuwalerdsuwa/* order.cc Move Ordering Copyright (c) 2000, 2001 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "order.h" int endgame_order[NUM_MOVE] = { A1, A8, H1, H8, // Corners C3, C4, C5, C6, D3, E3, D6, E6, F3, F4, F5, F6, B3, B4, B5, B6, C2, D2, E2, F2, C7, D7, E7, F7, G3, G4, G5, G6, A3, A6, C1, F1, // A-squares C8, F8, H3, H6, A4, A5, D1, E1, // B-squares D8, E8, H4, H5, A2, A7, B1, G1, // C-squares B8, G8, H2, H7, B2, B7, G2, G7 // X-squares }; grhino-0.16.1/table-dat.h0000644000175000017500000000154011436423225015333 0ustar lerdsuwalerdsuwa/* Generated by gen_table. */ char bit_count_table[256] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; grhino-0.16.1/gen_book.cc0000644000175000017500000003270511436423224015425 0ustar lerdsuwalerdsuwa/* gen_book.cc Open Book Generator Copyright (c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include "book.h" #include "hash.h" #include "log_proc.h" #include "binfile.h" #include "gtstream.h" #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x //#define PRINT // Grab version number in VERSION variable #undef VERSION char * #include "scripts/version" ; const char *prog_name = "gen_book"; const char *prog_ver = VERSION; // First move excluded #define BOOK_DEPTH 15 // Book is normalized so that the first move is C4. // We don't use tree structure here since we must take care that // multiple openings can lead to the same board. struct raw_book_node; typedef std::vector raw_book_move_info; typedef std::vector raw_book_info; struct raw_book_next { int pos; int index; int count; bool used; // Only used when generating binary book raw_book_next(int pos_ = 0, int index_ = 0, int count_ = 0) : pos(pos_), index(index_), count(count_) {} }; struct raw_book_node { // This depends on raw_book_next byte_board_info board; std::vector next; int new_index; // Only used when generating binary book bool used; // Only used when generating binary book raw_book_node() {} }; void swap_raw_book_next(raw_book_next &n1, raw_book_next &n2) { int tmp; tmp = n1.pos; n1.pos = n2.pos; n2.pos = tmp; tmp = n1.index; n1.index = n2.index; n2.index = tmp; tmp = n1.count; n1.count = n2.count; n2.count = tmp; } struct book_state { raw_book_info *book; std::vector *hash[BOOK_DEPTH][NUM_HASH]; book_state() { book = new raw_book_info; // Initialize hash for (int i = 0; i < BOOK_DEPTH; ++i) for (int j = 0; j < NUM_HASH; ++j) hash[i][j] = 0; } void free_book() { // Free hash for (int i = 0; i < BOOK_DEPTH; ++i) for (int j = 0; j < NUM_HASH; ++j) { delete hash[i][j]; hash[i][j] = 0; } int depth = (*book).size(); for (int i = 0; i < depth; ++i) { int size = (*book)[i].size(); for (int j = 0; j < size; ++j) { delete (*book)[i][j]; } } delete book; } void replace_book() { free_book(); book = new raw_book_info; } ~book_state() { free_book(); } }; void init_file() { binary_file_output b(get_book_data_file()); b.write_int(0); // Book depth b.write_int(12345); // EOF Marker } void store_hash(book_state &t, raw_book_node *n, int index) { int num_move = n->board.get_num_move() -1; // -1 for C4 first move int hash_index = n->board.hash % (NUM_HASH-1); // Same hash found if (t.hash[num_move][hash_index]) { // Append t.hash[num_move][hash_index]->push_back(index); } else { // New hash t.hash[num_move][hash_index] = new std::vector; t.hash[num_move][hash_index]->push_back(index); } } int lookup_hash(book_state &t, byte_board_info *b) { int num_move = b->get_num_move() -1; // -1 for C4 first move // Hash information not required for // last move of book depth if (num_move >= BOOK_DEPTH) return 0; int hash_index = b->hash % (NUM_HASH-1); // Same hash found if (t.hash[num_move][hash_index]) { // Search for board b int num_entry = t.hash[num_move][hash_index]->size(); #ifdef PRINT std::cout << "num_entry "<< num_entry << '\n'; #endif for (int i = 0; i < num_entry; ++i) { int index = (*t.hash[num_move][hash_index])[i]; #ifdef PRINT std::cout << "Test\n" << &((*t.book)[num_move][index]->board) << '\n' << b << '\n'; #endif if ((*t.book)[num_move][index]->board == *b) return index; } } // Not found int num_board = (*t.book)[num_move].size(); // Store new opening board raw_book_node *n = new raw_book_node; n->board = *b; (*t.book)[num_move].push_back(n); #ifdef PRINT std::cout << "storing id "<< num_board << '\n' << b <<'\n'; #endif // Store hash store_hash(t, n, num_board); return num_board; } // Returns next_index int update_info(book_state &t, int prev_index, byte_board_info *b1, byte_board_info *b2, int pos) { int num_move = b1->get_num_move() -1; // -1 for C4 first move int i = prev_index; if (i < 0) // -1 = need to initialize i = lookup_hash(t, b1); int j = 0; if (num_move < BOOK_DEPTH) j = lookup_hash(t, b2); // Search all transition node int k = 0; int num_next = (*t.book)[num_move][i]->next.size(); for ( ; k < num_next; ++k) { if ((*t.book)[num_move][i]->next[k].pos == pos) { (*t.book)[num_move][i]->next[k].count++; // Sort next moves according to count int kk = k; while (kk > 0 && (*t.book)[num_move][i]->next[kk].count > (*t.book)[num_move][i]->next[kk-1].count) { swap_raw_book_next((*t.book)[num_move][i]->next[kk], (*t.book)[num_move][i]->next[kk-1]); kk--; } break; } } // Not found, add now node if (k == num_next) { (*t.book)[num_move][i]->next.push_back(raw_book_next(pos, j, 1)); } return j; } void process_game(book_state &t, game_log &game) { if (game.board.get_num_move()) // Ignore random opening board game return; // Extra +1 since a transition to next // move required if (game.num_move_queue < BOOK_DEPTH + 1 + 1) return; // Make sure board is correct if (game.board.board[D4] != WHITE) return; if (game.board.board[D5] != BLACK) return; if (game.board.board[E4] != BLACK) return; if (game.board.board[E5] != WHITE) return; byte_board_info board1(game.board); board1.place_piece(BLACK, C4); // Force first move byte_board_info board2(board1); symmetry_type sym = get_symmetry(game.move_queue[0]); int prev_index = -1; // -1 = need to initialize for (int i = 0; i < BOOK_DEPTH; ++i) { int player = game.move_queue_color[i+1]; int pos = sym[game.move_queue[i+1]]; // Need to pass if (player == game.move_queue_color[i+2]) return; if (!board2.can_play(player, pos)) throw std::runtime_error(_("invalid game moves")); board2.place_piece(player, pos); prev_index = update_info(t, prev_index, &board1, &board2, pos); board1 = board2; } } void load_file(const char * /*f*/, book_state &t) { binary_file_input b(get_book_data_file()); int file_book_depth = b.read_int(); // Trim book depth if (file_book_depth > BOOK_DEPTH) file_book_depth = BOOK_DEPTH; for (int i = 0; i < BOOK_DEPTH; ++i) { t.book->push_back(raw_book_move_info()); } for (int i = 0; i < file_book_depth; ++i) { int num_entry = b.read_int(); for (int j = 0; j < num_entry; ++j) { raw_book_node *n = new raw_book_node; b.read_board(n->board); int next_moves = b.read_int(); for (int k = 0; k < next_moves; ++k) { int pos = b.read_int(); int index = b.read_int(); int count = b.read_int(); n->next.push_back(raw_book_next(pos, index, count)); } (*t.book)[i].push_back(n); store_hash(t, n, j); } } // Check EOF Marker if (b.read_int() != 12345) { gtstream bufstr; gtout(bufstr, _("cannot open file %$\n")) << get_book_data_file(); throw std::runtime_error(bufstr.str()); } } // // Remove opening moves that are rarely used. They are either: // 1. Used less than 5 times throughout the game database. // 2. Used less than 1% compare to the most popular move. // // Idea, rarely used moves are marked with book[i][j]->used = false. // And the "index" field of book[i][j]->next[k] is adjusted and store // in "new_index" accordingly. // Rarely moves will be trimmed away in generate_file. // void trim_book(book_state &t) { int depth = t.book->size(); // Clear used flag for (int i = 0; i < depth; ++i) { int num_entry = (*t.book)[i].size(); for (int j = 0; j < num_entry; ++j) { if (i == 0) // Mark as used // We need to keep all the top // level moves since we won't // check them for move popularity // (It's always C4.) (*t.book)[i][j]->used = true; else (*t.book)[i][j]->used = false; // This is required by generate_file. int next_moves = (*t.book)[i][j]->next.size(); for (int k = 0; k < next_moves; ++k) { (*t.book)[i][j]->next[k].used = false; } } } // Check move popularity for (int i = 0; i < depth; ++i) { int num_entry = (*t.book)[i].size(); for (int j = 0; j < num_entry; ++j) { int next_moves = (*t.book)[i][j]->next.size(); // Don't emit moves rarely used while (next_moves > 0 && ((*t.book)[i][j]->next[next_moves-1].count < 5 || (*t.book)[i][j]->next[next_moves-1].count*100 < (*t.book)[i][j]->next[0].count)) next_moves--; for (int k = 0; k < next_moves; ++k) { // Mark as used (*t.book)[i][j]->next[k].used = true; // Last level's next index not valid if (i != depth-1) (*t.book)[i+1][(*t.book)[i][j]->next[k].index]->used = true; } } } // Calculate new_index for (int i = 0; i < depth; ++i) { int num_entry = (*t.book)[i].size(); int cur_new_index = 0; for (int j = 0; j < num_entry; ++j) { if ((*t.book)[i][j]->used) { (*t.book)[i][j]->new_index = cur_new_index; cur_new_index++; } } } } void generate_file(const char * /*f*/, book_state &t) { trim_book(t); binary_file_output b(get_book_file()); int depth = t.book->size(); b.write_int_compress(depth); for (int i = 0; i < depth; ++i) { int num_entry = (*t.book)[i].size(); int trim_entry = 0; for (int j = 0; j < num_entry; ++j) { if ((*t.book)[i][j]->used) { trim_entry++; } } #ifdef PRINT std::cout << "***" << i << ' ' << num_entry << '\n'; #endif b.write_int_compress(trim_entry); for (int j = 0; j < num_entry; ++j) { if ((*t.book)[i][j]->used) { int next_moves = (*t.book)[i][j]->next.size(); unsigned char trim_next_moves = 0; for (int k = 0; k < next_moves; ++k) { if ((*t.book)[i][j]->next[k].used) trim_next_moves++; } #ifdef PRINT std::cout << &((*t.book)[i][j]->board) << '\n'; std::cout << next_moves << '\n'; #endif b.write_unsigned_char(trim_next_moves); for (int k = 0; k < next_moves; ++k) { if ((*t.book)[i][j]->next[k].used) { b.write_unsigned_char( (*t.book)[i][j]->next[k].pos); // Last level's next index not valid if (i != depth-1) b.write_int_compress( (*t.book)[i+1][(*t.book)[i][j]->next[k].index]->new_index); #ifdef PRINT std::cout << '[' << (*t.book)[i][j]->next[k].pos << ' ' << (*t.book)[i][j]->next[k].index << ' ' << (*t.book)[i][j]->next[k].count << "]\n"; #endif } } } } } b.write_int(12345); // EOF Marker } void store_file(const char * /*f*/, book_state &t) { binary_file_output b(get_book_data_file()); int depth = t.book->size(); b.write_int(depth); #ifdef PRINT std::cout << "XXX\n"; #endif for (int i = 0; i < depth; ++i) { int num_entry = (*t.book)[i].size(); #ifdef PRINT std::cout << "***" << i << ' ' << num_entry << '\n'; #endif b.write_int(num_entry); for (int j = 0; j < num_entry; ++j) { b.write_board((*t.book)[i][j]->board); int next_moves = (*t.book)[i][j]->next.size(); #ifdef PRINT std::cout << &((*t.book)[i][j]->board) << '\n'; std::cout << next_moves << '\n'; #endif b.write_int(next_moves); for (int k = 0; k < next_moves; ++k) { b.write_int( (*t.book)[i][j]->next[k].pos); b.write_int( (*t.book)[i][j]->next[k].index); b.write_int( (*t.book)[i][j]->next[k].count); #ifdef PRINT std::cout << '[' << (*t.book)[i][j]->next[k].pos << ' ' << (*t.book)[i][j]->next[k].index << ' ' << (*t.book)[i][j]->next[k].count << "]\n"; #endif } } } b.write_int(12345); // EOF Marker } int main_real(int argc, char *argv[]) { use_private_files(true); if (argc == 1) { gtout(std::cout, _("%$ %$ - Open book generator\n")) << prog_name << prog_ver; std::cout << _("(c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij\n\n"); gtout(std::cout, _("Usage: %$ init|gen|FILES\n\n")) << prog_name; return 0; } else if (argc < 2) throw std::runtime_error(_("bad arguments")); book_state t; bool init_book = false; for (int i = 1; i < argc; ++i) { if (strcmp(argv[i], "init") == 0) { init_file(); init_book = false; // Force reload } else if (strcmp(argv[i], "gen") == 0) { if (init_book == false) { t.replace_book(); load_file(argv[i], t); init_book = true; } generate_file(argv[i], t); } else { if (init_book == false) { t.replace_book(); load_file(argv[i], t); init_book = true; } process_file(argv[i], t, false); store_file(argv[i], t); } } return 0; } int main(int argc, char *argv[]) { try { return main_real(argc, argv); } catch (std::exception &e) { std::cout << std::flush; gtout(std::cerr, _("%$: %$\n")) << prog_name << e.what(); } catch (const char *s) { std::cout << std::flush; gtout(std::cerr, _("%$: exception %$\n")) << prog_name << s; } catch (...) { std::cout << std::flush; gtout(std::cerr, _("%$: unknown exception\n")) << prog_name; } return 1; } grhino-0.16.1/COPYING0000644000175000017500000004307611436423223014370 0ustar lerdsuwalerdsuwa GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave, Cambridge, MA 02139, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. grhino-0.16.1/test.cc0000644000175000017500000001040511436423225014613 0ustar lerdsuwalerdsuwa/* test.cc Copyright (c) 2000, 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "boardio.h" #include "hash.h" #include "alphabeta.h" #include "iter.h" // Grab version number in VERSION variable #undef VERSION char * #include "scripts/version" ; const char *prog_name = "GRhino"; const char *prog_ver = VERSION; byte_board_type board_test = { 0, 1,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, -1, 1,-1,-1,-1, 1,-1,-1, -1, 1,-1,-1, 1,-1,-1,-1, -1, 1,-1, 1,-1,-1,-1,-1, 0, 1, 1,-1,-1,-1,-1,-1, 0, 1,-1,-1,-1,-1,-1,-1, 0, 0,-1,-1,-1,-1,-1,-1, }; // black to move // h5, h6, p, g7, g6, h7, h8, g8 byte_board_type board_test2 = { -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1, 1, -1,-1,-1,-1,-1,-1,-1,-1, -1, 1,-1, 1,-1,-1,-1,-1, -1, 1, 1,-1,-1,-1,-1, 0, -1, 1, 1,-1, 1, 1, 0, 0, -1,-1, 1, 1, 1, 1, 0, 0, 1,-1, 1, 1, 1, 1, 0, 0, }; // black to move // h5, h6, p, g7, g6, h7, h8, g8 byte_board_type board_test3 = { -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1, 1, 1, 0, 0, 0, 0,-1, 0, 0, 0, 0, 0, 0, }; // FFO testsuite #40 (Turner vs Monnom, Bruxelles 1997) // black to move // a2 b1 c1 -- b6 c7 a7 b7 b8 d7 f8 c6 f7 g7, +38 byte_board_type board_ffo_40 = { -1, 0, 0,-1,-1,-1,-1, 1, 0,-1,-1,-1,-1,-1,-1, 1, -1,-1, 1, 1,-1,-1,-1, 1, -1,-1, 1,-1,-1,-1, 1, 1, -1,-1,-1,-1,-1,-1, 1, 1, 0, 0, 0,-1,-1,-1,-1, 1, 0, 0, 0, 0,-1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, }; // FFO testsuite #44 (Shaman vs Tastet, WC 1995) // white to move // d2 g5 b8 (or b8 g5 d2) a3 b7 a8 a7 c8 g7 g8 h6 h5 g6 f1 d1 h1, -14 byte_board_type board_ffo_44 = { 0, 0,-1, 0, 1, 0,-1, 0, 0, 0,-1, 0, 1,-1, 0,-1, 0,-1,-1, 1, 1, 1,-1,-1, -1,-1,-1,-1, 1, 1, 1,-1, -1,-1,-1,-1, 1, 1, 0, 0, 1, 1,-1,-1, 1,-1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, }; // Simplified FFO testsuite #40 (Turner vs Monnom, Bruxelles 1997) // black to move // a7 b7 b8 d7 f8 c6 f7 g7, +38 byte_board_type board_ffo_40_simp = { -1,-1, 1, 1, 1, 1, 1, 1, 1,-1, 1, 1, 1, 1, 1, 1, -1,-1, 1,-1, 1,-1,-1, 1, -1,-1, 1, 1,-1,-1, 1, 1, -1,-1, 1,-1,-1,-1, 1, 1, 0,-1, 0,-1,-1,-1,-1, 1, 0, 0,-1, 0,-1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, }; // Simplified FFO testsuite #44 (Shaman vs Tastet, WC 1995) // white to move // a7 c8 g7 g8 h6 h5 g6 f1 d1 h1, -14 byte_board_type board_ffo_44_simp = { 0, 0,-1, 0, 1, 0,-1, 0, 0, 0,-1,-1,-1,-1, 0,-1, 1, 1, 1, 1, 1, 1,-1,-1, 1, 1,-1,-1, 1, 1, 1,-1, 1,-1, 1, 1, 1, 1, 1, 0, 1,-1, 1, 1, 1, 1, 0, 0, 0, 1,-1, 1, 1, 1, 0, 0, 1,-1, 0, 1, 1, 1, 0, 0, }; int main() { trans_table_init(); /* byte_board_info bb(&board_test2); int color = BLACK;*/ byte_board_info bb(&board_test3); int color = BLACK; /* byte_board_info bb(&board_ffo_40); int color = BLACK;*/ /* byte_board_info bb(&board_ffo_44); int color = WHITE;*/ /* byte_board_info bb(&board_ffo_40_simp); int color = BLACK;*/ /* byte_board_info bb(&board_ffo_44_simp); int color = WHITE;*/ int p, x; std::cout << &bb; set_max_hash_move(57); for ( ; ; ) { // x = eval_winlossdraw(&bb, color, &p); //free_hash_all_move(); x = eval_endgame(&bb, color, &p); std::cout << " Score:" << x << " Move:"; if (p != POS_PASS) print_pos(std::cout, p); else std::cout << "PASS"; std::cout << ' ' << hash_hit << ':' << hash_miss << '\n'; if (p != POS_PASS) bb.place_piece(color, p); std::cout << &bb; if (!bb.can_play()) break; color = switch_color(color); } for (int i = 44; i < 60; ++i) get_hash_info(i); } grhino-0.16.1/help/0000755000175000017500000000000011436423224014254 5ustar lerdsuwalerdsuwagrhino-0.16.1/help/C/0000755000175000017500000000000011436423225014437 5ustar lerdsuwalerdsuwagrhino-0.16.1/help/C/grhino.xml0000644000175000017500000011344711436423225016461 0ustar lerdsuwalerdsuwa GRhino"> ]>
&app; Manual V&manrevision; 2004 2005 2006 Kriang Lerdsuwanakij &legal; Kriang Lerdsuwanakij
lerdsuwa@users.sourceforge.net
This manual describes how to use &app; &appversion;. Feedback To report a bug or make a suggestion regarding the &app; or this manual, please use the &app; bug tracker at the &app; web page.
GRhino Using Introduction &app;, or Rhino its former name, is a reversi game. What distinguishes &app; from most other reversi games is that &app; will be targeted for experienced reversi players. Strong AI is the main focus with some additional good, useful features is planned. The ultimate target strength of the AI is that it should be able to beat the best human player at the highest difficulty level. Getting Started You can start &app; from a command line by typing the following command, then press Return: grhino When you start &app;, a window similar to the following is displayed. This figure shows the window using small theme, with board border and toolbar turned on. The actual display varies depending on Preferences settings.
&app; Start Up Window Shows &app; main window. Contains title bar, menubar, board border, game board, and statusbar.
The &app; window contains the following elements: Menubar. The menus on the menubar contain all of the commands you can use in &app;. Toolbar. The toolbar contains a subset of the commands that you can access from the menubar. This can be turned on and off via the View Toolbar menu. You can right click on the empty area of the toolbar to select if text and icons of the buttons are displayed. Furthermore, the size of icons on the toolbar can be chosen in the Preferences dialog box opened by Settings Preferences menu. The relevant setting is the Toolbar icon size configuration in the Theme tab. Board Border. This can be turned on and off using Show board border setting in the Theme tab in the Preferences dialog. Game Board. This is the place where the game is played. Simply clicked on a square to place your move. In certain game mode, such as in backward or forward through the game history, the mouse cursor changes from arrow to other symbols when you move the mouse over game board and border. You need to exit that mode first to continue playing. The board graphics may be changed via the Theme directory setting in the Theme preferences tab. &app; comes with a default board and another board using small graphics. Statusbar. The information here varies depending on the game status. When the game is in progress, the current player shown. When the game ends, the scores are displayed. Throughout this manual, various actions are described using commands from the menubar. You can simply click on the corresponding button in the toolbar to achieve the same result.
Playing GRhino This section describes game playing with &app;. The rules of reversi are not provided here but you can find those kinds of information from the Internet. Strategy guide to help beating &app; can be found at Links section of GRhino web page. Basics To start a new game, choose Game New game menu command. By default, the game starts from the beginning. You may choose to start from any opening by setting Opening option in the Board tab of Preferences dialog box. This is a good way to learn different reversi openings. The name of the opening, when matches the current board position, is displayed inside a pair of bracket "[...]" in the statusbar. To choose the computer player, use the Computer player option in the AI tab of Preferences dialog box. You can quickly change the computer color between black and white using Settings Switch computer color menu. After the game has been started, click on the board square to place a move. If the move is valid, a disc appears and captured pieces are flipped. AI's move is placed immediately without user involvement. Similar applies when a player has to pass, the other player just makes consecutive moves. At higher AI level, AI may take a long time before placing a move. You can see whose turn it is by looking at the statusbar at the bottom of the window. When the game ends, the final score is displayed on the statusbar. You can start another game by via Game New game menu. During the game, you may undo your move using Edit Undo move menu. If you decide to repeat the previous move, the Edit Redo move menu is available. The number of times you can undo is unlimited. Depending on the Redo also repeat same AI moves setting in the Board tab in the Preferences dialog, the AI may choose a different move from the previously made one before undo. Game History You may look at different stages of the current game by using the following menu commands: Edit Previous move View board position of the previous move regardless of whether the player is human or computer. Repeatly use this command to go backward through the game history. Edit Next move View board position of the next move regardless of whether the player is human or computer. Repeatly use this command to go forward through the game history. Edit Begin of game Jump to the initial board position of the game. Edit Last move Jump to the last board position of the game. This allows the game to continue. Although these commands are similar to undo and redo, they do not affect the current game. You can go backward and forward as many time as you want. When you want to continue the current game, simply use the Edit Last move command to show the last board position. The mouse cursor, when move on the game board, shows "X" symbol instead of the usual arrow as a reminder when the board does not show the last position. Another convenient way to navigate through game history is via the Game History window. It can be opened via View Game history... menu.
Game History Window Shows Game History window.
Three columns are displayed in the window: move number, player, and position. Click on any row to display board position as the result of that move. Pressing Up, Down, Page Up, Page Down, Home, and End there also works.
Saved Games Currently GRhino supports IOS and GGS game formats. Game files can be opened using the menu Game Open . If the game file contains one game, the game is displayed on the board immediatly. Then you can use various commands in the Edit menu to navigate through the game. If multiple games exist in the file, the Game List window opens. Click on a row to bring the game to the board.
Game List Window Shows Game List window.
Five columns are displayed: game number, black player name, white player name, game type, and result of the game. In the Type column, Std indicates standard game, i.e., game starts from initial position, while Rand indicates random game with the specified number of pieces on the board. The format of the Result column varies depending on the file format. You can sort the games by clicking on any column header. By default, games are sorted in the order that appear in the file.
Editing board You can start a game from arbitrary board position by using Edit board feature. It can be accessed from the menu Game Edit board . This feature only works when Toolbar is displayed. If not, select the menu View Toolbar to activate the toolbar. When inside editing mode, an additional toolbar appears as seen in the below figure.
Game Window Game window showing edit toolbar.
The first three buttons select the color to place on the board: empty, black, and white. You can place them on the board by clicking on the desired position. You can place a rectangular block by dragging on the board similar to drawing a rectangle in a paint program. The fourth button select the player who will have the first move when the game begins. The last button accept the edit and start game from the current board. Mouse shortcuts are provided in this mode. Right clicking cycles through the three colors: empty, black, and white. Middle clicking alternate the player to start game.
AI Implementation The current &app; AI is based on open book, pattern and parity-based evaluator, and final disk count. The choice depends on the stage of the game. All parameters related to AI can be found in the AI tab of the Preferences dialog. During begining of the game, an open book is used. The chosen move is based on move popularity of IOS and GGS game database. It is controlled by the parameter Open book variation. There are 6 possible values: None, Very low, Low, Medium, High, and Very high. &app; always uses the same opening with the None option while more choices of moves are made with higher settings. During mid game, a pattern-based evaluator is used. The pattern was trained from IOS and GGS games using win-loss percentage as a score. There is also score adjustment based on parity situation on the board. The difficulty depends on the search depth. The deeper search, the stronger the AI. &app; also relies on searching during end game. But disk count score is used instead. The setting Winning move search empties determines when to look for a move that guarantee a win for computer and places moves based on the search result. This is also known as win-loss-draw search. On the other hand, Perfect end game search empties controls when to search for a move that maximize computer's score. Searching earlier in the game when there are plenty of empty squares (or simply empties) produces better AI play. Usually winning play search is a lot faster than perfect search, so Winning move search empties can be set a few empties higher than Perfect end game search empties. When Winning move search empties is set to less than Perfect end game search empties, winning move search is disabled altogether. There are 5 default levels of difficulty available during mid to end game where AI parameters are fixed. They are set according to the table below. The AI parameters can be changed freely in the custom level. AI Default Parameters Setting Level 1 2 3 4 5 Mid game search depth 2 4 6 8 10 Winning move search empties 6 8 12 16 20 Perfect end game search empties 4 6 10 14 18
Currently, a search tree pruning is not yet implemented. So playing AI level 5 is not practical.
Pattern Evaluation Window You can view the score of current board position without move look ahead from the Pattern Evaluation window. This can be opened via View Pattern evaluation... menu. The score used during mid game is the Total score but from searching all possible future moves up to the specified mid game search depth. Although it is intended for AI development and debugging, this provides an idea of what AI thinks about the current board position. These information, however, is AI implementation dependent and may change in future version of &app;.
Pattern Evaluation Window Shows Pattern Evaluation window.
The main part of window is a table listing all different patterns used by &app; and its score. They are simply summed together and added with Parity score to produce the Total score for AI. Positive score means black has an advantage while negative score favors white. Parity score is the AI idea of current parity situation. This is very important toward the end of the game as the player who can play the last move of any hole can flip a lot of pieces that are never flipped back again. Move index represents just the stage of the game. The AI uses different pattern tables at different game stages.
Settings To configure &app;, choose Settings Preferences . The Preferences dialog contains the following tabbed sections: Note that the changed settings only last until you exit from &app;. To make them apply to all future sessions, use the Settings Save settings menu. In UNIX systems, the configurations is stored in the file ~/.gnome2/GRhino. AI
Preferences Dialog - AI Tab Shows &app; AI tab of Preferences window.
Computer player Select the color of the AI player. You can have AI playing against itself by setting this to Both. The AI player can be changed automatically in each new game when it is set to Alternate or Random. Computer level This setting provides an easy control for various other AI options below to a predefined value. Due to some flaws in the current AI, the AI strength appears to peak at some point and does not increase with the level settings is higher. Mid game search depth This controls the number of lookahead move the AI search is performed during the mid game stage. During this stage, the AI evaluates the position using pattern and parity score. It can be configured only when the option Computer level is set as Custom. Winning move search empties This controls when to use winning move search instead of mid game search. This search is started if the number of empty squares on the board reach the specified number. The AI tries to find a move that always results in a win for AI and terminates the search if one is found. It can be configured only when the option Computer level is Custom. Perfect end game search empties This controls when to use perfect end game search. The AI evaluates the board using final disk counts as search criterion. It can be configured only when the option Computer level is Custom. Randomness It adds the amount of randomness to board scores during mid game and end game search. Open book variation It effects AI during opening stage of the game. The open book is based on move popularity. With None, the AI plays the same opening every game, with the most popular moves always chosen. For higher settings, the choice of openings becomes more varied. But the strength of AI is weaken if the setting is too high.
Board
Preferences Dialog - Board Tab Shows &app; Board tab of Preferences window.
Log game moves If checked, all games played are logged into the file ~/grhino.log. It is a GGS format and can be opened by Game Open menu, processed by gen_book and gen_pattern programs. Redo also repeat same AI moves If checked, when using redo command AI always makes the same moves as the original game sequence. Setting this option on has an advantage that game may be undo several times and then redo as many times to get back to the last board position. Otherwise AI may choose to try an alternative position thus making further redo impossible. Animate opening This controls whether the game should animate the opening moves for the selected Opening option below. Animation delay This controls how much delay before computer makes a move, the larger number the longer delay. The unit is 0.1 second. This is useful when Animate opening is selected. Start game from This selects the board when you start a new game. Initial board starts the game with the standard four disc in the center of the board. Random board starts the game with pieces randomly placed, beginning from center of the board, with equal number of pieces for black and white. When playing with computer, AI open book is disabled with Random board. Opening This allows you to play games beginning from a particular opening instead of the default &app; open book. The openings are taken from Robert Gatliff opening list July 15, 1995 version. This option only applies when Start game from is Initial board. Random game pieces This chooses the number pieces on the board when Start game from is Random board.
Theme
Preferences Dialog - Theme Tab Shows &app; Theme tab of Preferences window.
Show possible moves When selected, all possible move is shown as small dots on the game board. Show last move When selected, the disk placed in the previous move is shown together with a small cross. Show board border When selected, graphics for board borders are also shown. The actual content depends on the theme chosen. For themes coming with &app;, labels indicating board position are displayed. Theme directory This chooses the set of board graphics used by &app;. The DEFAULT option selects the images compiled into &app; binary. Other choices correspond to image files stored in the specified subdirectory inside the &app; theme directory. By default this is /usr/local/share/grhino-0.16.1/theme. New themes may be added by creating image files named black, white, empty, hint_black, hint_white, black_last, white_last, left, right, top, and bottom with either .png or .xpm extension and placing them inside a new subdirectory of theme. Toolbar icon size This control the size of icons in the toolbar when it is visible.
About &app; &app; was written by Kriang Lerdsuwanakij (lerdsuwa@users.sourceforge.net). To find more information about &app;, please visit the GRhino Web page. To report a bug or make a suggestion regarding the &app; or this manual, please use the &app; bug tracker at the &app; web page. This program is distributed under the terms of the GNU General Public license as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of this license can be found at this link, or in the file COPYING included with the source code of this program.
grhino-0.16.1/help/C/grhino-C.omf.in0000644000175000017500000000173211436423225017220 0ustar lerdsuwalerdsuwa lerdsuwa@users.sourceforge.net (Kriang Lerdsuwanakij) lerdsuwa@users.sourceforge.net (Kriang Lerdsuwanakij) GRhino Manual 2010-08-29 User manual for GRhino reversi game user's guide grhino-0.16.1/help/C/legal.xml0000644000175000017500000000713011436423225016246 0ustar lerdsuwalerdsuwa Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. grhino-0.16.1/help/C/figures/0000755000175000017500000000000011436423225016103 5ustar lerdsuwalerdsuwagrhino-0.16.1/help/C/figures/toolbar-edit.png0000644000175000017500000004370211436423225021204 0ustar lerdsuwalerdsuwaPNG  IHDR-̯ IDATxw|ϥI`A[ (SD\?Pj d*D@,KCe +MGMn:-~߼ M{Q1OֆcGv=תL\BbtoPƣ(KnDFDz%M)]8@Jlm|=D?pChۺ%m\un˱c(Zjp?owOr%qЂߖq2OWd9^؎]N܍TT&cҟLsr˘׌&~e*/'妜6L7ѻOte<˛N B\Mgptg&28Gy̴֬֬daٖ6@1ڣD9PAGn$+ :7H UQ r//#ƓH='`֐$^.RN(Yb'ƣbDhhlpptBjö0UC/Nqt)!IjR5I[f 99f:G)IRb,(6(#:4rAUUS1;k]t7 M%1\`gp^Րx`rՅ(=hS F~ggPo ;y[hlv.H=|K%:* <w^O_ Ӌ*8cOCj8g0jH> !MvqΨ!J}r^A$}4NU}4GMV:eܯ zy& ^_."HqF#)]~(GnbBn-vR^Kw=}LԨנj{hSA=h4MCXZBEpuMt 9"Ba'B)? 4h#m!D>IOaFΝ@6o&-ܺu;5|Ξ;ϙ3g=j8pp>|ȶ_^9q⟄ ׮nOİw~nkrtewe[UU:+ϝ@\\\ׯ\LSUvU +?')Miy4m_~5yPl=һ@J>7yޛgΜ%44^6\x1OL}ZTU%..]{qt}Rv1gYD]xe,?JwAYnj3^Kk`Y{ƼV`'Yl>38|j\~SV *[߯6SdJ*rV/\^x{f>ŋ7qf\\]hӺ&ߗSFIo:4y갰pzǷ- ߙErJO|E'yh޽O+W1w,U(/ɪSbETUe 湦ӮCUU  aIJZ@9p+WUtؕ*r߼8b4M@>ػ/_'w Md${RHh(CGUU^y5bccyw4)1sZ@ɒ]Z/4y&mUU;;'=%<ߨѯ亞zTb~ݽ|<%Kdeb^Ǡ`ČPNh߆I⹦3r˼8f!mwyּdDEz-ew?MF-ջ?Gz$O}4NA盧{f4jԐ^9/ g-?u |Ι3gf~_-mڴb豜>sV|GǎT?p0K>oތ;?mavY9G8|o17BC2t8-[>*.6{Su]lll2x~t ܹ j **reSOw~6ld;z=ċaGij^Fm8 93tr6>.#Guvƿ 7IoLHH(Ѧu+]ŋrτ{o,\?e% dΜs)m߾+Wzܻ?N)..=޽{{{  UgfƓٳyk][SJJJBQd҅<:رGGTED$wgރFa)RUT𑣬`VG>OϲDDDO b VIn(3*2RtiڶikQ:6rj|yB¸y`qN>ճGeZDDFҾ][:o$7?&C3]%ϝ@*U$>Z<ԱC4mé]&SCٲessԮN9)RE*UT&00({Ɠy Yxq^|q۶HUL?D)+_]I5]hhok SߛBHh(K.cI\|>W˷TVjڨDEE @ppEj$O:w'Ü2oBnܸwX2_ر~Ki簵e׮=Ѳ:wشi3F[nӭ[t7v @]=< o[<-[[[<ȟΝ:ȧ>cA~6͛RmN:p6mV},[=+UݽD׮mklmx.\HpO?CNS-,ٳ;ǏO+Ws->%!9r#;%oQce9&%1c8z87ӽ[W2 hr|2ċa͚4mޒMZ|̙ ݻukhB:tʚ_Ѫ \ q\K,OfY mw}vR뜖Зh֢LF\_}9Rl߾|?Ν;1{8K](Nc xe:]ʕ.;#..-[аA4 m۶Sٸa-ECxz3Tcgf)濿nR2 |oBv_TXNǐhִ ͚|ŪZE i-瀞+11TRFҠA}V6oMNw'Ǩ[iFSUE֜ƛwbn5{{{tk3^OHH0/7颣cpttȴCӚbcc9Qe:1$,2;VUU a@ 5kghִ t֖wĉ {q.!!!NFy,ikc s3o׋*oj666ց(J}at111TZu7BYc%l)uAAWASF, ֤( e˔ᗟW*~y> 3Ne=v!?Lo&.,;F<\']+]cǎzհDB;Jau2r48yB !,>dB}4u4{<5B_oLeRKO}9>3x6b_LTʢ&ۅNB%@ 4B>"\xp"5IH3t1_":?rl!DunbqС%6oI*E A?ƒxאপ*[`wx*ΝsT'a6?Kz湜{7SU߰a'N/,zNHHh46ڸ^o=nw/:1Cfhrg\4E]j%oE'1JFIF5qgF4FFu; b0=7hЀcggWo%`[|L;%ǽ/XiZ|||lپk} d}sݘd--[eֿ-\C Rܸq#;l*Tf1r#iIF1G~ACXy7t~lILLSTW࿚[9s`kTo`[2e\5F3a(6Plfo6WSU 6QZu+{Zb$+V`{f c͏XK|Ŭ/c]3j*^ԋK]^履Q\ǐѨ*u4h9*JTUn>|p{p?ڹvFG3e4ƍcԮ]0f͚Eٲe9~8&MO?aҬ3*y$ [ѠH[{[_@ڕyFdd$-Add$\cCn;wjV!::j+ѳk'OZ=1mjU+3TZ?A 7n:!893sTR?AyZ\ͻq?u5?ՑkGyot C3^n^ά7'dڔη6tPşqC1L7~qMlm,j:,Ͻܻlqb+n4c9<4>AJh̵qfO9AMMŊy!, IDAT^-[2x`ٿyzR?/byl{+*W>w!~q2cdJ;ӺmwvMSl^?ZUcƬE&խ(,O_NUU9w":vɓp;mՑE?}Wl;e6:{<=bk#!!~Z3&Wˈ~ȝ;xzOϲ٢rlTUeԬ]gHN,_Wtoyu MqyZwVˏ?޽Yz+SFtgL{ O?cTU%))>}p-^̐>]X6#r\݊p BCÈUQ5wA}:Wq(T(Bv4P Pou1%gASFKΝSN,]6mD޽ٰaDeժUвmsgTGp/7لd <<<=.Yf.^Fhݶ~yNgMBW݅":t•+WصW:wZ_0D~8}'ZKfcccCbb"sEV2{|cs?S?۷y= 9sf|n+uc[:'|#s]6o3\2=h4cs)zϜ:swc1e4-Y>br鯫;Ds5c{:-'DH$(>L:v <8I<+':'!؈mq 1-Ö-[ضm4lؐsҸqc^J޽ٴiXQ:LO6?^ y ڷŋٻw/vv4~h.]Β9X~QfNir\/oe\ҭKO>l$u޼;{vݻ7qSU^\cʵ̚eyݻ /30Eu1rפiѢ9Ύv&O523nW䩬+ D-}6cO=%vǔ)1ګGrF&8v$C_dKZ3`>x{=Xf9sł{l_%>>.WAڢ@й[;$5AE5d?LG;uѣX"~z/^W\fh2^ۓ fj/$4,6R`$EmM$m,d401$:`ۚY}zE[j7>رc9svq2o|ؗ=&w?dn'ӷo_mG)))+Wh*>=.cWZ/d>ʕ+94%ٳ;ey睷YƟ^Y:a?T#ӳ,E!'*+c7[_СC,9C{3n`٢Y C鴼DGڞ|z^w&ywfҥ34iQnf9:H3;4í-εt8=å-nMm)Z:kjӹ7w|RmQͯ[b%kn&EEEQJ,XW^n[;Ҥ@yMV/c W"r gϞi6[dѨ.ug&M4iBKٽ':ۿӡo___^̘36g ztUV<d X2x.]! ܟac^cWgú2szӗqy嵷ܼy3ؠpvvbռ4߮ `WWf,co|?gMED,̀xEJn2dƂռ9?Hr+-o9S'C|bSFtw/L%Kfhr9^2Rr;GP *A+c9.G[qat'K#=u/=3m,6_5ׯ3{l6mD߾}ٸq#׮]⻨[FxwCNڵ|jv"/E>dmSpl7hmso2sMJǍftޝCV[/:/OG|||e -}60~hBoW0`cd #8&&?siwk3ѻ_i4ƛkWfÚ hѢ9( 6Vob|>ۗ߬)ꮓ\jY&N h[)sOiLk j=w5Ylګ:|v+L̷˖Y2eJ[tXhR>,uZOI1&BD1Q:ly slwmi^.>[SO?eΝ???z/ ;-絗оpN:9H i~ s 4z"`ko;~h(Ljת;hݺ5.aߴsy{d> %KUFAqԨ^/b:*Ng-֖&ѣҦ/曯j(_=~OPUvX>?_'Izi [&m9{Тeߢd V\I~ذa}͍+VPzu|||q| ua\j F>76qzw1N˔٤Np}vU.LJ3w 40gDn,(8;;a4K䷕ׇvcr{}Ss6 5Dbo{\O>?\Żzg֭b)QQQ-R$e(@刎b`Ls&jӳG7ZmǶa&WiժuV> >c.޽{q?[6a<:6<{`*hH4x=S>}A/y9}_qF|||09J75AAέ%g6.]byL|maAt֎UJS+N.O^^(7ehтWǽr;kEmY}ٿ}bQUEQ+S69VZňAjoGch*T>Q_fjժ3}jxSfu|?NRl|Y/&P|ZpuqAM2VH{Xغ0?\ { smUvyF̢a"6hF2-.TQJtXUʽ=o%kaw6/+[r\~3dϟW^ԩS0|p͛GW?'E܌ڵ M˗>>>-_gF_ٶo X~c1tP&N;1L:nѨaGFFNq c v_6,댰mh"ȖQTnnEjښAiWfϹaQ'! d4BRfަ BX&)3uBVtX:+@cN'I+..ORb a T\)WO:6hF%SDeRUU  꽏?ujT6hܾ}3g/2p \] _гGWO^qp+Ţ# Nvp/neŢSYܻ̽fya19wO>Y[*:&3g/2rԨT;3@R+oٚu̍he=6囎"eݻ8ggM4F#NueێLəs8u0+ms)%GGGƌexxxPb n_LӪܕĄC:5)YCiT, 4mbXKfjҤ!ujrNP\ ˱TzuXt&!!!;zʕ+=֦CzuX˚,KCg^jѵ D܏F3 !Ki899uUSƢN~Ȯ_7\ :e;m2 Iw!wQ|4ё=xB._L||c8q~үo^kUxQZmF y^/Ms ӣ3yf=E 9y47͍hڴnנy\B58t蒩3mYʗg`׃$ hi -*,>3T^{,CWV EQhܸ!7rJQZ|-ZZ=:c&M2EfѵN% sq2 prrb萁-NNdʦT0 smR;;;,;@w{B+z !2T2OzB@ Bz2Y uQl\쓮OLMftB Mq(Ԃod?IDʳwj%7ҽa)Ԗ ¸c<)/G剧\/: 4B@#: 4B@#: 4B@#: 4B@#: 4B@#: 4B@#: 4B@#: 4B@# G؋!Q'!etOAFUtr}Nl[kQ?sTW ZG8^Nש}(퀢{ 6^1Rl<]j%z]}էSBqfQyFΏO̟I^>'Y^ [wOɀK}.ȤTͮłM+LJ1&qTc,D&}42v ]: v qD;}VO8(Da"M:{!~L+Da!Mj2fژwdZ! h2`8봆8ˣnN&I:}ɴBd:mVvi(,$/IP㳝.ANWn##NG(Da"MnއNއ%v: ZLuv*S]p`s(xR$Ʉ!4{ ?+3̑#&P"&ٌx:ɵNYp+GbwȡekND&<ogGđT:makQJJuʆ^MXnΗ4v QtBX,SE$BX,EhV'!NΣB~c QXy41~{ b! @~c QHM{XF2 =d41~{ b! h2cB6d 1(l$@~c QHF7 &=o~A,Da#M&{XDuB~c QXȵN1~{ b! BX,SE.BX,EhV'!N2!IF#:hV'$BXd4BFau!N2!IF#:hV'$BXd4BFau2fW0O3Xau2fW OBXuBXd4BFau!N2!IF#:hV'$BXd4BFau!N2!IF#:hV'd`)`'*2fd`)@'.G#:9$:hV'$BXd4BFau!N2!IF#:hV'$BXd4BFau!N2!ɘR^,OugOr9s5˗ i899&7UU9{/I]̯[;冢(|0CF㓮Q(xxSje"##ӽ*d75}v08>OtAAUUk?$TJ5BڶLy<ʰO$66wN#((_a#R-s͹~kLK]X:ČPhqIDATNh߆n%K1xTWUUsRTO?UtܝrjZ@]ٿyd3ikԨ3gg.D~(ݻM6o3?`{ J7]pH/Ècޟ:s>̙<|^TR ӦM+FKPPP2f͞|ut:-5_{o,\?e% dΜ3lny}x<<<#<<ܜiJppIIIƱifBBB8qyr1nW_qㆼ>-ӭ``ݴ|T78$\S}E1!.6͛?~iӊrY~X;v`Sq=8$ZЂ_i.D`899a0 XѢDDDPDT9::iެ)R(AHh(7nՕ}>a܏~l Hb*BRR'K.aLL͔ˡh(S4ZUTUEQ2磙xxs ,^@u8t(gϞtRխ[yHJRd׫jޔb?$>Jɒ ߏ-`ڴү__n[/S4*U#_k(|jתiI}&Nz_mN5+Νw\~eS޾CJSo9 k׮%`+aaDF>hѢvN;0ۋI&,<ڵj2e;)S&þdk4<.>]҃(Z-:6ݼeMŶXaј+6jz #{sb %E{za0::];"##cbqZ,t<ؘjv+P*Ӌ(X^^Xy4ݸ\ FcAqKCcS3^ K8ʱ\.ȱ]77o~u؄l M i p&46yrXV+pd2AG_o n$@݅z4lDJrG<ϣV=>LVoJ 2Ľ)x1ܿ󉦸g`FBn jjvjګM*GnnǥT 1H\97'pWJ 833?Nfaj҈IㆷENfI'8zWv=VODEq AWQ14<. >X7W<feeŝ؀1Pz 78. eqqY`q@_ t׉10T> :sM? EǬL& YqSR\Áw?81a38~DQDgW._x]%d;O$p^ޑ+?:l6֜ݱqW@?:1oFvYhe&ф,4v2'`x2"8B D1BSFz["h։`W }{Bf1#!dKC}XtIENDB`grhino-0.16.1/help/C/figures/mainwindow.xcf0000644000175000017500000022353411436423225020772 0ustar lerdsuwalerdsuwagimp xcf file,BB/ gimp-commentCreated with The GIMPS gimp-commentCreated with The GIMPgimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)   07Menubar     Dgimp-text-layer(text "Menubar") (font "Sans") (font-size 14.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) 774<i4444>4:444"P44y4444+׈ȗ44fe$N(>4440Y' !q44M}4/r 4444 :Xê44`4-:41?4+^GI44&s 4Ŝ oH44+{X 7 444@44\4a;84< Statusbar     @  gimp-text-layer(text "Statusbar") (font "Sans") (font-size 14.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) <<Pa444n 1z444B"P44i%4"P4l7ȗ744A 4+׈ȗ44`4' !q444u40Y' !q44Xê444k:4 :Xê4>4GI41?=4+^GI4<++)X 7 +)2 s4+{X 7 42Ja;8J\fI4a;84M Game board     /  gimp-text-layer(text "Game board") (font "Sans") (font-size 14.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) lM M @@@0t46N 5ƈ4Q"P4Z{[4"Pȗ4|4+׈'Ӌȗ0' !q4"76$40Y.W' !q::Xê4 44/>4 :0 8Xêؘ_GI444-4+^'UGIW| HX 7 444Ŝ o4+{¯!ΑX 7Sva;8444@4 a;>4 444$4+]40 84,V 4'842&R Board border     *Q "gimp-text-layer(text "Board border") (font "Sans") (font-size 14.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) RR@@@4444 444<"P4444'Ӌȗ4$4+׈'Ӌ44.W' !q4+]40Y.W44'0 8Xê40 84 :0 8404:'UGI4,V4+^'U44  ¯!ΑX 7 4'4+{¯!Α44 a;844 4222J4 4 4$4+]$4 8/>4,V-4'Ŝ o4@4G)0Toolbar     L: gimp-text-layer(text "Toolbar") (font "Sans") (font-size 14.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) 0000044744444"P44Ի'Ӌ'Ӌ44+׈ȗ44.W.W440Y' !q440 80 844 :Xê44'U'U44+^GI44¯!Α¯!Α44+{X 7 44  44a;84, New Layer#1     ,dp|, ,<Z*HXhx&DT x77 @999~==  4 4  ### 77 66  (((               88   5 5 5    dK2%, New Layer     6,V'8'D'P,,9EQ%XXYmzFV9 dJώ.eY-=!|"''(J5 ؅3 ؂wallft$ j{Оeo$ }}hIJ}$} zzfWz$z wwcWw$w uuaVu$u rr_ܣUr$r oo\סRo$o mm[ҞQm$m jjX̝Qj$j hhWMh$h eeTGg`\\WTSRBEe$e b3b `3` ]]::ZZ0 SS/ UU. XX. [[. ^^. aa. dd Μ gg[+,k jjb  mm?,}T(0(.H 9 pp  اUp ]s!a  rrՙڱ!Kk uu0!2,rZ xx{v94 {{ސ|̈́y0% ~~ߒ$"5#5[?w h ؁  ؄. ؇  ؊. ؍. ؐ. ؒ. ؕѣ/ ؘ0 ؛% ؞uuѣ$ ءuuѣ$ ؤuuѣ$ اuuѣ$ تuuѣ?0/??>? حuuѣ?NqB?0/?>/$9>? ذuuѣ?L@0/>$ 9? ذuuѣ?N0/;#? ذuuѣ?T0/:?ذuuѣ?~J0/< '? ذuuѣ?F|?0/>,;?J5 3 oxxt$ ~Пn$ |JW$ yb$ wc$ ta$ rܣ`$ oס]$ mҞ\$ k̝\$ }}hW}$} zzfJg`\\WTSRCQz$z w3w t3t qqA:nn0 ee/ gg. jj. mm. oo. rr. uu ̛ xx[+,j zza  }}羵?,|S(/(-H 8    ֦To \r!`  もӗٰ!Jj ㅅ/!2,qY ㈈zu84 ㋋ގ{˃x0$ ㍍ߑ#"5"5[?v g 㐐  㓓. 㕕  㘘. 㛛. 㞞. 㠠. 㣣Ϟ/ 㦦0 㨨% 㫫Ϟ$ 㮮Ϟ$ 㱱Ϟ$ 㳳Ϟ$ 㶶Ϟ 㹹Ϟݩ٥j~ 㼼Ϟݩہ* 㼼힞ϐϞߩ| 㼼Ϟ੥_㼼Ϟߩ) b㼼ϞݩܜJuSJ5 3 $ ϟx$ Kf$ o$ o$ m$ ڢk$ Ԡi$ Μg$ ~Țf$ {ÿb$ xNf_[ZURRQC]$ 3 3 I:0 xx/ zz. }}. . . .  Ș Y*+h _ ⺱=+yR'.',F7   ѢRl Zp ^  ϔԬ Ih . 1+ oW xr7|3 ދyǀu/# ߎ#!3"3Y=s e   . 便  﨨. 着. ﭭ. ﯯ. ﲲȐ/ ﴴ0 ﷷ% ﹹȐ$ \Ȑ$ ᄒȐ$ Ȑ$ Ȑ Ȑ*xU  Ȑ(~ 鐐ȮȐt*  Ȑ1 Ȑd& EȐ!a[> 66666666666666666666666666666666666666666666666666666666@?&񜔄$𤁓z$b_PTvkt[z}#}4ALM}_TCNNG}z#zh@S^k`JLEd6kqw#wWK_gw7k4asu#uyMl`t[6Jnx?fzr#ruMlsh9@UST}tHozo$o֡Q2 2w>H 9wN v'a 0^F!KkjT'DZ rZ|A ~4 yr%; 0%\l h  ????Y  fqҤq@?&񱫞$˙򶚩#gdVYz}xm#:K[\ddO^^Nޒ#lJestY\Qyz:hx#}^rx`=X}|Iv~#\yAKbafxV~#䅬حEQo{xW~$們:WQuxW~%xYGA:ATev:Qt{O:Zs:Wxv:V_}&}wlecegs}ler}}theqjeu{kepz(zyxyzz?w?t???Iݟ ݟ  B$ N$ 9!_>Q2 2v>H 8vM u'` 0]F!JjiS'CY qY{@ }4 xq$: /$\k g  ????Y  `pҦ{p@?&ºúз$׵ʶ#ki[^~|#AVknhu\poT̯#qUyhm`B#bjźF@p|#o|eDhT#iHVqry|f#䝻ںN`|g$嘛Af`|g%iPGAIdyA`]@gAgAeo&猁wvy{y|yyy'?????I؛ ؛  A# L# 8 ]46DSbj-jVSaWSafWSabVSST]h.h ed1e?b?`???Yީߠ%'2 P#!~ WDL 駕H 9Q2Q2>;}2@;K]_eU ]Xa !W {^#sZS Z"+!Kk9 3.F V%rZ0fZ0Mwpp ͜ 40y? F 0 Hڼ;S%0uqJ  a h\\0N!† 6 zIQ;[????Gwwwwww maa>=9 韶_ A[[<''p\\VPDVV È6T Ÿ@Ņq0[ T! ‡}9.]@?=Qew-ievjeu{keuwkdefq}.} zy1z?w?t???Yܨݟ%'2 O#!} VCK 禔H 8Q2Q2>:|2?;J\^eT \W` !~V z]"rZR Y"+!Jj8 3-F U$qY/fZ/Lvoo ͛ 4/x? F / Hٻ:R$/tpI  ` g\\/M! 6 yIQ:[????Gvvvvvv phhMMJ 硶` @ffN99 \\UOCUU ÑLV ķLŏF[ ߽Z- ߉PC^@?=:IZ\bR Z U^  {T x["pXQ W!* Ih~7 2,D S#oW.cX.Jsml ͘ |3.u= D . FԷ9Q#.rnH  ^ eZZ.K  6 vGO9Y????Gssssss rnn[[Y ⡶^ ?qq^HH‹\ZSMBSS ÚaV XŘߍZZ ں]8 ˜ߕfV]@??  }ѣ}}ѣ}}zѣzz::ѣzz::::wwѣww::ѣww::uѣuu::ѣuu::rr::ѣrr::ѣrr::oo::ѣoo::ѣoo::m::ѣmm::ѣmm::::jjѣjjѣjjhhhhheѣ eѣ eѣ?b?`???Vݣ- 0, 0}+#[ 0H 9Dc!8@e ta PŐ -77 !KkUxo/ 0rZx]k 04_n& 0%^^ % 0 hQ& ;х????FxwwB_E"蜂J.>n4 An0 uH-蜁H-=n0 ع3n0 @??  ϞϞϞ::Ϟ::::Ϟ::Ϟ::Ϟ::Ϟ::::Ϟ::Ϟ::::Ϟ::Ϟ::::Ϟ::Ϟ::::ϞϞ}}}}}zϞ zϞ zϞ?w?t???Vۡ- /, /|+"[ /H 8Cb!7?d s` OĎ ,66 !JjTwn. /qYw\j /4ؿ^m& /$]] % / gQ& ;Ѓ????FwvvAfR%曋`C>}K@}Eߛ_A曊_A=}E ׷3}E @??  ȐȐȐ88Ȑ8888Ȑ88Ȑ88Ȑ88Ȑ8888Ȑ88Ȑ8888Ȑ88Ȑ8888Ȑ88Ȑ8888ȐȐȐ Ȑ Ȑ?????Vמ- ., .y*"Y .F7B` 6>b q^ M  +55 IhRtk- .oWtZh .|3ӻ\j%| .#[۫ [ $ . e߻O& ;ˁ????Ftss@m^ߝ'#ᚓtU<ٌ`?⌿YڙtSᚒtS;یY ӳ2یY @8S7S7S7ѣ}}S7ѣzzS7ѣwwS7ѣuuS7ѣrrS7ѣooS7ѣmmS7ѣjjS7hhS7eS7bS7`S::]]S7ZZS7SS8ѣUUS7ѣXXS7ѣ[[S7ѣ^^S7ѣaaS7ѣddS7ѣggS7ѣjjS7ѣmmS7ѣppS7ѣrrS7ѣuuS7ѣxxS7ѣ{{S7ѣ~~S7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7S7S7S7S7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7@8e7e7e7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7}}e7ze7we7te:Aqqe7nne7ee8Ϟgge7Ϟjje7Ϟmme7Ϟooe7Ϟrre7Ϟuue7Ϟxxe7Ϟzze7Ϟ}}e7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7e7e7e7e7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7@8x7x7x7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7x7x7x7x:Ix7x7xx8Ȑzzx7Ȑ}}x7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7x7x7x7x7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx777777777777777777777777777777777777777777777777777777777 ذuuѣ?Ej|W@?0/?>7*/;:<>?0/??DMJ@??ȡذuuѣ?>$4>0/?[B? ذuuѣ?0<0/Dr?ذu裣uѣ>80/M?ذuuѣ>!80/K?ذuuѣ?5=0/A`? ذuuѣ?>0:?0/?Jn@? ذuuѣ?>=>??0/??CA?? ذuuѣ$ ذuuѣ$ ذuuѣ$ ذuuѣ$ ذ$ ذѣѣ% ذ0 ذ0 ذ0 ذAmذ,AAذ AذAAA AAAWذA A,ذAA AAذW,mW AAذmm mAAذ0 ذ0 ذ0 ذ bbqbb ذ b   ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذmb ?? ? ذAb ?? ? ذ,Ab ?? ? ذAb ?? ? ذAb ?? ? ذAb ?? ? ذAb ?? ? ذmb ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b   ذ b   ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذmAb ?? ? ذ,Amb ?? ? ذÂAb ?? ? ذAmb ?? ? ذ,b ?? ? ذmb ?? ? 㼼Ϟݩ–bbBM㼼鞞ϐϞ~b㼼Ϟ~{b 㼼Ϟݩ>?㼼Ϟ8ܩ? 㼼Ϟݩ:ԩ?㼼垞ϐϞkũ㼼Ϟt ǩ㼼ϞܼVة 㼼ϞܪG3kݩ 㼼Ϟݩ 㼼Ϟ$ 㼼Ϟ$ 㼼Ϟ$ 㼼Ϟ$ 㼼$ 㼼ϞϞ% 㼼0 㼼0 㼼0 㼼Am㼼,AA㼼 A㼼AAA AAAW㼼A A,㼼AA AA㼼W,mW AA㼼mm mAA㼼0 㼼0 㼼0 㼼 bbqbb 㼼 b7nn7 n 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼mbnn 㼼Abnn 㼼,Abnn 㼼Abnn 㼼Abnn 㼼Abnn 㼼Abnn 㼼mbnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 b7nn7 n 㼼 b7nn7 n 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼mAbnn 㼼,Ambnn 㼼ÂAbnn 㼼Ambnn 㼼,bnn 㼼mbnn Ȑ Ma5EE6䐐ȮȐ E  Ȑ E Ȑ)%+ ,Ȑ :~, ȐU,ȮȐ )ߐȐ 'Ȑ ? Ȑ &ȶP Ȑ Ȑ$ Ȑ$ Ȑ$ Ȑ$ $ ȐȐ% 0 0 0 Am,AA AAAA AAAWA A,AA AAW,mW AAmm mAA0 0 0 bbqbb b   b   b   b   b   b   mb   Ab   ,Ab   Ab   Ab   Ab   Ab   mb   b   b   b   b   b   b   b   b   b   b   b   b   mAb   ,Amb   ÂAb   Amb   ,b   mb  6666666666666666666666666666666666666666666666666666666666666666 ڤy[ ʊʊʊڢsgXXXl'* ʊʊʊ΢ ^XXX+1ڋm?X*5  M-;ʢXqɓQ4BIo G\;IOST{` n'eB??, , A,Am ØAW   AA A  Wm,, mm mAAW AAm AA?b    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?       ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?o ڦ9y[%(vhhhڕrviii?l15 rhhhΕ niii7=sh|Li5C ou \:JʕipɔTAT]{n N`J\dhjW x'eB??, , A,Am ØAW   AA A  Wm,, mm mAAW AAm AA?bn7n7n7nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn7n7n7n7n7n7nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnneeee> ڡsss)wZVepL666,j$& Re z?666',UVV&6Ѿ&1 K1 0Ѿ)5e6nǑO/=CEk >Y5BHKMl: `&bB??, , A,Am ØAW   AA A  Wm,, mm mAAW AAm AA?b                                                                                                  U\Gp+P [i2 Ҙ'{6SiZ/ܛl)7c2 Ay4 mY(p{e( =9A[[<''\VVVVV ??77777777777777777777777777777777777777777777777ޚ_A}8`C6A}E@ mzEC7Л`Ձ`D2mv`B5㷤[E= svC6ᯜd`=nU6Ġ_;m5ⶢ9vtauvᯖphhMMJ@ffN99 \UUUUU ??77777777777777777777777777777777777777777777777٘tSz@uV#5@ڌY? mڍYV8˚pՎuXAkuU5޳l؍YN qV7ݫxuNml7qLk5ݲJsr_rsݫrnn[[Y?qq^HHZSSSSS ??77777777777777777777777777777777777777777777777ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7ѣS7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7Ϟe7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7Ȑx7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x77777777777777777777777777777777777777777777777777777777777777777 ذmb ?? ? ذAmb ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b   ذ b   ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذmAb ?? ? ذ,Amb ?? ? ذAb ?? ? ذm,b ?? ? ذ,b ?? ? ذÂAb ?? ? ذ,Wmb ?? ? ذWAWb ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b   ذ b   ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذAb ?? ? ذ,b ?? ? ذ,b ?? ? ذAmb ?? ? ذAmb ?? ? ذ,,mb ?? ? ذb ?? ? ذAb ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b   ذ b   ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذmAAb ?? ? ذA,b ?? ? ذAb ?? ? ذA,b ?? ? ذmWb ?? ? ذÂAb ?? ? ذWmb ?? ? ذWAWb ?? ? ذ b ?? ? ذ b ?? ? 㼼mbnn 㼼Ambnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 b7nn7 n 㼼 b7nn7 n 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼mAbnn 㼼,Ambnn 㼼Abnn 㼼m,bnn 㼼,bnn 㼼ÂAbnn 㼼,Wmbnn 㼼WAWbnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 b7nn7 n 㼼 b7nn7 n 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼Abnn 㼼,bnn 㼼,bnn 㼼Ambnn 㼼Ambnn 㼼,,mbnn 㼼bnn 㼼Abnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 b7nn7 n 㼼 b7nn7 n 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼mAAbnn 㼼A,bnn 㼼Abnn 㼼A,bnn 㼼mWbnn 㼼ÂAbnn 㼼Wmbnn 㼼WAWbnn 㼼 bnn 㼼 bnn mb   Amb   b   b   b   b   b   b   b   b   b   b   b   b   mAb   ,Amb   Ab   m,b   ,b   ÂAb   ,Wmb   WAWb   b   b   b   b   b   b   b   b   b   b   b   b   Ab   ,b   ,b   Amb   Amb   ,,mb   b   Ab   b   b   b   b   b   b   b   b   b   b   b   b   mAAb   A,b   Ab   A,b   mWb   ÂAb   Wmb   WAWb   b   b  6666666666666666666666666666666666666666666666666666666666666666? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?       ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?       ? ? ? ? ? ? ? ? ? ? ? ?CבC?? ?>$  $>?? ? ?QQ?? ?9  9?? ? ?@@?? ?>  >?? ? ??? ?''?? ? ??? ??? ? ??? ??? ? ??? ? ? ? ??? ??? ? ??? ??? ? ?YY?? ?66?? ? ??? ?%%?? ? ?~~?? ?**?? ? ?DwwD?? ?=,!!,=?? ? ? ? ? ? ?       ? ? ? ? ? ? ? ? ? ? ? ?>$  $>?? ?CבC?? ? ?9  9?? ?QQ?? ? ?>  >?? ?@@?? ? ?''?? ??? ? ??? ??? ? ??? ??? ? ? ? ??? ? ??? ??? ? ??? ??? ? ?66?? ?YY?? ? ?%%?? ??? ? ?**?? ?~~??nnnnnnnnnnnnnnnnnnnnnn7n7n7n7n7n7nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn7n7n7n7n7n7nnnnnnnnnnnnn~..~nnn**nnn//nnnnnn66nnn  nnnnnnnnnZZnnnnnnnnnnnn֜ttnnnnnnn7n7n7n7n7n7nnnnnnnnnnnn~..~nnn**nnn//nnnnnn66nnn  nnnnnnnnnZZnnnnnnnnnn                                                                                                    {{   ..      oo                     88   ww   cc   \\                           {{   ..      oo                     88   ww   cc ? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b    b    b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b    b    b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b    b    b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? bnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnb77nn7n7n7b77nn7n7n7bnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnb77nn7n7n7b77nn7n7n7bnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnb77nn7n7n7b77nn7n7n7bnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnb    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x77777777777777777777777777777777777777777777777777777777777777777 ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b   ذ b   ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذAmb ?? ? ذWAmb ?? ? ذîb ?? ? ذAAmb ?? ? ذ,,b ?? ? ذÂAb ?? ? ذAb ?? ? ذWAWb ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b   ذ b   ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذAmb ?? ? ذ,Wb ?? ? ذb ?? ? ذ,Wb ?? ? ذ,b ?? ? ذWb ?? ? ذb ?? ? ذAb ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b   ذ b   ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذAb ?? ? ذmmb ?? ? ذAAb ?? ? ذ,m,b ?? ? ذW,,b ?? ? ذÂAb ?? ? ذ,WWmb ?? ? ذWAWb ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b ?? ? ذ b   㼼 bnn 㼼 bnn 㼼 bnn 㼼 b7nn7 n 㼼 b7nn7 n 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼Ambnn 㼼WAmbnn 㼼îbnn 㼼AAmbnn 㼼,,bnn 㼼ÂAbnn 㼼Abnn 㼼WAWbnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 b7nn7 n 㼼 b7nn7 n 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼Ambnn 㼼,Wbnn 㼼bnn 㼼,Wbnn 㼼,bnn 㼼Wbnn 㼼bnn 㼼Abnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 b7nn7 n 㼼 b7nn7 n 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼Abnn 㼼mmbnn 㼼AAbnn 㼼,m,bnn 㼼W,,bnn 㼼ÂAbnn 㼼,WWmbnn 㼼WAWbnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 bnn 㼼 b7nn7 n b   b   b   b   b   b   b   b   b   b   Amb   WAmb   îb   AAmb   ,,b   ÂAb   Ab   WAWb   b   b   b   b   b   b   b   b   b   b   b   b   Amb   ,Wb   b   ,Wb   ,b   Wb   b   Ab   b   b   b   b   b   b   b   b   b   b   b   b   Ab   mmb   AAb   ,m,b   W,,b   ÂAb   ,WWmb   WAWb   b   b   b   b   b   b   6666666666666666666666666666666666666666666666666666666666666666? ? ?=,!!,=?? ?DwwD?? ? ? ? ? ? ?       ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?       ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?       ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?    nn֜ttnnnnnnnn7n7n7n7n7n7nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn7n7n7n7n7n7nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn7n7n7n7n7n7nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn7n7n7n    \\                                                                                                                                                                                                  ? ? ? b ?? ? ? b ?? ? ? b    b    b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b    b    b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b    b    b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b ?? ? ? b    bnnnnbnnnnnbnnnnnb77nn7n7n7b77nn7n7n7bnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnb77nn7n7n7b77nn7n7n7bnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnb77nn7n7n7b77nn7n7n7bnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnbnnnnnb77nn7n7n7b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b    b777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x77777777777777777777777777777777777777777777777777777777777777777 ذ b!b ذ0 ذ0 ذ0 ذ0 ذ0 ذ0 ذ0 ذ0 ذ0 ذ0 ذѣ/ ذѣ. ذѣ. ذѣ꼺ݣ ߠ˩ذѣ K  ذѣ  *ذѣ >}?,}F8xdU}+#[Qذѣ |m$ اjxq)@e ذѣ 0;8/ڱ&xt#ذѣ b12,{G' o/ذѣ .都e8kذѣ Ҽ0Iy0 ޮ &ذѣ R5#5[?w# ^ %\ذѣ   ذѣ. ذѣ. ذ0 ذ0 ذN:ذ3 ذ3 S3S 㼼 b!b 㼼0 㼼0 㼼0 㼼0 㼼0 㼼0 㼼0 㼼0 㼼0 㼼0 㼼Ϟ/ 㼼Ϟ. 㼼Ϟ. 㼼Ϟ軸ۡ ݟɨ㼼Ϟ J  㼼Ϟ  *㼼Ϟ >|?,|F7wcT|+"[Q㼼Ϟ {l# ֦iwp)?d 㼼Ϟ /:7.ٰ&ws"㼼Ϟ a12,zG' n.㼼Ϟ -炼d7j㼼Ϟ л0Ix0 ܬ &㼼Ϟ R5"5[?v" ] %\㼼Ϟ   㼼Ϟ. 㼼Ϟ. 㼼0 㼼0 㼼^:3 3 e3e b!b 0 0 0 0 0 0 0 0 0 0 Ȑ/ Ȑ. Ȑ. Ȑ㷴מ ؛ŤȐ I  Ȑ  )Ȑ b Ȑ .96-Ԭ%tq"Ȑ _01+ xE& k-Ȑ ,b6hȐ ̷/Gu/ ר }%|Ȑ P3"3Y=s" [ $ZȐ   Ȑ. Ȑ. 0 0 o:3 3 x3x6666666666666666666666666666666666?b@??ښߠ T 2ϢEQg-;}2@Esl#ET(0(.?,};}20O!W !WЙ0Up ]s! ا!00ڱ00ꃹ002,!00!hO00hOy00<05#5[?w8 4;x"????S?b@??ٙݟ S 2͠DQf,:|2?Erk"DS(/(-?,|:|2/N!~V !~Vϗ/To \r! ֦!~//ٰ//胷//2,!//!gN//gNx0/</5"5[?v7 4;w"????e?b@??Ԗ؛ R 1ȝCOd+9y1>Cpi"CR'.',=+y9y1ޔ.L {T  {Tʔ.Rl Zp Ѣ {..Ԭ..ン..1+  .. eL..eLu/.;.3"3Y=s6 3;t"????x47T rZ827.#8.,7.mP8.5;:c9\8????x7777777777??????S7777777777??????e7777777777??????xS7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S7S:NS7S7S7Se7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e7e:^e7e7e7ex7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x7x:ox7x7x7x777777777777777777777777777777777    dK2%grhino-0.16.1/help/C/figures/prefs-theme.png0000644000175000017500000006217511436423225021043 0ustar lerdsuwalerdsuwaPNG  IHDRc$ IDATxy\TeŔ%5L7PsW}2~-bifVYng~q4AQ@?A<}x w=sg9޹(Ba^M:BլVZ(jwQ!v&7SKݟ( ;^ ['0%GnVYY'o% 9-- vV6v.upBQr,UF-fr*bDBRUS֊=ZO4̼RY+J匿É^^w*nX%߸N*<A*;v^88U+Q!B lܴ_~]5y5h=Z{qY̎T4 v||'6YVzM4XBӸ/,a^^.}X鲳 ul]/SUNGvv6\/PbӴmb!DYHDBR:vnIȁc{pvveXߎD& ;[KU;ny)I7Z&6U\qfP7_\ ZҷSƒqZngd9B-]Zǥ-7Sq"pj[;ϵj͓uܩTɌoI22+M׊| azPJRYdggӺu+n`ݖ Q4ffhTs:޴o݂[\@bU<ݝĥHN[q+-?7ڽ93^θ(+/MLSy'h)ښ)WCe=63> 4/Vȧs_>X1Lvdޒߙ4%?-e5 /\͛)mO^,v"QUX~#3gFa<4qTJ _"<"n 3P7 eSonn%Ɠ9O슙yeK-vXfCrCs2%a3,TUGVV&YYYF*++ N+Dy۹k76̹gƱ'/]z ?TUG/Wr5"LょsrCfnQ[[;xz\15<׭ Jzm6okPh;;;WM[v0h?o$>vvq+5E?,`<d Ѷ@yjзk;,,,Ks(f$^ֲ__! Sa@ygVw[js=^gU @FFzU֝U6'Nǎøy7)б+srWl{VǭڿkSãZK"=OrRSRP4fVuk[;Nm[N5d{կE%.߃7=Gјq"ܽqh.|̜*aL'gb/5gHZZ:*[X+[{\+qؗlO |_F^a Yegsv&NsJaŝYY2SHCUsO~pBkWvd@SQPpq̌TT4(5Z+['v::(hpq0ҺZոY:sssN΁TEFssBǷӇdh4h̰"_v.KvJ".CFFYYY?$޹$9+@v@aPw[{TUEQPCt}fۣ\eX~UU`];mPuhr+j|MeXhΠ.?(?+vۼ?]/ѫ8cW==NFaVm3^~ +_( yesVB!))0x<;6WXAB!mtW6 ڻc3q1WleB!.jRQKeHK} !$}XSM!haa}XULEB!D>d$df%4fR板/z742Bag̬B$笄B$3ʔY!)|f%笊ͧoEP&07]BPsV!ʯwzFTp%6CBϓOOEҟg1YJ;}!D+Uq`q2/(9V]\4~CTIf]BSL[ !]r5B'Ba Y]˥Kyqqq&xWݺ(N!.3fV׮'rMxOߥKef%E˟IyFSCSghҸ7(´w^'?݄ys?*q}5Yo?-?{rO߹۞q>1v^V>r [wD0qR?;,vfh۾3t#88!$&JQں_ߦz֟~ʘj(b.m`{ꤤ/{Yի89U%0/͟nc\X,Ю5{pXJ*QCj+HHSM|ʺZ> 8{/J˖-@wʄ/py;נjYa?.+V2jXO?|Uy)߻B_RmBTgVfR]زu'~;Шa}ٶ#莺49z{ض#kt7n;|;ws9s< xoƧg2z`~Z\$==p:`cc;?x +qmof&Nyʉlڴ+++&MOء=m۴akfS̀HIԩS]!""IG!3fVrxiiTJTt -[4?n]dfg?Z-: ڒ!QݍAV3me#wh ^~k=׮%n FQ7n 4W&pךv˝IOK'<*QuaЗ39o]sf#R~ז$0z\sNAzJsq˓Y[W_ǜ0OH{u}^:ڊ.˷K~!**ggGRSP;ɽ/.>( I}t#--J>*=BIbaj7Jc_٦S6tІ ,,,;UŜddd`nn^ sMܾ}۠)|ս>~god[r-/7^!D?">*9+qQC!([ezJ<<%X!&sVB!;J'B#5-5˼ ;Y%!qnn5 ,+4ŧW$L[ ^ѥ!aK[{+vXF a=BTّ*B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$Bu=$ƾro!%V=m}(>Bjj*UUIMM%xWݺ(lrnݺ߶[n+dLNNa}wJWX Tvܖۘ4)jX[[sY:ϱ 66Q_ 6:~5)-& 1FSUU"""x _?Bq/~JLvne:a|VPCQ<FH\v=>èyq+ 3x>)9qVy_̥oq'mY'}{>N%""OO^zEQȑ,u=ztgعsVt:!oF?ZOf}D*Uxۋ={5A߿ pmYx!RR*9cΞEzuy&dŊU 6DMbԨ^ViS؞l;WWǼ :u vvׇ_.`n}S4{)VṀ(Rd=͛?]mBc*<_NtԑΝ:*׮]gr];bg'G҉;!g;iӺqq\]L}mNرЫgR?//O"#qo/TU0rҙ! zx6ϛoNՋ|.?EQ[oo/C ڄ_%22 = z~s3Fjw^,[ǽض}75j(GB! Àgddd9;XGGGJtLAms8vv$$\38#thߖkr=ݔ;8td}1T+o0ue8~ GuVLsdQ姪~{TU%** ''G6vv4=}3s`MnGq_Q `Æl͚5j(Jdۅ0V;cMSܸy9S ?S7ru!dm߁>}eWҵ~~]X76ܜN:L$++>tuy{7X9sV?޽9j,18;섵5@3/ܹ z4w!,$m@~{rBgV3¾Z>EQhi\]\ӹ |NxESmBc*0 k׬gУg?Ұf@~L:Šms1O믿DZ-/MХsG^yhצ O5iFCFgvv$UkޙYaceeeFmʤv|p>>WsImϺhy ڴiٳm<=9s8TT"\iiih˳ʪ@}: ,--yt*UYRSSj%~)uBMZ|JJ !55z +n]Q~J݇'>>*UX!VCG]>e6&M µ+֜9s|9s,,,cr*</S`TUgZcՊxIrX!+sVQt:^~aέl޴Cp"4o[bVU,ՠ G!Dr 333ILL EQPgg'>\]] ~8c& 53Xf~yhI I3V3۶*_z*Y 2mw=fWܝ CUUQU̷;w˯|B:t3x7"5e*E0qR?;,vfh۾3t#88^o( IDATX|k9dH.\?Gy3;=<[XwFaaaA 6^嗥qԱf&NO?KAM\\<ѬYSV,[ 9rV?6p1v f͚upw߁9:&gay#LyO>˱cٲu ^G3gɧD䉸4oqɷoߖQcr ~;toMAU"vZ|k}nٺI[jb.}9slS!(eVwyo0g,} Ѫu:tرmY1grD(7lӃ^ӃAc@,u]ؾm';w"00;w}h4}kbo?lnTZzDLl,YYY(۷qwwgL5kh憹ÂYYL}w п)):u kע_>DDȊھv#&&Cj (lڴ+++&MOء=m۴ak !i)UN$AputΝ:sط'SaGiP ^Aۆ =THzZ:QQ<~b^DEEӦu+br%x.?ݪqqCBС]Eޞ0vE'|6|4)ɨ_ HPkԩאA9{N_>&..\bogFoWYZZһw/-_ɍ7ض} <*Quڷ|OԔa=٫?>>|(1mswy%!xC^ .t؁leth߮!׮]W fw=~m[6ck(._&00r~ZnIACry_[Q000 6۲4k֔54̩=}Op`MoB2 ;䒜ء-,;n"'O͛<̙gY'c{۶@UUN>ò+?.,|}cnnNN~ɏxzxX,+ۼlٲ(nd5X\qvvZ8ܼTX}͞n+|:BXI֯߈NʕpwU!(UNWذvJ4=Q^# NǙ3{A[c疞x_|>_Zu9ƌAХsGiצ O5iFCE ATɜV;УW_67m۶ŋ -|Ӣe[ͯ-XF!񽾯_B/}``x{W6xyzxyѡ?:ud%z(zj"gϝOg_b4,pHB/чshJe+n*U̬@eggUS4^i(JZZZaF!(9߽rj5Y5FXog,|(accSE)*Nfff*w=;;VGQO!&+ƾeYBQR=]!ă"J!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&ϼ+FGGxƾFvH!R@nӤEϩʭ[8tԫWOE֭[ {S=ֱ+d7ݺ/ozٵk7ŹLBv_a0tTPڅ?`tlݶIp抵5gΜ߯3_ bc5bk(Btt F@ltxclܷiԣ~.]:=`B(sV J˯3};onЁ= 孰q˳ԕkXg'Ibb"^^3m?c4jBgڱzZTUEUUBN2dHwlݶUU+?pUUbl۾C1r%\?nz_#vĿ[O?RU̷;w˯*"SO] С#o6;,Ps1xs~LUU9Cg;vG!*BUq[\22tH^~_ƅء=L0~^%:& YX8r(Zlc̚5 wrYya8%..бcb1yF_7Δ7ӹ?~4֭@LL 'OACѦM+-ׯ~@ SOILJN@ܪUcs۷7Ϗϙ3g #YAN0ݱ ;u?dEoQ|67~RE hĉP"""xxȑ,u=ztgعsVt:!o333uϝ=zSM ;ɊӃ^DQ<==cT3-[\,DLl,66}\\Wr}޲@ SϤ㍎ګ/sӦXYYשQ:!} #L VI$޸Aܩ# ^2Cv6lP_ߧ#iDEEC( ^l߾6[Ǖ+ wdI;NpHz09u{{{Vqo/c|ĥKQ:)>5 .DFFukjzLgYԓ;fn䎙ۿ~DFF׵{coogЏBT2= XҠR^}~'''JtLA[333} 岳%!;..GGG,,,о-׬… 4{);v-[ٿڷ3:QUksQQQQ899"c[|iz۶lΠVʵkwt$$\+O=~厙gvv~L;;[||qqΞ>'8?kЏBT2 T+:vhGe Ǝȩӧq&a'9S5vn߯ !/,8s,˖kW?om9:u%?ၳSu 8w<^={ʽH3._͛aaa-ۈLEdz8x0|Nm ~z}s}j0N~Ft:Wӽ{/VZ]T!Z=Tҝ5k׬gУg?Ұf@~L:yz|l^-'&jyahz9եsG^yhצ O5iFC[>#""ڞuj++AmXz>K\\<[mUTuB:uh۶5/^A' 0vDnJx{yp\pѠڅo0uL|1V!=j.].PB +QĆ   QxgV.]͛Fř]!tꏢ(ٵk7ڊ]!tֵLOJ(\r@RSS*4À&_3x7n2ixF~ (w>]5bY3۱jo<(Tv2f*?G|X͝SbfnƌrޤK.:oMLۗ)nO>aٲeѶm[fϞ=QQQ[jՊ j9s&.]bXXX0k,t-[={6/^ΎoT։a\%Girꎼ=>λspL4jBgڱzZa14oњ}cg0IARڶڵKmtҍ{cCЧo-ƛS @Ll, CUU"##7EN{Nbt\ΝgQ4mEٶ}2n‹֔DFF*a'2t$|[ѻnnt̾YO1aK>6B.(OCAQfi=8q"XYY1ixjTNpp~_ðfSpuua@~̛S`ogG~}6m\h?ӧAQ6lOOO^{e>loVv}\\Y|ec4jӧ(4moаA}4 077gxzzrd #GY2}߹cfff9v8?ڵ ssRO%={=7n|@͚5mU@JSteG7… ԬY$9 nE\ťZMN{ͬ6_HzZ:W¯k]\07yr3hOse9ڢ/VnjnFя_W#m{EEE󸷗A{{{}N.@>]'a \T}qFG}DTTcذa$$$h4?v˗/g,_͛Srej׮]GĽ'6:WLj/_$*7l򶳳ǧ6շqz)!ZjUΜ9_MB5۔wruHJNFذqQx晖4lP@gϞ3иxc}6l~qs{QsNϟMjpqqƠMv/^ݝ֭[( W^Zx4'bL^Yq.v7r%{rjM-xf}/pB+w1֭ۀN#<~~{2?3)))޽fjͤZ{3gβlJv3Z4j#L}ACSy56mPN,--Yd K.5h3J*Oкuk6l@Ν9wgB~Yq`7 :}&VeA5BC<= ' 97[R7^nWEjff/?}6oO#?M߯2|l^-'&jyahz| .~>njgѻWO9-bcmmן*;WgRSSȕ!FE/ s9gOg_b4ħoW>cs_~˥ZMmZXog̪,(R`_e)lW;;ˋ_UUïuv~`BTfVV\(Bvv6f1LJ2AJ!铰ӤTtB? IX 4(?̫$xcaV7n,B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!ɓBa$B< +!&OJ!3xDGGVt BOc_B(jx +!c+!ɧIyK['a%4tTPE DϨRˬ//VB! jEHX !(B'a%HX=t2Ǐ0uR6*)TU%%%?7kuV[Rk1߾F_YK0Ć   QxdgV_-qoזs>)q/L ?DG0j D]AQ2[UUbcʼPE_Kltx0۴iÆ zFϞ=\rpIMM?NKK+-u#Vy)S137cWe(Q+4ryzz/D=NѣO3f iӆo8'SydFv!CG̷ `z.m;߭8fع+_~UUd܄:}:uJppA]1 2LϹs:||[ѫwmQdM~W ڽa=n×_-C'Z>ӎW^{IIJtL rfT+;;UU9Cg;v}6׮]nݺ((2|? Æ cѢE4jԈf͚uV[5jDӦMٲe-[燗M4OJ~@T#elȇU@cUUO`@ 5kʊeK89;Ço#Gc|Fɯp"4Fz#捼3M>t.Ǐ 55u6ɓx>HE!-5`ub/i߾-#G%22:ٻo?K]Fquua'm,z1x%CdD$~:>{1}ڻL.Ny8*WBѐLUƼ/ҷoo;ӧϔݛ\2cƌgϞ5ŋsyuưa9b ˚5k>|kңG&NDDDзo_Əρ㏙>}:-5U-W"w?ÀϦr]a#49r.Axzzҋ(Ҍ IDATq/<_`gh)Nb*|u3-[Τ^8;9 3>|WWBزevvv7]z oB|i$Y'}{>9BQn߾;/VJA^w{~X[[ݷ_if4q<5W'88Uawv(¢Eݻ7WfΜ9?/^Lfb֬Y1dfΜɬYppp`РA̚5 kkkOڴi@Æ qqq!** // Np+0`|lήFǡCY2qo/QQ}Xu"::{;;BCڽua$$h4*W#mP端ѨabٰA}}@;;9V5ҙ! z:03gԑs's8tۻ(ْl $ -R(*"y? *x)Y"b9T@ʉ F&dwg~,4 !k|޼f3|rDG1 @y yꩧHIfQTv"lڴKd9q "Bv+HҠUmGV#G g bbbٸi F۵; EQ8>2&{Hll{ǑHPP{ɉ;vJYƺ6l\~^gh):Y91?A?~YCQ~g^/7|NppKxNtYo/,sJcƌg5aFٙGySNɓ'yW?~մU5}/^Hpp0 ٙo$nM?(jhNRΝ\t:Oy&P%J)mN G2p`ڷo]?`>޴k׎ApE:u`U Ǻ?ey, <,z^X'qx?9s&>}a2 arǟctލ֬`Ht:SǧW+ݝ(͛ǀ(..ݝSVj;iG'~CѱcG F\\;vlu0F%6)ظ;ֻZ?dZZ ]{Ul|%%%t`ťEVk՝S1VEV|Rqq1...獘fJKK-꫸NJ9OKKCuDHaa!nnn6ǥ'''K ܊3[~|1koSVvfVgNb߳^T]!y+,uEfԶ$$ItzjK"ZZ9QAswwK9"=zd% Q&JAHV JAp|"Y KD>9u!jƮ ]{7vᖭ_`! {߯=x o?] HV JApx"Y O$+Ad% 8<A' DA-="--! dHψAXn*Y93A?qJApx"Y O$+Ad% 8<A' DAHV JApx"Y O$+AԳ~kCCA9Ϟd5H+# 5H47n AAh(✕ DAHV JApx"Y O$+Ad% 8<A' DAHV ûg ե4vA7F$+DtUh2֯]ND>"v$bj"~r!By]߽K1UWpQ&5Tu1HV6R䈘ڟi8P%(,ȽiDD| iit='>D~^bb8w<Ϝжm.ڷkO;c08p 8`$IB$;X#GLEWl+$XHVՒ _m '&Yl12eO^ jAXD{_nK:x0QBBB"лwO}@!//Mf ?sH|R1El6joo4MupTY[v,G$ry9-}5p )7H8ihPThOr_%{vZrb2(**j2G*772w{+Y&êđU[9ܬz_W?+;tDQ@%Ie$ҢTb^* ( ʵWSҴõQWn]<5z<'(:1-?ƸN/y4aIfT~m1:y#R\TtHFEyY  ^6ƴ*qde#[^3(`ыOcMΑ_H7WW5~LD<;Dxr1KeL&4j FVk)̙ht=6EQ@@@^֫}0zH֯>JQJ mcF2U,x9ThTkYGaa!l>JP@||,]^GVЯ__&=(]pp_+mP* ))'O"2ݻwwnՒ d\NM1f'nFAAz|$Q\Onz"O#'GU5}))h4'N'..ظ8FUc⦅ ~'4_9FYY99oo/sb oGJJrk|psse=C,^>|o$+gn>m*/+`?UrY|n=6',M i͗?`jgygR/ТEfذ|b[ކ`o p}2cQ#UUҥˬ3=*QK0IE[ޞZdbB2)y ڴ AV[;//k?糵jw>\>}&6mB,{x^3}]CY‚BYF4 whpFcxiZd'~% \1ջ^GXꕓsExp͛x_8>ƪ[]fxdD8W+2hp9!Nc4eB?eSywy內ɻzoV~_r>309zb0W:l}|J ZUw@` Qwsq+ML$>.v-uuɲ̻KY-c( zò?Vd٩\;У{7!33zw`˦ L~d3 G;YCk?-^(s7ZLo oFuh)51ͤKJ̕lbr8 霎DRe<]h Y=u4&ATwHHkڶi#G-þںǦdٻ11g]18ѭm[_3:7˃ 4 V/Ul6SR\•+ɤf\cǟquu ·}+?Z˯{<Ǝǎ0Rj(iȰթjҮoyt ˰;wEL{Z nInn.999Z?ud2QVVf5,55PK$ݿ0b02ʢssiѢ-oGurNŞ[ӫ҂,J1eҧCZ] OII xzX(XiV>I|}|0>HX"YֽP{4so[2q{/*+9㕟ŘA}Nr _&$-[hէe'P݉ҙn[2--2L )((ݽմtwY2S1k.͛Û73gc|$^yQj(ե2+rI2wg%jL: (.)Hd2!Iyxxx!I*KJ"_;\ZŲz'sh6Yv=য়vX͝7L8Ʋ"""g×V;R?Xٳg70wwwbbc-+BFF&>\'H࣏?e3Ğ?]gn̘֦S&N 5_<-;E㤫q$a*Sy3XBpG~dXwƍyOX{׮(rr2x𠊃8:wD@?V~3#d{=asV66,-K.B;3=ʣcGpg oG<r՟RJw߾>Ɍ"Ȳb2p!GУgo2c8q(=zY/U;h֬7|N0LLz֘tjHں ",,P֯[kWUhԼҋ,^VrBWp|G|7 2"3Ty?{k]s:%__`~#RXUh $ѥ3} :u$&62ϝ޲%̝2t:|qƍdLYh$M+W,GAGmV捿y-8!ȹrCzܚ!];"¨ nՓ+qcqsscٲYE!4- ^{)'UQhw=z}Mɶn"$@M%6.&3=*{BDޤ$TNB+}/oB_GA r9}?Ym5NQy h hAFj"gOwd]%i[V("INNN7\^IIIs2PjU}ߊhUd #NI~&cv`aXεjX_]6LF\\\k"#XRp@VlyuEV-VBBZs)io>Ο2s )q#pNNZ HII%=%Zݷ'ϯ{yeUmojɗWԬ IDATp8wSu}W"!.]]ym=?#C|Z b" I%ոe͉uSwk I"}E.KTI6N$L2R.s5sg9o/} Ek\V}O]ԦӹjNVRo;P)FOwysx}\L.6BՔߋY=oVFiuh@"Y֮//OBIHH䮮{elѨUIOϏ6hًhd@~~)%]( -Z1'rm]VT*cFয়v꽷ˡK.W._yq6:.WOOOF$IvM&._fa;RC]mU[_QVV75ͶbnV5ٿLCVEsժg ںo61V66Xg''z݃Ν;vݻkO0쌏7-[R\RL\t:]:ӱC{˝N&w? O_70fpquE*ZEmOhՍ'݃ Jzyy1p=Dx/ %z 况WQN]+L)ZoDYY:ggTT~+*+5HD=j,hh2]OD*ZFK=-OcUZG ثf }a^VWOGHGVMECYUjoNYYYPlYg"Y٨!5j?[:56=g;֐笪:i:]1Მ`EQS8q4"'bj"HV6m*49"'bj"HV6XvycW1?S1D=x ["bj"'bzg O$+Ad% 8<A' DAHV ëvi4ouAO6Z9m 3M-A!AYy[cEAj$AA~cIENDB`grhino-0.16.1/help/C/figures/prefs-board.png0000644000175000017500000007460611436423225021032 0ustar lerdsuwalerdsuwaPNG  IHDRc$ IDATxyXTeeAMY4K3MsK}ߗ+5헥Yf[(Vn/.jl &fUƺ?^^̙gsssΙ3B!,5@՛BaR: `R' 3z9Uy4F^4aIW6x;2sp򨋣K 4MP˸^AJIc_TR WG.GEyg>+k W>7T/U_*xZ3_BH)Rz8ɁK% DR[YlVVVԩ]Bг~k!N͉E.c׋+u|I¤&?0ͧ^C9{ӤI2zrrrxw;pm+!Cd[9tA>=կ#1 7]G"~6]Z>Gu'o ~5;+RoQfzRù*úlTў~]j ԜLzq'#]Gk4a<;r+5]Gs)5;nZhXw!=#r6GKu/_ 0+effV rOR99ЦMk233XQ]!* ;;{j~oӒܸ̈́vǷV .EpN^{%l'bd  xX-b\3BFVf_vuTV ~t.qvѽt۰&0[ t)ndwPϑ'bWDb+z==z` =7U_,G;+IrrrXYYf\W6|@hx~'#w>/t]gϡ߾8Usy_p+6;>=~Bšl\ s>ǭ[Fe\)vbP m{F/?E/xzDEQӋCrad[)7@9x,?׸5ꊕukL򥊝sCzyIkrJÀgV(';;l*;;^ Q~޽[D)EjmΝLܼ}t~2\;P٘n8uj=ЪPk2_VUeOILJcŋǛ&MEd:q 1ԨY^z!Ϭ ^ѻogԦbrfQJMVVQ{CVVJef%5 Gz9`emk7}N6U!Qc&1:M[u2228[آ͖]PjӫNnY}Ul'99*6Twuuqv?ҙf},<L4IO t8ߠd߭6<.MO ./rfaNN*dl*_3NӰDD^b`ԩ^Ol}ȨS.1&˞:{?i(66}ddu,moIf Yz5YY M#nMptr!##N;j(D)3 J7`H:}bڕf끙ႊl =\h !*m ꯋ_1Hdd]|kش@$e[ymުQ7H擯V3_G^.iw0ǧq+>z-C{- Z[[[x4+n^O}_!)0ἂ3^[: ݵEȫ7+ o\ouF HFƝ3?gV9:ߴPBT?©\zn'ك۩]Z> ' $]!-5MgcuO\kSщ_}ϲ,kmcSծ OFm}8=5jUן q$'^&55PG]2f$DEz;Tǭ/])B<ӧ)MrII׈8qQUT ! kz*',HKK#;; >Š?OnggeJS:Ry'bnk_vdgf+44k@e![:g'|Gߠ!+7ur/=A! )9&6;gTBO"=gU;X\xcGʽCWĺRRoWvBaVdWL RB]YՀB!DA=+!q ?OkiZbϞ}4l ڗB rY]q?o=嗯\%#3Q߷m;{lmƍw󰱱)SE4ק[oA.U'6.E ժnբY)8~2gS:勗 dggSۋ",G7 1]{bjFVa3,TZc'N c57}Azæ>3B]TJęh6ĔgǡiWXD^}yj4 w}? ;gx{y1udݻ2w\|GGGsS&';͙3pppO\|<>Af}酩bXYYц8cb$Q !D1a@Mq.ӻG0oCƏ!a/[Rvۯܹ1t`R\AØv.]R!De)%+ϮR?y;x$6.V-~O&wԥY͞![ k9zx?͛7cjKQ(1ڽ7>ԄQO#%5NMӈ0V*u>PX͍7> ]]*U47n<jՒ>Ǎ7Jk1YtBjժw o:ZT;Bq?)sVJ)vM.>kk+ѧgW;?nR /x4k!#G4~!|u}з`ƏM^=>l(66ִnӁǟh۶ /^4s>Lǯ![_Vp||21.~wC)E|B"!/`pz)ӎB RimݺI]OH,ԆwkG!'Esrkkk/Y!KnIif2[nN+Sܤŏ߯2Z>wǏ VܹA*dV[7k;Bq?Z8;]2_Q!DeBaϬJxΪ"ɏ !?[+B!=9g%'B4$-= O:}~_n׸EU2n=/Zxy ݳve"o>k];Y\K.u@7.lJrd2B! J!œd%IBa$Y !xBX]_iL$ H.BQbNV'l-ҕB2%+cCU.!srr8} 5J~,P!D!~*==nq$*!&UzO)U!!@ άRD>Èc jMپc#GoZ3vӼ4v[]ٲJ)0hpZӱSW>;qL%m߉.=ؽ{/i۾:w#<| ~1iѲ }d&pI5R| [P.++#ŋ(ƣd0oNj/ʭ2m;!HؕR\A lʰP̄8z >ՂU'tY IHH4[6.>c'0f(~ܺӧ9yilظÇ_Ѿ}[ƎȉX":wīMG)ŭd W͚|:g6ag9w.P<%i71upqիy_ж;b6;v2,bct[ !DIXT?4 7 !SaA Џea߰ƍ [~عYyxtĈC ykhaM{Z BXJVg NNDF7Q'&^ 9Q"KHH4N^]~#s}i4[[[=(.xjE''G4y͛^MάJndyqC1l(| lN?pQ\|!C1i'$p<% /b\~?99.ٳwႂs" []ЫW:\Gb8tWQ^%KqJϞc({j-۶ 66,6 Y‰Μ>} 6r%{jBuK`](suXs<=< 2ؐЊg;sm͟)~oEpNԫWB3?__e;iݦ\iРm۶ŋ4yL=ey|s Ύ#1nh3\{02dϝG] 3QJqڒEzbg%nBqhz)Fb ^0==;;;:2<{gdddp.&E!/w~Ə@fflˠmll JK)eky}Y)ŝ;w/xRz222/d !"N$5~{]\گ/̪I@P٢,;iNIMMߏkñ#͚U6o&R$`i888K[-M4 ++ U![Ue=]4Xʢ!<||fM6Y!C!"Yi6'0yʗBb1W !HBa$Y !xBX%waiР>i1G#33 __~زB $Ifú58~qiF /OC5嗿lIݫ,:W9x0m۶Kc~#ӓ%Q 7Saɪ4_>!kƀ}OHƍ\+OOmw ~7;r} "L{mYY"Na1O߁l߱l{4d8Aة+ϝorLϝO'ix;^|Un%'B)UR̤,ԕ=&Ǩ_>b4OIP'g0gR䘔R<;y*iii6}&&VQ4n\|/#!!a#Frܸq\A lʰP̄8zXc=vcFǭ1}|8|Rmw0,bc%O4Y~#L:5=MܹHٱsׯ_'t 2ƌ'**֋7;OΎNã6,jEΆ9|~۷e8y,sNt"^gU 2VZ͚7qōM)Eb5رԫW0$mwp_1;s"پcu*(Z;7UD5IV@bb"ׯ`9t:6oފS&? @-oozwx{{K/^?m;=u IDATq>2z;vea4o伃a˗2@5j@u qfggiԮ] sO%/;;a+Vc]t|˾X;j֬i^Hs-_BA(:o//lllRq+S:;;7y̜9g''g(r9sz{^nN^\t]X$1GZߋy[޶ y94Mǰ-ۼ> =FcY;iEE̮S!D&*QF'BlM **11tӨJ) }WVu 66~isυvdNNDDfrej&%58tĈC ykhaM{oo\\\pqq1%&&,;&S;vsU.wmkܷ3V:\Qc653 [͛7yu{X:LˠwYɩPly2miooO> [~عYy1NE+dUUOǧ]pY^zU6oZNN4i[_oh?9%׳drΝ4IJ#v8pss3Y); .OVt2C bӈOH`1yJE?0R2o73$'"%%GjRdԎqݢEkuMleK}v6ȷ"P撗Ng|ռmG޶:dÆϗԩShLuz!tQY,49s>&66WgX~#ztޛUҳG79ʁ_Pyܸq#^ٻpbܹHVk.vd\ˋڲmbcsg.1c';5ZjX47l؄^ʕ(!~ <ĺѽ[6&[[[nJ.4M+rYWy2n۵`5kAǎkƏo!):999Hy|\r](sm Xs<=< 2X۱u*(Z,DPӓ?zyf~j$ c曳\vvv1qcGceeŜO>f3};ࡇ2瓏x׸q&vvv<=q}zQJ1|PI6J h۶ /^ e LDiZjKvv5MO<)5Z̘Mw cᣘL0h&S8ZWMil`c63a+9b:hy^=,[k|y:Dh?dr[P~ȐA|>w=w-vTJ]Biz)Fb ׯ ]C9z MKOOԧcccc8aNNN888R;vOٓddd`ccUܹcS0͎8nIۮ-oWE3=W,.. >hG:ߞ{ף+ױK?jT(K\rtEP)n9+++4M3ۮiٕiEXd>I4nԨXm*HKK#|u FӴb+NIIqqqڪ-o5~!4~Ϊ;PχēqbqOZ4oӎgZt !dUDCi۶ .^RXu}}}ǖ"/’UI>kF؊Uwċ!SYf-oF)Rظ8sӵ{o޽PJϰg/ mNt { ]NԹ{ 톇aАc|>w>J)<4^>XR\+OOmw ~7 RD>Èc jMپc'J)Ξ#Fz}C<(*ȑc0֌4/2ݻB T.ɪ`b8srrXrC Ux{{f:4MC4a. Wxzz0q$%]'=-={Ά9|~۷e8y,sNt 7;1GM̘>>ɓ4x~d<<;%$$2tHڷkW Vea$$&y !DE+y4MC)UDbܾFzut2]xI(iTvx {ر4hPߨLvv3ߘ1st߿/}>–/U 6|5OH Qt:^^X[[yV2Yjy{k7g 7 !SDZc ]t|Rߏ}fwԬYlF/͕| 5")4n܈7oBKPn J>ʫ?[7z#4>yNmҔK*͌*ύ7زGB|C ȷ%++]F^LxR_`4k-ke=''G4y͛ھ4 ''G"#%k|4x\]] }l~^rJ Jƍ%rnիsPnX%^f:<==ر=66Xcmmc-$%]7Ϳ-JތsWEP@lmmٶm3[[[nJ 83OaÆMz\{ެZ9.ٳwᢊs" [])ܹ{~i DE]5Q,׫W:’˸r%g!>!vRՀ|zyJFaiYW^y> 0Ǎw8;9_CFόh}f2ާ|>w>mvԫW"BK*M""nNA$_5*S~{*s666&%'`o8"==;;;8z#ǹ'NW4糄R/w~Ə@ff&7`YbZ(~$b8q{Ԭw=Zrkz笚-J if_wrr,TolQTX;9Ҭi@%ʒfHMӨU/R)FʰP} {S5k0Pyլĉ*6BX4M+> 4קɓ":: OOOرcyW*;!J%0_\̥B0`z5Ӷm]XA4||{&miQWeM~8p@e"D:?%*R҉CzZRSS ѯ`>;{3xݗ{0!a#F".>SBX$;%w%4t9mwSn1ACԚ(xfsϰ "FC`Pk;QJӜ#Gѷ Z=fex…_yjxZlCsx2;O|,63is(> 66{CԒYH"wYrC Ux{{f:N8H0z쎧#GRuٳ'7!aF>·_Em;~"'Nb7ܹ6ݐXFѣq&fLSx}vvvR$&^ca6geX(CfI;vl׮%wBB"F'ZϹqQQWHNIaxլɧsfӯ_&L|s"ڈ7;???,\dHϜe}< ޢ3fpQ4hP١Q*|Jĉ_Z=+rg޳۷ӨW..]kp/ eQFe|9G<}8v8 7*7y̜9g''gKh ĽF xNƛiMsCǎ'tYOb6Άġbs?m;ؼy+L, 51x_JCA53NΉ' xu60hʲVj֬)}-*$+<7ox嚦qaZ5na^ÍtmzxV:aDDif..]V-oRRS󊍍QcΟXjZԭQQWKמF};;;lv 666 ߗu7MX~#Vʹ.!FހR7oe,[-۷3ַ@](Y%%; .OVwɑ(4 MHL[q{\zuΝ4$%]7Ѥ#l~|rJ J'..ްnc2dF%K'jR]'$ߺQr/Z>4Mcuxzzбc{ƚc[ ;pkA޹.s._A-e۶ƒ{-n%j;KgǎPJ/[]g={t8{qF.83Oazҽ{oV^[1hFGS3faC!/!>XBfVJYI';yᇘGkܸy;;;8޽zpeqY0瓏dnNA}|s_ay|s Ύ#1nh~;'5;y>{!@!~ىc WߖK"$v "1Qq-!\:ӱ)t!RT챲*WJqԿ^'##l;iii:Y0qv\֬(S"N '~|I@7 Mzf 6Eĉw=gweս_q~_f9o̙39r#Gp1ޟ֭C)R^d6nhCR۷%+eOVJ)I-y|t|+<;Ű4۴ٳhVZt(J)^6ݻ`ooONN}7ߤwtڕ)S]Ϛǀ4 Mhذ!'O0VvRJq RiDGGڿW4Mcԩ9r)JNPJ+ -9rh"Nբ 䒮rGPZqT/0鯿}hڵL0ݻs"s0GOFFFz]! BdeeqM +Ý6<;y*iii6}&(à! jMN]||R̤,ԕR#GoZ3vӼ4v[d?qL%m߉.=ؽ{/i۾:w#<| ~1iѲ }d&<O?m/4=D>Èc jMپcgb+4С|-[$88;wWݻw`Ĉܾ}SrUbcc޽am6t邟M6>(2!cܹ4jԈ CǏgϞѮ];lr>|8/͚5c۶m߿S~}LBfffEZQn^wo^YU*U>l#G!䅗Y.^c MӘ4x~d<<>S7_-HHHdoזͭ:HHL,t6lGh߾-cOS,f;wצVr2 ūfM>3~0aⳜ;Y({E\]\7n - Յ؜a : 'qb$rL鄇h" {&114vヒ=ӦMf͚FЯ_?}Y:z-CmEͬǤI=z4G%>>Ν;ӪU+~ƌ9x`ݾ}+Vôipuu{tؑe˖ĥK*jTIE>,)1d'+_E1onӁrD9N kkk[ݺJÆ^ 6,Inj<~F7jDSx{WWW7Sz3S^]Kttj8880ec} VP<ƚZ8;9Gᅐ0t G貰$ oqssFu|||tԮ]UVe˖-ߟ5jиqc<<<5)jf`=z4cǎeŬZ3}tׯرc9r$-*Vsa߿ 0sLYhvvveZ;w-!dk r7<ٱ@RRM}{vDDif..]V-oRRS C6]v IDAT^hgdmtL >>(4 kkkSX@!KkkkC+P.**11txN~Ř<qi~?vlL.΅b;$AZZ]@suuرcoԩSdzfVѨQ#> ۷oޞ +hР?#...Eիy]01U'$$g*^''G4y͛^<$dj{}HpΆ髭-n%pj-۶ 66,C?5իae\dz &83}GQ &J !@ (%4P#H)6WTPgA"ADAAaH E{5Fn5>^fgg90Ϝ3eO>÷~N#*#F5 Ul( ¾*""γ 6Ԡ;C2VkII~zU:e淶&##.]UVkkk~ .d`_gϲvZ^BCCٵk?p)֭[GhhhST7pŋIIIcDCU~ qQr5`}盯7V5:څ}{~kZHP&N|Ih,w B/ү__.]/l5[RCx?I۶mh4PVU+y%ŗwp]9Zʽ[yo1ڴkϘ{c=Ҡ%P]taѢElܸ:} >˗|>k,4 v}cDFFV*|DEE@>}?>& 5k#`oo3gǏYv-'No:EQ諸P/#|t:#K>fp0I 3\ BQrssUYdeecgg?Fѿl xE!20kt9+MS$er!DHff&ʪ!_r쌪OQPPPaN8ŀ`bDN?DȈ߳*wQgk(Ͼ-sVT*5kV玎mmmk]ne˦;8:eW[ơݺԶڴÔ;SKԍ W*2{{ܛOVK1(S66-r"Gv'e&4X6j2@PPw7v3s9,J!D$Y !0w ڋS'7v3)ii@ " 0 M۰ngj hMExyy536t]!ٓd%IBa$Y !0{B=IVB!̞$+!fOB'7zMBQُ///^F7j&!nR@^] ۰ny!J+SUQd˗.yYIVB!%g%IBa$Y !0f}VǏb۶xz=JP\EQ8rQ3gΐ&q(b1l***ԳK+?`]!L>zSRČRꥎ2VKpp0s1JbҤIܹS&dUE7d}do?qpz;iG̵CΖ-[+CU=O>c履+cݜ9{g1y<%{I8p>.\dY՗( q>Vư7a ( Lr?@e ȧ79Xak0 .dTM;vQFKپ};Yt)z"$$]vy9ƌ_~iIQ _U-g&N8V_O;|ڵ?]IMMeg0qxMEtt Yٌ?/OOc̓=JDy 8p6nbxx3uLRRRg߾pKLLb ߏVѢ 6n"1)1B֠L A5k:;JLLdȐ!ݛӧs}q!ٳgk֬aܸqxyyJRR <ooo>c&N}ǩSqMh+%ǩ$V1ՀYYbeeU]Q@Vt"7o/exzzbggǜeKW[XJo`A=FS|Wܩs@Νǟ' f(,,o+Wo޼^x8|0k֬alڴ=z{n:Djj*̟?֭[c6lexh:KNͣUc8I&+ww7X<<<pvvy@CllEE1t(wQ ??T5_Ll,|ڡ( * KKKni]o\\\Xv-ƍc111zT*ڷoo0;yyy\zhziPsìMTM')!wsLVݺڂ/#?ho;v%++lKZ||͛;@@@ (²Qt:JeaaQת E!1QT0k,MFqq19sB\qss/[U<֭/Nk5iQI-$_ 9+Fâ7^cћKY~W\%&&71g\4{VZm Kl#2ӧϰmwt:]fĈP6U_OjMo>|O?HT5~]M UvQŋ…\k.EOfݺuꗭ*?~/NǕ+Wݻ7~iîMLmKBR:z$>^͏wtMxɡ<0}/,\@`kU+y%ŗwp]9eQ着|}|[ѷ "##i۶ Ɣ0[eC|_^]ta͚5<#3p@̙VO6m… &00#FBAUJe&9 ; A)..;;J-,0l6Z a!accZ]}|ڑ͠_Qwgͧ( HHHCѱs  h4T*=zP?mԩL:ww7,V[w| գRx~ዼ :d)Bbb3f>LB\Կ>qׅ(<8paÆf^z%~wꫯ={6AAA̛7 H)⋏Rgj o( 0os;z ԡ(杆J]\1ټy3/_NG^X~=fb٬_#GI׮]?~<~~~t! 4ՀMUY2QՌg ( {caax? EQg=0 Sؿ?\_#G3v</PT\3L:>=^v܅('$؜t fhHφ o`Ξ= _u8r(cM (3f>̼ϱwףup"ӦϢg=^v={S/NBǁQD&MEQP2DF^`!qܵV˭x?w<5Y2Ḧ1nnnT*j5~,--9r$*[o޽{}n$e&ʎE_~'$9.{'NR_ذqGÝfBbbϝwðqZ4);~AAr&Nѣ?1`@?fz'N~ ̳ Vꑔ M<Ѫ0ZpaM$&%ոSQ27~"^,ƎzzܵT6| 'gYDGǐϾ}=+;2ϝ ''&ˇa+0g8Ȗ_3P5Х3 T*w@Zz{v={R(**UV^FnN[yR˗/OX%9u4+Wݒl^DN;g7~zfis qqJϗ]~חei'F s^K;v---uZG: v-8ePAwvvY?ׇ8ek*Zt ڵ5Xߧ(O.7t`LܹHJNs<|o!,<<{wG}W^y ͭ1(Dـ7ߝ}i׮-BrY,?~ 666lի5+++m|ν`hLӑR ,GGΟ4ر'%%ӢE U%+ZyҝVmC6٭GG?B* ++@Umvgegt|k5.wU&L#!1ի؜\8:)¯ʄ  c;wӧ3gNc6Y*eejW.ֹ&wJVoϳ-jT^^^ ʊ~I\\EE_,QHGGqV$-K :}UDDg6lA{*J0zH>§m$*o. 7;UL!!C8} ~=:k毶VZ@-QXXCf۷12mNǵk2 򕫬Srrrؿ?KƦ8nnW3i$,Y'>>lz쉏K.EQo_ѣBTJj2FY=/OO~k1|ݻ1yDvEqiќӯ__.]D@<Ի{y<mʻ{ ?4#rj{_1yr9^|78z/{_VZK/cƆS&1sU&S'GGsrh{+͚ޮ_Ov-‚֯e3—hѢ>-( NW~hŴmۖ޻vOf222={6gO?>˖-c֭L>?ggg+\\\BTMw`>KKM0I*@9 LRBLcJK~~>F?W[:J'˗kcccFy5s:EEEt Vu=|۫=zfqh4޷M!ɲnj ] >>S'B ل8uIK­ds118u!#JY({_ݳ5v g_~֏4ՍTlnDV׸l]˭HR/_mft@^MʭWgDe,W aG+cLzp:gxlɗ6q>k?Ņ-[6hZQ[y3{BQEUVW)Խ?C3)B3&?(IBa◂%Y @ԉÍ !L.%5d%DGOaG ~UsB.]Bang[_B!UdPB!DEJV 9.)BT$笄B=IVB!̞$+!fOB'J!ٓd%IBa$Y !0{B=IVB!̞$+!fVenB7~lsnBQ8iʩB$笄B=IVB!̞$+!fOB'J!ٓd%IBa$Y !0{B=IVB!̞$+!fV6vI<Mh26[N@^S6[~"DT/';wR{$W1[62FM4 cZIVFRHLMObZ?Hresǒހi$Yȝ@TTV!.>nوΞ9SLJnCt8pkkkٗVZRPT&ZFT*Ru/ۑ/Iı{m.O*{{Z%%B1Oo<mF,GХ[wڲ /µiV%73T+)jYc;|Zn:=r괝߾,3lX23R b( :ENQJ"93ӗ8GAj4[:RT\D~a:E-HɑM/N vMjV ++j5swe:8n:Sj6@C3(*.p޼))IDATJZİ"Yտesǒ\kQxx[G*%:T* sPaqPQ@QPOl 7zv DމC)@/[ /\#q hwE5:4S3*/6o__h/Tnjނ|oY3sS<,rsrP;5 bZ],~*:y,]VIĵ%#-ɨ'xŗrseHEnF2~q/31HzVF2%>!D̛iR#P`x2VE)ե3t1PGV%h4}٧N(\pwww7w]?a!F_]gJQ olO>Z-[zU[(dffMV%(BAA.' {Y)wf):[/c8v8:nݺ[nֲcIOM4bk>YYY~RIzB9)?UUq ܩ())ԩtIQl._͚53z=JzVF*auUyx*V?IܥZ m}/DS.q7 2##)..6({1\A;fvM:k̜0:u1M;u:%%%ܽ} 3w%66ڣV- `'kxWHLHuNMIUah4&)bZrwwtDoJS,NGaa!s|={;+܇_y EQtkL4Q$ 6{IܼZKNNE\xNpnzɝxwV=K=ysR[~bigcᤦרk2M_|MĴ:ɓ<ڐ8doŤI0^ڴO/OzB/r5c EG\\EEedk7j7TƯ3ELکStJЖh ֻl)]:& t|;BcYOqwp2yMϿ]W3y{i)_*xWط?{v{o mؼeKnu!ě1JNIfx(5co?~7WL>Q$''aiiQ*={ػg'b玟9!=q;3g12{Ò%P[=5a@cAEN@]nUFK8;9hPTtȱ}mՒ]$'kk+,--D[\T=Jp!Eŋ"Ο˓|Wt:ΝEiۦ ;wÃNb8( Еx{k7^?LL4nۊ;gϞəQcoOllL)ѯ@}>^͐!hF|nzMELʼi rWʗ§mMoڶ /(0N>oqEZbgA"_CAA{@n:U2~Ee1| | ӞxBP1ld&?[M(XX)jt5 Ю][,-, ❑ɺudG·a+uG?N:Mvmg^|Q^Xӧ|]BzVF2ӡ,--ku 88:bkk~hYRJJEAAiddfR\\LII塗?̧m4x(=&{=cf惏p\D^^;w&%%>a?mQQe(2hb]r5'NRբakY0{*ym>=4\\ӯ |}pnޜ#ꇨ 9w <=!c+ȤʷÃݻvbck_: Ņh1iN[K ߿ݰ?Cosǎѽ[W!))qN$Gw6I'0G8rO~m+>EnjbbcY-Ev>{\FKdw8w: K((.!>5Ș4"ʙɈDG]Ί֭Zaee8qVK;Vw۶mi׎O۲6w^7zӚHH7||ڐ56xzz+W07''-=KII y\C\\"Un?+vvvAQ1Gh{7~~EAVt"!<_mO5jR-h(,,`̰Al {^;W2o,x/yaT*:"=sg),,-mv.]ן}G_r?XZ]9y8F'g'g%_n ..g'zꃍyYFFԴ(Ž:uٳw vWcYyy4(l;ɹJwy6|NHT*x{{zU9IM+/PxTFSIIIÏ?Y(Ky}רF_Җ6mn edfbkkUmvrv"3Eo.ҒDMU# vǰ;9bbKtyylۼkޙ¬trrsHMM͕-\P+oT;u4 k12NNqvvY_qG3^˘ڇy.dX//ZAVW Caޓ+v4k@jr:-HJL߿v888[z1kg;˳G`Q9E 3l5˦%L֪7gϞϝy%LJejMzz:haVKQQx|eT*|ٵw̔;wItԑ瞛O˖-oj6++٨ۏuCck_j0+(Iy/-Z0ݍ|2pr4\wEQţ܁'>‚?H Ǝ,$+#{t?ng`@4Nay2>n&'rGo6vifsf2##;H"/{]۶x{{caiY=P(=@@6gɩ}qOkvv,_VNN6'O#<wP|rsrjT*233pttFRONv6_qrj?VVWP^YL;2ҒMcS{/6$&&1ޓU?68ZJΜ93Ospp y{EQHLLE \ʄgIHLdGkyl\Ο;Yݘ1N3{{&K\< ޝzcieSe* m~Izj?ƍGG,, 5v\][iӗ<,xܹ4 W։sN=<>'g' KY1[?? g)X%..L6)#rkoO77vΒ[2}†Vr|$ZyᎥE`|ASQ d`N97۾ky77oʠi%ƛpa[F V/u-7_zo9L Ă~ʼGpy||}j?DP>deGJr{s~Mס-rb$GA`ϊx!c{Pp֭oYflڸ;DE-s\~|`:t0`]t:E/72L ꊽԼ}7RLoT; }mI8LIqڢc.yȣ$^8FكDǕ{ XX h4e._Btt ?yO=#l"~1;^/ Yf^ Gq}mХ%>?|DU\DΗV25Q8:9RT\RFS=w>m6|W^}$66L<ӧqBQptt$;;_`W.e*Ri(ѡ/g*OK} "lJ>[ap~:˗o3 w۾&|^Zl-<X[zϽt?Vٙm-K\A={2`PsMvΠS J5h ˖ɳ-`7+-_ICV0/YJ"Kg>d :u$|~[;,c3ϓ Κ#j:}}-.m\۷)-,,h޼9Kf]8JHvH7CuGn >aCЪ7NNNOZ/߾ѣFboo;˛( >B&OP@lw=r|K PGs>ch % 0ثFs5ڂ5_gMݚ[a: ͔)7^bWW%#[EKtHQQ/xw7:򰱱fEQ8v8f<șG),,Dј9uX)}~E:Wcsfmr[zy'S+7deTͳ5Oo_cA9w$3EQ /' K-Iۿ{maSĴ1+KQ QTXYYݰJd .&*S}3c;-|Z2xg)p ?3ocϵZZ^`jV[[F+i_ vlͶoYK*N۶m=室t4V23#!6} b 1[ț͝ ҲOꏋ mٹJ$T`mcmI]ʮxb {jo ZUe]zrc߾Y3T* /e&)>SThE^!5-g8|EWe]uQ!^ngckS|j 5v._m(#KK X˼]\v]q6*Ʋ^s XbuGdP~~\ݸO_ǗoDquumvɑC[\L>wTK&i(lœsoXM1dUFV3bP~7Tt\r773#3OW9aPTh\r~3bX LoS [YYޭ}kLmba񶰰˓<2$4 66l]!YPvm sIV2r"Gw:w =u…'&^2kkk\\ۛ<"/\Ɔ.x[N&*Jt5 0N_ w*ҒÆҧUTI;99qgde]nYgggןgBA~YԘ*u(SV쵿jPClk0qҒ kk*U[~\]E9DLqtea<77W(..X;h,-3(H7u{){Ve,,,pSDKNvF˖&Zm1i)?۔_9Yh4thOQQQPԶ2IVFqk K ,,- Zh?X}HcAc ndeГ17SӓĴaI2Rzzzc7ɑ$ K6[Mhr$'15=iÓdUG^^xyHLMObjzӆ'Ba$Y !0{B=IVB!̞$+!fOB'J!٫tU费{n!N[iZd5sdfN B!jCB=KM}McE! ؏!hrԮlKFIENDB`grhino-0.16.1/help/C/figures/history.png0000644000175000017500000003375611436423224020327 0ustar lerdsuwalerdsuwaPNG  IHDRC$ IDATxyxSU_7ӝBlVJU@Ď:2?t@ •,lj ehZB=Q6iS䢜!=s7{=[dp#aڤJ|vdYÅod #2$Iy-%׃JJʁ::q'JYyWjꬷehn' pS|Zp(d xTё%9HҍoGϰX *qWHdYğ8Ï zxv>$c[GjZ-2^.|RR"ݛ4(#W_Q~!MxlP_,8q~ʊ6?,3OGʾC]VccF=??J^ #yN{F€DZ߸V•4~ڲmZT H8k:Bu NYnj(OA|:N% 0N:>eNVEr| HW'vsq=-?k &麭=aDu?**9~&ǓtwatndpW LzrWX0e z2{}GΒrYdpEyfgFc莹;AC|,WȠ֡ j.ec\"emH_ʋ79-ڶ'-_&\]xjx$4|V2/28^(D%ɴn}¸Jȇ"ھqwb@dg⠆#{"B2O鉣:juU_=͓":;}=- _'۴Dҕ``Wϧu5K'%׉;vd?L U:&荟{Fei!зk;Js!j&, JPnZM~NfנGW/z0ӟ|VTVni u:j$5qP@kEviN9ϊ;YcP9Գ']:w$2%U/Ū5 2 .Y?1aHD 6|`tۭfY֡ThLOѠu:5/ȴnՒċyxz6!Ǎ!VPCv-CCpvHD^UΜ=3<ʺJ0$'w$I@yaʳTUmHYo//RgLSaw?ɲ/ i݊OoI͔SNX_ ݌vUܛO孉V#i~ݏE~çRqtt架}two4R_äWUY,IT'&#'NĨ,7=Bh<6+6|qh5]m%Uxz݄`Q: kKzV^>p!U½pΥr9=|sgoGNӷxxP] j/Qtf!MY+qv^,q`__Qc|kLoW6j5TVV^׾WݞMds4eWH?w;},Z!ׯQZZ+$wԄ\˹6wqǝs(ʽD %'͹!JťtBuյmN㛯י=fV>}MsOJJJh*x,sz1JMљm( t2JJgg7 pݩ *YZL(4Z&7W ku [Oey 2*$Ig _ӷ6]ѓ7]ܼ vsuj*qtrY뎔\GѠRPxx,ߢ#H,/%Ek}Ж6Ս6]T֬)cDqWX3GgW\prvɩ癦[|PG7SQ^^Fd-X&WE4^^Ȳ7խMF':7t:Zucح xxuhQxz{8l8ƱO/2U-]]]FBdIn%t:-nnUSUۻ H/o@RKAa!W_;9*5R=]~iTO]WX\V(+.&35 'gw<抳*ylZs>r8:9Gi+gscUH$hDkլ4L'08>3YԘA|JOkL >9u3!>Eʪ7ŧ;ܾv( !c 33/[N}%䱚kP{rKvHNߨ:u55&|w kWo6'PSc'Ҫv|wEydjlka|NͱFj*Y;@̶nǎ3LpppiӦ5Zׯ_fԨQ*N;h4rrr1bׯ~4/331cƠjԼQNjjLukY+ر4233IKK|mO(Im۶@2[.ƪO}EÒ4s5pN>#>#GZzigȷl2tT ^`ĉǓJZZ={4Cee%ڵ30版0%001IWJuzm$޽{siڵ+W^%;;lΝ;ǻヒ.]2J5G BM1/77,dY&++{0bf͚_c=Fjj*CeɌ;?|g 05k֐a<7{.zl 0zYd $q]w~zOSO=+=?>>r1c}%00Тs ,ìIee%?I1cOωKLL4^u>øk]<{P˼넆r%xVZ&|%00[~FpayBfdц;nKKK4iv">>Gr/_nE n E: EAAA4{6Zasm}]M2r?D?yyy;2eLl1o<#_v qG>qZh'|Baa!{fʔ)-<F$BBBܹ3C%..o ,B5$Uݻwoz]oZKӪU+>Cx &NH`` .4{P, <יZ#.\31c=z4%%%plm=v-/g_|?;~T- jj23x6J%w[v܏`3)""5oAVkҤN.O`!P(pp4Y9t3`MPXkxGDӦMkϐe .oMtt_~'*4g} &oovFSS?ξ}ϯ3mu~a ѣ&$$]믿6VZEǎYb/2\~aqHv~ƍ_Yd jVZe6oN`` $''~iMwq%._LVVݺucС$''SXXK/ķ~˾}8}4lذ:aGoiHs+IXjJU_@СC ǺwNzz:Ǐ79CO9p+VG4mڔ( ܹs[ [t8z gر@ػw/&o'N0xhTydddG*ٳgh4iӆӲeKf̘;WҭVbSRR1b/"=z0N?9?????8884zHII7$++D֭[͛o"bw~{'wީ3,DDDP+IZnpӿNKKOOO$Ik׎G}/TP/vO 6%K0gΜ:#7W~guȧ7ۺu+tY0gg[VAحáa…|!]PP̝;OOO6oĉYx1>>>̟?|)hvx뭷,ڣEF8,G{$$$pu\]]~v۵"=V)GP?bV@1!'P !>b4!BD>b COB|PdQjj*ӓ~lD;v NG׮]iѢ!υ  dYf˖-L6(2337o۷o׷Vzk9kaQT$%%1eô.Bd1k,~m&L, 472eʔZ@$2%66vȑ#{;vhٶ|A V^M큛EU*MOKZhA޽F\V^ƍ hݺ5ׯ 2&..___n=}WرVkXTTk89rGGGS+:g0 \pPl7,<==̙3b9JJJpssCR^ӻM8ۓɐ!CX|9/-\៛+߷yۍ~,[3g{Z@J^^ʵZ-4mh&uHHBt%# 5]CQQaNhh(&[Á(""@֮][kZҥK2e g޼yc, ";`Eff&g̙\~Lo "|Mf̘T?T*nG}Ė-[.D `ʕ+y饗hժ5ELo "Ix'Pռ{̛7Iܹ3֭cǎ&]+ԅ{Z￧ WZ#$CLL eeeHTkM1c3f Ÿ,v@D<°+\쇘X P !>b COH" COB|Ÿא >"jziF8;UM6p?/99C=,^vq󉈈h~9~=UV1m4wŋ7o3Z* vZ-< %%%@3R۶m# ^źHZݻws5ѣG !Qdɓ'f'I 2Đ{\|'Nйsg~<$I޽[)={YfSo3gq‰'n^$-[$ }|y t:y?~1sy~mՑ$ L`yhۺu+pRO$-[4h}ΝŋOf-Nrnݚ8nQ\\Qں0Fr}H`י u<-ZjZCk8N?v">>Gr̙:g2KdQ}oΜ9<쳆mPIDAT۶lStFBBBc "=[lͧo3:صQ k8, uFXBBBc "=/_ծtqq!$$H`kaaa rVϺO>lٲAH`| qGfff$}Ö8>Tsg%OQ!'P !>b C8 CD>b CO_EF8RRR~MQ]O!bw}Áh̘1ϟ7"Xv ck4]mu>):ҁH$I\-u>9ŋs ү>sL-WLvu 2i&yl@$˲+n?m۶D\v+ԇ]|~܀~@PW$kn?v \dY7$'' Fs>gggn?QQQ&ځ&5!s9y$ŸR۵[u I}H$IGp{O,(@1!!"@1!'P !>buVKjjj-!G&ӁŋE~prrc6ĮZ裏 ɲɓ'1)>{:mذ3fХKhҤ [nÀ6ĮcC aȐ!@}RRRxM,kRVVF>}ؼyfuQdbh"~mڶmk2%D-Zw޷$IIRR9rDrmbZ-ZDv ^g~h{8$''jڵ+2oIعs' ɩ޴v $#2eeeeO8*++9q111P@ԴiSzM`` ,`̙$&&?n:\$vwΦ͛@Ě5k6m}̚5D!!!ZޞDQ\\KxRg$u !'P !>b C8 CD>b CO_EF8:DBBZBG8.^ȡCtٓVZ?=18MƸqF-S?~}ot2yh׮gѢEkmܸN:i&ϟOn,v|,^Cѹsg ѣt޽Vk8 %""ۓ@EEzs>$Iݻ'OTMׯ:u'`ƌ,^ɓ'#2Y&A]JZ6D)np z*˖-c턇Ҵmۖ~R6mD $lv]\\OxGKtlhqrr⡇5?P/Z`rJ~Z-O>dc.YPvu *//믿WWW4iΝ;z}a)hvu Ǚ3g8t~!AAA,]l:lْ\kh4}6sLV\+oJbȗCXXaI'##lȁ]vѭ[:#_ /;^`ǏÇhJD˖-9._`oψ#8s 7ndܹfU"GGGΝ?dYCRyf,Yž={̚5yQTT;СC=nbG-;vdʕ<㸹'Lo-gyZ… 9s&$ѭ[7lB.]oxgiҤ NNN7>W, p<7zKXsc„ <Ӕ!IFyڴiÞ={(++ЖjQb$Iuw\`]STb COB|DOB|(@1ٓ9))cǎ̃>hv(Z鏧s1t:]vE&h>rj.]!6bI/_΂ "!!`6oތsr *//^cÆ RHJJbʔ)̙3hHjj*Fb̘1fgX ]p1{lmF.](..&22իWsϙX"YMll,Fɽرct u cי̧Nӓ]&ۗ{u;Inn.Wfɒ%nݚӺuk>SN裏Y:u&/EEEU?+Wf(̣@TL#GH>}jСafrr2g4kp~k{_~>_~lI,r 2JJJpssH /пƍgt~IXf 1~xLGEPͭCPRRªU8z(c?4Ů+--_~/`Æ ȲLǎMQDD]ֺݥK2eJKKС_~aGD \$v:88oɓ9|0| ۶m3DsΘ1#GRغu+}[lcǎL6Pμy5S`z+W /{ŋԩ<_ߊ$I<j{=iΝYn;vuX;EFFrQJJJpuu{J+I111- 2[oe9C1"77z@9b COB|DOB|(m->@Ʀ#)))$%%3''$h޼ybRWFM6% V@d_l*++8q"3f0J7n$<<ӥK.\hS"~aÆ1zh [nFD&KOOgԨQ8pJJJ:u*Vbǎ2w\oW_QPPmW^$''sꋒ}iiidddEn:t(ΝCeі-[8t^^^YZ_6ߢE`ɱ8880tP$IW^l߾d9Յw j֬tޝ-[rĉ:g2*ߟO?-[b ʁ駟68 "cow̙9r 9#u]Fm۶,:g2*@V3p@$=zʕ+=zp 6_ppLE4WWW:ٚXÁfy_{yyQRRbT@d?lv_9#X$<==zQ+**lu Niii}.W3WFvh߾}e4Ɓ\ٺu+H!zI֭Yh,}v>|xeDFF駟سgQ}///,4hL4ȁ˗/ ";`5#$Ij6mĄ Oolp 6lPDtt4s5$IbᵢZ퉏E<2r>sXp ?9'<%DEb #={Zyu@t;fo߾Zt~Añ*++yfuVD$q&O̜9sꫯXb-[4 !6_FFӧOÄQ󺰧ѩS?~3BBBܹ3C%..o7`SZDT󺰕@VXxaaч~oĉ d…Ǣz n G3x`>=ƌØ1c(..M,9YDS8b COB|DOB|(m->@FHpp0 d~kp=zNWsOOOIIIСCѫW/ h6ށի 2 gy3x`>sf͚ž}Ln nja\Z=}AR۷/۶m#!!%KرcL0AφD|L2ЦM(bccٸq#)))Yj/Br X"""h߾= TTTЫW/dcǎ&=#<# ,ܹs,DX`?V7̝; Ll&o̙m6f '<<ܐݻs,'N$:&''UVnʲ̜9sgbZN$syF/HM/#??{Dxqpy/ѭlذ5k֠V-ZbMߣ>ʔ)S={v~z"@T{1ӟk1zMdvعs'ƍ?&&&U$I2r j޼خ]ѣŶu Jemưaptt³v|İpBz!æt :~8'OZm@Tiiif1ҬY34 ǎ3؞ l"εkט:u*SNꫯZD5tKDTT{ʕ+ӢE q˵vu z뭷,ڣzHkR:͛779 "خ்@1q[؟PKOPN58ڕө #&)*C'u2Z,t:uLnnN@!'P !>b^|k}yB˵ŋ9{,ˤrA<==ׯf=4?ɓ'j> 3p:]oe$r"m">Yh4\dYf˖-L6(2337o۷o׷V9r 9r$Z>aÆ5Nw*9p5+jc6ieffSOvs>n֬Y۬[ݻwƍMS}fLAA#G$**Çagr}3lBJJ .\0'=4Nw2WҭZMWe-w*KXÁTy5?I_$6t|.]*;vj;vr@ٳFCCC3Ie$6h9Lݲ$773gΘ,Dz2zhΝ;kͶNa5PCO>e˖1sLvm8ٲeՙ>}:,|ruSpa5LPu5_˦ Rk(iTb 2yJa@1!'P !>bp[$31SZ4oL7THpg#npuΚU.; )E~{EIENDB`grhino-0.16.1/help/C/figures/pattern.png0000644000175000017500000013006411436423225020272 0ustar lerdsuwalerdsuwaPNG  IHDR1r IDATxwx׀iZ*^wE@P(*Sgo" E$t!B/tjzٹadwSؐlyd{9wܹ3s[؛-B [=߉zd9y\=}pt=?Ѷк۩ls WShks$]J]Ym3[cc*.\I`ފ8Ws/U\ҽ)~+vUJtW'x֪Mɵu^VKC78}91='z2:!d=ƾ W`݆M,}666ԭSWNf@Lr/M(-87ekJoYP71$[[[#mwz:;_C.\rAmTm*9f9/@Gj;[[N=GVj4+|!6EߣqZtg7e 4iDN,h44 .\H7hٹ_xXs)wpu̵>paphXCl[5grr9v&}3*5o2ioƈ˷n$GvYÕ;8tIy{ %$'O_Q`m2sv#+;bD;s5O6]=hXmխ˚S:=>ǹ~+ ZF'4@x:Ҙ>bY94nP>cAX7o,cTN:q#s{F!19F>ܾnv{̥(TMOh.F!77rrɦc<3)\>*xթGn=qRҹq#8ukQJI`g],ש] C򧰪r-f/\&u'pQ)=Ξťj lm wZƜ_Vk%r5@p\\.=HMKZ5KmUA&!kt˩iTuv,]tU,dΜ=G8]HH.magAÆ\L'V7w6cǭ _HLe摫0tdyyBHW^#i.98bckOܑ+70k|XdAޢw0X7qϓrͭԪd*j\\ Y芳+ړ_2i8:W5ن\wg]@PT6ƎQQƍʩ \v: ӣS[w0>=bQZU*Xtiג#[$ 798UO\89/'_?Ƅ>qt1 Y0x0K/߽0x06sC#1{L&˹o%4X|lQ{*IΎ*xya?1~3ڒ>٣A 9{c1W;>}uD.[ޫ\66eh4/##1<Ԑ!M'nIؙKhd .t@?> UQ]d{ >z_[m5=j[Gld>tNI͎ݻ#OzaPQf{rhhcUM&N SMVvk7/?H=CU!KN%ʆ;]n2z5utN`v8ܝx07/QA+vt4>5vYȺOzzvfjJ1ğ?ӉSUDۿ1}HrWHKCek7Ukcooǹ=xaPs4kKՋfKIIR\HvU41h%## r90݄I< VDDP;S'8y]&Oƽ^# "'3p9+:~8Ws'7; IP;9v"yreH@.f#dn5SW[A@nfߕpT}5^> q,kW#kUκW9j4 y9٨ll$ !d.hLH{8FBLIYh3A1ԏI}(#1}RR_A=Ԝ!bnƜ#;;<@n-/nݾk-e..+`תΎȲ@e#R$$^vZ!$IujT,0nn...br]vvvTN>-vU!@Ri'U]PRwAwu"T(.Rj5_H/:{iN~1ka#*(o$TB G.7@ h߭/:+4'M$%>XW]|3Xsbٙ v )tNLec` Wi_911WqbHLAAUw8THLAASW)#1RJ)((XGbV:'vR o6jժ=>99jժagg>Zjj{O^TAί\s]1&2G3طCxzzJ7'6맟ٱsnH]t/gL*}.6mbvWsNIΪP*i2URRRճnVSOqbFtsb_9f.66|{r4ۿ)(#>!7ޘΡÇFIB$;}OM/o1+<}ΥT*~kߜ9qO==m;0hp[mG _"##fõkBsnut̏fz.YY֣ww趟9sG8h(۶iJk׮ėx3;ws9,mȠ!cQy*&?8vS!/{':bW3U_666V;L:dBu,s)#F 9|oO< OOO39ƎMx{ƛ|;v\W^A)`y| k|wߦ1,t̙#]vf őbRL֒/O˫&Cˋ's^$**앫`^6- ]n߾M\\~7x^}c*g+&}ωi16Bf::%$IߏÇ?/QTGGGc1o @PPC1j4F`t؍niР;w… 4lP0>9b8'Nvחg$Ixzztx777>]'wMv7'y&4~j$Ǎ)s*Xcׇ="|tT15}.>JZAVVj4:deeagg<-_eQFGl8::=>33"ӖWyorbWxz峟3:v0ۑĊBBL0SI'%Im%r4iJÁɑ5rPW)#1BSPPj*]PDJQAABy:`(sb V2'`(sb V2'`՘LbdYرdgg&֭[,t6nTARRrHPBp·n3tС=zLIbʪ!srr VZ]$ŗs/<&$ĸϗ>!gcǎ+w?2)&2!GxJ8bbNL?2xff&+W OVqק|8OH`8t0P8ʫ,L{u233 mW0Mpb1H]&`܏Z`*_~ßV婧rȧFϓCЧأ I|a?9:o '7W' E-[D]Wؘ;bȓ mW0Mpbm?4Ripì~98{~~IM543#ݻ}Y<15kz3IINRR2#MN3Gnܸ+tܛQg25 ָBi0wR l|Ԯ]hi*92l;wC0,dn~1O?п/ ,Iذa.cZޭ+;u⯕6plh -zOZՕ62tȓ2z쁇ǽdOj ȟVP?0m{ObGu<ڵ8tqqǧ^4i܈=q?XTV\Kb'lg3/Ɛʿ;vҭkjN~}+ữ :LQ'GcӺuK֭;TČ%QQQW└Ez۷K-xO/GfE34zQ/O@^~SX18yY?ݺ[gM>kF/VGcWՂ ߗȃػwB~'nܸ/yi2m nFeĊ0g&<[6o` lg=C_VEqbڥ3_~- ^$ _γ0:: {{; u0mǏ?Iztч=3~ܘb6hob bӦͺ<~~&Qռsxx3ӏx6ʊM坌>s=VʼZL,q}m4ߤ_RA0^u z%W|X08Y2ߣ1E/P<*Éʼn)((X5SPPj'`(NLAAQU81Fqb Vʼn)((X5SPPjcǎ[$ήD!` @JuUmဆ ƍ=wuP[ojXO遍*?nXzF:* ?=|Wh߱ -f͚ k֮NfM9v&')XXz%~@~6?kɑKTH $337o:?={vtчOϷ.~NLxT*C &!17n"` E3gFkxaK+u"_25X77qNQY~5n=Ю}^yt/Μ9όu 4T*[a2'fAYw]< gHDZjm[4Ꝙ~ 6oÝ5q1vh6oZ3/رddd^~y2u|{8880Ixzzyu<{аABҷnp\]_',IKKcX(3Gvq#99dN̂zy4RzLAU(>V};9טč7iwT*<޶ AA pw'!1@gg><==t)wERQ[[[ޜѣh֬)WaXB$$IPN͛MzZpuuwF$Zlؿ~L2#,O&Oz@?];w毕޻o,GVVj[j[4êO$ITuuqƸ;8q>Kb]i%c[KӦMXhG!{QLI4zQ|ujժŕث+SBa 0ڜZYkK`8;9r`$K!P|ډuԱcY?̼iѼhNCC1z8E$.:$!1y0iTDzj<,;o>۷91%I9آR*XAA 9wx. IDAT]y 91 \LƆ_] z)3~̥Zj-QNfffbggmIQ;n˖̙7W.3{YFV'i*~ɢQRZ?Brss/oQ2dirLBܓ˗uv~m C|V$lllL:IW^%/e@$Ł'މ$heT*^m"gimSFbʬWkiY*cۉ=zJ ޮX$''SZ5.?lXJHOO;пpO߶ddd׷L"@iiiDF$=#G " l`gg[j! RZXmۄ*#߷ѳgD^=,uj͚50XF/Ыxq$nP&Wlm[·⋓ɉӧ~޾^ٽr %9.$B·n3i*UX޲>ؽd׭YOʫ?vJ[(\Ea9ׇӷ/qeM@2,KSywy@h_A̝ /<^~~w TRֈ2B) F?= $ ^zib_HJB鿝"o! *I"dq:Bٱc'CҢtړ~e&fMьzZ|u6]*'viőSZ9%0)YǛV/Lk1gcS6(NҷvO 7f* NL?{Yٴ<<ܩ^:qq~fCt>%G3A͔)/Qh;<9t8^^ yr}ӧHHg53ԭ[{x#~] W^ϿdY&11dWTxjF> /</ ލa!CBА0w,u3c%Ur5k4j;]"hP,D<Ė-[B66e"fooS^K9w<ݻu 55ը ^fVڠyp?N<|v‹yIIܸqٳG$Ԏj۶aPҥj׮EjZ*wu+4k˗pZ7\T*<== yG9 ww7232eYw߉{]}#;BlK'UI*bnS\^G6}zSB2Uiأ6^wlWTnܸ[ѽ=wCyy饩D+Wb5۫L`a& }N:җ$6Ӣl`|s6ޭ+=w>^}e B U, JEXN5 $lZf3DͰev & w M7b0]wRSLrr $ӾħRݻCz Fbwܽ !t[cZ޻bʾ~jɟS( dN...DEGt$jpR Ç1#!1y,`D>ј o|s+m{yk8rh)X5=)6n!ժU%>.ޠ~Y@% ?%Yܫм oڧnnnFm\wm_=J \֭ۛ[aggǖœ^Ş[o. !ӻ''O갵h4._BXbU!]97A91+qE˫=`9YF!&沁޽{mEe;Ų+ӧ{e $$$;NNF׷~}7ֵkyI:nS|6 zuWwx Fjj{2pRrɲ\d) ~?ʲuvdYtTtl(+\/ 4nĉFmŤ;bO!%P~E^@1cԨQԩϟG޽z21 {v\9>楗SF0vh.]{uC_^W`m{(rI tW <Ԁox7osώe@q)uJ^n.~we 0wu1W~Le+mNNjV\Ƈ~C oOGwͷ& DdJ/["6(԰}@+1!-_kc9::<<܌߷X6U$HI/lKRBlq~]HkJTQff&vv$D(QR@888 S!888 IR!t_zBZ.^eQ&)c"c---GGIfddr?kh4qtt4{|jj*jf(mB3ptTkJUy`LVc]=Kf/3K??$`BEaJޒ"'{q+a}we5WHҿr_*hV>STRT٠2u601=l`b9+Wσ|^zY2MqbʬWkiY*c'VzY2NC.Y6k4Tƶʉ-]PrZf-rڶlk*X#Y6k4XKN;PKĬ)ΐqIKu;Y'ʟ ,u"**Km!/^dÆ e^WyDZcLn׃ ̑#G(ܸqoA5%%ݻw[/B L}ɂ ؾ}{oJڠාZh?*Nyl߾}v0)¶a[@$%;~tX;H$E:uD:uDjՄذaC}-,"''GtYY=,ˢwB$q)ۋY8r䈐e`}V!dY~`z]|Qӧpss~\ }[o%j֬)ƍ'DHHr6( JR"˲8wprr=\S\q~!0:-}sNbcc<ɾ},^~EA˗ٽ{7={dΜ9 L\I~DL8~M6~ȅ ʬ!&&222X`gƍ:tP9mgwIʻ_k}YTXkjT*F"..0zХK6n܈cDz{nҿ6mڤ+3$$/#I9qqq|glBB$~Wx f̘%KtA ܇E^#""HDPPڵcƍeVgiBAjj*kJρ-΅\yF${N8Q b-p#_֬YC͚5qww'11^zꫯ GVj*:vȁؼy3nnnŮ]AaPogh4̞=.]Pn].]ĉzד>uk֬)tUOII~zp 40g`` 111eVgiЎT_V?B.]8pSNyF#By888,Ҝ9swyٳgpX# ELHH 99ŋRXbgƌHD9pgС+|3vX֭[,˄ӻwB$IRWHlݺ48< bܹȘ]'''mׯ_~zDVN3,K$I&mdee|rQT^͛73m4<<< ;;dykFgo߾<3̘1@FkbNl„ xyyW_}ž}hժW^%((۠A6oL݉ŋlٲ3grQ"##ٶm!!!źElHĢEqAAA"""ر>h,\777Ν; ][n`ye IIIQ!-6$ݻwӱcGV\ə3g]w}GvvI4k̠m'1Wާ~j͛70{l8wwab<,zI``  ѣL0={VquuԩSWD<<>>nݚ֭[\ k6m?Gƍ9}۷ol2cI̽ |U 2~wܱ:hQXƒĊ*ObYm۶ ooot©Ssϟg„ ǒ{ '0僌'_1;wBD}UdX2Xq3˪Emٳg# \nݺK/_mz,EIc5(2e¿8 JY3WE<ӏeeoooXV...HHH1X"^{+(ĉu6.6GqbK2U~l,{{{]9e˪QFffflz,IIiV ʖ6rJEebbxbM6-iz,IIiGf9Xo"##+M(Nbxb[Ӣ{PT?Zo߾|'tŢXҌJZ_<1{{{6ڵkk)JOqS !)u(!B`/XZZj 9q@ō'`H@bYIds.Ey6( Vʼn)((X5SPPj,2Aop@@:u ///zUqqq$%%zHKqp %k9}4^^^iW!.]"**?:xhڴk/^$221k׮P9G%((ZmPNTT^^^ܼy/^p6( {Sm= ¶HJ-w~dw$ oooQNQNQZ5&6l`tK0~x$M&qѼysq2eY[H$N:Uh{q ˲pvvG,oժ?,WYENNܹ *J zjѪU+_˖-$Ibܸqiڠ Z+APlp~!0:-NܹXbcc~:>,?<RU興`Ŋڵolll,^Wy"eN yrϞ=Wa$.ZE"&&:36lXh\H ު+ϒ!* ¢/`͚5ԬYwwwի*~- >pj5Vcǎ8p͛7Fpp0QQQڵ h 640ӧ-ٜr_՗osKH\Y@I$I4lؐ^xh8Ü yQYI* ŜXhhYx1*+VP~}f̘ qϟСCyWo gر[Y wf?Ipdʔ)jR)wD1SPN sOWcq*$Bի,[%Kʼn'ݧ8YqѬ9 &Edd$_}6 IDATuWd0RkР7o{sEl̙39z(l۶ $$_|{R}{WxbcYںuk]ʳ^ vy%fBh"_n`Iؽ{.ŋƐ!C+Vʳ$d+Zٳ' 4G2aكZՕSN J*ӇhڵkG߾}Y~=v_~1:޼y3̞=#GZQxb`.> ΏmٲZP6~Q`[nlZ7lt!JOL`yl`91ItWI&h"̦M۷/'OdѢE̚5 0et邝ߟ Ys1rHfΜInHHH?uuud _hB&Ooh4&P^=|||m z1*[E;mKoOOO8rcƌ1pYaBbկ_?[^dd$'OϏ]R͵.%%(|}}SN{B+W,˴i__B7WQ !8x e<1YԬYSԩSGxyy [[[1dۧqĊ*ﭷ5kƍAAA"$$h\eFO>M|eR%{9agg'6m*5k&oa ̵dY6j5SX`xQn]1w\]vvvE@E&ѣG,֭[Q%Byfh4:uXƎc@ iי*t:u*-Zh.\@ h=ˁ[nڤI60g#X%Bj*h4שY&@8\ELIvv6˗/ZMټy3ӦMbmDV|,V̴X ==GGGo'پ};jeB"(Vyx) ]ˌ7ee+Wrt!`w}ǧ~j6d jj*puRRRpww 66o[nˠA =94Olɒ%El 2گ_?۠2SĬc$:pi$Ibʔ)lٲ-[r"˃W|}}7g4jԈh]zI8y$S뒥 d"BGG,,Q͛7C' ad ::Sz'et`Wt`,9O5r'&##cȝ]#wb222v('KJJIaJerաxGD?*܌pߛR<߿IeEDhllDss3Fi疟}">>02Y0ϯʳI0CK#OOOڱcl޼\\\(11|A1bX>[,M<r͍7OTg~Sdd$ emWshB3 3f <@mmmzi84s`}:=jѺӧO r9jkk/׿PQQ+W ++`l;c9Iyb"<릦&\p7n{a`AAA(**1c Oڵk^x۷o˲ɓ,ہohh;.\ Ɗ$BDطoۡRP[[{ _}ϟAomml͸2 E #~:n:,X=z4bbbOݑˁf̘a}bs΅7'ѣpX;44T0R ƞ={0a466{Ň~2cHJJ2Zb_ꫯX&a/ Tmsll .q=z^Xzz%4**PybUeU[[ @znD*0Gll,ܠT*/;褤$ȑ#s.hybvbOLqqqxcĉ;w.:::@DpwwGss\1`8::bʔ)oQUUQF!>>8|0Lsʕ+HLLD[[_?jiiiAvv6rrrpMT0s|bWe\/Dkk+}vAF ,,~uvvh 3VK>1@)gϞ%///zeY駟ёv=`ڼy3,K6l wwwJLL$e)??)22Reje)""/^LW\gRLL =쳦 k׮?cY[rtt&q40h@39~:kFׯ_B۷/dbƍHMMߏc޼yӧƏ b̙n+;::0qDC=<#υ8~8<<< [Nؔ ̞= a$%% ׯqӫFb\4 {?O޽Έᅬqgɞg {>1uh=cnʻ~:J% 6k!vpvvxT i0u`\yF=A8q3\]]%]޽ʽ5;TFF7܉5r'&##cȝ]#?(8s ,1l0:uɫ+..Ɖ'0l07b7ޘ4iswBYYt>WT+󈕔boYI,Kׯ_9sR#GRDD)J,9(s[t) 4f͚EdA&''Shh(+"""ʕ+s׏ܨ_~ז-[DSe鋽G܉I JJ~&???$eIVSBB)Jn5U^{{;)J*++#eB%%%+??\]]X./BzĠ_~T\\lΑğ+K_9֊1b+l:c_F1{L$?Z[[]]]v aɒ%o6U^GGlقSN֭C~~> >"m,((?gyW~\x.]¥K,ޜkŕYfKX4ǵA90|8)Q"##t|JaP*L7zh۷g(N:^sU xꩧbhjj%uqiN_98q"-[m۶Y4O;}ȇfꫯ7 ((ؼy3m&8kl=)GFF/^ 4gxl ˲4ydb Typ疎͛4eUVI:9ЎߛoIHUXXx06T,7Rf*CAVCVgƋ/nСgFGGml "™3g8ꝌhNyp+q 7`׮](((ʕ+QWW'j=bqiAcO?aܹ())_=?Pyb٩7c ,ps?~O?{aa$&&bD{{`Nـכ-ׂ `5jv)j=b@D:9z~ 8t ˜ ˻L6 $$D90]5mۆA ϟǤIꫯbڵ((([nEll,gxzzGAee%> kDj[HIIAUUZZZXww76l؀;~~~شi,Xgq>۶mkii[#uuu300O̟?p%j,^8}4&L-[L(:#c9IywnRˁ96{'1j(5 ÇG}/˗#((f3<#11y^={,0yd888Vxe1{l^ۇvT*W_}ŏzlܸQjmmŵ3:;;Ena` ;4.**BEEjjjPQQuG0c J90Fbs΅7'ѣٳ ,88{ ؈zݻ~!P\\#))Ig蝖" ;;555hkk޽{1edSAFF.^Pw5{믿xzzc  ͂ի-U*222*0ѣ/3gDaa!^{59>8|0Jvtt <<iiisΡ )))L'҂l4n8"66h |Vk5,, UUUz*0 N8 V";;۷o7Çc޽x܎ŋa)f蜘ĄA{{;\]]@90QXTWW={'e駟~"GGGڱchIJ,mذ)11X|rwwH./]̙cwڵk) XoI=-N#FЊ+eYڱc׏ZZZDńzrtt~h߾}J)Ϝi.=)nrl#u>dbƍHMMߏc޼yӧƏ b̙ttt`ĉzxGLT&2|ڞٳN|a///_Kƾ{1P(غu+0`,^?d[[@fT*222+@Tggɞw7888́XĈ:3e~n޼+vGbg7nF>1aL2+p疤Z!= 222v܉5r'&##cȝ]#?(D” лwo`z?3*++1uTW-'Na0n888Xf_g>cǎeYtGee%ELGD())@!b@OL׏HC """СCoX7oҘ1c(44`Y,˚UҥKiРA4k, ߴOɉ\\\U,fTy,́K>10#G_p̙CT]]M,˒ZR*&7 S嵷R2bY._L...TRR"j]F۷˲TYYINNNTSS#j=bDǏ7WeY,+l1smذaSiԎXyzsm[%܉ݝWGk?<ܑnܸ͛7={+`G'm@RvY믿?O _n>1=RҫrY IDAT+o˖-8u*++'U%$$>êUDk880Wt,Y7#"AہNjhHcNELL/[l17sJDmO['N`Ĉ#&=q9:0"hg6s`8/^DSSj5vލ)SFGbBTT"j'ѣ =F-j1|p^D;w#j555ٳBÂvLGD|m"©S,صks` yDׯ7LJٳ:1k;:t(999Q7ߤnVQQAI*$;Oa>nkܸq:bC.+eYeY9=baU}@*cz%\v ...OLda,ށqa@kNLFFƮ;1FR<#Ӭ㨫Cqq5jE63[t*++ ssC"Bcc#1rH3-r'fSŲ,UWW0dK˞aY&OL Pyyzp!%o,K?#EFF|YfY^s184skĤsxVЀ&1rY+W|`k c.0s}bw9ռ9 "1 H=Dɮ>K.E\\ӑX>ӽFww76l؀;~~~شi,X SضmtZ>1Cy`޼yAn,f؎eY9?U}b bnh2vb -G>}sN3 <<K.DDD`֭{ "¾}JZ1g1wpp HLS;_C[[jAAA|9 3K0 \xQ:#Xzz^=** lւalܸx'$5"HOO@{+|bhmma#66j>1n5c.x8Oղegee?FVVwT8y`hll`޹{dgg#''SL?7nRSSj}ŋ?T*ek5J{ٸeرcMR) ԅ};v";;۷oכXĸebTiRWW___Pոy&fΜ.>>RRD^pBlݺϟo2 oluuuђ̩ #4sګW/>\N[n1hشi0x` 99aaa8|0={6J%FX ..NBpp0233Gɓ'RjB9ٳARR~z>̹: ,^...xᇑYf.}0 ƍ:t$sz'#1Mϩ'"Z9 "Ḁ0Ĉݻ7 rXI]ALL bbbl(222vdFb2222w܉5v#"ޘ4i$'J-|bEEExeYDGGcذa-'Uii)zέ^|bD2~K.<6DB( DEEd>1e)99BCCW^AW\)`'fn XׯӜ9sHTȑ#)<`YՕeYH/Dְ,K?39;;ӤIhѢE X mH .$JEZϏ233J%˲terqqsժUNUUUNI,KG_}ZM T*ESj~npИ1ca3gMhl3)"`=00`k^^^t钘M)|bD @P1>hnnFZZRSS\'&U6\ \tσ>1sn<Ĵa|8~8~ie*v KS8x V\)fl)f ۮ|.""w?~F5}b$Q6{AUUQ^^Z^x_ޞ~2.o|:u oRRRPUUID a>1zʻ>HD?矗|ڊFvZř90tȩfl,5B^p,Y_˗Ԥ]qe,X_XM)֯_K. b0d{zWٳg#-- 6l@`` `ƌⲲ&'OƐ!C)S ((HĜl2O'%do"0 >1[!dL0 f{$sd]#̝ wb222v'e"44T"HEEѿ s>1C~gN.[@D_i؈f9Ro[mke0G175|btMK*s݉OC{[Ĥxd,ɇOQPPB]vAVj%%%ذa׮]Ú5k{n;wıc,>fӧѣ',Y2#++ ~-gϞ,@OF~~>␚*?3f̀x N;lͻ'赝\R… M& l#իzgM 91c=eO   "'tiǓs=,WOaINLsOi|bon7nX' MuyO̐#]rX'@܉ItDDD>ď=q.4<"K/Yf[lOL{jkkhmmEKK v=c6ØO,##Sa땈>v r'fhٵN5c>1}1 ûX'l#%"##yŋDII }]8pG>Vdggczqa^;1;Im)pPIǍ'NOLe! W^&l:`C>>wi"j:hI;ɞĸ7i$ 1i#c&c;IFdddkNLFFƮ~YY{ihooG^^O.Fu>>P(("":D,Ruu51 #eYڼy3Pbb"=4bjii)=1`YGnnnԯ_?k˖-IJ^%3'h"""HTޱOsi 3f <@mmmirShؑ#G/\@s!WWWwbG߈eYz֮]+z=eYٙ&MD-$ _~T\\vR*TVVF,˗ŅJJJ,F"UV;UUUY,-\T*UVVWWWeff˲V)!!JQ '4&|2Ӟ={eYvT*JKKh[Ӗ9~T믿FCCN "!//'OJBDDV^͗qL0* 3fyo>umݺ?<=R)[atS|c]_MȌr%VWW;-ZWO1۾}{}b<|رcQ^^6`ܹde:U3 'OƉ'сoܸq#ƌL>Ǐ/tR!==iiilؾ};3ψ$ݭ=moiьx@ee 8z]b 1!"3Kj2FɿO 0FWWT*nݺ˗/cѢEOk{@NLDwwwttt~ӧOܹcƌahhh@AAñtR@DDn www\pY6 Lŀۀ-ZBf̚5.1UI94I*'>1#먯Ǻu`bш3hQl1[,6cj0qyxxرcxQ[[ ???VėP(b _|W_}UU{adddŋC?ӶpXDxW1zh>#X"ĸ'O:Utf4YRk4wݸq\\\zn;EGGܠT*/a!)) yyyvb3K`sbpe MD㣏>ٳgQZZ}_~EpΧɕ+WwDՉ$҂l͛+&&1nLjŋw^ݻ[l:0"KLs8gJJp>tN>s=gbADFs`XXX7o"f-%x"V{nL2HNN#rssVqM̜9HKKC}}=}]~#s᭷իWЀ>ȮgM6)R R^za…غu+Ǡ Νc0tPDEE!**JtwD'ѣضmwqQ1!"ޙ- O|:Xf >S曂.! r -ƍ7~mܼyغus,-ۭ[8!EDĦM#  Ç&ٳT*1b"''qqq8u>wN< Jw~@aݺub5ɦp)sE 踧 ŠW'¬cF̒ľ+|7 B`` 6oތm۶r޽{'v gggǸqDn"nO" Xyy9<^z 퓜 Bnn9 M:;;o"סT*S"[k,ɋ.|b Eo߾XbM6!o01]bzj eؽ{7N~~~ܵG2ҶĩƲQ7>8͛7Siʔ)IVH=w)\b0凳K[ws l ztcqZNk׮QiIJ,UVVԈZp6}3Y%&'&clps}bͼ+$$5&00wcY)VPP^z!!! 44FΝ;EGL ]b%HK".1.ӦM0 | !8SSLĈHҾsc^< j,X@>}ZzBmt]bqƔΐKl͚5M90܉Ic)ИOaV"C՜bpvv,3:;;ECL98Ƽwpu]b\4w$R΁1NL⤧U9XO|bhmmŅ QGWWnܸwq*ѝbnnnhnnl@W^Y.~DFF4jt|]p.1 K _4w$R΁1sbvsb=iXSpJv W^ĉ1bs]щkkI?K+.1*99r'fҶ'T*y7և~Ȼ>Sލ9rrr@DS,::ÇիADعs'jkk(j=b}Aw{M_ȑ#inܸ"a`׮]ρ!N0vu\pfȍ*N1B["// ŋ?GHOFb7g%6vXqWS,M|b2B=qgzWpNDڵkpvv:nܸa'ɈKO}b~0Ub\'*#a=ᤌ]#wb222v܉5r'&##c׈rb_ӹԻwo`ՎvYd pjNaa! $sE,L8= B?MZcǎeY>= FEߺmzTVV|) :TVV׉unq=ݵ_~4p@%R(Au/ XŲ,P>}hΜ9okL84c`HD...*x󿳆OH04k,QS6SX+ԿA ->m,V2 IDAT=Lœ Z455DBBjkk7nޣXٳv@D8s TЄK(,,իW/Nr5YwFzz: sN;vLv=())_3f̀x Ql/8wκMD8{,OG0~O?aܹ=Ch$q`///_50uT1 ?ǏO?v`?AD:1зhϬӤ+W|`sp2zzz m:N1C9Onwb8t˭֑$dW+ L<'N@GG8wO7b̘1())1~x">>K.E\\ӑXSN᭷BJJ bdoOub`l$VRR`ذalm wAHH͛'q'm@)fj$fw%j,^8}4&L-[X=Yd$ƽwww燥}Ν;O aaa8p p,]Xn/v Cx{˺x"<<׿yf&e IsbӦMdpssnP*1bbcc8:u G}'OJ2 1sGO{^󳄄󯐐<`j>1apyܸqCeD 2Dml$9W'U*222+@TgNj,d{qAKn?8aРAGn21N{{;['0 \\\+V شiK-OL8t3ab8y$֭[///۷m222CRfWa[/ ̝ wb222v'e"44T"HEEuqf'faiGKK *++___I^1`Ӿ”O؈f9R|k)q>14T, SČ8#"ڼy3ߟLBj*ss݉OC_[4a+l&I'fVSSc5w7|]v+WD]]Eaa!tl\Lq>}ZΩ|bN #3.|b7k ЫW/$$$abԨQQv]zU-|ba/$1Ĵkz߬Cpp@>}ZzBߟg'>1e:ϟv>1}䑘1枺Z>N8;;=SzBMO̐#m{AItDDD>;o򉹹Y0z*  ZbrXB'VMaѣG&> wbvжY'*\z7A8q .11qj;Z[[۷t'oN0t>N|bƼogΜO,::Çի{a׮]Ebb!/9>>w988t'|N0v>{ yݭS(غu+0`,^?]0m4-88>l94;0"8lǑM|b2҆#"ܼyS@I'&#mcF C>kNLFFƮ;1FdddQNT#//ӧO:[{ECC.P__7 ҹ%5X}}=ѷo_K$>1"BYYBCC,fQYY oooxxx>/,,B@TTůRt>1c*eek`YVH'A...4fxDn'9q, qFJSO}bMƨQܶ,,[ (--E`` nܸ!DӻV "9sF/{j.|Yfcȑhkkq1DFF֮+W_Ə?I&sVXwٳ?>= Jeb؃w9G-=oO'p T544`ԩ*//'OJBDDV^͗qL0* 3fyo>u»dMqO \ >rePlۿ?|||0vX 8p&lmG%y{u!OUGGMӧOƍ1f`?~<|}}K"..HKKCllΞV%kݭ=`4'''6[ĪJ[nXh֬Y#j=b!O 0#"8K}{H{y4ӧv܉'x^^^ Ѐ,cҥĺu @w#wA75^H{omQ__˗ ouVQ 1}b9,}(iۓFb*<<1R_|$aƌ#bĀێp*C={=weINLTi~?YYY#Qyzzɓ|9 àСCV.يdgg#''Ǡ{_>^\ }Qʓ5}b:;;%}>1Ci7^6ky,(S,rss~ڵkEGGʕ+)EEEQww7,K9990 eeeQUU9;;Sjj*;C ƍukUSSC?PWW۷\]]wtYWj]eYoё@e~Sy:~8999Qvv6,K4x`Z~m~:kFׯ_B۷/)ubFCtYyb CCs̡I&ѻK,Җ-[hD3gΤ@ҩeY?AC !aLJ-\k{=oܸAC /c`칓wСCɉOo&uww޾ #aÃ֭['N2 Ǎ{7N:11qpN&>1"Bgg'z BqAKn4hrsskpH[.q]&Y'v58;; D2ۓ]υp+V شim4R>b 5s'E-'ab8y$֭[///۷OHI]ALL bbbl(222vdFb2222w܉5:RZZP {'>1cn򉵴I})9r{--#"9|krd,9#{3ⰖOlԿ2e yzzҪU$9O̔+\#м>KX՛)`30t  q͵k׬n6oSN!""3gD``hEvv6~Z[[u\yΝ3'qi#{"OӮr` @F.}7>1+((@^aQFaΝ#&ܽ}bwڎWeiiӦaH>Gbǘ{ʘʐOL+ X'VWW`!00O1! )`#˲zqߩS,r.HLsO݉OL~Y' ggg#&;0L|bqOˁD90<8鈈|@שfOωY',؀^VhW`$a'V#a#66j>1./Bg:t+Vh4}b{޽{ei~ΕX'VUUş b'N#DGL4;+W 77111AD:9hmmEvv6oߎ7oQF!55'j*9r"j{pl "r'f:9dY[nEww7ߏ͛70tPDEE!**J`UըEMM :{-`ĉ8z(rrr@DѣGڞh }Tǿ'%H1 Ѡ@1KGR hP%MԞjZ **jF/@VY]@( 3]dw~Ν;3wܡC~zX >\ ARR8 /\ cܸqHMMEJJEB>|>>>ݻer,E\\|}}Tѣׯi!"r̙3GC;DDHHH7rss͚899鍁0#+>1e!=|YJz %yo>1eqdK`ǀd0 Kb áaI`84,1 ƢW\Aee%xGdd$-Ԥ׽%J~PYYZHRL2fOsR/ܿK.111\XEEF]-~rpM{N}}tN>mOfz cǎJG>14w\H$4j( #DB|ɓ 11󔚚J#FL0kVwO\eel;lUWs1wHs}bduݻW3f qG)))V-W2yyhذaT__/GQhf<}I*xN ?Vӟ˿tє)Sh:DBA$HL^@tY۲m#4.Ǐ;w.yzz{|S?O 6+WI}b* 999زeDz߿AAA "TWWc6lqA^~ ,ѣm6L8ׯGTTN2: Btt4JJJn:oQ r֊cv܉D<|Dc̙>|||uVoooܾ}$鸧n.+c}V_&juo{ M&ŋk"$$&ĊÃ:;; fVRI^^^f:a;w=P\~Ǐ͛ &MBqq1ŋGFFñDd=%:Zb/a_h233u$ՒjjSSb MitظHu? [o׮]Ν;1ӞqG[[ZZZt\Dk0b >%%%F>  @{{;._ BHuz);!C-0f`޽:v+Wqu떆{ x~嗍>OL}B]WXaէb@^^HD9('/u?oO?7|!`$T<,^X#0k׮ӧ&A yObkAD߿?Fcǎ߹s<͛z#P^^R|gvСC¢E+WZZ3gB&skڊ"k&L-[hq]@HLLH$mj)@IIXYfYDv0ފH@lҥ`M{߄9pOnjAD"Avv6>Cf̘'''Ć PVVgggY´iPSS\͛7Ѿ+O?EAAf̘˗/#66|x@Hto77|HNNˑ^xSNEBBJ%f͚uaĉP*߿ ):a޼yHMMņ 0p@c':U(puuX___޸q(-1@夽\_bӎ=Oى~+Vd:=Buu5-6wR.SHHqGNNNA4drss#///Zr%1"ƒDŊuf.?ߕuw?<<<N`RUYk}&l'+K F3 %1а$`0 C& qL*++QSS@L0NNM|brJYK`O 4b9^D6# ~~~ݾ`I!"è?ҥK!? Ů]^@/2tq`Æ ߩٳ-z٪KG",,L\q`$&&bٲe:1ؽ{ζ8äIЧO]]]PT9IDATr$6n܈vލtDDDɓXp8jѰˮ c'O?D"SNtrww*/\ic+ToLa'f,ژ.Z޽{E'穾\]]… -IOa=ĈNNNpvvg 2hjjRÇ`zbh줱hgs|b ky;`8!!!;v,|FyAAA|ʰ,)d'<~pssï~+ 33SiSʐ'E9OX ;@w|bzݿ_a߿orlKbv9>={ܹs)ظq#:::'qS-[c cзo_@LL0׫_~PT-Q >1;E'C綾^–-[uЧOD Ass3222PZZRٳGcĈHtJY{0[c)  ̊>K/$^P444hgJyք%1;E'&H Hy桰* 'Obk.?< """ъP(hllą Ŀk׮'rgg'ifr,#B "¹sk@@) `ԩODWdd՜k:t(֯_8tg Kbv\.ǜ9s48CBBPrdddƍCjj*RRR v*b_HH4xgv٪Kb%f,NHMMEhh(=~ƱVwrrBaa!> ddd`x駭R5a}bvʙ3g.ӧ]ٳ3gݨ8:m ~Kcrzʏ?wyUUD$&&K>;v ·*~wСMb?Us=3 D&L2f9Y G)ON1&<%DbrV`J%7oG/6Kc>1"҉x׈z8sZ5= 'c>1ףk׮ J ۷ş?gΜAPP=Z+}bDXAuӦM8{,~mZ~sҎ1#",_ eNxaYII ՅZ( ̞=D۷oCP ##|2&M={I!;x4q @XܹsO!ЀVD-%f[*j8M у%ۑ … ͛R?'dqg0q~^XKK0gL6 w--[dUes|b¿rrrI/}RRRp 2_m⭷‰'R?{r94bq[> 䠢2 EEEp޽+.,]?k{lk)|b,Ǚ8ƍC]]˗/֭[d'ֆ"߿_#cǎq'vǏӐd-e%1;ŔO͛Zb.+ikkÍ7܌jO+q/@aa!xw,Z7rz \\\8su'Rf:uJqXp!PUUJ$''^CQQg o-`IN1'bR_GºSL燩S"88XlA.#33IIIشi&L`Ѻ9OLz_t3'ꫯW'fZ"pxΝʯYQNݔm [CDw<=={{W s|b Ӝ=]/-7|6@ꇢ+{Q:ֱЅ8G9:$phXc0 Kb áaI`84cߎƈ#R^^^ \ry c !***P[[ T)S B 4^T*_6'&@DzF 􎵴O~UVVj^_DVh;wNedhLx,NGG}>úu0b,Z֌cÆ ߕ+W^9s`٨Ś5kwZ\S1~gK,[ 8v͛3gCGG~`:q|b_~Mܹsub`h:{c/=^~iii1l0 ȑ#8{\illɓ1rH;8s }]fwvŋ 裏lP?ɦ_|*++1j(ܽ{ɓ' 1/\ysA{{N֨۱c>`-1@߰"s}b* 999زe BBBğ;AAA׿ Oロ[fM4k+ HZZZ(c V>1aB |||DO%f۷'OX*}ĉu.ȑ#GnݺeSP~HHGAvvU.bjO8hI`[z >?{1Xsu_t: c1* eee777#==iii 1~xl޼|򉥫&###CXoa,z}bby(X̛7oj ..N'l2m#<bar{KbvN^^NֆR(ذaܹG6-\Pc<KHH@ZZVXa7O4L D$NVx{{N JM|b1\gǎcrJgMXs u* ddd 11 HC*"77K,qGee%QVVrb͚5v7"Bii)fΜ LYfM0'f'j*1Xt) <<UUUXj4|b7dMb1/`I0&@'6kl';;8oQTT#??_􉅅77|[>܌Yfaݺu8q"nܸ['ЍdXt)ۇx'SO"27| ._lZ[[Ťf)7z J%!IĀb`۶m B`` d2d2~'!77oFzz:WZ1O,55UApp0*@[mM~Ν;18Zy cDj,uĬ/ s`84,1 [?'GE k `tm`0'$I`6O`84,1 %1а$`0 CÒpht^c ƾ0 QP$F{#Dc0lIи'}a0n k1 'SsIENDB`grhino-0.16.1/help/C/figures/gamelist.png0000644000175000017500000015010311436423224020415 0ustar lerdsuwalerdsuwaPNG  IHDR~C=>e IDATxwx݀'zSEEt 6$v8vb'_8qo؎qw{ǀhBʩ~w'tҝ@B RBEzx1g\Z93w[/Aep<{3~v#"vs_o€JmeɜqyӕUpt$cuSw`]*+&=JJ+88e\]|VATwHvV[jo\=c?¿C@_8dJ%*^LF L' z=/sYd2Tv,AfNX C&_fvVjg\76G6d},5(yȆYw2z|1&/f݁$YZ[[zd?w3;E?z c0uYFL M`˓(!A0  ^M!9$y =j%ӼqtDɧnDP#S`^8P[LF쉃-,#2(rx9Q^USɤ6쳆W@{q^;3r@?.W=2_ kb9OMm= >3/NiaΞ;FMD(zo %$$zWIL˅tuWHNT=6Gheg3,ю{$; /DMh"][dAaAsBlVzd~kꈊ `pqCzQ^Yɤ,:HNÙ)#iY4v6ZeOfўf2jݯ?Lܪb{ᤱcx2ahoHҲn3xrQ$/=zds@@=2²Zze=9?IIt<4.sNǾ./yQQ^btj).kQլr? jLB=tI7wOᓼk8{q`| ?g٢|E!T Jϼ D=7mABD$4J*ph"==hӑ%,{N?nIfUMEao%[Os`nVDeaL;lٺwbH|2"۶"5UmמOLk׬AD"!f@\{ESYZCFlՔpj,iM걹m:gyNzA}~bԳ/`惏IYY%= po;vJӯE0 B/}eij䱣*)9{8/!Qi(-)R^JiҢ\4ܜ'c? Q;w{Ѭ=xCRȯ$-#o[>AJH=9Ơ>Lƹ<|Ir3A6ֻcÏ ʔ\J+x{ʪ{DkIr59~GVWJ3z Kҕ4|0衩M;`QCcpرۺQf>!LHcN*JuB.% n[~@hh(}V~P^RhYQ7ѷ__}n-fAE}ʯ?mӃk,. j.VLPDF qټ WSR L{xƼb3(r@//+?AmSdy`dl4)Vfɶ-Z˶ʉf z3fp90iKb#^o17n,@iy% ҃8:bςiA ;vA自!)J$|gDA"A-DR"8;9~9Ggw*UD,Hh0C4ҋ9qQ=yGy׫p"<%Ź0dR;DҠMahtPUS {S1XQW?.N~Xd28{p2IJW BmHnA ^^dm=zi3y2I\/7ӏ7="ɥNd_rKf;,깢攈ޠ7O$ˀ^!߼{f1,/!ެ^(AcB|J6z2z{ۚ|$?II{5VꉻUO2`T/\.W#0BI':q\|9ܼh}_qg8)1<5uut 7lkj$Ms<\]jpel\}mڰY6۾iú6ˁ H}^gaOeU Xp5]/ãsD`%s5[S0@l#T٣qplXD *ӻ/}b)n!8v"Z<ֺoÕWyx%s8C!JHS .dBey1u޷s[ CWȩS 틝u9aqѱJ$Pk 聗)W"xsz˟H6$ٍZ=u`@V'BED^vxyq4 oZ =..*eӍ 2,6mHP.^^Ǚ6u2=pE_2~$9qwuBn1IꚚ6}F.ʍ=ԖIcmfD8[^ P;7$IYE3{YڌFF`ԑV2:C鏳gS&0ma)̿o6 o|l60rP/p2qniNUM^ g\e6[me!3{prhN=?Qutz`hv% /7`펣<8{oY~BO( oG?:5+Cva%Fr|DTbF@$~*";_}O˼M։+n^vUT%#y[ uuu\=w _?ef^=Y wHBRiI" "Ors2a~IcG0(v(Q7L556]bxN`YЩ1 2])܌o؁|շ&yj{SY|tOT/2{(c\.މMzӓ<|?bk1IYč!˗)C s5f}>tLϢ{'" uVD2uD6ĤkjDo ӿڼB>:M~ںz6(]܌AiSh>'ܥ;o1"BwJ%BH%2efeٔVr\j{+4"=8Rlب0Ad58 W(?Z6jϐ?g׮rMP{ ~zj- nؑ&k w?s,8;iiD[s+|q7& cz r SLMtq#b8rr8"zA~cLm+.*c6\3Y5gWN&&3ڽ G Tj{ K*輅$8s 5kM(Z]ۯm37%kbR#7ٹڪ.v<΄,^6Łcgn^H$COU7ŁB$b*3u4ͷHe̦LVX[6Wmh:#­o|ȦeݸRrkW_RL,?6h ucQWWۢǯoHHHd˾SXhH]mڌdkGR' ,*J(--CAuE1nxr!j3Ⱦr>Cq#;5 ++He8yMvԆ^ Tqv;FGv9+KE?{Gg\=H?w|<L&PߍTHMO&b<prwGDUE)30ߐ $ގG@8>Aad_ՕH }JW;GO 2)RL!i£$ZErRHO*5Y))ˠƙRz6u=_>OmJJ5z]a $OKڅ8y'vw'j;; |MU#k@VE2zRs͊`DxiG;{ +)ɾ'v//& `vd]I74 gwO~ڇG@8~!H2l/^~H${-Ŭ~ުܽ/ɴ^=k Wj -R2٩HRjjj'U 2֣PዃN5fqۃK'XadYMN9£$d^/<О&Yuw flcT]R /;_ao0P_z`ҩMQ >AaTP_W D*C*bJeO 4JW4^Rdr9Hd2ac "N  n^A.z$H ]]5"R$ v *}|-)ǡe7I.W:`4Rh5ՕzR)R GxE(Cr5~hnZA}"*ReL 1H$xqPWj;MQ.x(4:hCj;INADOP8 H HDM=Kף'n>ʌm4^q 8{6`4zRΞk+kC|M"apC@*R# >Ael* ӣ'NnR`0 AW@rNn^\Ifk5M>k:NM~זjDk fq!PX9VͯaH)6v8VxE}]5`@"#I8bgA1$ 6ƠJG zŜWXC-UY״0PWW^o4H㰏(/Jʑ9{u+7>khuiL8t;EQB=7(DIYABCқWDA0Hfpi8U"i_9K1]07$ύ4qsaYlhפHRドT|rH$b+9dZζ\QEfv6 33[ i7 3.;?;=W@qA.kx)7|"6lذ󣬸P(6lذa΢<8o[ dÆ 6:M%,zٶVF~n̆ 6l| n͔jo@6lذa2W/bÆ 6n .So4 6lظshoÆ w"]զFvIeÆ  &Oc_sJA^}-{z>}ٰaÆ =OZ̰6auX4ƯEaÆ"12wh$o7/oZNa6N˝޾;|tvvo =v˨Ħv*K "55M/Ft>mQQV h|(4lNlx3 ^+ȹ,("6^qNoqcft#[.;dw^hV;nwUt'Y6XN˝>e~q ]bFKJ..Φ掞`0>&t\ee%eʔI}0c܅4%)2nnfzHII~&=TVVrU"`Huu5`\.v,FYic] bu!>l h5P:{UTTpQN @AA...(딴a OzyfiDrM8Ϗ?4۷x3k֌ Y>nQ(2e23 9׮et#dgt\,YJQanghoA> 8~asVbDQ4@ ؤX IDATXvncnF|c@II).;KYÄ2xUU52}O&ܒcLs h򑘘[RߝqO 9Y:߸ o7[ EǗmvڽkroټ}"{OnI9x9M D">*++* ]|D!w%`ns6ggg>x.{ѣF6l" ޽; Zwߢ_>?Og&3IHH䕿t@]$8$=ilڼ|JJJqqq锶t&:jz96oي;11HR ]IrѣFٵoަ=<ܩ @F5sO=ۇ_|?__^y#6n?-{fQ,>O<4:qёKIIfF%\ՏՆOILL4JAC73y>up4{lZϛo3>Ϻ+݂6:O>c„qH$DQdTVV`Q mc{LH~lݲtLyEUȼyd2&MǛP>(/6.C:FAHp0'q{lټZmuRYy9 ys^ 7/ϿXy  M`0Xz[Ǥ ˤ]sZ+{J( ދ4 ԐȤI8|({E \xVb8nqq1yhssIL<ǧѣF%5QIOח!CP(عk799ZuLGjZ_k***9tojT?{srVnǚ^Пb&Ng72T*Ŵ \ڧT))-+CE&OȹXakL~7Vzi}LmQΟ}Ə^oo=6um9\^x%3mظ@zzI#GвGO4{DQ$__efW^e۶<º?77_-'1x>7Bi=~H$j>]f=Q3}GJJJQ]Ji[?"?Xsqqf̘Q/ iQX`.c񸹹ΨQ#z*3gL?_} /K/n &==TFcǛoy)m ZP=s3 QH$""" 97囗7LQhoRD> x|ɇ>Z恅 xŭdJZҘDqo3sEA?TExcO0p` K/lSs>b,z`H`?7^>bA W1>#nyܪW3@L,a<нZ-}g?G|ҚjM.(7ڕݔ,-R(͞L47;;{DQ4uWfk>^-`lߙ3gyp#K8E]] U.=tݫQխ7 aoooW]]Fco}h|bhjVmfuܖV Q9pkx{EVwuv rY;]s۹M::8'n7 ʓq-{e}ʉjyLǚˤR> H$84V>b2̝ʆtns&KbՋASX~,z/Y*QI\?gǮ}9zO5k7t=qŁCػ(|J>kM/vV*+O9EyyE /gd>g_v=?ڵln굛;N0ݾu ZmvW]dev\l Ȇۉ81%&++sd<#!=8x{V**%S@Jj:== 67}PPX##GJYY9ACzF&q\7(~fpIKJQ)UDňb)/`݆RT*#Gu[qΙSW7S1 Tja T7, 3+={Q^QAXH0Z6!=ؼexx'^$_I%vH 3's *Ǝ~b˒N س8::0z0‚[ɴa6D |rC50ںZٖZOt,JQ#ҫWN͐Ѧ֭]w ۫9Ͻ//_-Jً[stݖt##qwsN#-͸HJEE%|`Ξޞ3gYM`GLt?VLVV:(d䈡xx&+ae8~!;'^OFF&;G j&\!g]88h\.'&&~XφM9}&bC*+1TPZR-np9*aDFI}}=YY9t4%KIWkذqfR'u|*{bMIsR2`IIIKDFFrj|8wwϜ1߸m.;qtLnn>ix??r9gγrFDQTr93űrF6nΊ|ǰ؁xXVhk]o&ٜ#G7b.\+FWqss%+KDF 7^OiIEE%* $ %r;) :ȴ6ww'JA* {=ywwW K!I hy}R7[]Y w"5JDq̪jv>?㭗 ,+TJ\]o%$6m+k E"#(+l -g >_vuCL *+())%%% 擝%5->#/l3>-h_%9?q G]|-NvvPSYY J"循*4 +u% I9zĿ?7;z=;klݾgz =: ΎfC(RUUs[!tzsdD(Fi/TJ|}yxBӶ:r9aa$DaQ1~DpJ Y̚1=2"UUզ\yy%$3" 'G<<-2TJ\(.)'+bww7***oLfܮё޷O$׮esL%%e?xd=HKƕg 8{Kş;@r9)cyrں '<<Lƚu[˧mn{gd:;k٤gצ>tǗZDDGFQ[S\.#0mhs9! Q)))_}KBe{FqO @&ɟqssExسm^Z^RQQQGOJhH2\|b.\L{![^N&;{sG0\\dx{y2kd6oEMu raۧ'E]-z30&+WS__bog;=(,,ק 0)n,ÆMJ%-t(UJG!nBtK=s kn^;|@hhry7e悇;.R'͞XGr97MmIDx(:BCCLOFڊصZ\ƘQMD׷gw,6noL&_L2J=㎽^Bΐmt5@L,!=?eҧ6q IO49^> j5t(dCPA( SZ@Ez/w,a/t:rӦ3vV|zd2Y+S8v4.wJczhf3tlwވ_ ZȆ';ǯVسuuuxp"* WmUZߤQ*VԁD"E%,Eg뤳x2\M i#BN.{NKaƍ# aw{~qeÆ;77W̞bt wt߆ 6lƖmذaFzz[! 6lluWz6lذÖmذa-۰a/ [aÆ_>ӧoعs'm.d\UU֭[ow6(RPPN Hwxٳ$''_:ʁϷNmK_oDE8v7jRRY}(rUWYYٳg?7cKş_XkOGi>S]MOO=O</^waҤIW+["//%KF |bcc9|Wq˘8q" .d,Zɓ'ӧOvu 9svQo+**E7˻˘1cn(;0}3f0n8rJyO9ENNN٧yO?~ 6; ?>jLHHYR?wnJHqWQ3I&qUFwmcƌw1}?}4888cyǸq㬞G"Wk| >'}]VXaVWΝk}:nùH$&:|0'NZ""̝;dzb <<<ˣ{wX֬Y… Yt)Nu֡jy駉5hZ-ZIJeصky7#G_3k,),,Ojgy/'m6<==qss c޼y=/"222,$''|=--pHBCC9o>oΤIV5/˹{㣏>b,] .Jvvvlڴ 0^ݻ5k֘}1jl_f>#~aqO>0u~oߎ ߿qƱi&ϚdlSN޽{3h xWy牏'&&u16_>11 t$OuݺFE?~)S0w\׿xkVVƥ$ r@0;><<uvv&!!8YpT#5ã[/',Y~#GÖ-[>}:4i7,I$ nS'N|1a:88VVVxCm3f ޹|n{WDRDC9|PsTal6kf #Ɯ3r>D:Q)r,IhG݉xon|_رcٳ===ͩ]6R),XSddd`kk+8qB y+++HII!<j 11v֍BlmmE({{{ϟOnn.ӧOfy*B[[mۊ3AɡL&CCCoΕ+W֖iiiOx~;wP~}xЧ OOO100(wYQ2q:P͛7O>}:ݻw֭[dee\ɓ'Yn)))̝;Wܕ->0JLLdNtRRRhԨ]tA]]ӕ": VV?2%Kɓ;777`ѢEdg眕YYYdeeGh֬\v *۷';;{{{5GGGݻ;v|*y/qu ,3#rlmmYz5ԫWyx/^dƍz}6m_>}'77TuҁÆ ܻwɓ'cff}{fbfcVXŋŋ4o\G}_57͍O?TСCt'''85W^}fZ''' +^ՋL&@֬YuעE ,Y7M6e߾}*ذaWu333͛ׯ'"";֮]Kݺu\=z@.ccc#Elْ? Jr CCC9s& 6 ;;;qhI(,,QSSW^U?ԩCjj*|L0kkk$''^nĩbwVNᾺ/r1?ZlI@@NCWwuF}ѬY3&O/۷gJB' &:L4ݛ~LӦMO~: zPUJKKA`֭bQvv6 ?/^>_5*L‚ صk111hkkaÆ6ؘV* x{{ٳg9qIIIűx68p7n ##TbccYvmuFQ^,*((`} b3m۲rJ:uD-|c۶mlV^޽{$DZx 鑝]JWd2t@vv( 9c n+Ӗ޽{_pB>̈#سgEEElco X֭[ӹsgN>ͺu?>ƍ#66 6l35'JƢ;HZQu%$$'nʏL6k_3iҤr!...]P^=QεkN[__HMMUE4%aj-[V,𠦦V͈ܹ˗qvvߟK.qM*- ikkchh:ͮ4+W$,,Gr5tȑ#KWQIII) 4ݾ}; 6ؐIrr2bذa4i҄93d2Q)騫E`` P,d^ӦMc͚5b,ھ};.]"&&Kr14h &Tߧwך5kFRRRi7oO:uyEšXƍJ233baS欬,QZUpw΃L>9e@'O*\fPEv* ?MEGWWW),\ӧO?~#G2jԨRB(lڴ/bii{ѣ888<rbO畖&ćN`` 4n332}XD*bѝ;wh޼·)e_uҁN:CNNRn$4iBn`޽>7 ݻWEPI cXr%̘1CtR777igϞe͚5UկGGG444֭1&&&?j(r9ffft֍ݻwckk˥K^nnn899WEP)d2lذ___Zj122B]]6mڰzjF={/`m+VZFnӣgϞ|G,_\i066ߟSvmv%.*vvv4jԈMRT4h]Xx1uӓ (]&QvmO~'.]Tn DqΝ;#@ׯ_vtڕ)S`kk+իWXԺuk֬Y×_~I͚5ڵ+e. [.*+^PPz߿[+*.ϟ'<< 4`޽(E!]ohiiڊ۶O͚5_ym^Jl}޽,ZgG\.+ue?Il2TVpE󀷑:u0m4rrrٸq#JU-Pv2dR6ѳʥZ쨪:.).׮]c,_O>)몗Ez$LFӦM9x ϟ?^zJ"O҈_BBBC Rxǐ;_N:{G ptttxߺ?/ PPP@DDL=CAAfff)~mtttjL%_OHHɓ'@ 6<; w~~>Xv)W޽{wK]x}U1?%%www<<<^MNV:]$++O>DO RcƌaÆhii#˖-CCC?([f̘!2JPfMr9?ёիW#IMMVLvvvZdddT]7o毿Yf͛ҥKk _A(**b„ V9o=2 CCCn޼YݦA`̘1C}6NNNX/-mF6mՋ-[<5zß| ?SBZHNNfĉasFXϋghWĹs4h~-游pqGA)((o%==ŋ^ɓ'K2d渺biii|gL6=z kd̘1Y]bccCdd$ׯk׮ ŽС...VsiGq]QYJ!2w\6l |go!111sssL£G$χ|ejOPfQP/u:ujbƍĉA|A`ᤤС>|XԌvss;;;<<A`+=z4gϞ-3sahhHTT.\(RRR;w.?SBUBRRgfΜ94ncK %;;<==2dׯ_'##CÇ~hjj:̘13fO?\.GMMKFXd cȑ$&&RPP@pp0|Wl5ҳ),,dǎDGGaz'|ӧٸq#LS$iԘ7o 2GGGmF͚5ٺu+...bffFzy&|jjj4j\NӦMi۶-mڴ᯿BKK5kw^j֬iܸ1zښ[6̙3GpP?~?L-8p yyyL>͛ӿ2CBBS ;vdL<JPd2.\ȪUPSScɒ%t+++d4kL7vڅSL},^X|޽uֱn:v؁Vm#)/̘1;2eʔR0w\vɮ]W^8::p<== zݻ144dҤIY~?&L`ٲerԩr˿pBk׮Ѹqcrss+"Ι3' =S׮F ^nxGYJB2)SK_ܻw;;;l|||;v,ѥҤ)׮][WU-ZD6m`7_pa*#%}}!99(b,YYYIHH >>HCbbX 9r֭ſիWӣx"""PWWC,}Rn]\]]CPaa![fڵ,XΝ;߿$Iݺu f̘1vyڵkٴi۶m^zb֦m۶\|+WpN:/ CσNIBB«0s1x(^^=F! ЗDWWW\VPi;tRiE}/|xyy1a„r544a\r lmm9x QQQؠ]Noݺ4y^^^ر( hٲe̜9SݻwŁώJt/ #,,#G鉓7n0bIÇDEE+)))4jԈ.]NHH:x֬YҴiSHHH`ǎ="ggg{Ϟ=ҊhJ^ۛsq=={6NNN}ODEEţiUXwr-n޼IBB˖-ں}/_ڵk?^%r[[[V^!ё[|͛ڤ2̛7GqE6nH>}bmߗCAFXlwɓ'رC|cΜ9 QԩS\6mСC} :\NΝqrrX[[sU80+Vr8` IDAT=lllhР!̜9 bee~i5_>7of4k֌QF1k֬R7---vލNNNѻwoLMM-Zdiڴ)w*Ѻuk<<<022b… O]&QV-,XիW\JP177GMMM_裏믿qƸ駟2ԩST>0aӓdͣy|3zh~7uL&4iҤU[Wcccc<|P܉rEb999ԬYRĹ6>>EEEsssnܸ!^_~=^^^ܼy>Q ~V%}\nJ۶m b٘ [Nm8q"1yyyUPW3gg+td*RMEٳ8q$XxquKIl%::,j׮͞={롡ٕ_Eg,X]A[[ 6W_}Ŏ; 11P&ܹsϼ?==aÆ|rڴiZ6m`nn.񝞞3PΟ?FFFXYYqW]ƙ3gpqqa„ `ee$a122}̝;A2dL0T|}}E"􉉉ccc Anܸ&MClLMMװaC/^ %7(z聉 ƍ5T [[[nܸŋ{Ҷm[+?zԩSiذ!lڴT)}IA`Ĉ8GpqqRINN&>>WWWf@ZZ={dܹt*\ZYd ZsrլYXtRC; b@d28rX[[s9rrrz*} @Kjj*_~%cƌHTTSرc7NW!喗vvvOi:&SPP}6{aۗk׮;cƌ!::_ӧ+ m(Aח_LckkKƍٳg' @633*@CCQFѻwoYr%.]ɉaÆ7o쌍 6mΝ;\vKR6͚5ĄC҈A^^'O$??_)3yd,--9r$Jd r5 g !!!lٲ .pQ455Ғ2bɓ'),,$22իW၁nnnܺuzزe ;Ç)-?N>MXXZ*^&aaa&k׮Ã'O0tP._Ǐ122V\6_Q411+WQaǏob빹oYf0߻w/:::̛7.]??RePSScҥ퍛7nDKK[F__ 7oM4A.ӬY3ڷoOvX|9jE惃bʔ)4mGGGlmm-ZUFB&b 6oތ̌vL&EJum6Zl^#U;;;9Brr28;;@QQ"44;*nٲ)Sf J i{{gӇfĈPTT$ `ذa@[[۷oȃHNN~͛;wM6Ʃ&Tt&MtR Pa+hذ!⊣&OII)$C]]] iiiǷ~իWiڴfqYL>(=*OBjj*:uRWP000xE{1ܹÿ3۷o>|8.\(&55UiiH[[*accȑ# ~t555طo.\V)MvĿ+eó۾=$''s!~7N>MLL G;wNI e˖JG%mHlQ)E`` ;v$ VXNLƴi%K0i$ \.?ߟÇGFF}*+*KZ… 9}tVaݻ@WW͛/iiiSN2+V_qׯ$BߡCnݺ۷}6W\a޼yjЇӽ{wj"<<555u놞={䣏>b}Oׁ1 <ڵkk.qGUC. cff=]'m{ ęb6mڰzjF={/`.ׯ_vtڕ)S`kk+w\zAU϶mHHHnݺcbb:ZZZ-BO58\[AKKKIl]!X~?:yzQj*ڪ,߻w/-"44y|J~>n3$$T'Oѣ;vluZ;Bƍ[P%.7o\ݦT oK#~ wJ/ܽ{U!!!!!FRxǐ;%$$$1T> @JJ ߿DA ??_T!(1Ū.޽{IJJ*#22R%Ox] pR)yyy?o߾R/o_W%66xAĉJ|k׮lܸ$שּׁLNKMD:D۶mʊQF)>[@*̟?ٳgJϞ=! O?֭[M*㊣Ynx}׮]tԉ `mm͢ETQNN}7ndϞ=|8)))$$$0x`:t耫+F222pss;;;<<\ztz*OF_~rJzɰaÔo2M@@ 2ׯСCrx?#L8}}}ݙ1c3fয়~"++K[ɡo߾4jԈ%KЯ_?FIbb"W_}E˖-JPWWgСxzz2~x֭[իW\:uʊUV׫$eӴiS cԩSн{w1ݞ={?~<?LRNkϗ){nx|2'N@SSwww:ubȑ:upq֯_ 4ӳB1۷dFرc9s ,[ (@JHHѣejp(̞=9sи|5%VCCC PRRR4i.]"**m۶w =~-Z0p@>}:͛7e>| N:/tؑɓ'3ydWU׎Eٶm5kd֭͛|ѨQ#r9M6m۶iӆ ---֬Y ׬YӸqczꅵ(jU d2.\ȪUPSScɒ%t+++d4kLvڅSL},^XezAdd$)))\t {{{lllp"""h׮?KҠA}(ֱccc9R?=711!""uuu<<<]v3[8ϟIJJ%ZkժUjGzʩG~s =TVIGGGi& ˗/k׮m۶r(yHݺu fcnn:C֭[ǦM8p܂ M۶m9xLt}}JT;vogϢL&^z1m$&&.**RY]nݺQXX7?>L>])ӊZσe%Y2 lllؾ};W\[[[MLLdJmR͛ǣGx"7nO>@o*7_|AXX鉓7nC4kLya]&"*544ذaGQF 0>*yf/_Nf5jf*5|S4mڔCC:t(rΝ;āի@q0`+V?޽{РA'..CCC9s& 6 ;;;>j.yhii{nprrȈ޽{cjj.thт%KMӦMٷo_{F=-Ze˖|/$tT(,,O >???k7n~+C:uHMM>ё &`mm-ӓd+L&cDDD`bbw}ڵk[n{]TZleGSSw/JU;xyyqe>|(yZt"霜j֬bhjjqbyyyԬYL\j֬$C455UruP/GQ'U!|Ov>|P\2,};Kbuw2:vMIJe2Y:xV U'UUU%^_Nhh(~TzwӼ1_hҤ[KIBe(**"::#G2r6"wF]fHHVnS7kVBBBB⥑;FzTyijFRxǐ;%$$$1TzRR1117oKK˗[!}a~Y[k)77(iݺuS.Ihh([aÆJϓ'OS7 D;GQDDDлwn߼<>BݼJrss 28v8::V "gϞU:(K1bK~(>ZCerС:Q3l05jDZ8{,{fڵu`aaQf>&LX[[\.ܹs777lق\. 4E_*K:IKKA`۶m9^zi5 IDAT|RRvvvxzz+J/ۗXbccÃڵk3uԗ[*TMEٳ8q$XxquWe8p7nAjj*ǔ)SX`v"&&mmm6lѓ'O5jK}.T:?Mrr2 s̩P5==aÆ|rڴiZ6m`nn.񝞞3Ppϟ ###8p*+GqN=FFFoߞsB={dܹtQ$}Ȑ!3aRSK)P< hذ!/Aƍ@TT=zĄqƉ|e[((%2sLK=z 1BG...b> п###ٿ3<,YBVܹ3;v@f͚ҥK :̤ .֣L&S:Ϗ Wޘ?cjjf  $**`ԩSرWWWƍ'ޫrSSS6mڄƍlt3f L>X dxxx```nhN/Fwx{{rJ.]Æ (U7o6mĝ;wvZ5bBBB`ƍ|w2bĈR'111G۶mcڴiR5j ((hBBBزe .\ѣhjjbgg%dĈ 8'OVe;v,Ç'..SSS-Z$}ihժU2 455YvDBUZZZ߿+++XT__ [l9y$nnnѤIrld2VXA>} b3m۲rJ:uD-`۶mlV^޽{$DZx 鑝-jS+OLF.]>8zƌlݺǏW-{믿f…>|#Fg111aڴi@ntt4WZVXAܹ֭3Ofݺu̟?q 6왚hkksmdԨQ899'?])[U͛/iiiSN{^*Ny ?'==4zzzܾ}z-3"]v㟦"?)GR}9QF9R888i&.^%NNN?=.};LJH̡ӆqYu$FjӾ~>f4М(iDEJtFsR[rUDvs^|z^|DEE3j}Z\\,C+//O\ehӦ ƍ[n1x`Rvʢwy~N8+ʾ@MZZ{~p/_B !!WFa)++7xKTTOuSRWW7oցu xzzrInܸAZZӦMC.www{0iҤjgBy1h &O/|;w|&[ܻwﳷlْH.]J&M"$$Dm2fڵ 233x\.Օ%KԁuKƍIHH@KKӼysx뭷XrX>077'44OOO ~4GGGLMMi۶-XXXOIu~Ry2 ~'Y6 LWӧZZZеkW֬YøqΎ?aÆոFFF\| ArE^m=۶m###Mbnn?cj,#eeeu[הԢJnݺ~{P(W*~mU֕B gI~r5jۭo^_Q[b==zyjK$uMD&A]*dj}PēUWcqvAt{aʕ9yYD!%%q1~6NDCeƍmJ7w%$$$$j)KHHH40jS/$$$$$4i/!!!DC  )KHHH404>+uv?Viy>ڵkjA }tttR㉊"++K}oTERRFfkbmm=III_kkk @bb" PXX?ϝ;7=z`РAskjp QYJ)2w\Zj |'o!GaXYYX6P}bkkK^^.\@o8 -5{Ŷm"|XYYF||= 0a:$~É|}}!##OOOz聛8իWӯ_?BCCU7nNR;ؘcccQdyܼyÇk$իKB… 5j0n8vZ91???OPPs!==wrA֯_\.e˖xyyquM&MR!}(//'""T6l؀#G$==0 &'':sss~gQSbzYaĈxyy1qD֭[ŋqppqU<<CLMMYlCeќ9sF- ڵ xgCCǐ!Cݻ7۷oۛѣGsرjqU(w ƌ9y$J ddd\9p\tIMcǎ޽{믿񔔔TyNFغu+nnn4oKKKUb 5kƱcx7jf}:tÃRON裏*]ФI{zI@@_ЂG&h"V^˖-O>ؐL&]v*tޝK[MDNN899aoo $$$;Cv:44'|rZlɉ'T||DEEѨQ#&NH6mxe֭jƄDصk;vdt///<<͛7 88WWWܣ!IMM%%%ŋWXd2޽;%%%899ﹸpMtuuٳg~O\]] << ._[l\z~5kбcGqqq?o={7\0|¹~.]3Zht뭷X|9SL>j/Ј#֦O>w^lmmx?ՕaÆ-Z`ƍ\v1ff͚ Yg׮]hiiꊙs,\P,otЁe˖G۶mVi 0mmm큇_:tSNX?>ر#̜9VZacc#cǎ\GGG-&+++Dz%K_ҦMr9cǎU4i҄\|M\\\Vl 2:6l[R7|X~=XXX_믿ҴiZWXl2HԺmm߾}F5D5R5jTغBQF*bCOO[Z/J?Qˣ[Ͻ{V[᧟~bΝm{ѩ%PӀҸqJd25xU6X&r €`„ O (׹sJ3V'J*#mi̜9/BmPF%?xAG}Dvv6iiiaff-{yVŲexӧ;k,/_rވ#\ر___-Z_~_{5-Ӡсؘ۷o, rJ甕eRRR www;FDDnnnL0A,(ܹ3 :zgȐ!|g?0}t=Jyy9IIIYwwwZn\.իʔ)ShժU}7e̘1 <???~g233quu@8p o\~K.sK'&&͛7_Mnn.FR+W9rBQytB AAAl۶S_gǎC)Ø6mIrr2zzz8::ү_?ǨQkUlڴPƏ/Ǐs,^X;==x~me2zBOO_wwwFAN6l2LIHHxfј@gϞx{{3i$҈{͜9shݺ51gfΜ9Ŝ9sΉȈЧO&oYcٳg666CR _coڴITbJHHrx7^IzLƪUرc ,>[nݛ:mԩAAAYznIرƍ?K)))5T'YYY1o>d.]D߾}+ME\<>F1}v 氷lbcc7ȑ#899"ЩS'+4*Tf;w&??ٲe yJWA5uT֮]˗_~ɓ+`mm͈#/GMEYYqqqXg Ok**ެY3ELk7of̛7SGi޼9׮]+^6&bmmٳgՎW'@mMI]]]n޼YV=...ɓ'qiiiL6 \.{9x III̞=ׯ׋OKII EEEƢEpppP+W(Ȋ+P(ǫCCCf͚Enn^nnn{-[XX`bb\.'>>^{)֮]rMj̙3ygΜ!44>ݻcbb¤I+By1h -d;;;(,,dk]֭lٲ֭[石bŊҲeK"##Yt)M4ˋʘ1cҒk.|rWWW,YR-7&!!---Oͱ㭷bʕbGܜP<==100 22RT155m۶8;;caa>%IUcѶ+駟CfffO 42Q\O>hii@׮]Yf ƍC__;;;>s Vqe &00qfŋ[m۶AӦM177‚5kp Ə)iӆ3gֺbŝ;whԨ 72_eeeXL֭[" }}Jo߾غR\s'I]U^+5(/^L\\ۣG[[^{[D[ ue2+Jb``PqLU6qvAt{aʕ9yYyiDm?¸q?~|}SH_BBLٲq6^蛻%$$$5COFKHHH40/!!!DC  ʴj=%%%:tlsM̙ԩS~+;wP %f\|k׮U+:322HOO'== ;A@PT(}F(--Urrrؼy3{ye[5&L8QPI޽ ֖ŋ?AIJJ_H_9'/; Knݘ6mK,Ɔ1cƨ ޽{s*ꫯHKK k̠Atȑ#̬=F4g j.Aشiք7Liii-XYhD/((LJGǔəXb۶mc޽̝;jKOOgL:ȫQd2:vHQQQ}R'ĉ1c$66tN8UۼZc۶m:u?ӧO.J<B_MXXw( ۴gB#ŋ)**?Çk$ĺW^Պ?B @HH*+qqԩoQXXg}ڵkޞ$֯_5 11A(,,xoΝۛ=z0h 5ǃqㆨ,b;w.ZB>ꫯC9"00m MB>ssJ5A 11CңGlmmUqW ,X)S*[0aև.#䐑'=z͍#r,Y#x{U^~ nc$$''ӲeK}]O ǎUӠ?00xT_tIMcǎ\|ʺLBӦMODMP%Xx$''29RSSٰavvv9tpvv& @, <ܻ:t(㣦È#bĉ[/ ~M6 ===&M W^V^MIII> ֭[1cx{{+,,dĈ~3giiiV {`vI```bvdz}vΟ?ϡCcȐ!ݛ۷ѣ9vw_\N˖-V g,[1c0~xNǼ:Aii)ӧO}|G}!-- LFvmmm"##133#00ݻtRtuu)ղk.֭[Ǻu눈@__kبQ#n݊͛7cccD_1c={$00PΝΝ;RE\5&$$E||<$&&bggǮ]ر#'OcǎxyyzBCCgŊ4k֌cǎUEaee'lܸFݻ0yd233IIIa۶m޽.*7n-^ZZZedNxx8 ^UF5722V>77WEH\&HnLII YYY8::l2=Jff&ovz򰰰8վ}:,^H9q={?W+פIN<#x{{P(A5_صkܺuJ[lll(..&'')iii$%%aooO~~J)((_wEظZGgmmm|}}Сr*۩ht෴… ܹsGz*&b֕/?m<I(Q*zhtѣڵܿ?.]ڵ+-ZoipgadggJii) 88yZGWW???N>͛7 88WWW8夦}puue޽r*}Ѷd27nLHH?/^iGGG/+++Dz%K_ҦMr9cǎvMhҤ 書8xÆ 155eذaamm]c{4WZ{2 O?Ν;6P[ךNii)5Tl]PШQ#{Qyy9U>PVVV'" ?o=C[[[Ml&@ӫ)@zMxާ&A/YK5 ^eaGiܸqe2WeqԮcLLVgB/&2zhF]HHH# 94LEz6EBBi@coJHHHH/!!!V>J)!!!!QH3~ %$$$Rh`H_BBBq?;;Rq䪎?+ PZZJDDD7nw1yd]&aH<֋!<<ϫ_\\\V\\FU9sF.A$==]R z/ }㧪AbӦM*HMM%44h߿1_t>xmPXX{֩L085jDvv6ÇoA]v0o^'@^^^_'pBRymر5ӧO3k,B}hLgȐ!:t詎?/J {j̱co9sfȻ4ԩS:t,?ҥKۼWѨNMM8!9y$| Gѣ=z޽{sAnJrr2 .k[M sΥٳg?LJ+WҵkWzE\\Wk׮XYY98p 09s\666ݻY_9| YX|tĈ? ߿OII(#hժK.u7wߟ+W ))) 0 &L%+W8w EnExޔ)Shժ;w~S/'b?ssslmmQGF%?xAw^q䣏>";;4033֖={ yyy1w\틳3n,[~>}U5{Norr2OkѢ b:ycczd4hL:u*ǎSNOu*زe )))䄻;ǎ#""777&L ߁xDGwttdС*ᗙӧӬY3>s^ΝYx1p`o])3?Lff&b#`XTT~\t[R9ڵ‚X4 "11R>̝;wTxx8׏ѣG2^[n@6mlddd_;vW 111lڴ ?dptt_~۷QFÇ)//'))5kN֭\z~شi?___?^#q||g 777޽KN6l2LLHHxfј@cVrWw:o̙91 9s`ffW<** ###ϟO߾}6m~++=-fffhkkӶm[TޓܼySܣ޼y3>>> B^&j*6n܈ ,Ғwy#G СZZZhkkm6:uDPPzb͚5*)5 GGG~w9{,ٙ bccgϞ*~i&Yv-[V2o߾JO`` m۶թ4&6Z+*޴ijEsrrԔ޽{\O(5Pٲe yfFUߦ ׯ_ 8P233)**(8*[Cj"䚄=ر-ZЧO !::XTywĿMLL(//3rrrͥwJ'NMll,>>>9r'''T:uD^F:Gg;w&??7x˗ӵkWd2mڴaذa◍ 8pkkkFy4Z 5Ui֬S EHOOilٲ$ڴiF;nm{ݻwEu>S5aq%͛7ڵk֫fo(++c+ɱcDC%?SohhH=v׮]ի\p竔S 8;;oq9뇫+QQQ$''쌡Z"P3GxzOJJbԩ*/1wYll,nnn,\ӧ?]+k| X|9 ^Y޽;&&&L4跮.>^{)֮]rMj̙3ygΜ!44>xzoӦ !!!l߾xlLaa!^^^̙3;;;(,,dk] e˖DFFtR4i!!!jW___.^ؠoܸ1 hiiѿ7oo+Wr\]]Yd 愆鉁֏舶6/sss,--AWW+G‚M6ߢ;8qb42qѧOpqqk׮Yqơ9Æ qۍ|2X[[ާ{333֮]ˤILJ%K0`֬YÍ7?~<ҦMfΜYc[(Ŕ_]͚|o5mP(W*~mU֕B nݺxCT9~}"Q[ ;wf~akHbȫ"Kسg+WdȑmRb``PqLF&MԎ5U'9~jmVd5 )K?¸q?~|}#!Q'4dGS7ַ)uFC{殄DC  ohr! '#%$$$Rh`H_BBB!~ ~A!66VEA?NXXO17o2gN_)%'JuBii)DEEkת[OJJ NFF P(DgE3Fiiiڕ͛ٳgO2 pQ4zhL￙8q04_| 8{, ,ɉj $))_˗/"M(..n0A 66nݺ1m4,Y cƌQؽ{UW_V&טA鉏t҅#Gr=F4g j.Aشiք7LiiJaȐ!  paG>|;wMpp0{EKK͛7W[_zz:'Ofԩ &rm!ر#EEEmJ 'NdƌMzz(w(d _5aaa޽ÇP(DM@#ŋ)**?qccc~G7o.g5o\^Ǐ`gA !44Tzܸq:uagvZ'))cmm̀HLLD ۹sG 4znMnܸ!)XΝKVO>2+#G0x` vHPܼq$ :=z`kk˒%K+ʶ4,X)Sx 8t(>|pA%'' <==ѣnnn߿A(((@.dqww۫bq& 99-[P(8v#G3zZ3gΈ5cff&S DL8&(SLiӦ|'W=sssVXj 1b~~~߿ ̙CZZ£Je ՟IDATΝ; D[[[-믿ή]8~8l߾s!2d{fx{{3zh;ݻw9x ׯG.ӲeKپ};˖-c̘1?'O(\x=zҭ[7m鬬,={6m<{zB#`ͧ~8۷G[[6mڨuqqۢbxx8Ço>w}G𠴴ӧӾ}{>JcbbhҤ =={$ zhA#XhWFKKe˖ѧOlllHKKC&Ѯ];055E[[H {,]]]nJڵuֱn:"""ׯ6jԈ[Fͱؘ"f̘AϞ= TssN"##166q՘TTTvcǎL<;兇Whh(Xf͚ ?ʢEooo6nXxp]rrrSSSHJJޞ|SPP ҥqb-,,(,,DGGぁСCr9 [Ǐg%!!>o4>'$$Ipp0SLy %%֭[өSTSz###O?DFFƋ09pܻwO[766fԨQVzNfmM=Mܭ}v<<t"۳}v.\@^ppp`߾}`ooZ^zUeQGE۟6XZZ$(ҥ +!!!9rӧOTAc2}t{=^Jqq1 ڵ+-ZoipgadggJii) 88yZGWW???N>͛7 88WWW8夦VVVhiioK,/M6rƎ+ФIrssy7qqq[[[qf4@GG 6cjjʰa 1˞Ybbb駟عsKytJKKiԨQb F߻w==WΏ֮G_$ ?o=C[[[Ml&@)&WmS%D._L\\ mKECJH[&{ݏ{UI+_>d鉯5Զ|}`?@EE=ѣG׷9ŃmLW"Xzu}"!!QhjAAADEEA`֬Y,_\e>bߧΝ;\VXt)[Fs\rAHIIaXXX0a߿_-\¹s(uƇ~(n>xLBVܹ3x>sᇘckkKLL= 0j(Q 4{[H iz 8Q&&kD@ѹb )]]7Ztȋdi-MD&E0C̎/?^:r;Nv]~w3g/s (fj5l6_|p|󽖖ŋA v>}"Hϟ?'`0)++r155{N>|N#///^H("k?ݻcN'D"y^ݎJj277ytttpYxՆ(jt:Ii2>>_odb"۷o`zz)޽an ?]R$g]igxxv9pOӧOnj5'O\7?|l\Bii).\5;+(ZR$??kVswܡ&-+ <o&##v:Çy% B222طoJwjx"xބFF c20b1y GIX@f|>**$ gϧNn*Mt: Bb1zzz0 ܻwFC[[Ӊ&7ow^"7PRRB]]. (244m[k D6nrwm3K!zX¶6bqm~B!+żY?&%Bt+jJB Bf$ !D/i&]k9~ݹnB!6$fR௯=E}B'!H3(kjV !H] u(!r@.2IENDB`grhino-0.16.1/help/C/figures/mainwindow.png0000644000175000017500000005002311436423225020765 0ustar lerdsuwalerdsuwaPNG  IHDR,bKGD pHYs  tIME$T/tEXtCommentCreated with The GIMPd%n IDATxwx?w$@( EzQ )ҔQD:$T&-A@I$""%Q0t'HK!@N;..PswwޙyAAAAAAAAAAAAAxXNS ` _k D%m`b(ws|(ըbeK͐nJwLT-_+Q1'&+#OysmRBٻM V@Lp \]sLN1u/mj5txډ 9Fap&Y΋Kd\I"l nF\N.nا-!{Gg1z!yZD?p$ݹMEEAQs0Ԕ긗.+ֶ}g_"wIOӳڷNuC 6mΎjU0~tj4 "u8}l? vT~.\vouKxQ[>U;G}!S^/Ezzv \@:t<<=[nΙ3g|iزXB8;ҰN%;ȸS[}p( t#N,q\O8/^]-[~}zSjURtObcnzYq OOGAAQUP Gzz4o"))ɬcs)QV˒%Kps/Mq-VEݹt'5j|"ԬN#m]9 ԫ,OƣtIw^\*OߥLjT ™)^ܔΣ\" Iws.z=Cr~i^of|8Nd ġݠ8p$n$P3OqpxIRq)ZW7 ˮ5קTnE%$$h(U$ήP%9s4bAfpY) tw֮^GקgIަc]9rxA@RTuy z_i WwySukUa;b\ EK`&& doG F)^8wzw%pv/6Յvag`j<Vta)zeXvu^Yjo֬ kwKfxX3\r[3G[4|;G6n؈gŚ2̵$mNWZs9b3WJ+(9WF/^a+ӥ5o@Bb,_GhZnm؅K)=cى%Z y ORRRHII䁤HZ)Һ#cy #IKI"99G'gJKR %GwoDtlsu2UaЅ DOs3&stw+Ar Uswpo؄}4#; ?>!E;^"EY|Ȋ%y Hv z1]IO'%%DIKKE7yRӤu([:ʒzVK8:PK&E;5R\eTkZщ[LעT{%i88KW7h4T ג''F+Z͛QV?od01tg);1+/|bggObP(4}SXq3%KprqЋUs")/FW+ ^<+_>O,܏_fz" <܎bӬ#@rq" C@]$gbof e;uLEaܸEBB6FE$55 8?DDKTl{YFFf&>>;ظi3gΞx#Gp)ܹqql;40FDQ +84k|˷ًͦ#a]zЭGozͰO6Faď9|ׯ`7h4h4^hފu-ͬѤ,ݻwС+ws65 ~c!,lG˗r_⁘ xf&'n/a<D[`vF= tϔPfEX' Z;H5 ٳa[solc3vlc\5i=ϰ-[sUpYS :4ү_6;o6hXv=EV-V ^|@Gܾ=9z{]|/F>h,y^{$cJ80$l~u#l3?+ڭbvl)pM*Vg:,Hz 7o%̘>իZUVaITR;v۷H붯]E!5F~~Kmy}'vMpRZԖ:c.N>,]ˆ ͥ9zGј(Jvqvv iҸ:D(NkK:uw9חߠcWhy5kB:Sʖ^?_tdۻIw>FF?~ {HOOO5ƏV-d/i&l's.`(N'S>+>:[8rH}Pnm$%%0uL/?7-TT12xhU^vc"ֺs@'W`}ʔwvJ پDrF@Nk>J2; DfDQ OHLL$>p-Sřf͚l4mZti]NIKKg)SƓ^=_eַ4i"ŋWwظq3EaիWʕRߟnwԊ=ʔ"x `SWROUH&45OOc`Q\1 OS9=bsA5fzeoj7ڵk4{. ϡAz8::fz?UŊngX-ːS_dI︩ܼy+tTQe[QFu-J۶#ZjN>MҺʾ}/]{b9tpNNNh4J*k `-ʶiZ}e,a.8JĉOp |<8C]΂ 5mN?Vc wd yOѢnDF^D Do\{|d0~ԙP Naf?%U[ p Q!@CI7.28-4Pk[ڣzLۀgBTqpg t2oða9ʕIF8::۸z*))*̼foߎcYWz=.\cǮXU`C]zss9v5عS˰0^b^^GGGbbb M4ޞ6mt,\#ժVtR.ck]+6|܉Xx>/PkףxR~ kʺKN7/…|9k]޽xc0]quu,ۜt|Jrr2ϚԱCT?iRj6tܼrb-4gWv5; 7zqf]_rQEؗhc_>|5c:˗Ҹis6jƢ?1ܩ#ܵN˖9sL 3sk.ժ`l~6 kӞ6mZ3x6T􅖦ً=]ZUzÆjZl޼իe5 ۿL~-ƚ8;ӻ뛭(Ybvm[tV- ԯVE{@kVhU,=^OdƗlWjelg]dzj̙=мekN8A*qppo6iLf-TK.gomu#.>kChxׯW8g\x2*&zȪuGn&V-( h4TNIII888ؒ:III8;;gDדKbc(RĥH|||:ԨQ+WSԭ( 0~?3ONز K G@淲{Xxڪ [h.FCrYc.Tʕptt|EQxSWϸ RhG_h44jԐF>Rh4+[a߷k"HDg*DGI@ I@=yE( ZxXPD@,qelԭT,("d 4S^\/EML'ƒ؛ &۴Zٚ p0D(Dɾu2iK>OY],+ 2"WEK c! % 9*c! 2"o$?-z'4x́4NYc& ׿[@_@rh K4P\[[WJٕ=IKzx))H!zO xtrơ#?0jĐL()WkQmٴ޶hQ׬YGʕٱc-[dΝyEK綨(]Ν;bgg,Y:'Ofƍh"j=4E2ʖ -` 6H(7@Q;_ ҟ3|Q6W ^$9 hRo-TYE5Uvigɓ'[T:LjJ!W+4Gg6fmחwhc:urJ{- ;xl=1q'瘧%m4slyK,ZE:1TRRRr Te  E@rv&6[ʆuKxH+roqW7)-aڗpiAʽ$ƍ wt%;v۷j `|s: uL'O̡CHayA 688ݢv5`O ӑ? b&M[Ѣ$%ݵ:ۼy իVJLJILLʶrDD3MOOg󖭼eV@Y|>ߒcbc{hfQ{0럘8]NH1b>B~}quufʔOQ*N fj<]{Yf>׀"ڎ70sVnm0?KwV~Ι?]XOUĭܺi/qį"]IGQot 袡n8֚Jљ,@Fî'lIj5HO88b}:EQ t}$^9KҢuo/KഹKK%2H~="h<hצ=?.e;9i蹏 IDATR'Rc 8SS8::,gf8~ظ._B OZ Z슢io~_, 𾝘:F&(d+/cG?f]Ĕy+4җi3puuѣȋ4nG#ܸyףmbS;ƍ(-;lt6 H~EW YIbͱuׇ0JGv'A.ʉKRg;--3Ӌc_Tk_δߺwyuiLz IKK'**Ꞁ:S[HZUiȦ sID_0/dK+;whN<~}N[LW(t&{51~ʺujͥpY. fy3>ςt*.^DѢjM؍ǭX>>:U㊍ ȼe8 3#zĄxƙ z}dz& .>.G’k-]c?~ ~L+9m*_ɿO3tSL^pHS7c3lQX$ ɂcD[P& 3y3[=Cۅy 6oX+M9B́e=lعp@21RH8F‰4bO*ɑzKih >")L61mGo?'߬6mڴ#""0\Յ5j;~GQ0~aצIOL`᫯gѢً| *}I#z1yrמyLEgg7}RmR#?esuu frll5{ $K@Lg@=]Xbx`qzfN7uxcGܼp}Ɓ)Ny9Vt͊Q酲=?d4#|풍3Sd5a p8u.\ ;;;psse钥Ӆo`ob~~6  υvj4J*E ն!6an2g?7h5zڵmm*5Fɑ}Mۆjj>|0ڷ-|Oз3j4TPsf.BnrtfUhMP(Bٲq\e\ N+7&TZn ̏t+WaaoUۨ^6GxE+;Z?f 9[6.L@@F a-tԉ&}{_'Ck@ Y#_oRþ1_v0gȡI$ö[hժzU ؏9>AnDg캭 sM7B8+WAv&b@g0K1p@?qpp:gɒ%ؠ~_wfL9eʔ!--QF;jZxajתI0n> \(ߗqtҵK'2G~f{iZym?Mߗjf^K[(p(e+ˢS w&g9bugh]BB;E]*ώp0HcsYuQT117 cȡ("YM:M%V{ чiS~ T'O,DD+z7^_Vnb:&ń/8._D pź{JG񃻰aï|1a7n {YXTTXz菿b̀N(Tt=5FG5ĶoAV-yk;|٧,Xݺue͚uj5ĄN`p  eGYڅf"qFۀg8+rmwl* ;?z&_GOr'2NO}v)[2KB q/vlDqtvVJ4'8w'OҥKTXz*1}-Xy!]ݻhrJ{9 ]d 9xw@FL9vl!5%g'|؍Sf ?"66F7 !!ƍ@Ųm3?N(LJ?.eR~ f77/__Ƈ2u^5T^Mfb=\yy]*ssƚaeWACW(<8rau>yӵblO5_kaϐСiM۴NM5LJpϷ5iѪ /ȼ=s߿?c&~=;0vh/>:IrE6ho~Rt)Ej.hzى=<߰QQQ*]{;lÚ(Bpp0_LY?,c5Fчq1R];o }>-IIwqss\x ج ˣZQ K;sya)77u`W3$ӉIM"-IʘO=iZX+Kȫ?Ln]GOkIn NRpL%-vEQf@7+B3it_֮]n:v@ZZj5r1ܮcTl9@ɵoMLku7_E۝a^ך(]Jj1a/\9~)'NGn&wz>!70UyGM[IFAу4ZC`=zU`zNӉ є(QBɒ%2LC}tuuTnݺ{{e~s88 R+=aUO+.A<|ɳo%_#ɦlYձ-=[A_GGGSwTf{*E  r_<AAo׆%AD@c@"A1xM OƧRfC EQt'ߑ/^ @AAD@hѢ)lAE9rHS^={$""@i9v3mn|/ٳk z XZP C8?NG`` 'y4UZVwve\CBB ϯ sEq ܯ<`|0xsŁK`X~~__<p||| 2qF[3///<<<)xŘ1c }? 鉏xyy(!XZq:cYPIt:f /5-P~vۼ///(7b~"흯{7/WTTT~7'ݬ} jv `M/2 !_Հ0D; L֚a4 C}w 3P=UR('0haMKl4<blѧml9r$XVlݔl?j(0oH3kٷU?_W,3yC(dŔ2 CXu?U+xOMMFV$2%.cfN峹[@Pf3',,1c%k"((fJHHMF|}}`ȑ& 4Q+ PL/4_4T47My|3\jٔMd.hEMxxxy廯OOO 7J~7s7oge_AmbXq5>[WxνMOLdy"fhWv:[}y\ nViEe ¬"da~. }ɍDaI\ijlŇ9"q0؍{Nj 꾝c$_*-ju0f܍#0D=+PܧnU>ͣ{ ykUQBV,DQ"@q*uf`P>T+ P 0 R\9j݂rƪe؉a~e_b6a3p {= pBo*5|7q>A:H ? D{2GP@Al٬xO>>"AxL@v@TTaaaDA<1bQQQDA< #((___t:XWA<<<<ĺ XN#<3Iɻ+H*W' ) b>>bL\OB9JSdqreTNA>d׮]̝;$"0-I+pĈBȝy$+wL%μzX0FpXa.f-u 'Wkgz,? .0C7Q3(3tj`ÙaUsE l=6øԇ^@BCC 7}KLfa^e)4yh51G]錂FB0 &u9 3,M} O*Fe7Mn7mmxNNȄ9`涎.@$""#Gҳg {:c XMcX9an 17UV%$%qV ?!!!DDDX8l1A̛gN32b涎.` 6}X1\YcrMgiuAc涎.p_=0_IDAT:l1AD@f1mc]!KL  <2Dh~2CA0DbK~4?. "   " K@"""'44T+ bAAAAx4ސtx{{K@)A #,, ooo"c1(ƌcAA"|||GDA2t:AAA:N,, 7cƌAәb KP)A0_}744TB X' aaa3w\ cJ+AA  އQ@AX " ֋G``XUADAD@AAADAx$ߓ2@A'Ob x   "  MqAA< ooo Mxx8^^^ExxXXA$ot:QQQXXA$op7n MHH>>>t:|||  䍷 .,A@b  <  "  "    "  h?ss 5W{[|QM{A<- D@A' Gs>±n܈2SxlEQ}6m-~EQp"awX(DE$55@岔;11]kQV\}_!ݺ7xc0H4MRSS|2CFwv  ~3Khc6>;ު5 /4oEDDDeM'NG}Y*Vnٽ7JѢE@ Z.Ko~v}<,"{'zV'j`PpWc0QsXi4<b?qW^~72\af;w+W0|'Ӧ+,YAW}޹EYgq3 T23E*Pk[[Ye$ժL[hBZYj hyY Y`SnMfP ?ifpH}|}f{g9aUc,qqA1Yrqq쟿e 0f(g?>f?7èblذbbog߾Ocw4;@~1Fes'q} V2UMGb\J@9v@z{M?䥅)KL$5KFISdٙ>3Eqx.ϟg||"DGG1y4FqR-eKVf>8:/70+ή{X:/c5.aen^ΙEǎy|tBCCZ;DNQL&3X,V230̘({6u /R^~Y\ؿl?0CdLfbeKVG|[҉b8vٍh'ƌ{s=^ұlOI4?\Ro2sq[AL 5n޲\}ƪǶxUR HQm:Ƕ:Za b[Do*0)8`[H_O$bPF\}{K4KN#nαwcFp)BBygZѯ<ǘ?u9``WHYNr$ q }e8n|ի{@FEB^z(e!sS>ܼf%*^Odd$s>sBs>7>s Fbcn+7c; N`;3 [TElk ӱC rc Qe%~>j0@_RR+Wͷ'B[²Zt:lg, zK(Bcc#^_𣱱BN.IEalֲ%s b`0\ŗ555t:G k\9ѡCI/h42w>ASZ#vzGB/ItvC^2scoh 7/Zh4.bCF㈱Qx*9 ???yw6]Yեسgo.ښZڬ .4ވWA{I``'&$<1 H;1IZc$ pdDNL cd]AH]5|!AV\H(                hgBWIENDB`grhino-0.16.1/help/C/figures/prefs-ai.png0000644000175000017500000010147311436423225020325 0ustar lerdsuwalerdsuwaPNG  IHDRc$ IDATxw\UuϹ r`h!;QLm̙z4+-)wi9sfV{`r{A\%`~߾{9\Ηߙ "BTcW:!@M$+MOUe,BH];TH$>)i-h_ddGə{&,Ŀ}KsBF+(rC1Ž#STUeSVPWN126pWmo=Wz&Ŀcq5~%"UUQUgΞpǦvR"DY;YfFFFsqILGx;!FC;-߮\÷Waf^#s[깢%D4v\ ǍG "42;y;to$$5nGafb@RB<֣mj[[2iYZ節%jת9}[AG;3w*PˊnmáI;y!ԮeycLL #Y5?PKS[7 JyA!#+]v6**$Evv6۷###] qi033K}{xй}!.27{ܜks3(?e;HNM_~#{%xyP?'`d)L4Ĥ|eεmjXӷGھ>#{?Irr*ic=GVcne> ~W?ٔ#'rл' s6fUNWrysN36| n&@MMRwUvv6:###P q ++LTU'#+QBBB9qֵ+ؙY`dlm7]v6&5&FDTL,E]-јX?LLQ -PKnz9eu԰DjPcS3]Я;zUSxusEf.:EƏ+7AQtlTༀ~/uy9wavv?*duw4 *;['ǬD365SsK4 5 h M>ݑO?_#=ە붱q6_ɀ ,{{}Q01{ 3;qO]&lظLtKA]B"bڐ_~=暚kU >w^ܠ: Nزi}U Ydff%37ߌMk`e+Ի'劈e5m챭mOD۬anId2HMMä9vnXXYSK,>-!,Fbb <{߃j@dm6-]*;LRRRHII!++.ĊngefJT*]LOEUs^njf{Ndeө((8QӦ6)hPsKK,hљ̌4t:PZpYs˒k^wNdeTuj;BkCZj A`iش--1v$5%,4 ##jZT11%*{YzP1+]6"֟]?IYJeZ&6OiAU*(좳)k5j( (JY%m@ksujjmҢ@+M :wPTJ\eY*l@=ZNd p;PWAc[E(w4+_z*:+!:7~GB<ܞ4^ ;futN"+72!u*=5B! 7'U=ՄBr/'+##H!#7'dd%zI<_nJ!D7'J!D7'1+!NޜTUxxS!9 YsDD ܷB}]Q:Lrr 6[Ϊ PN9ϾGس߭\CtvrFZͤ飏ߏۅO>+׈Gᙞݙ姌9Uu(1wb˭[AsQ.]‡V-<1s^K֭h@ܼyL"U%oN*jd銢p .БcʊDl8;N 'Ǻ\'?_ɬhִ F˝;q0ڰu/892|@ޚ4'N:ּXPž: 7r|EyĤ$j`Ѐql g_u=Z6<ե#6XZZХs{m 32-BT ly篬YΝ;?V;_&7&[C}K/1%:&z.NvEىSaii`ՄE`ooGJJ**wG;gEEGrO;ԭ[Tq޻yevwk/cccMzFDaS ڲпO9?5-[n{%iG!v%EQqq੧:h屣GoAUUTU%;;cc"-/7}Qv>n̏kk-eæL&4ĘFO0h3V˭[A:K罱;׽)%̛;K_>9%UX`?R-!xT1+UUaz??`*> ZXZ:uel{RDllwb~lE <pYTU֭ ~ݽ'x]-5m1O!:YwOMpU/\DUUmBBBI$%X'~&AUU""4v=`P/o;y^IBAǬyb^oN711վ1ibYc`wZդe2n Ij7$&$bZÔ~{ҡ}ĩ}yZ]h8a6 9Ǻ~cfIjZTxKLtvwe+ҳGWz?CGޑTA#BIޜ8;A~DE Gם,]s뇇xu阚mcll\n܍FFFJLJ&Yڵk_x N_Q.ǫS~9ԭ}lZ6s#5jjz^_*jG!<"D!DW#BJyJ(~ɛ4**!8E!}yDHETJ/:G_/V.GxxhU"x9:?dUUqt}E!D%_1GŖd+.!ّՅBT{fd%ĿO/ot8$gUuB˳E|*KhIUE;JJo\V溒B'w EUU#"$V}Oξt}4BUU.^İG@>8zwTU_~ ~r-^0LNXXrڟ5mӧ@?ט C!1h0}o,\||Xe ŋeaKPPW\AUU~'<==۷/;v ++}SOM2u#fTU%,,={*Æ #99'\t}AN_^Qw,UPxՙ3011]5mZ$::݊k29^7ӧϐm8q$+/s玌;γjŷt˻SʞsW2d FKppDGGAVVޛO 4Ǻu\Ë^+&N|F= ,*\/2j s;ӦN9s9w<|[}?.^#}* 6j4>= w7_nis1֫Fcccv؉Nxg''ҙ:ǻ| y'G|ÝaÆkO֖&Mvm""#׍Ξ=lٲA`llT~&Э[7Í7t={Noݻy'[v-Xr%:uʠMWWW4 ...yf,--ywW=zXl)l^aOʈ /S]\#66;;;yYYYdddN#wyݻ_cUj`lllrnڰac &44=1nmӧFS_n Eښ ̘97oDbR"bbb€}= K[:%^3UUyꩧ=z46m4 ;vdǎ\|___z^^^ϭ[uQLTD0u|_dռysYz^8`p"͸rh(JKH'!!+@ή>[[LLMOHrIIdgg؆VkS|Bb"NGttL$$ēVkeC.UU EKXbZԔOU:x ^xa4~}qt?<7۷OH(qlEQҥ )))|StԞ={'~jPOjlْ#GNj% 8'2<}w3wl̛[n̒를$w#*._uѣ{fdzHOOc^= Ï>f/1gjjJ||N2ƅ  NGPP0={fM!--p[oOkoLMMٵkaaaddd( 7vm;MCˍmt:n*Ul[[[gϞ>,qqqѶmũQ7{ٳ_NǍ7h۶-}-*Y~al0t`~oħmZiϖm|j9͚>ƣ6/?w1}?1#lReՒ{F˴Sh‹Y#ǼĹ? ˾]+KY'K}wtkק3zdcjnPf!Ӯ}ݏFǎ~̐q-~)+t yGر#nw<̛7FvZNJ5gϞk(ߪ%*PqjέaxP<|WUtE4.+UUIKKܼL:u#p9111A#%%KK|'$$baa?.*O/nN>/v+.onn^-\W`̊Dު# <{ 9^~PsUz6--Ǭ( fffE/k*I? f͚=toy 2QԲ_޾={Yj5Xh&GQMhăGUIVř߬ڇUD ٜ8y#3j :.KDu2nܘ*_Q ͕o,ՙ$+!՞$+!՟$+!.-xxU!DVu$+!*OU DW!IۯQ>8:Ϫ W !$Y !$Y !$Y !$Y !$Y !$Y !$Y !`!*AxxhU D>|~qtt.uIVBTǪ:! IDAT٢6a+DX{!**)1ھqZJBQ(yBjOBjOBꯚ$+Ϊ!!l۾ pTU%::̬rգ*Iӽ]~UVeRSS_B@qECU222xwi۞/ςhۮ#3fΪ6'wŋn'$$__UM 6ɦM5kZ"6zw EUU#"$V}Oξt}4BUU.^İG@>8zwTU_~ ~r-^0LNXXrڟ5mӧ@?ט C.{Q]AB뉢)¦M9r$h Q]w,UPߊ<Μ9)ڵ7ihժ%1 4oV_ϐ!>}ԔTnƉ'Y|;wdq=wU+[7_ޝ2Tǝ;w_!1bXCHMM%::ڠdx}HHLd!8֭˼ү_^ /_!%%mDDD0q4jQNÆ Xh{矸YO333VXAfUwjWLTѷ -^yH#%%ss"ݺm;nn1i"nn <f-YYL* 8?IIL> п_BB5 ͞CƯ{7~ܴsA舱1;v‚W'OuLv>x}5>cnnN>Yn<ٳw3>^EMy뭷8qDG$DLTD0u|_'Iʣy88س>q qE<=qUyQQMQOBB"VV5]}6|Y. O}DTRT;Cbpwۻ+^xxD~3|p֬Y?f4h׫82!*.DQDZ>Ali 1S}|u6AA,z)K^[oM¯{7>?+]=lf~cv+oz$3?n\tӳgo6lTXkVqgs2ds%' j e$$$ʜ9sիWU&^I-gVC3X~#>m;кM{lUi1} _}939ƎIgKjILJս #Ge)hEl,oc^@_w {e.Օ,ƥ;]ѵS=TajjB=JUO( 7n$00[[[<<!DU]n1'ɪ 9֭˸qc: !($+!՞$+!՟$+!.-xxU!DUGHxzTuByU$+!*vx9::8D`!ړd%ړd%ړd%ړd%ړd%ړd%ړd%ړU*e\:$gUuBTm/W+ӝ1$Y Q z#;%w_eSBrtIVB!Ed%g !(NgzQw%J!DtׄW01ur@%+NǹsIOOG-Q7W\EUUy/SU]|Xc*wىM{\Pr%=?Nǧmzѣ*/LNXXX.\8m-kIp-RSh9]=]ա Q*11%z֬YK6wNMIС#DEE3С_/^@ll,AAUUH NNYbjf-QQGD0rδl\Ν;OjJ*[mĉ\Ν;2z8Ξ;Ϫҭ/N @Bb" n]}5~WtFWUUv%K  !̙3v 5%%mDDD0q89;1h0q  !;;'Sy^LbgUVuVCg2}{ԨQΩg3{|?ov)퀭hִ)O@fMiN,,,Xؤ#׮MDd$dee3ԩ7ӧOZ_;vbaa^ɉ|0}AxlCчвe bo^WsOqrt,z.*^={hl,lllpwqf|u4 N$.33F8~CGŧmOK:kk-?ut튽}CCpwYӒ X6$4W7W ؗ1`x3gq-HLJ4K!' V F/Lhh{@Ǖv}!*LP<| NN#==swի8|(cnjr.D~kWOVHMMY^fff(BTU kGUU011Ȩ]X믬[))) O:c|阘h #11 -GuJc>"DUU05Q@"q=|{ac|ܠ^HHg3UE\u;1$oaӲȪ,4M\VZ+pg㏛iEmE)QbP##B֎(\rQQZrU],{/][^"|[y`Y\r[IZǵTuxZ.μ%Y !(yBj2g%g !(NgzQw%J!DtׄW01urqߓի׈FUU_UU%))sIJJ睿/d~KSUUsh1dffU *9} ^UU3O@,xUڄq_0N?OU7Ǭ~9KKKgNoADGp8;;a&.W1zKD.sQA"u\SERU'wbhdggd$M,kW.Ӽ ~3`aaQ _.y :ȪS8pP̙sDGP%K?CtW׆(Wцx(b͕~$rN s|̵TU~}9#Fc欹h4UDkBTO=pǬ:v@hh]Ic==صkYY9r_ ,<~cٛ?GPUymU.ɓ7`0>=%~g2ηLxucg_@ξv{^燏ۧ}dʜu233y~(~UUvOFK6w (p* .KW?>ى7~QU1h0}o,\ט C\z#Fӎ}g>8>S>ނOvb-~ UUU.^İG@>8zwTU񯑒” %<"ϿObEmFb0t(Z5&VZ-hZTi QR11%z}OV]tJn9;ɜ>sTڷoGjJ*$4~ 5kyԩcS伒CDD$C s,f1vv_Ȩ|RSRٺm'NdetܑcqyVn|ywTTU%**݊k29^7ӧаa.ZPڽk+ 4Ǻu\Ë^+ٽg/,e'3X72g\TU%>!v#"9EF|_wng|6g.Ν'%%mDDD0q89;1h0ܹ <´&cff'> [߀w|(89(qxݳP<+1+UUԩoW]}1GiNc\x=jo^WsOӧиq#枏8/oyݺ}fM 4k֔vVRgEL>k2"nێ+^MK3Yg佩sihƍyn@EaǎXXXWpvrClq3~0 ,E!##.]v&Mz?|O69Hik&"2588 VˇLCQZj @lXs$z=>ǺuLU"yaWFggakkK#w7m7^G舱׺[~Xllk2229?^}pw*{'+EQСOzv-[zhhև]pϿء}m4kھr7ym#oP\\Ӎ_޻` Zk9u5}pypgӧOo֮@#wnjLhh{{JvOƢ۵ Mn]y$%%1}ڔB0222+wV_UW(DFF}˥ZqUv`A nx{? Rqvlߢo7>!U[eKҮ}GB%#V[7,s(Xkxy5'66_߮ xnSF xUm@ )wZa=l/?j};Ͽ|}}_g8t{CUU.]uѣ;OC>3!ӯ?n\[nGqv={fM )O(cUQU;j6ÆiwqqTilBDeUro@EQԱҥs'_ޮ iȃajjZh{G([swscy̘9i_w_6lI߂ڽc=W_~;L!6.333^7җvpgx?َ| IDAT1sxw^Y .zeՒ{jִd)xy5ϯ;C)};Ej뱪 II|t!.],33|ċUt\ʸQ}le8\@__" CtdHtZ]\rGX3/§w⨪JZZ楮YI:N#==ss| k'7."wmt siHOOFc\IXX\EcE%1yDW:䡽(89:~?\VRV-~qm$EPgg~s}!V X)w+ ?CTu2nܘ !*<|Q!D'J!DWO d%D%lцsǫ: !*\̝އ$+!*AioI#ăżJGvo㣦ruA PFee %AA((Ddo=鼎Guy݋6ȓ4\]u!BX5zVn)Bddc>Mdreee|G$&ܦyV᳕Kk+|p6(O9C|//t̺ǍS^] {'ΜL:cGhG*'Ob;o8'G]QYbrAQ||rj/66V,Ԭ d*##V.asSiѲ5a!L6:Rӫ)DQ*j@Y)b| |?peF=E6xs3&3k<ҭ'MlIxxs֭QUвr%FC{l wDUU̘9v 7,<feݏCFw>c#G vdW4.nrQ B4SMgʮ]{4d8ӵ[O/YGD0qR0_~N#weoԹݺb׮=w]TUeety$fԗIHLk=E5۵kO$yMӶlacSa)n|TUs $̜E@ێ{l @UU0ٸ뱨xڼq=q d23XYYѢekEVm4|ǎݦe-&&X/srv^7$&%1pP9,AwGq+$^}>?n+mq3M7&I4iҘ|mZp q^H\\\볘Lj̚5gg?/^ Pr>UzE!##Zjr2RZOpd|m_*ΦMqvvٯ( -[0Gz)æM1 ܼy޽nrr)?a0q㦱l\vd{s*IHHW(E֛wyr#q@xNj着}8t_} 7n >p <== h nNXX&u䭳$[vODd$W94rɪ/"99{⮟@⭷琖}.rӻpgɫcy5ټi=r""i٪db!X/s}o>*Oz\Yd`9bcu]P\Ֆd.$%'S~Tqՙ3߽˽t{k⪪jq,^c2u&U8KB~o'~Q&m(zV<.^"n)<<fDGT ܍t: .LMM>$@/n1 coo_h/^b<56>QިI3Y NV-UPUդ Tjkrqg诼0ur j&SUd \QTʩKL-{jB@#Br,;WNxf+gR.$&$w9sxԬͦmُ!zF6|:b^ڝ(E-lsџ>Voa4M*^'g'}o>pD͌GEQ]EQ*SҾ6eYO!C/j)*Eű佲UKKKƤ X2ȶy{yvj_V++@h:%X-D}?U5d|*ހpZUݍ,Ϛ5?~((E!OBWO d%DoކS'Uv7(s11ކ$+!*@IoI#ĿU*IVBT~GQK]\.IBa$Y !xBXÈA hc`JxD'WԹ={^VNѭ{/vS/]蠧hݦ2.%H m=̔/h,W¸~ݷ( |On:<5Un^1wK+}[J^=\xq 4,eWgPՕxomyJ^CW\A&~ztHRXjQ#ɪ?=[[c钅h4XWm}o{DDFOA;ѣǸS_|>?n?S'( >>8zYMBbk3QÃ'>΢2kL\y|xI j?.>&M|o//vuP jժʕHIN@:ONd=:z$DRydUFÝcǎlJ#7EQ\]\8u4o5k׮ERr7i{jt:BC599UN ܕcǟ:s^.Xi4&m͛ GϾ&uqqGn>DEGӤq#OWK~*'''L%%%.W7Աեg`N>ˋS_旟6bggǦMYt9+W,Ef⡶&孬]4ӳɾϖ.\4zZjiǢ.(}gg'M@vBLLJB5v:C b+Ӊdϙ8)O:҅%Y&MpIIITRӧO3iҤJ%W]vm( ~@XX8/O 7$u+lllغu;aaadddLx#TUK^=g>؉;w5߭g9;{~m?0;OaӦ n޼EX~$hx""#pwݽ:EӺuk|||7o+7>h%LQ YzCJ(g_F >x=,-[`l۾V* 4S\rMӋ3rԫW}g&J~6mq{׮]7O}c劥̚&'cgg;OMNԭ[>`ţhذaAAA|'~z#g! |)A}e҆ns%w *ɛCo@tdH4zRU4ZmCnESUt˩7]Ŭ,qpp/@zz:"r*sԉCƇ/7 .&8o3c?/_?r!!79u Y]ãfm6m~ k7ӹ2 XE޾ķ`RFS?/QA*_9$Q(ĿZ.]KV7a@!fɹ7`%Vf.IVB!"_Ba$Y !x`IVBTm8uPewC2SmH4B[ȍlwŽӻT+ B'J!œd%IBa$Y !xBXRI*G |yM3NYK?f9{g1|ē2sm;ﱁK.3:)Zc`矻PUp<>Kѳw?޽;:u%ף&CxNa ZOmcˑ?ZWgȚd rUUٵk U@{v%˲OCCyfdf~Gd6bq +̄ɤ2c,BCC 0)W2}믿'xWVҒ{Zjw}Td:yzN:K >>WÇؾc' 蠧u+Ĥ$g͚,Zcg9i48ohԨc-hꇍ?4MSDEEĠajՒkV3t`ƍѣLj)t^ns}f ϣ՚^/*uam۹t2>c(~'^9ypIRSulڴ{nkyg>cb)ܫLΎ矛T\Q[XLca ڵO=l2;zYCƍ P^]矛|?qssEQۧ|#C-YzEQppp`ͷ_&5ՉįJyM<<ܹvޢ5k /OOM77T,ӊOBcz;|n:ׯϫ >cL2>[O?``֭++Zq)l.:2 ^䑕;:ĤBCCQTZ^)>q-BCѳu![9*/ IDATzIF#tY)BÆ PEQ%<UN8lWr)jysvygggLdd$7|Å h۶-zfՅDߔ ,JJ2睷</YƵk o0iR0/M{YYҲϙl#}z"0;OaӦ n޼EX~;Åz.^7߮ߣ} ѝ={}NTUܹn={0˹ y9ʌ c姟RVG _! xzzк666lݺ0222M!Fvr666$$$KQ˛7fm\\WBBcǎƋ*N>ͪUׯ}etVKϞ=Yd 7Qs_D؍rUUXGV.΄Rק!vv8%N:6mq{Or?rtt1ft~cȐA,^>{7Æmw[4hЀN:p7z (@``śo̢#]4j]2UUiҤwEQxG?xgޞЧOƍ#<@@@={K!ʄ-*zV<.fߺ|7 :2hL233qpp0_G9z,Ϟ ==VFyiiih|'UU%-- {{t:mj.(m9UUIJJ8Tw~Q{/ zDHjj*D8u^fuGEGrA{g?*"5ki[J^ ν7jhZiy?Z>o+PwyK[aϹ8Zn+L'DiHVQZL,X2$MV}GVv7bIBa$Y !|ooކS'Uv7( J , D^`$J osXA- !*/KbBgϞc T^l6%)*YYY?ձ­jUꃥ*6I|{1/*CޛyjP/N³"%9 ֩E ?G1o="(/,FǏfsRSRY9H!v4~=pv^/3cYO/$EG2wWN{Oķ4[GuF?P4nr - J7p[ʚLZSNSvvvOlre<<6z QLL ?~$&&=CQHMJ >1ԙw Z硡a?~ 4nl\YYY:u&M#իW_ߏ*U%GVfʽauuzG-b/$|{3-v 6+曯y!~8}"ݽ6Mԩ =ŋp"&uy?/mO cǎ`0p->4e۫,bZ~ ؾs7`ٚҭ9hذк3}u"#"2{cct2Z2sYĴr{6:b00 Dg|˓.@zz:/C۲`G,\[Z_ic ى*.&{zz>q/Ys\>w+Gwƿ.YN_2[tG&>6TEllq޸yXZ*$de&'OZͺِu6 6!CNYx ˕Ll8Zj ,, ss5n"94 Y&˝Ĥdjzx}m^:|Ktii&gxo\t//OLn]x264ڶ 7fPݥKǢ@fW/k$B2j,NYUҐszBoFzu2 Z%_~x׬'Ӧ]'N:Mzu˵knƍWg`L2_Ґ#+3{j08Ժ+kkڸjltNF\|<$++˖_㫯1yơPf >^!ܹ&l߾YC b1ܸq\̩###/7Gϵ8~$z=d-FܬnVդ? 7j-[47YQQ |b(jɺa! G[t';-V}P{UU ݾϞ=Wi1[oEwɃL,2MbHopV,gGsr'_֍k8PV-lllX't!_֭Oz:|8 5z, >GГ|9iQL% x^>>uHHH[[;j3ׯ]f&MNNWM%++ ]7C ֶ dZ||<*?&M|/OOܵu70x@򩪊Fa9þ}Y^l41)jIOOϮlz-snڷ `L ̌_@˫3g( "GVϝ%==Z+4m?~mRshpvqu8J-TVH|cg3=j4+θ:X4M/!jڵzu퍕ujF T'''6ᗟ7ߓ=,a $&&}jxxe2o_KR}`lH&NcK/0r[gP<,zyt88k3w]IZ罻w[Ӧ4(M}pwoc &}3gҴӜ8wUUZ57]ΐxeDDFϙ8) N}WfL Sё~ǻq[m lWQdtQW~j//NXY2y^k֬O{ѹs84n;˖~̤ХÕ䜕!M7_&m\ԋpvs#hF Ҡ~6gp8y48ƍ?һWr.mj;%' ߎ2_Wf|S (2ÇBIL%&:0ڶYCkY>K9z0-[wedfpEur6k׾*U/i׾Yz=z}fanL :g5qr0o]ϗ_2i>̷lmm/Oe|x׮_ƍ|S>d%S^xdѣ{g Νwk؝}4v<W{8::jw%nר_eG""+3}F!xGtгqjN^]ֵ+8::be1Wo{Yt9W]֭;&Nf)ԬQζO{ d9^zx^3m}f&ueEwپb-mʊU tju{iX#rk.ѝZqqq1z=ڷ,Xwߛ0{LZvINNalܰKM pq:o"BU7Y{l9ݗKEUF;b 5ˁiii$h%)xoH/^[jj*vvvԬ*ǎgq9ytZm>~ *:SjnLΧ}i0cL ~ϗ-۫&5zgjUUqNBr|a׬Gx|HNJ9 I;}O?[n2OUUnֆ^Dٻ7𛥾d,b9 KUUQ򝓁/绘(GawIv[e$&$2yK9KwѽsVTss3Y޾҇rbI5ki!^ Ε#+s%b[^66ZjxxPnۇHTMQ\veE)M8M@+6+)3xgL (rBbX )ɷIMuYKjygzظXΟ={hӮ#:TP`[QUw]ϵM۳+}+ /t6C 䊑.Nl|o!ak 6A.fx[kZ2#IVf2w(??__ZЮ}vڟeJCbR2T^uQgܽ}f&ڷ[Wʤ +2ֲʡhݫeX6ir1dIDAThһp6gN.pŅ^=(JCYz=ׯ]Sn32wY ~N]޵}Upe)a񶲲ӳ&=3(Z-vv888l\!YPvq sIV2sC-iҤP\tL7&UKÿi=MN& tj̓a>2ܱ*5{ %%{4w( %Iб$'wt0I E݃'Ս4]2)Iߩ)xkN]7.^Q+(Zkk=p?| lm(J{ST.K"LeJCGGc}quu!33LN"hZ[cmuVOe+#VVV8CV=(z}&q1w]Ғ}dCҰA}222 uI2Sy[[Y[aeme-LbY96Z6w>޵{0ޒt/Xiٓ=iŒde=GbZ$eObZ$YaE݅{ĴIL˞ĴI*%OOo<=D$eObZ$O (IBa$Y !xBX>)dnl Define if void *operator new[](size_t) is supported. changequote([,], [])dnl */ #undef CXX__HAVE_ARRAY_NEW /* Define if C++ bool is found. */ #undef CXX__HAVE_BOOL /* Define if explicit is available. */ #undef CXX__HAVE_EXPLICIT #ifndef CXX__HAVE_EXPLICIT # define explicit /* Discard `explicit' */ # define CXX__NO_EXPLICIT 1 #endif /* Define if header algorithm is available. */ #undef CXX__HAVE_HEADER_algorithm /* Define if header bitset is available. */ #undef CXX__HAVE_HEADER_bitset /* Define if header cassert is available. */ #undef CXX__HAVE_HEADER_cassert /* Define if header cctype is available. */ #undef CXX__HAVE_HEADER_cctype /* Define if header cerrno is available. */ #undef CXX__HAVE_HEADER_cerrno /* Define if header cfloat is available. */ #undef CXX__HAVE_HEADER_cfloat /* Define if header ciso646 is available. */ #undef CXX__HAVE_HEADER_ciso646 /* Define if header climits is available. */ #undef CXX__HAVE_HEADER_climits /* Define if header clocale is available. */ #undef CXX__HAVE_HEADER_clocale /* Define if header cmath is available. */ #undef CXX__HAVE_HEADER_cmath /* Define if header complex is available. */ #undef CXX__HAVE_HEADER_complex /* Define if header csetjmp is available. */ #undef CXX__HAVE_HEADER_csetjmp /* Define if header csignal is available. */ #undef CXX__HAVE_HEADER_csignal /* Define if header cstdarg is available. */ #undef CXX__HAVE_HEADER_cstdarg /* Define if header cstddef is available. */ #undef CXX__HAVE_HEADER_cstddef /* Define if header cstdio is available. */ #undef CXX__HAVE_HEADER_cstdio /* Define if header cstdlib is available. */ #undef CXX__HAVE_HEADER_cstdlib /* Define if header cstring is available. */ #undef CXX__HAVE_HEADER_cstring /* Define if header ctime is available. */ #undef CXX__HAVE_HEADER_ctime /* Define if header cwchar is available. */ #undef CXX__HAVE_HEADER_cwchar /* Define if header cwctype is available. */ #undef CXX__HAVE_HEADER_cwctype /* Define if header deque is available. */ #undef CXX__HAVE_HEADER_deque /* Define if header exception is available. */ #undef CXX__HAVE_HEADER_exception /* Define if header fstream is available. */ #undef CXX__HAVE_HEADER_fstream /* Define if header functional is available. */ #undef CXX__HAVE_HEADER_functional /* Define if header iofwd is available. */ #undef CXX__HAVE_HEADER_iofwd /* Define if header iomanip is available. */ #undef CXX__HAVE_HEADER_iomanip /* Define if header ios is available. */ #undef CXX__HAVE_HEADER_ios /* Define if header iostream is available. */ #undef CXX__HAVE_HEADER_iostream /* Define if header istream is available. */ #undef CXX__HAVE_HEADER_istream /* Define if header iterator is available. */ #undef CXX__HAVE_HEADER_iterator /* Define if header limits is available. */ #undef CXX__HAVE_HEADER_limits /* Define if header list is available. */ #undef CXX__HAVE_HEADER_list /* Define if header locale is available. */ #undef CXX__HAVE_HEADER_locale /* Define if header map is available. */ #undef CXX__HAVE_HEADER_map /* Define if header memory is available. */ #undef CXX__HAVE_HEADER_memory /* Define if header new is available. */ #undef CXX__HAVE_HEADER_new /* Define if header numeric is available. */ #undef CXX__HAVE_HEADER_numeric /* Define if header ostream is available. */ #undef CXX__HAVE_HEADER_ostream /* Define if header queue is available. */ #undef CXX__HAVE_HEADER_queue /* Define if header set is available. */ #undef CXX__HAVE_HEADER_set /* Define if header sstream is available. */ #undef CXX__HAVE_HEADER_sstream /* Define if header stack is available. */ #undef CXX__HAVE_HEADER_stack /* Define if header stdexcept is available. */ #undef CXX__HAVE_HEADER_stdexcept /* Define if header streambuf is available. */ #undef CXX__HAVE_HEADER_streambuf /* Define if header string is available. */ #undef CXX__HAVE_HEADER_string /* Define if header typeinfo is available. */ #undef CXX__HAVE_HEADER_typeinfo /* Define if header utility is available. */ #undef CXX__HAVE_HEADER_utility /* Define if header valarray is available. */ #undef CXX__HAVE_HEADER_valarray /* Define if header vector is available. */ #undef CXX__HAVE_HEADER_vector /* Define if mutable is available. */ #undef CXX__HAVE_MUTABLE #ifndef CXX__HAVE_MUTABLE # define mutable /* Discard `mutable' */ /* Change const T * => T * const */ # define _CXXAC_THIS(T) T * const cppacThis = (T * const) this; # define _CXXAC_THAT(T, P) T * const cppacThat = (T * const) (P); #endif /* Define if namespace is available. */ #undef CXX__HAVE_NAMESPACE /* Define if typename is available. */ #undef CXX__HAVE_TYPENAME #ifdef CXX__HAVE_TYPENAME # define TYPENAME typename #else # define TYPENAME #endif /* Define if header algorithm is available. */ #undef CXX__HEADER_algorithm /* Define if header bitset is available. */ #undef CXX__HEADER_bitset /* Define if header cassert is available. */ #undef CXX__HEADER_cassert /* Define if header cctype is available. */ #undef CXX__HEADER_cctype /* Define if header cerrno is available. */ #undef CXX__HEADER_cerrno /* Define if header cfloat is available. */ #undef CXX__HEADER_cfloat /* Define if header ciso646 is available. */ #undef CXX__HEADER_ciso646 /* Define if header climits is available. */ #undef CXX__HEADER_climits /* Define if header clocale is available. */ #undef CXX__HEADER_clocale /* Define if header cmath is available. */ #undef CXX__HEADER_cmath /* Define if header complex is available. */ #undef CXX__HEADER_complex /* Define if header csetjmp is available. */ #undef CXX__HEADER_csetjmp /* Define if header csignal is available. */ #undef CXX__HEADER_csignal /* Define if header cstdarg is available. */ #undef CXX__HEADER_cstdarg /* Define if header cstddef is available. */ #undef CXX__HEADER_cstddef /* Define if header cstdio is available. */ #undef CXX__HEADER_cstdio /* Define if header cstdlib is available. */ #undef CXX__HEADER_cstdlib /* Define if header cstring is available. */ #undef CXX__HEADER_cstring /* Define if header ctime is available. */ #undef CXX__HEADER_ctime /* Define if header cwchar is available. */ #undef CXX__HEADER_cwchar /* Define if header cwctype is available. */ #undef CXX__HEADER_cwctype /* Define if header deque is available. */ #undef CXX__HEADER_deque /* Define if header exception is available. */ #undef CXX__HEADER_exception /* Define if header fstream is available. */ #undef CXX__HEADER_fstream /* Define if header functional is available. */ #undef CXX__HEADER_functional /* Define if header iofwd is available. */ #undef CXX__HEADER_iofwd /* Define if header iomanip is available. */ #undef CXX__HEADER_iomanip /* Define if header ios is available. */ #undef CXX__HEADER_ios /* Define if header iostream is available. */ #undef CXX__HEADER_iostream /* Define if header istream is available. */ #undef CXX__HEADER_istream /* Define if header iterator is available. */ #undef CXX__HEADER_iterator /* Define if header limits is available. */ #undef CXX__HEADER_limits /* Define if header list is available. */ #undef CXX__HEADER_list /* Define if header locale is available. */ #undef CXX__HEADER_locale /* Define if header map is available. */ #undef CXX__HEADER_map /* Define if header memory is available. */ #undef CXX__HEADER_memory /* Define if header new is available. */ #undef CXX__HEADER_new /* Define if header numeric is available. */ #undef CXX__HEADER_numeric /* Define if header ostream is available. */ #undef CXX__HEADER_ostream /* Define if header queue is available. */ #undef CXX__HEADER_queue /* Define if header set is available. */ #undef CXX__HEADER_set /* Define if header sstream is available. */ #undef CXX__HEADER_sstream /* Define if header stack is available. */ #undef CXX__HEADER_stack /* Define if header stdexcept is available. */ #undef CXX__HEADER_stdexcept /* Define if header streambuf is available. */ #undef CXX__HEADER_streambuf /* Define if header string is available. */ #undef CXX__HEADER_string /* Define if header typeinfo is available. */ #undef CXX__HEADER_typeinfo /* Define if header utility is available. */ #undef CXX__HEADER_utility /* Define if header valarray is available. */ #undef CXX__HEADER_valarray /* Define if header vector is available. */ #undef CXX__HEADER_vector /* Define if using namespace std; is required by the library. */ #undef CXX__LIB_NEED_USING_STD #ifdef CXX__LIB_NEED_USING_STD # define USING_NAMESPACE_STD using namespace std #else # define USING_NAMESPACE_STD #endif #ifdef CXX__BAD_ALLOC # include CXX__HEADER_new #else # ifdef CXX__LIB_NEED_USING_STD namespace std { class bad_alloc {}; } # else class bad_alloc {}; # endif #endif #ifdef CXX__LIB_NEED_USING_STD # define BAD_ALLOC std::bad_alloc #else # define BAD_ALLOC bad_alloc #endif /* Define if guided declaration is used. */ #undef CXX__NO_GUIDE_DECL #ifndef CXX__NO_GUIDE_DECL # define LEFTRIGHT #else # define LEFTRIGHT <> #endif /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the CoreFoundation framework. */ #undef HAVE_CFLOCALECOPYCURRENT /* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in the CoreFoundation framework. */ #undef HAVE_CFPREFERENCESCOPYAPPVALUE /* Define if the GNU dcgettext() function is already present or preinstalled. */ #undef HAVE_DCGETTEXT /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define if you have the iconv() function. */ #undef HAVE_ICONV /* Define to the name of the distribution. */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to the version of the distribution. */ #undef VERSION grhino-0.16.1/iter.cc0000644000175000017500000000300311436423225014573 0ustar lerdsuwalerdsuwa/* iter.cc Iterators Copyright (c) 2000, 2001, 2003 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "iter.h" // FIXME: Iterator data are shared and not thread-safe. int empty_endgame_size; empty_endgame_entry *empty_endgame_head; empty_endgame_entry empty_endgame_order[NUM_MOVE]; void init_endgame_iterator(byte_board_info *board, empty_endgame_info &info) { int count = 0; board_full_endgame_iterator iter; iter.init_pos(); info.empty_endgame_head = 0; do { if (board->is_empty(iter.pos)) { if (!count) info.empty_endgame_head = info.empty_endgame_order; else info.empty_endgame_order[count-1].next = &(info.empty_endgame_order[count]); info.empty_endgame_order[count].pos = iter.pos; info.empty_endgame_order[count].next = 0; count++; } } while (iter.next()); info.empty_endgame_size = count; } grhino-0.16.1/white.xpm0000644000175000017500000000415511436423225015200 0ustar lerdsuwalerdsuwa/* XPM */ static char * white_xpm[] = { "40 40 23 1", " c None", ". c #000000", "+ c #3FDD18", "@ c #55E133", "# c #96EC81", "$ c #C8F5BD", "% c #EBFBE7", "& c #FCFEFC", "* c #4FDF2B", "= c #B1F1A1", "- c #FFFFFF", "; c #7AE75F", "> c #EFFCEB", ", c #87E96E", "' c #74E658", ") c #44DD1E", "! c #E5FAE0", "~ c #A3EE90", "{ c #45DE20", "] c #F6FDF5", "^ c #86E96E", "/ c #BAF2AC", "( c #E0F9D9", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++*=----------=*++++++++++++.", ".+++++++++++;>------------>;+++++++++++.", ".++++++++++,----------------,++++++++++.", ".+++++++++'------------------'+++++++++.", ".++++++++)!------------------!)++++++++.", ".++++++++~--------------------~++++++++.", ".+++++++{]--------------------]{+++++++.", ".+++++++^----------------------^+++++++.", ".+++++++/----------------------/+++++++.", ".+++++++(----------------------(+++++++.", ".+++++++]----------------------]+++++++.", ".+++++++------------------------+++++++.", ".+++++++]----------------------]+++++++.", ".+++++++(----------------------(+++++++.", ".+++++++/----------------------/+++++++.", ".+++++++^----------------------^+++++++.", ".+++++++{]--------------------]{+++++++.", ".++++++++~--------------------~++++++++.", ".++++++++)!------------------!)++++++++.", ".+++++++++'------------------'+++++++++.", ".++++++++++,----------------,++++++++++.", ".+++++++++++;>------------>;+++++++++++.", ".++++++++++++*=----------=*++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/Makefile.in0000644000175000017500000005557511436423224015412 0ustar lerdsuwalerdsuwa# # Contents from ad.prepend # # # Makefile for GRhino # Copyright (c) 2000-2005, 2006 Kriang Lerdsuwanakij # email: lerdsuwa@users.sourceforge.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ VPATH = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ prefix = @prefix@ datarootdir = @datarootdir@ exec_prefix = @exec_prefix@ bindir = @bindir@ libdir = @libdir@ includedir = @includedir@ mandir = @mandir@ man1dir = $(mandir)/man1 docdir = @docdir@ etcdir = @sysconfdir@ datadir = @datadir@ localedir = @datadir@/locale helpdir = @datadir@/gnome/help/grhino omfdir = @datadir@/omf/grhino icon_dir = @datadir@/pixmaps pattern_dir = @datadir@/${PACKAGE}-${VERSION}/pattern book_dir = @datadir@/${PACKAGE}-${VERSION}/book theme_dir = @datadir@/${PACKAGE}-${VERSION}/theme # DESTDIR used in rules below is undefined by default. # It will be defined when building package. CC = @CC@ CXX = @CXX@ CPP = @CPP@ CXXCPP = @CXXCPP@ CFLAGS = @CFLAGS@ CXXFLAGS = @CXXFLAGS@ CPPFLAGS = @CPPFLAGS@ CCFLAGS = $(CPPFLAGS) $(CFLAGS) CXXCFLAGS = $(CPPFLAGS) $(CXXFLAGS) LDFLAGS = @LDFLAGS@ LIBS = @LIBS@ INSTALL = @INSTALL@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_DATA = @INSTALL_DATA@ # # Generated by autodep 1.1.4. DO NOT modify this line. # adDIRS = po adEXECS = test grhino gtp-rhino aiai gen_book gen_opening gen_pattern \ gen_table dump_pattern adINTFILES = $(adOBJS) adMAKESUBDIR_TESTS = adMakeSubdir $(adTESTS) adOBJS = test.o alphabeta.o board.o boardio.o hash.o gtstream.o iter.o \ order.o parity.o pattern.o proginfo.o grhino.o binfile.o book.o \ game.o gameinfo.o gevalwin.o ggamewin.o ghistwin.o gpref.o gutil.o \ load.o opening.o rand.o randboard.o gtp-rhino.o gtp.o aiai.o \ gen_book.o gen_opening.o gen_pattern.o gen_table.o dump_pattern.o adOUTFILES = $(adEXECS) adTESTS = $(adINTFILES) $(adOUTFILES) adTESTS_MAKESUBDIR = $(adTESTS) adMakeSubdir adBeginSubdir = test -z "$(adDIRS)" || \ for d in . $(adDIRS) ; do \ test $$d != . && (cd $$d; $(MAKE) adEndSubdir = ); \ done # # Default target # default-target : @DEFTARGETLIST@ adMakeSubdir : $(adBeginSubdir) all $(adEndSubdir) # # Rules for all target # # Compiling C/C++ sources aiai.o : Makefile $(srcdir)/aiai.cc $(srcdir)/alphabeta.h $(srcdir)/board.h \ $(srcdir)/boardio.h config.h $(srcdir)/game.h $(srcdir)/gameinfo.h \ $(srcdir)/gtp.h $(srcdir)/gtstream.h $(srcdir)/iter.h \ $(srcdir)/order.h $(srcdir)/rand.h $(srcdir)/randboard.h \ $(srcdir)/scripts/version $(CXX) $(CXXCFLAGS) -c $(srcdir)/aiai.cc alphabeta.o : Makefile $(srcdir)/alphabeta.cc $(srcdir)/alphabeta.h \ $(srcdir)/board.h $(srcdir)/boardio.h config.h $(srcdir)/hash.h \ $(srcdir)/iter.h $(srcdir)/order.h $(srcdir)/parity.h \ $(srcdir)/pattern.h $(srcdir)/proginfo.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/alphabeta.cc binfile.o : Makefile $(srcdir)/binfile.cc $(srcdir)/binfile.h \ $(srcdir)/board.h config.h $(srcdir)/gtstream.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/binfile.cc board.o : Makefile $(srcdir)/board.cc $(srcdir)/board.h config.h \ $(srcdir)/hash.h $(srcdir)/iter.h $(srcdir)/order.h \ $(srcdir)/table-dat.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/board.cc boardio.o : Makefile $(srcdir)/board.h $(srcdir)/boardio.cc \ $(srcdir)/boardio.h config.h $(srcdir)/iter.h $(srcdir)/order.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/boardio.cc book.o : Makefile $(srcdir)/binfile.h $(srcdir)/board.h $(srcdir)/book.cc \ $(srcdir)/book.h config.h $(srcdir)/gtstream.h $(srcdir)/order.h \ $(srcdir)/proginfo.h $(srcdir)/rand.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/book.cc -DBOOK_PATH=\"${book_dir}/\" dump_pattern.o : Makefile $(srcdir)/board.h config.h \ $(srcdir)/dump_pattern.cc $(srcdir)/gtstream.h \ $(srcdir)/pattern.h $(srcdir)/proginfo.h \ $(srcdir)/scripts/version $(CXX) $(CXXCFLAGS) -c $(srcdir)/dump_pattern.cc game.o : Makefile $(srcdir)/alphabeta.h $(srcdir)/board.h $(srcdir)/boardio.h \ $(srcdir)/book.h config.h $(srcdir)/fdstream.h $(srcdir)/game.cc \ $(srcdir)/game.h $(srcdir)/gameinfo.h $(srcdir)/hash.h \ $(srcdir)/iter.h $(srcdir)/opening.h $(srcdir)/order.h \ $(srcdir)/pattern.h $(srcdir)/proginfo.h $(srcdir)/rand.h \ $(srcdir)/randboard.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/game.cc gameinfo.o : Makefile $(srcdir)/board.h config.h $(srcdir)/game.h \ $(srcdir)/gameinfo.cc $(srcdir)/gameinfo.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/gameinfo.cc gen_book.o : Makefile $(srcdir)/binfile.h $(srcdir)/board.h $(srcdir)/book.h \ config.h $(srcdir)/gen_book.cc $(srcdir)/gtstream.h \ $(srcdir)/hash.h $(srcdir)/log_proc.h $(srcdir)/order.h \ $(srcdir)/proginfo.h $(srcdir)/scripts/version $(CXX) $(CXXCFLAGS) -c $(srcdir)/gen_book.cc gen_opening.o : Makefile $(srcdir)/board.h config.h $(srcdir)/gen_opening.cc \ $(srcdir)/gtstream.h $(srcdir)/opening.h \ $(srcdir)/scripts/version $(CXX) $(CXXCFLAGS) -c $(srcdir)/gen_opening.cc gen_pattern.o : Makefile $(srcdir)/board.h config.h $(srcdir)/gen_pattern.cc \ $(srcdir)/gtstream.h $(srcdir)/log_proc.h $(srcdir)/order.h \ $(srcdir)/pattern.h $(srcdir)/proginfo.h \ $(srcdir)/scripts/version $(CXX) $(CXXCFLAGS) -c $(srcdir)/gen_pattern.cc gen_table.o : Makefile config.h $(srcdir)/gen_table.cc $(srcdir)/gtstream.h \ $(srcdir)/scripts/version $(CXX) $(CXXCFLAGS) -c $(srcdir)/gen_table.cc gevalwin.o : Makefile $(srcdir)/alphabeta.h $(srcdir)/board.h config.h \ $(srcdir)/game.h $(srcdir)/gameinfo.h $(srcdir)/gevalwin.cc \ $(srcdir)/iter.h $(srcdir)/order.h $(srcdir)/parity.h \ $(srcdir)/pattern.h $(srcdir)/proginfo.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/gevalwin.cc ggamewin.o : Makefile $(srcdir)/board.h config.h $(srcdir)/game.h \ $(srcdir)/gameinfo.h $(srcdir)/ggamewin.cc $(srcdir)/ggamewin.h \ $(srcdir)/gtstream.h $(srcdir)/gutil.h $(srcdir)/load.h \ $(srcdir)/log_proc.h $(srcdir)/order.h $(srcdir)/proginfo.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/ggamewin.cc ghistwin.o : Makefile $(srcdir)/board.h config.h $(srcdir)/game.h \ $(srcdir)/gameinfo.h $(srcdir)/ghistwin.cc $(srcdir)/gtstream.h \ $(srcdir)/gutil.h $(srcdir)/icon_black.xpm \ $(srcdir)/icon_empty.xpm $(srcdir)/icon_white.xpm $(CXX) $(CXXCFLAGS) -c $(srcdir)/ghistwin.cc gpref.o : Makefile $(srcdir)/alphabeta.h $(srcdir)/board.h $(srcdir)/book.h \ config.h $(srcdir)/game.h $(srcdir)/gameinfo.h $(srcdir)/gpref.cc \ $(srcdir)/gpref.h $(srcdir)/gtstream.h $(srcdir)/gutil.h \ $(srcdir)/hash.h $(srcdir)/iter.h $(srcdir)/opening.h \ $(srcdir)/order.h $(srcdir)/parity.h $(srcdir)/pattern.h \ $(srcdir)/proginfo.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/gpref.cc \ -DTHEMEDIR=\"${theme_dir}/\" grhino.o : Makefile $(srcdir)/alphabeta.h $(srcdir)/black.xpm \ $(srcdir)/black_last.xpm $(srcdir)/board.h $(srcdir)/book.h \ $(srcdir)/bottom.xpm config.h $(srcdir)/empty.xpm $(srcdir)/game.h \ $(srcdir)/gameinfo.h $(srcdir)/gevalwin.h $(srcdir)/ggamewin.h \ $(srcdir)/ghistwin.h $(srcdir)/gpref.h $(srcdir)/grhino.cc \ $(srcdir)/gtstream.h $(srcdir)/gutil.h $(srcdir)/hash.h \ $(srcdir)/highlight_black.xpm $(srcdir)/highlight_empty.xpm \ $(srcdir)/highlight_white.xpm $(srcdir)/hint_black.xpm \ $(srcdir)/hint_white.xpm $(srcdir)/icon_black.xpm \ $(srcdir)/icon_bw.xpm $(srcdir)/icon_empty.xpm \ $(srcdir)/icon_new.xpm $(srcdir)/icon_white.xpm $(srcdir)/iter.h \ $(srcdir)/left.xpm $(srcdir)/load.h $(srcdir)/log_proc.h \ $(srcdir)/opening.h $(srcdir)/order.h $(srcdir)/parity.h \ $(srcdir)/pattern.h $(srcdir)/proginfo.h $(srcdir)/randboard.h \ $(srcdir)/right.xpm $(srcdir)/scripts/version $(srcdir)/top.xpm \ $(srcdir)/white.xpm $(srcdir)/white_last.xpm $(CXX) $(CXXCFLAGS) -c $(srcdir)/grhino.cc -DPREFIX=\"${prefix}/\" \ -DSYSCONFDIR=\"${sysconfdir}/\" -DDATADIR=\"${datadir}/\" \ -DLIBDIR=\"${libdir}/\" -DTHEMEDIR=\"${theme_dir}/\" \ -DLOCALEDIR=\"${localedir}/\" -DICONDIR=\"${icon_dir}/\" gtp-rhino.o : Makefile $(srcdir)/alphabeta.h $(srcdir)/board.h \ $(srcdir)/boardio.h $(srcdir)/book.h config.h $(srcdir)/game.h \ $(srcdir)/gameinfo.h $(srcdir)/gtp-rhino.cc $(srcdir)/gtp.h \ $(srcdir)/gtstream.h $(srcdir)/hash.h $(srcdir)/iter.h \ $(srcdir)/load.h $(srcdir)/log_proc.h $(srcdir)/opening.h \ $(srcdir)/order.h $(srcdir)/parity.h $(srcdir)/pattern.h \ $(srcdir)/proginfo.h $(srcdir)/rand.h $(srcdir)/randboard.h \ $(srcdir)/scripts/version $(CXX) $(CXXCFLAGS) -c $(srcdir)/gtp-rhino.cc -DPREFIX=\"${prefix}/\" \ -DSYSCONFDIR=\"${sysconfdir}/\" -DDATADIR=\"${datadir}/\" \ -DLIBDIR=\"${libdir}/\" -DLOCALEDIR=\"${localedir}/\" gtp.o : Makefile $(srcdir)/board.h config.h $(srcdir)/gtp.cc $(srcdir)/gtp.h \ $(srcdir)/gtstream.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/gtp.cc gtstream.o : Makefile config.h $(srcdir)/gtstream.cc $(srcdir)/gtstream.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/gtstream.cc gutil.o : Makefile config.h $(srcdir)/gtstream.h $(srcdir)/gutil.cc \ $(srcdir)/gutil.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/gutil.cc hash.o : Makefile $(srcdir)/board.h config.h $(srcdir)/hash.cc \ $(srcdir)/hash.h $(srcdir)/iter.h $(srcdir)/order.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/hash.cc iter.o : Makefile $(srcdir)/board.h config.h $(srcdir)/iter.cc \ $(srcdir)/iter.h $(srcdir)/order.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/iter.cc load.o : Makefile $(srcdir)/board.h config.h $(srcdir)/game.h \ $(srcdir)/gameinfo.h $(srcdir)/ggamewin.h $(srcdir)/gtstream.h \ $(srcdir)/gutil.h $(srcdir)/load.cc $(srcdir)/load.h \ $(srcdir)/log_proc.h $(srcdir)/order.h $(srcdir)/proginfo.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/load.cc opening.o : Makefile $(srcdir)/board.h config.h $(srcdir)/opening-dat.h \ $(srcdir)/opening.cc $(srcdir)/opening.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/opening.cc order.o : Makefile $(srcdir)/board.h config.h $(srcdir)/order.cc \ $(srcdir)/order.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/order.cc parity.o : Makefile $(srcdir)/alphabeta.h $(srcdir)/board.h config.h \ $(srcdir)/iter.h $(srcdir)/order.h $(srcdir)/parity.cc \ $(srcdir)/parity.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/parity.cc pattern.o : Makefile $(srcdir)/board.h config.h $(srcdir)/gtstream.h \ $(srcdir)/order.h $(srcdir)/pattern.cc $(srcdir)/pattern.h \ $(srcdir)/proginfo.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/pattern.cc \ -DPATTERN_PATH=\"${pattern_dir}/\" proginfo.o : Makefile $(srcdir)/proginfo.cc $(srcdir)/proginfo.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/proginfo.cc rand.o : Makefile $(srcdir)/rand.cc $(srcdir)/rand.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/rand.cc randboard.o : Makefile $(srcdir)/board.h config.h $(srcdir)/gtstream.h \ $(srcdir)/order.h $(srcdir)/rand.h $(srcdir)/randboard.cc \ $(srcdir)/randboard.h $(CXX) $(CXXCFLAGS) -c $(srcdir)/randboard.cc test.o : Makefile $(srcdir)/alphabeta.h $(srcdir)/board.h $(srcdir)/boardio.h \ config.h $(srcdir)/hash.h $(srcdir)/iter.h $(srcdir)/order.h \ $(srcdir)/scripts/version $(srcdir)/test.cc $(CXX) $(CXXCFLAGS) -c $(srcdir)/test.cc # Linking test test : Makefile test.o alphabeta.o board.o boardio.o hash.o gtstream.o iter.o \ order.o parity.o pattern.o proginfo.o $(CXX) -o test $(CXXFLAGS) $(LDFLAGS) test.o alphabeta.o board.o \ boardio.o hash.o gtstream.o iter.o order.o parity.o pattern.o \ proginfo.o $(LIBS) # Linking grhino grhino : Makefile grhino.o alphabeta.o binfile.o board.o boardio.o book.o \ game.o gameinfo.o gevalwin.o ggamewin.o ghistwin.o gpref.o \ gtstream.o gutil.o hash.o iter.o load.o opening.o order.o pattern.o \ parity.o proginfo.o rand.o randboard.o $(CXX) -o grhino $(CXXFLAGS) $(LDFLAGS) grhino.o alphabeta.o \ binfile.o board.o boardio.o book.o game.o gameinfo.o \ gevalwin.o ggamewin.o ghistwin.o gpref.o gtstream.o gutil.o \ hash.o iter.o load.o opening.o order.o pattern.o parity.o \ proginfo.o rand.o randboard.o $(LIBS) # Linking gtp-rhino gtp-rhino : Makefile gtp-rhino.o alphabeta.o binfile.o board.o boardio.o \ book.o game.o gameinfo.o gtp.o gtstream.o hash.o iter.o opening.o \ order.o pattern.o parity.o proginfo.o rand.o randboard.o $(CXX) -o gtp-rhino $(CXXFLAGS) $(LDFLAGS) gtp-rhino.o alphabeta.o \ binfile.o board.o boardio.o book.o game.o gameinfo.o gtp.o \ gtstream.o hash.o iter.o opening.o order.o pattern.o parity.o \ proginfo.o rand.o randboard.o $(LIBS) # Linking aiai aiai : Makefile aiai.o alphabeta.o binfile.o board.o boardio.o book.o game.o \ gameinfo.o gtp.o gtstream.o hash.o iter.o opening.o order.o pattern.o \ parity.o proginfo.o rand.o randboard.o $(CXX) -o aiai $(CXXFLAGS) $(LDFLAGS) aiai.o alphabeta.o binfile.o \ board.o boardio.o book.o game.o gameinfo.o gtp.o gtstream.o \ hash.o iter.o opening.o order.o pattern.o parity.o proginfo.o \ rand.o randboard.o $(LIBS) # Linking gen_book gen_book : Makefile gen_book.o binfile.o board.o book.o gtstream.o hash.o \ proginfo.o rand.o $(CXX) -o gen_book $(CXXFLAGS) $(LDFLAGS) gen_book.o binfile.o \ board.o book.o gtstream.o hash.o proginfo.o rand.o $(LIBS) # Linking gen_opening gen_opening : Makefile gen_opening.o board.o gtstream.o hash.o $(CXX) -o gen_opening $(CXXFLAGS) $(LDFLAGS) gen_opening.o board.o \ gtstream.o hash.o $(LIBS) # Linking gen_pattern gen_pattern : Makefile gen_pattern.o board.o gtstream.o hash.o pattern.o \ proginfo.o $(CXX) -o gen_pattern $(CXXFLAGS) $(LDFLAGS) gen_pattern.o board.o \ gtstream.o hash.o pattern.o proginfo.o $(LIBS) # Linking gen_table gen_table : Makefile gen_table.o gtstream.o $(CXX) -o gen_table $(CXXFLAGS) $(LDFLAGS) gen_table.o gtstream.o \ $(LIBS) # Linking dump_pattern dump_pattern : Makefile dump_pattern.o board.o gtstream.o hash.o pattern.o \ proginfo.o $(CXX) -o dump_pattern $(CXXFLAGS) $(LDFLAGS) dump_pattern.o board.o \ gtstream.o hash.o pattern.o proginfo.o $(LIBS) # # End of output from ad.rule. DO NOT modify this line. # # # Contents from ad.append # # # Default target # all: grhino test gen_book gen_opening gen_pattern gen_table dump_pattern \ gtp-rhino aiai # Generate en_US.UTF-8, en_GB, en_GB.UTF-8 messages automatically. # Only used for packaging GRhino upstream source. default-po: if [ ! "@GMSGFMT@" = ":" ]; then \ cd po; \ $(MAKE) update-po; \ fi perl "$(srcdir)/scripts/copy-message.pl" \ -d CHARSET utf-8 \ -d DATE "`date "+%Y-%m-%d %H:%M%z"`" \ -d VERSION $(VERSION) \ -f "$(srcdir)/scripts/copy-message" < po/grhino.pot \ | perl "$(srcdir)/scripts/utf-quotes.pl" > po/en_US.UTF-8.po perl "$(srcdir)/scripts/copy-message.pl" \ -d CHARSET iso-8859-1 \ -d DATE "`date "+%Y-%m-%d %H:%M%z"`" \ -d VERSION $(VERSION) \ -f "$(srcdir)/scripts/copy-message" < po/grhino.pot \ | perl "$(srcdir)/scripts/en_GB.pl" > po/en_GB.po perl "$(srcdir)/scripts/copy-message.pl" \ -d CHARSET utf-8 \ -d DATE "`date "+%Y-%m-%d %H:%M%z"`" \ -d VERSION $(VERSION) \ -f "$(srcdir)/scripts/copy-message" < po/grhino.pot \ | perl "$(srcdir)/scripts/en_GB.pl" \ | perl "$(srcdir)/scripts/utf-quotes.pl" > po/en_GB.UTF-8.po if [ ! "@GMSGFMT@" = ":" ]; then \ cd po; \ $(MAKE); \ fi .PHONY : clean_curdir clean distclean_curdir distclean install # Delete object and executable files # Do not run rm -f ... if variables are empty clean_curdir : test -z "$(adINTFILES)" || rm -f $(adINTFILES) test -z "$(adOUTFILES)" || rm -f $(adOUTFILES) clean : clean_curdir $(adBeginSubdir) $@ $(adEndSubdir) # Also delete files generated by `configure' # Use `clean_curdir' to avoid recursive call to all subdirectories distclean_curdir : clean_curdir rm -f config.h rm -f config.cache config.log config.status rm -f Makefile distclean : distclean_curdir $(adBeginSubdir) $@ $(adEndSubdir) install_mkdir : if [ ! -e "$(DESTDIR)$(bindir)" ]; then \ mkdir -p "$(DESTDIR)$(bindir)"; \ chmod 755 "$(DESTDIR)$(bindir)"; \ fi if [ ! -e "$(DESTDIR)$(icon_dir)" ]; then \ mkdir -p "$(DESTDIR)$(icon_dir)"; \ chmod 755 "$(DESTDIR)$(icon_dir)"; \ fi if [ ! -e "$(DESTDIR)$(pattern_dir)" ]; then \ mkdir -p "$(DESTDIR)$(pattern_dir)"; \ chmod 755 "$(DESTDIR)$(pattern_dir)"; \ fi if [ ! -e "$(DESTDIR)$(book_dir)" ]; then \ mkdir -p "$(DESTDIR)$(book_dir)"; \ chmod 755 "$(DESTDIR)$(book_dir)"; \ fi if [ ! -e "$(DESTDIR)$(theme_dir)" ]; then \ mkdir -p "$(DESTDIR)$(theme_dir)"; \ chmod 755 "$(DESTDIR)$(theme_dir)"; \ fi if [ ! -e "$(DESTDIR)$(theme_dir)/small" ]; then \ mkdir -p "$(DESTDIR)$(theme_dir)/small"; \ chmod 755 "$(DESTDIR)$(theme_dir)/small"; \ fi if [ ! -e "$(DESTDIR)$(omfdir)" ]; then \ mkdir -p "$(DESTDIR)$(omfdir)"; \ chmod 755 "$(DESTDIR)$(omfdir)"; \ fi if [ ! -e "$(DESTDIR)$(helpdir)" ]; then \ mkdir -p "$(DESTDIR)$(helpdir)"; \ chmod 755 "$(DESTDIR)$(helpdir)"; \ fi if [ ! -e "$(DESTDIR)$(helpdir)/C" ]; then \ mkdir -p "$(DESTDIR)$(helpdir)/C"; \ chmod 755 "$(DESTDIR)$(helpdir)/C"; \ fi if [ ! -e "$(DESTDIR)$(helpdir)/C/figures" ]; then \ mkdir -p "$(DESTDIR)$(helpdir)/C/figures"; \ chmod 755 "$(DESTDIR)$(helpdir)/C/figures"; \ fi # Main installation # Only run scrollkeeper-update when not building package install : install_mkdir -$(INSTALL_PROGRAM) grhino "$(DESTDIR)$(bindir)/grhino" -$(INSTALL_PROGRAM) gtp-rhino "$(DESTDIR)$(bindir)/gtp-rhino" $(INSTALL_DATA) "$(srcdir)/row1.bin" "$(DESTDIR)$(pattern_dir)/row1.bin" $(INSTALL_DATA) "$(srcdir)/row2.bin" "$(DESTDIR)$(pattern_dir)/row2.bin" $(INSTALL_DATA) "$(srcdir)/row3.bin" "$(DESTDIR)$(pattern_dir)/row3.bin" $(INSTALL_DATA) "$(srcdir)/row4.bin" "$(DESTDIR)$(pattern_dir)/row4.bin" $(INSTALL_DATA) "$(srcdir)/diag1.bin" "$(DESTDIR)$(pattern_dir)/diag1.bin" $(INSTALL_DATA) "$(srcdir)/diag2.bin" "$(DESTDIR)$(pattern_dir)/diag2.bin" $(INSTALL_DATA) "$(srcdir)/diag3.bin" "$(DESTDIR)$(pattern_dir)/diag3.bin" $(INSTALL_DATA) "$(srcdir)/diag4.bin" "$(DESTDIR)$(pattern_dir)/diag4.bin" $(INSTALL_DATA) "$(srcdir)/diag5.bin" "$(DESTDIR)$(pattern_dir)/diag5.bin" $(INSTALL_DATA) "$(srcdir)/corner5x2.bin" "$(DESTDIR)$(pattern_dir)/corner5x2.bin" $(INSTALL_DATA) "$(srcdir)/book.bin" "$(DESTDIR)$(book_dir)/book.bin" $(INSTALL_DATA) "$(srcdir)/help/C/legal.xml" "$(DESTDIR)$(helpdir)/C/legal.xml" -scrollkeeper-preinstall "$(helpdir)/C/grhino.xml" \ "$(srcdir)/help/C/grhino-C.omf.in" "$(DESTDIR)$(omfdir)/grhino-C.omf" $(INSTALL_DATA) "$(srcdir)/help/C/grhino.xml" \ "$(DESTDIR)$(helpdir)/C/grhino.xml" $(INSTALL_DATA) "$(srcdir)/help/C/figures/gamelist.png" \ "$(DESTDIR)$(helpdir)/C/figures/gamelist.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/history.png" \ "$(DESTDIR)$(helpdir)/C/figures/history.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/mainwindow.png" \ "$(DESTDIR)$(helpdir)/C/figures/mainwindow.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/pattern.png" \ "$(DESTDIR)$(helpdir)/C/figures/pattern.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/prefs-ai.png" \ "$(DESTDIR)$(helpdir)/C/figures/prefs-ai.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/prefs-board.png" \ "$(DESTDIR)$(helpdir)/C/figures/prefs-board.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/prefs-theme.png" \ "$(DESTDIR)$(helpdir)/C/figures/prefs-theme.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/toolbar-edit.png" \ "$(DESTDIR)$(helpdir)/C/figures/toolbar-edit.png" $(INSTALL_DATA) "$(srcdir)/grhino.png" "$(DESTDIR)$(icon_dir)/grhino.png" $(INSTALL_DATA) "$(srcdir)/theme/small/black.xpm" "$(DESTDIR)$(theme_dir)/small/black.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/black_last.xpm" "$(DESTDIR)$(theme_dir)/small/black_last.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/bottom.xpm" "$(DESTDIR)$(theme_dir)/small/bottom.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/empty.xpm" "$(DESTDIR)$(theme_dir)/small/empty.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/highlight_black.xpm" "$(DESTDIR)$(theme_dir)/small/highlight_black.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/highlight_empty.xpm" "$(DESTDIR)$(theme_dir)/small/highlight_empty.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/highlight_white.xpm" "$(DESTDIR)$(theme_dir)/small/highlight_white.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/hint_black.xpm" "$(DESTDIR)$(theme_dir)/small/hint_black.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/hint_white.xpm" "$(DESTDIR)$(theme_dir)/small/hint_white.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/left.xpm" "$(DESTDIR)$(theme_dir)/small/left.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/right.xpm" "$(DESTDIR)$(theme_dir)/small/right.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/top.xpm" "$(DESTDIR)$(theme_dir)/small/top.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/white.xpm" "$(DESTDIR)$(theme_dir)/small/white.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/white_last.xpm" "$(DESTDIR)$(theme_dir)/small/white_last.xpm" if [ ! "@GMSGFMT@" = ":" ]; then \ cd po; \ $(MAKE) prefix="$(prefix)" DESTDIR="$(DESTDIR)" install; \ fi -if [ "x$(DESTDIR)" = "x" ]; then \ scrollkeeper-update -q -o "$(omfdir)"; \ fi # Run scrollkeeper-update. # Intended for installation script in pre-built package post_install: scrollkeeper-update -q -o "$(omfdir)" # # Development rules # $(srcdir)/aclocal.m4: $(srcdir)/acinclude.m4/cxxac.m4 cd "$(srcdir)" && aclocal -I acinclude.m4 $(srcdir)/config.h.in: $(srcdir)/config.h.bot $(srcdir)/acconfig.h \ $(srcdir)/configure.in cd "$(srcdir)" && autoheader && touch $(srcdir)/config.h.in $(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4 cd "$(srcdir)" && autoconf # Note: we should detect changes in source & header files too $(srcdir)/Makefile.in: $(srcdir)/ad.rule $(srcdir)/ad.append \ $(srcdir)/ad.prepend cd "$(srcdir)" && autodep grhino-0.16.1/gutil.cc0000644000175000017500000000257111436423224014764 0ustar lerdsuwalerdsuwa/* gutil.cc GRhino GNOME Frontend Utilities Copyright (c) 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include "gutil.h" #include void error_message_box(const gtstream &bufstr) { GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, bufstr.str().c_str()); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } GdkPixbuf *scale_pixbuf_from_xpm_data(const char *xpm[], int width, int height) { GdkPixbuf *p1, *p2; p1 = gdk_pixbuf_new_from_xpm_data(xpm); if (!p1) return p1; p2 = gdk_pixbuf_scale_simple(p1, width, height, GDK_INTERP_BILINEAR); g_object_unref(p1); return p2; } grhino-0.16.1/gutil.h0000644000175000017500000000203211436423224014616 0ustar lerdsuwalerdsuwa/* gutil.h GRhino GNOME Frontend Utilities Copyright (c) 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GUTIL_H #define GUTIL_H #include #include #include "gtstream.h" void error_message_box(const gtstream &bufstr); GdkPixbuf *scale_pixbuf_from_xpm_data(const char *xpm[], int width, int height); #endif /* GUTIL_H */ grhino-0.16.1/icon_white.xpm0000644000175000017500000000523611436423225016211 0ustar lerdsuwalerdsuwa/* XPM */ static char * icon_white_xpm[] = { "48 48 11 1", " c None", ". c #000000", "+ c #363636", "@ c #848484", "# c #BFBFBF", "$ c #E8E8E8", "% c #FCFCFC", "& c #494949", "* c #FFFFFF", "= c #989898", "- c #101010", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ........ ", " .+@#$%%$#@+. ", " .&#**********#&. ", " .=**************=. ", " -#****************#- ", " .#******************#. ", " .=********************=. ", " &**********************& ", " .#**********************#. ", " +************************+ ", " .@************************@. ", " .#************************#. ", " .$************************$. ", " .%************************%. ", " .%************************%. ", " .$************************$. ", " .#************************#. ", " .@************************@. ", " +************************+ ", " .#**********************#. ", " &**********************& ", " .=********************=. ", " .#******************#. ", " -#****************#- ", " .=**************=. ", " .&#**********#&. ", " .+@#$%%$#@+. ", " ........ ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; grhino-0.16.1/grhino.cc0000644000175000017500000020067711436423224015135 0ustar lerdsuwalerdsuwa/* grhino.cc GRhino Gnome Frontend Copyright (c) 2000-2005, 2006, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* #define GNOME_DISABLE_DEPRECATED #define GTK_DISABLE_DEPRECATED */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const #include "black.xpm" const #include "white.xpm" const #include "empty.xpm" const #include "hint_black.xpm" const #include "hint_white.xpm" const #include "black_last.xpm" const #include "white_last.xpm" const #include "highlight_black.xpm" const #include "highlight_white.xpm" const #include "highlight_empty.xpm" const #include "top.xpm" const #include "bottom.xpm" const #include "left.xpm" const #include "right.xpm" const #include "icon_new.xpm" const #include "icon_empty.xpm" const #include "icon_black.xpm" const #include "icon_white.xpm" const #include "icon_bw.xpm" #include "board.h" #include "hash.h" #include "alphabeta.h" #include "opening.h" #include "pattern.h" #include "parity.h" #include "book.h" #include "game.h" #include "gpref.h" #include "gevalwin.h" #include "ggamewin.h" #include "ghistwin.h" #include "gutil.h" #include "randboard.h" #include "load.h" #include "gtstream.h" // Grab version number in VERSION variable #undef VERSION const char * #include "scripts/version" ; #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x const char *prog_name = "GRhino"; const char *prog_ver = VERSION; /************************************************************************* User interface variables *************************************************************************/ GdkPixbuf *top_pixmap = 0, *bottom_pixmap = 0, *left_pixmap = 0, *right_pixmap = 0; GdkPixbuf *black_pixmap = 0, *white_pixmap = 0, *empty_pixmap = 0; GdkPixbuf *hint_black_pixmap = 0, *hint_white_pixmap = 0; GdkPixbuf *black_last_pixmap = 0, *white_last_pixmap = 0; GdkPixbuf *highlight_black_pixmap = 0, *highlight_white_pixmap = 0; GdkPixbuf *highlight_empty_pixmap = 0; int grid_width; int grid_height; int left_margin; int top_margin; int right_margin; int bottom_margin; GtkWidget *board_widget; GtkWidget *status_widget; GtkWidget *main_window; // Toolbar GtkWidget *main_toolbar, *edit_toolbar; GtkWidget *button_new, *button_edit, *button_exit, *button_undo, *button_redo; GtkWidget *button_begin, *button_prev, *button_next, *button_end; GtkWidget *button_empty, *button_black, *button_white, *button_bw, *button_finish; int icon_width; int icon_height; GtkWidget *icon_new, *icon_edit, *icon_exit, *icon_undo, *icon_redo; GtkWidget *icon_begin, *icon_prev, *icon_next, *icon_end; GtkWidget *icon_empty, *icon_black, *icon_white, *icon_bw, *icon_finish; GtkTooltips* tooltips; GdkCursor *view_cursor; int main_x, main_y; struct timeval start_time, stop_time; int edit_board_color = BLACK; bool button_drag_state = false; int button_drag_from_x = 0, button_drag_from_y = 0; int button_drag_to_x = 0, button_drag_to_y = 0; /************************************************************************* Menu Info *************************************************************************/ void menu_game_new(GtkWidget * /*widget*/, gpointer /*data*/); void menu_game_open(GtkWidget * /*widget*/, gpointer /*data*/); void menu_game_edit_board(GtkWidget * /*widget*/, gpointer /*data*/); void menu_game_undo(GtkWidget * /*widget*/, gpointer /*data*/); void menu_game_redo(GtkWidget * /*widget*/, gpointer /*data*/); void menu_game_exit(GtkWidget * /*widget*/, gpointer /*data*/); void menu_game_begin(GtkWidget * /*widget*/, gpointer /*data*/); void menu_game_prev(GtkWidget * /*widget*/, gpointer /*data*/); void menu_game_next(GtkWidget * /*widget*/, gpointer /*data*/); void menu_game_end(GtkWidget * /*widget*/, gpointer /*data*/); void menu_edit_empty(GtkWidget * /*widget*/, gpointer /*data*/); void menu_edit_black(GtkWidget * /*widget*/, gpointer /*data*/); void menu_edit_white(GtkWidget * /*widget*/, gpointer /*data*/); void menu_edit_player(GtkWidget * /*widget*/, gpointer /*data*/); void menu_edit_finish(GtkWidget * /*widget*/, gpointer /*data*/); void menu_view_toolbar(GtkWidget * /*widget*/, gpointer /*data*/); void menu_tools_evaluate_position(GtkWidget * /*widget*/, gpointer /*data*/); void menu_tools_game_history(GtkWidget * /*widget*/, gpointer /*data*/); void menu_settings_save(GtkWidget * /*widget*/, gpointer /*data*/); void menu_settings_preferences(GtkWidget * /*widget*/, gpointer /*data*/); void menu_settings_switch_color(GtkWidget * /*widget*/, gpointer /*data*/); void menu_help_about(GtkWidget * /*widget*/, gpointer /*data*/); #define MENU_INDEX_EDIT_BOARD 2 GnomeUIInfo menu_game_info[] = { GNOMEUIINFO_MENU_NEW_GAME_ITEM(menu_game_new, 0), GNOMEUIINFO_MENU_OPEN_ITEM(menu_game_open, 0), GNOMEUIINFO_ITEM_NONE(N_("_Edit board"), N_("Edit board and start game"), menu_game_edit_board), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_MENU_QUIT_ITEM(menu_game_exit, 0), GNOMEUIINFO_END }; #define MENU_INDEX_UNDO 0 #define MENU_INDEX_REDO 1 #define MENU_INDEX_BEGIN 3 #define MENU_INDEX_PREV 4 #define MENU_INDEX_NEXT 5 #define MENU_INDEX_END 6 GnomeUIInfo menu_edit_info[] = { GNOMEUIINFO_MENU_UNDO_MOVE_ITEM(menu_game_undo, 0), GNOMEUIINFO_MENU_REDO_MOVE_ITEM(menu_game_redo, 0), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_ITEM_STOCK(N_("_Begin of game"), N_("Go to the game beginning"), menu_game_begin, GTK_STOCK_GOTO_TOP), GNOMEUIINFO_ITEM_STOCK(N_("_Previous move"), N_("Go to the previous move"), menu_game_prev, GTK_STOCK_GO_UP), GNOMEUIINFO_ITEM_STOCK(N_("_Next move"), N_("Go to the next move"), menu_game_next, GTK_STOCK_GO_DOWN), GNOMEUIINFO_ITEM_STOCK(N_("_Last move"), N_("Go to the last move"), menu_game_end, GTK_STOCK_GOTO_BOTTOM), GNOMEUIINFO_END }; #define MENU_INDEX_SHOW_TOOLBAR 0 GnomeUIInfo menu_tools_info[] = { GNOMEUIINFO_TOGGLEITEM(N_("_Toolbar"), N_("Show/hide toolbar"), menu_view_toolbar, NULL), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_TOGGLEITEM(N_("_Pattern evaluation"), N_("Show/hide pattern evaluation score"), menu_tools_evaluate_position, NULL), GNOMEUIINFO_TOGGLEITEM(N_("Game _history"), N_("Show/hide game move history"), menu_tools_game_history, NULL), GNOMEUIINFO_END }; #define MENU_INDEX_SWITCH_AI 0 GnomeUIInfo menu_settings_info[] = { GNOMEUIINFO_ITEM_NONE(N_("Switch _computer color"), NULL, menu_settings_switch_color), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_ITEM_NONE(N_("_Save Settings"), NULL, menu_settings_save), GNOMEUIINFO_MENU_PREFERENCES_ITEM(menu_settings_preferences, 0), GNOMEUIINFO_END }; GnomeUIInfo menu_help_info[] = { GNOMEUIINFO_HELP("grhino"), GNOMEUIINFO_MENU_ABOUT_ITEM(menu_help_about, 0), GNOMEUIINFO_END }; GnomeUIInfo menu_main_info[] = { GNOMEUIINFO_MENU_GAME_TREE(menu_game_info), GNOMEUIINFO_MENU_EDIT_TREE(menu_edit_info), GNOMEUIINFO_SUBTREE(N_("_View"), menu_tools_info), GNOMEUIINFO_MENU_SETTINGS_TREE(menu_settings_info), GNOMEUIINFO_MENU_HELP_TREE(menu_help_info), GNOMEUIINFO_END }; /************************************************************************* View mode *************************************************************************/ void set_view_mode(view_mode_type v) { // Initialize cursor only once if (view_cursor == NULL && board_widget) view_cursor = gdk_cursor_new_for_display( gtk_widget_get_display(board_widget), GDK_X_CURSOR); if (v == VIEW_MODE_HISTORY) gdk_window_set_cursor(board_widget->window, view_cursor); else gdk_window_set_cursor(board_widget->window, NULL); view_mode = v; } /************************************************************************* Configuration file functions *************************************************************************/ #define CFG_AI_PATH "GRhino/AI/" #define CFG_BOARD_PATH "GRhino/Board/" #define CFG_THEME_PATH "GRhino/Theme/" #define CFG_VIEW_PATH "GRhino/View/" void write_view_config() { gnome_config_set_bool(CFG_VIEW_PATH "show_toolbar", show_toolbar); gnome_config_set_bool(CFG_VIEW_PATH "show_pattern_evaluation", show_pattern_evaluation); gnome_config_set_int(CFG_VIEW_PATH "pattern_evaluation_x", pattern_x); gnome_config_set_int(CFG_VIEW_PATH "pattern_evaluation_y", pattern_y); gnome_config_set_bool(CFG_VIEW_PATH "show_game_history", show_game_history); gnome_config_set_int(CFG_VIEW_PATH "game_history_width", gamehist_width); gnome_config_set_int(CFG_VIEW_PATH "game_history_height", gamehist_height); gnome_config_set_int(CFG_VIEW_PATH "game_history_x", gamehist_x); gnome_config_set_int(CFG_VIEW_PATH "game_history_y", gamehist_y); gnome_config_set_int(CFG_VIEW_PATH "game_list_width", gamelib_width); gnome_config_set_int(CFG_VIEW_PATH "game_list_height", gamelib_height); gnome_config_set_int(CFG_VIEW_PATH "game_list_x", gamelib_x); gnome_config_set_int(CFG_VIEW_PATH "game_list_y", gamelib_y); gnome_config_set_int(CFG_VIEW_PATH "main_window_x", main_x); gnome_config_set_int(CFG_VIEW_PATH "main_window_y", main_y); gnome_config_sync(); } void write_config() { gnome_config_set_int(CFG_AI_PATH "game_mode", static_cast(get_game_mode())); if (computer_level == LEVEL_CUSTOM) gnome_config_set_int(CFG_AI_PATH "computer_level", LEVEL_CUSTOM_FILE); else gnome_config_set_int(CFG_AI_PATH "computer_level", computer_level); gnome_config_set_int(CFG_AI_PATH "midgame_depth", current_level_info.midgame_depth); gnome_config_set_int(CFG_AI_PATH "num_empty_winlossdraw", current_level_info.num_empty_winlossdraw); gnome_config_set_int(CFG_AI_PATH "num_empty_exact", current_level_info.num_empty_exact); gnome_config_set_int(CFG_AI_PATH "randomness", get_eval_random()); gnome_config_set_int(CFG_AI_PATH "opening_var", opening_var); gnome_config_set_bool(CFG_BOARD_PATH "log_move", log_move); gnome_config_set_bool(CFG_BOARD_PATH "redo_ai_move", redo_ai_move); gnome_config_set_bool(CFG_BOARD_PATH "animate_opening", animate_opening); gnome_config_set_int(CFG_BOARD_PATH "animate_delay", animate_delay); gnome_config_set_int(CFG_BOARD_PATH "start_game_mode", static_cast(start_game_mode)); gnome_config_set_string(CFG_BOARD_PATH "opening", opening_name.c_str()); gnome_config_set_int(CFG_BOARD_PATH "start_random_game_pieces", start_random_game_pieces); // This is in CFG_BOARD_PATH for // compatibility with older GRhino gnome_config_set_bool(CFG_BOARD_PATH "hint_move", hint_move); gnome_config_set_bool(CFG_THEME_PATH "show_last_move", show_last_move); gnome_config_set_bool(CFG_THEME_PATH "show_border", show_border); gnome_config_set_int(CFG_THEME_PATH "toolbar_icon_size", toolbar_icon_size); gnome_config_set_string(CFG_THEME_PATH "theme", theme_name.c_str()); // Sync in side this call write_view_config(); } void read_config() { gboolean use_def; // Default to COMPUTER_WHITE int i = gnome_config_get_int_with_default(CFG_AI_PATH "game_mode=2", &use_def); if (i < 0 || i >= NUM_GAME_MODE) i = COMPUTER_WHITE; set_game_mode(static_cast(i)); computer_level = gnome_config_get_int_with_default(CFG_AI_PATH "computer_level=1", &use_def); if (computer_level == LEVEL_CUSTOM) computer_level = LEVEL_CUSTOM; else if (computer_level < 0 || computer_level >= NUM_LEVEL_INFO+1) computer_level = 1; if (computer_level == LEVEL_CUSTOM) { current_level_info.midgame_depth = gnome_config_get_int_with_default(CFG_AI_PATH "midgame_depth=6", &use_def); if (current_level_info.midgame_depth < 1 || current_level_info.midgame_depth > 20) current_level_info.midgame_depth = 6; current_level_info.num_empty_winlossdraw = gnome_config_get_int_with_default(CFG_AI_PATH "num_empty_winlossdraw=12", &use_def); if (current_level_info.num_empty_winlossdraw < 1 || current_level_info.num_empty_winlossdraw > 20) current_level_info.num_empty_winlossdraw = 12; current_level_info.num_empty_exact = gnome_config_get_int_with_default(CFG_AI_PATH "num_empty_exact=10", &use_def); if (current_level_info.num_empty_exact < 1 || current_level_info.num_empty_exact > 20) current_level_info.num_empty_exact = 10; } else { current_level_info.midgame_depth = level_info[computer_level].midgame_depth; current_level_info.num_empty_winlossdraw = level_info[computer_level].num_empty_winlossdraw; current_level_info.num_empty_exact = level_info[computer_level].num_empty_exact; } i = gnome_config_get_int_with_default(CFG_AI_PATH "randomness=0", &use_def); if (i < 1 || i > 10) i = 0; set_eval_random(i); // Default to Low opening_var = gnome_config_get_int_with_default(CFG_AI_PATH "opening_var=2", &use_def); if (opening_var < 0 || opening_var >= NUM_OPENING_VAR) opening_var = 1; set_book_random(opening_var); log_move = gnome_config_get_bool_with_default(CFG_BOARD_PATH "log_move=false", &use_def); redo_ai_move = gnome_config_get_bool_with_default(CFG_BOARD_PATH "redo_ai_move=true", &use_def); animate_opening = gnome_config_get_bool_with_default(CFG_BOARD_PATH "animate_opening=true", &use_def); animate_delay = gnome_config_get_int_with_default(CFG_BOARD_PATH "animate_delay=1", &use_def); if (animate_delay < 1 || animate_delay > NUM_ANIMATE_DELAY) animate_delay = 1; i = gnome_config_get_int_with_default(CFG_BOARD_PATH "start_game_mode=0", &use_def); if (i < 0 || i >= NUM_START_GAME_MODE) i = 0; start_game_mode = static_cast(i); char *str = gnome_config_get_string_with_default(CFG_BOARD_PATH "opening=None", &use_def); int id = get_opening_id(str); g_free(str); i = gnome_config_get_int_with_default(CFG_BOARD_PATH "start_random_game_pieces=20", &use_def); if (i < 4 || i > 32 || (i & 1)) i = 20; start_random_game_pieces = i; // This is in CFG_BOARD_PATH for // compatibility with older GRhino hint_move = gnome_config_get_bool_with_default(CFG_BOARD_PATH "hint_move=false", &use_def); show_last_move = gnome_config_get_bool_with_default(CFG_THEME_PATH "show_last_move=false", &use_def); show_border = gnome_config_get_bool_with_default(CFG_THEME_PATH "show_border=false", &use_def); theme_name = gnome_config_get_string_with_default(CFG_THEME_PATH "theme=", &use_def); toolbar_icon_size = gnome_config_get_int_with_default(CFG_THEME_PATH "toolbar_icon_size=0", &use_def); if (toolbar_icon_size < 0 || toolbar_icon_size >= NUM_TOOLBAR_ICON_SIZE) toolbar_icon_size = 0; show_toolbar = gnome_config_get_bool_with_default(CFG_VIEW_PATH "show_toolbar=false", &use_def); show_pattern_evaluation = gnome_config_get_bool_with_default(CFG_VIEW_PATH "show_pattern_evaluation=false", &use_def); pattern_x = gnome_config_get_int_with_default(CFG_VIEW_PATH "pattern_evaluation_x=-1", &use_def); pattern_y = gnome_config_get_int_with_default(CFG_VIEW_PATH "pattern_evaluation_y=-1", &use_def); show_game_history = gnome_config_get_bool_with_default(CFG_VIEW_PATH "show_game_history=false", &use_def); gamehist_width = gnome_config_get_int_with_default(CFG_VIEW_PATH "game_history_width=120", &use_def); if (gamehist_width <= 0) gamehist_width = 120; gamehist_height = gnome_config_get_int_with_default(CFG_VIEW_PATH "game_history_height=300", &use_def); if (gamehist_height <= 0) gamehist_height = 300; gamehist_x = gnome_config_get_int_with_default(CFG_VIEW_PATH "game_history_x=-1", &use_def); gamehist_y = gnome_config_get_int_with_default(CFG_VIEW_PATH "game_history_y=-1", &use_def); gamelib_width = gnome_config_get_int_with_default(CFG_VIEW_PATH "game_list_width=120", &use_def); if (gamelib_width <= 0) gamelib_width = 120; gamelib_height = gnome_config_get_int_with_default(CFG_VIEW_PATH "game_list_height=300", &use_def); if (gamelib_height <= 0) gamelib_height = 300; gamelib_x = gnome_config_get_int_with_default(CFG_VIEW_PATH "game_list_x=-1", &use_def); gamelib_y = gnome_config_get_int_with_default(CFG_VIEW_PATH "game_list_y=-1", &use_def); main_x = gnome_config_get_int_with_default(CFG_VIEW_PATH "main_window_x=-1", &use_def); main_y = gnome_config_get_int_with_default(CFG_VIEW_PATH "main_window_y=-1", &use_def); opening_name = get_opening_name(id); get_opening_move_sequence(id, opening_move_queue); } /************************************************************************* Drawing functions *************************************************************************/ void draw_board() { int last_pos = -1; if (view_mode != VIEW_MODE_EDIT && show_last_move && (cur_game_info.num_history > cur_game_info.min_num_history)) { if (view_mode == VIEW_MODE_HISTORY) { if (view_position > 0) last_pos = cur_game_info.move_history[view_position-1]; } else last_pos = cur_game_info.move_history[cur_game_info.num_history-2]; } for (int x = 0; x < 8; ++x) for (int y = 0; y < 8; ++y) { GdkPixbuf *pixmap; int pos = xy_to_pos(x, y); if (view_mode == VIEW_MODE_EDIT) { bool x_ok = false, y_ok = false; if (button_drag_state && button_drag_to_x != -1 && button_drag_to_y != -1) { if (button_drag_to_x >= button_drag_from_x) { if (x >= button_drag_from_x && x <= button_drag_to_x) x_ok = true; } else { if (x >= button_drag_to_x && x <= button_drag_from_x) x_ok = true; } if (button_drag_to_y >= button_drag_from_y) { if (y >= button_drag_from_y && y <= button_drag_to_y) y_ok = true; } else { if (y >= button_drag_to_y && y <= button_drag_from_y) y_ok = true; } } switch (view_board_ptr->board[pos]) { case BLACK: if (x_ok && y_ok) pixmap = highlight_black_pixmap; else pixmap = black_pixmap; break; case WHITE: if (x_ok && y_ok) pixmap = highlight_white_pixmap; else pixmap = white_pixmap; break; default: if (x_ok && y_ok) pixmap = highlight_empty_pixmap; else pixmap = empty_pixmap; } } else { switch (view_board_ptr->board[pos]) { case BLACK: if (pos == last_pos) pixmap = black_last_pixmap; else pixmap = black_pixmap; break; case WHITE: if (pos == last_pos) pixmap = white_last_pixmap; else pixmap = white_pixmap; break; default: if (hint_move && view_board_ptr->can_play(cur_game_info.get_player(), pos)) { if (cur_game_info.get_player() == BLACK) pixmap = hint_black_pixmap; else pixmap = hint_white_pixmap; } else pixmap = empty_pixmap; } } gdk_draw_pixbuf(board_widget->window, board_widget->style->fg_gc[GTK_STATE_NORMAL], pixmap, 0, 0, x*grid_width+left_margin, y*grid_height+top_margin, grid_width, grid_height, GDK_RGB_DITHER_NORMAL, 0, 0); } if (show_border) { gdk_draw_pixbuf(board_widget->window, board_widget->style->fg_gc[GTK_STATE_NORMAL], top_pixmap, 0, 0, 0, 0, 8*grid_width+left_margin+right_margin, top_margin, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_draw_pixbuf(board_widget->window, board_widget->style->fg_gc[GTK_STATE_NORMAL], bottom_pixmap, 0, 0, 0, 8*grid_height+top_margin, 8*grid_width+left_margin+right_margin, bottom_margin, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_draw_pixbuf(board_widget->window, board_widget->style->fg_gc[GTK_STATE_NORMAL], left_pixmap, 0, 0, 0, top_margin, left_margin, 8*grid_height, GDK_RGB_DITHER_NORMAL, 0, 0); gdk_draw_pixbuf(board_widget->window, board_widget->style->fg_gc[GTK_STATE_NORMAL], right_pixmap, 0, 0, 8*grid_width+left_margin, top_margin, right_margin, 8*grid_height, GDK_RGB_DITHER_NORMAL, 0, 0); } gdk_flush(); } void update_status_bar(update_state_type /*u*/, void *) { gtstream buf; if (view_mode == VIEW_MODE_EDIT) { const char *player; switch (get_game_mode()) { case COMPUTER_RANDOM: player = _("random"); break; case COMPUTER_ALTERNATE: player = (is_computer_player(view_player) ? _("human") : _("AI")); break; default: player = (is_computer_player(view_player) ? _("AI") : _("human")); break; } gtout(buf, _("%$ (%$)")) << (view_player == BLACK ? _("Black's turn") : _("White's turn")) << player; } else { if (cur_game_info.is_game_play()) { gtout(buf, _("%$ (%$)")) << (cur_game_info.get_player() == BLACK ? _("Black's turn") : _("White's turn")) << (get_wait_player() ? _("human") : (move_queue.size() ? _("Opening") : _("AI"))); if (!cur_game_info.is_random_game()) { const char *s = find_opening_name(); if (s && strcmp(s, "None")) gtout(buf, _(" [%$]")) << _(s); } } else { switch (cur_game_info.get_game_result()) { case game_info::game_result_end: { int black_score = cur_game_info.board_ptr->board_black_score(); int white_score = cur_game_info.board_ptr->board_white_score(); adjust_score(black_score, white_score); gtout(buf, _("%$ (%$-%$)")) << (black_score == white_score ? _("Draw") : (black_score > white_score ? _("Black wins") : _("White wins"))) << (black_score > white_score ? black_score : white_score) << (black_score > white_score ? white_score : black_score); } break; case game_info::game_result_timeout_black: buf << _("White wins - Black ran out of time"); break; case game_info::game_result_timeout_white: buf << _("Black wins - White ran out of time"); break; case game_info::game_result_resign_black: buf << _("White wins - Black resigned"); break; case game_info::game_result_resign_white: buf << _("Black wins - White resigned"); break; } } if (view_mode == VIEW_MODE_HISTORY) { gtout(buf, _(" (%$ %$)")) << "View move" << view_position; } } buf << std::ends; gnome_appbar_pop(GNOME_APPBAR(status_widget)); gnome_appbar_push(GNOME_APPBAR(status_widget), buf.str().c_str()); } void place_piece_and_update(int pos) { bool during_opening = false; if (move_queue.size()) { // Move come from move queue move_queue.pop_front(); // Remove it during_opening = true; } cur_game_info.place_piece(pos, time_player); *view_board_ptr = *cur_game_info.board_ptr; set_view_mode(VIEW_MODE_NONE); time_player = 0; time_player_animate_delay = 0; if (cur_game_info.is_use_clock()) { // Load clock clock_player = cur_game_info.get_clock(); } if (!during_opening || animate_opening) { draw_board(); update_move.update(UPDATE_FORWARD); } if (!cur_game_info.is_game_play()) log_history("grhino.log", "player", "player"); } void timeout_update() { cur_game_info.player_timeout(); update_move.update(UPDATE_FORWARD); if (!cur_game_info.is_game_play()) log_history("grhino.log", "player", "player"); } /************************************************************************* Computer AI *************************************************************************/ gint input_timeout_id; // Lock required for access void *computer_thread(void *) { int last_state, last_type; // Set deferred cancellation to avoid // destroying hash table data structure pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &last_state); pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &last_type); int pos = POS_INVALID; if (move_queue.size()) { // Remove entry from move_queue in // place_piece_and_update since move // can be canceled and resumed, say // when preferences are changed pos = move_queue.front(); } else pos = get_computer_move(); // Set immediate cancellation to avoid // getting stuck at the lock below // indefinitely pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &last_type); pthread_mutex_lock(&input_lock); input_pos = pos; gettimeofday(&stop_time, 0); pthread_mutex_unlock(&input_lock); return NULL; } gint input_check(void *) { pthread_mutex_lock(&input_lock); if (input_timeout_id == 0) { // Handle rare case // when multiple checks // are scheduled pthread_mutex_unlock(&input_lock); return TRUE; } int pos = input_pos; if (pos != POS_INVALID) { time_player_animate_delay++; if (time_player_animate_delay < animate_delay) { // Wait pthread_mutex_unlock(&input_lock); } else { gtk_timeout_remove(input_timeout_id); input_timeout_id = 0; if (ai_running) { void *status; pthread_join(ai_thread, &status); ai_running = false; } time_player = (stop_time.tv_sec - start_time.tv_sec) * 100 + (stop_time.tv_usec - start_time.tv_usec)/10000; // In case clock time out just // before the move if (cur_game_info.is_use_clock()) { clock_player -= time_player; if (clock_player < 0) timeout_update(); else place_piece_and_update(pos); } else place_piece_and_update(pos); // Unlock here now after all states are // updated to prevent button click problem pthread_mutex_unlock(&input_lock); // Need to start running clock if (cur_game_info.is_game_play()) { if (get_wait_player()) human_move(); else computer_move(); } } } else { // Check for clock time out if (cur_game_info.is_use_clock()) { struct timeval cur_time; gettimeofday(&cur_time, 0); int time_used = (cur_time.tv_sec - start_time.tv_sec) * 1000 - (cur_time.tv_usec - start_time.tv_usec); if (clock_player - time_used < 0) { gtk_timeout_remove(input_timeout_id); input_timeout_id = 0; if (ai_running) { pthread_cancel(ai_thread); void *status; pthread_join(ai_thread, &status); ai_running = false; } timeout_update(); } } time_player_animate_delay++; pthread_mutex_unlock(&input_lock); } return TRUE; } void computer_move() { pthread_mutex_lock(&input_lock); input_pos = POS_INVALID; gettimeofday(&start_time, 0); set_midgame_depth(current_level_info.midgame_depth); // Start computer thread pthread_create(&ai_thread, &ai_thread_attr, computer_thread, NULL); ai_running = true; // Repeatly check if computer is finished input_timeout_id = gtk_timeout_add(100, input_check, NULL); pthread_mutex_unlock(&input_lock); } void human_move() { pthread_mutex_lock(&input_lock); input_pos = POS_INVALID; gettimeofday(&start_time, 0); // Repeatly check if computer is finished input_timeout_id = gtk_timeout_add(100, input_check, NULL); pthread_mutex_unlock(&input_lock); } void cancel_input() { // Terminate AI thread pthread_mutex_lock(&input_lock); if (input_timeout_id) { gtk_timeout_remove(input_timeout_id); input_timeout_id = 0; if (ai_running) { pthread_cancel(ai_thread); void *status; pthread_join(ai_thread, &status); ai_running = false; } } pthread_mutex_unlock(&input_lock); } /************************************************************************* Game operations *************************************************************************/ void init_game_before_draw() { read_config(); } void update_menu_and_toolbar(update_state_type, void *); void cancel_edit_mode(); void init_game() { trans_table_init(); set_max_hash_move(57); pattern_table_init(); book_init(); srand(time(NULL)); pthread_attr_init(&ai_thread_attr); // pthread_attr_setdetachstate(&ai_thread_attr, PTHREAD_CREATE_DETACHED); update_move.add(update_status_bar, 0); update_move.add(update_menu_and_toolbar, 0); } void new_game() { cancel_input(); cancel_edit_mode(); eval_new_game(); new_game(cur_game_info); *view_board_ptr = *cur_game_info.board_ptr; set_view_mode(VIEW_MODE_NONE); draw_board(); time_player = 0; time_player_animate_delay = 0; // Make sure history is setup so that // Undo/redo capability is properly // computed. update_move.update(UPDATE_ALL); // If there is any Game List window // opened, remove the highlight on the // window. update_game_list.update(UPDATE_ALL); ai_tampered = false; ai_running = false; if (cur_game_info.is_game_play()) { if (get_wait_player()) human_move(); else { if (move_queue.size() && !animate_opening) { // Place all the moves immediately do { int pos = move_queue.front(); place_piece_and_update(pos); } while (move_queue.size()); // Draw board only once after all moves // are placed draw_board(); update_move.update(UPDATE_FORWARD); // game_play is updated in // place_piece_and_update call above // Need to start running clock if (cur_game_info.is_game_play()) { if (get_wait_player()) human_move(); else computer_move(); } } else computer_move(); } } } void open_game() { GtkWidget *file_selector = gtk_file_selection_new(_("Select a file to open")); gtk_widget_show(file_selector); gtk_window_set_modal(GTK_WINDOW(file_selector), TRUE); gtk_window_set_transient_for(GTK_WINDOW(file_selector), GTK_WINDOW(main_window)); gint result = gtk_dialog_run(GTK_DIALOG(file_selector)); std::string filename; switch (result) { case GTK_RESPONSE_OK: // FIXME: Check if it is a file filename = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file_selector)); break; } gtk_widget_destroy(file_selector); if (filename.size()) load_game_list(filename.c_str()); } void undo() { cancel_input(); cur_game_info.undo(); *view_board_ptr = *cur_game_info.board_ptr; set_view_mode(VIEW_MODE_NONE); time_player = 0; time_player_animate_delay = 0; clock_player = cur_game_info.get_clock(); draw_board(); update_move.update(UPDATE_BACKWARD); // Need to start running clock if (cur_game_info.is_game_play()) { if (get_wait_player()) human_move(); else computer_move(); } } void redo() { cancel_input(); cur_game_info.redo(); *view_board_ptr = *cur_game_info.board_ptr; set_view_mode(VIEW_MODE_NONE); time_player = 0; time_player_animate_delay = 0; clock_player = cur_game_info.get_clock(); draw_board(); update_move.update(UPDATE_FORWARD); // Need to start running clock if (cur_game_info.is_game_play()) { if (get_wait_player()) human_move(); else computer_move(); } } void switch_computer_color() { cancel_input(); maybe_set_ai_tampered(); switch_computer_game_mode(); update_move.update(UPDATE_NONE); // Need to start running clock if (view_mode != VIEW_MODE_EDIT && cur_game_info.is_game_play()) { if (get_wait_player()) human_move(); else computer_move(); } } /************************************************************************* Edit board *************************************************************************/ void update_toolbar(); void cancel_edit_mode() { if (view_mode != VIEW_MODE_EDIT) return; // Enable edit menu gtk_widget_set_sensitive(menu_game_info[MENU_INDEX_EDIT_BOARD].widget, TRUE); // No longer highlight drag button_drag_state = false; gtk_widget_set_sensitive(button_edit, TRUE); set_view_mode(VIEW_MODE_NONE); update_toolbar(); // Hide edit toolbar if necessary // Later the board should be redrawn by caller } void finish_edit_mode() { int empties = 0; for (int i = 0; i < 64; ++i) { if (view_board_ptr->is_empty(i)) ++empties; } if (empties > 60) { // Many data structures only have // space for 60 moves maximum gtstream bufstr; bufstr << _("There must be at least 4 pieces on the board."); error_message_box(bufstr); return; } if (view_board_ptr->is_empty(3, 3) || view_board_ptr->is_empty(3, 4) || view_board_ptr->is_empty(4, 3) || view_board_ptr->is_empty(4, 4)) { // This will confuse AI pattern evaluation gtstream bufstr; bufstr << _("The center 4 pieces must be filled."); error_message_box(bufstr); return; } cancel_edit_mode(); eval_new_game(); new_game(cur_game_info, *view_board_ptr, view_player); draw_board(); time_player = 0; time_player_animate_delay = 0; // Make sure history is setup so that // Undo/redo capability is properly // computed. update_move.update(UPDATE_ALL); ai_tampered = false; ai_running = false; if (cur_game_info.is_game_play()) { if (get_wait_player()) human_move(); else computer_move(); } } void edit_board() { // Already editing board if (view_mode == VIEW_MODE_EDIT) return; button_drag_state = false; cancel_input(); eval_new_game(); // Take current player & board if (view_mode == VIEW_MODE_HISTORY) view_player = cur_game_info.player_history[view_position]; else view_player = cur_game_info.get_player(); byte_board_info b(*view_board_ptr); new_game(cur_game_info, b, view_player); // Color to fill edit_board_color = BLACK; // Disable edit menu gtk_widget_set_sensitive(menu_game_info[MENU_INDEX_EDIT_BOARD].widget, FALSE); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(button_black), TRUE); // Enter view mode set_view_mode(VIEW_MODE_EDIT); gtk_widget_set_sensitive(button_edit, FALSE); update_toolbar(); // Show edit toolbar if necessary draw_board(); // Make sure history is setup so that // Undo/redo capability is properly // computed. update_move.update(UPDATE_ALL); // If there is any Game List window // opened, remove the highlight on the // window. update_game_list.update(UPDATE_ALL); } /************************************************************************* Signals *************************************************************************/ void destroy_signal(GtkWidget *window, gpointer /*data*/) { gtk_window_get_position(GTK_WINDOW(window), &main_x, &main_y); write_view_config(); gtk_main_quit(); } void expose_signal(GtkWidget * /*window*/, GdkEventExpose * /*event*/, gpointer /*data*/) { draw_board(); } void button_press_signal(GtkWidget * /*window*/, GdkEventButton *event, gpointer /*data*/) { if (view_mode == VIEW_MODE_NONE && get_wait_player() && event->type == GDK_BUTTON_PRESS && event->button == 1 && event->x >= left_margin && event->x < 8*grid_width+left_margin && event->y >= top_margin && event->y < 8*grid_height+top_margin) { int x = static_cast((event->x - left_margin)/ grid_width); int y = static_cast((event->y - top_margin)/ grid_height); int pos = xy_to_pos(x, y); if (cur_game_info.board_ptr->can_play(cur_game_info.get_player(), pos)) { pthread_mutex_lock(&input_lock); input_pos = pos; gettimeofday(&stop_time, 0); pthread_mutex_unlock(&input_lock); } } else if (view_mode == VIEW_MODE_EDIT) { if (event->type == GDK_BUTTON_PRESS && event->button == 1 && event->x >= left_margin && event->x < 8*grid_width+left_margin && event->y >= top_margin && event->y < 8*grid_height+top_margin) { button_drag_state = true; button_drag_from_x = static_cast((event->x - left_margin)/ grid_width); button_drag_from_y = static_cast((event->y - top_margin)/ grid_height); button_drag_to_x = button_drag_from_x; button_drag_to_y = button_drag_from_y; // Intentionally not calling draw_board to avoid // highlighting square in a simple mouse click } else if (event->type == GDK_BUTTON_RELEASE && event->button == 1 && button_drag_state == true) { if (event->x >= left_margin && event->x < 8*grid_width+left_margin && event->y >= top_margin && event->y < 8*grid_height+top_margin) { int to_x = static_cast((event->x - left_margin)/ grid_width); int to_y = static_cast((event->y - top_margin)/ grid_height); if (to_x < button_drag_from_x) { int temp = to_x; to_x = button_drag_from_x; button_drag_from_x = temp; } if (to_y < button_drag_from_y) { int temp = to_y; to_y = button_drag_from_y; button_drag_from_y = temp; } for (int x = button_drag_from_x; x <= to_x; ++x) { for (int y = button_drag_from_y; y <= to_y; ++y) { int pos = xy_to_pos(x, y); view_board_ptr->set_pos(edit_board_color, pos); } } button_drag_state = false; draw_board(); update_move.update(UPDATE_ALL); } else button_drag_state = false; } else if (event->type == GDK_BUTTON_PRESS && event->button == 3) { switch (edit_board_color) { case BLACK: edit_board_color = WHITE; gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(button_white), TRUE); break; case WHITE: edit_board_color = EMPTY; gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(button_empty), TRUE); break; case EMPTY: edit_board_color = BLACK; gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON(button_black), TRUE); break; } } else if (event->type == GDK_BUTTON_PRESS && event->button == 2) { menu_edit_player(NULL, NULL); } } } gboolean mouse_move_signal(GtkWidget * /*window*/, GdkEventButton *event, gpointer /*data*/) { if (view_mode == VIEW_MODE_EDIT && button_drag_state) { int x = -1; int y = -1; if (event->x >= left_margin && event->x < 8*grid_width+left_margin && event->y >= top_margin && event->y < 8*grid_height+top_margin) { x = static_cast((event->x - left_margin)/ grid_width); y = static_cast((event->y - top_margin)/ grid_height); } if (x != button_drag_to_x || y != button_drag_to_y) { button_drag_to_x = x; button_drag_to_y = y; draw_board(); update_move.update(UPDATE_ALL); } } return TRUE; } /************************************************************************* Adjust toolbar according to current settings *************************************************************************/ bool main_toolbar_docked = false; bool edit_toolbar_docked = false; void update_toolbar() { if (show_toolbar && !main_toolbar_docked) { gnome_app_add_toolbar(GNOME_APP(main_window), GTK_TOOLBAR(main_toolbar), "main_toolbar", BONOBO_DOCK_ITEM_BEH_EXCLUSIVE, BONOBO_DOCK_TOP, 1, 0, 0); main_toolbar_docked = true; } if (main_toolbar_docked) { BonoboDockItem *dock_item = gnome_app_get_dock_item_by_name(GNOME_APP(main_window), "main_toolbar"); if (show_toolbar) gtk_widget_show(GTK_WIDGET(dock_item)); else gtk_widget_hide(GTK_WIDGET(dock_item)); } if (view_mode == VIEW_MODE_EDIT && !edit_toolbar_docked) { gnome_app_add_toolbar(GNOME_APP(main_window), GTK_TOOLBAR(edit_toolbar), "edit_toolbar", BONOBO_DOCK_ITEM_BEH_EXCLUSIVE, BONOBO_DOCK_TOP, 2, 0, 0); edit_toolbar_docked = true; } if (edit_toolbar_docked) { BonoboDockItem *dock_item = gnome_app_get_dock_item_by_name(GNOME_APP(main_window), "edit_toolbar"); if (view_mode == VIEW_MODE_EDIT) gtk_widget_show(GTK_WIDGET(dock_item)); else gtk_widget_hide(GTK_WIDGET(dock_item)); } gtk_window_resize(GTK_WINDOW(main_window), 1, 1); } /************************************************************************* Menu callback functions *************************************************************************/ void menu_game_new(GtkWidget * /*widget*/, gpointer /*data*/) { new_game(); } void menu_game_open(GtkWidget * /*widget*/, gpointer /*data*/) { open_game(); } void menu_game_edit_board(GtkWidget * /*widget*/, gpointer /*data*/) { edit_board(); } void menu_game_undo(GtkWidget * /*widget*/, gpointer /*data*/) { undo(); } void menu_game_redo(GtkWidget * /*widget*/, gpointer /*data*/) { redo(); } void menu_game_exit(GtkWidget * /*widget*/, gpointer /*data*/) { gtk_main_quit(); } void menu_game_begin(GtkWidget * /*widget*/, gpointer /*data*/) { *view_board_ptr = cur_game_info.board_history[0]; view_player = cur_game_info.player_history[0]; set_view_mode(VIEW_MODE_HISTORY); view_position = 0; draw_board(); update_move.update(UPDATE_NONE); } void menu_game_prev(GtkWidget * /*widget*/, gpointer /*data*/) { if (view_mode == VIEW_MODE_NONE) { set_view_mode(VIEW_MODE_HISTORY); view_position = cur_game_info.num_history-2; } else --view_position; *view_board_ptr = cur_game_info.board_history[view_position]; view_player = cur_game_info.player_history[view_position]; draw_board(); update_move.update(UPDATE_NONE); } void menu_game_next(GtkWidget * /*widget*/, gpointer /*data*/) { ++view_position; if (view_position == cur_game_info.num_history-1) set_view_mode(VIEW_MODE_NONE); *view_board_ptr = cur_game_info.board_history[view_position]; view_player = cur_game_info.player_history[view_position]; draw_board(); update_move.update(UPDATE_NONE); } void menu_game_end(GtkWidget * /*widget*/, gpointer /*data*/) { *view_board_ptr = *cur_game_info.board_ptr; set_view_mode(VIEW_MODE_NONE); draw_board(); update_move.update(UPDATE_NONE); } void menu_edit_empty(GtkWidget * /*widget*/, gpointer /*data*/) { edit_board_color = EMPTY; } void menu_edit_black(GtkWidget * /*widget*/, gpointer /*data*/) { edit_board_color = BLACK; } void menu_edit_white(GtkWidget * /*widget*/, gpointer /*data*/) { edit_board_color = WHITE; } void menu_edit_player(GtkWidget * /*widget*/, gpointer /*data*/) { view_player = switch_color(view_player); // Update status bar to reflect // new player update_move.update(UPDATE_ALL); } void menu_edit_finish(GtkWidget * /*widget*/, gpointer /*data*/) { finish_edit_mode(); } void menu_settings_save(GtkWidget * /*widget*/, gpointer /*data*/) { write_config(); } void menu_settings_preferences(GtkWidget * /*widget*/, gpointer /*data*/) { preferences(); } void menu_settings_switch_color(GtkWidget * /*widget*/, gpointer /*data*/) { switch_computer_color(); } void menu_help_about(GtkWidget * /*widget*/, gpointer /*data*/) { static GtkWidget *about_dialog = NULL; if (!about_dialog) { static const gchar *authors[2]; authors[0] = _("Kriang Lerdsuwanakij"); authors[1] = 0; static const gchar *documenters[2]; documenters[0] = _("Kriang Lerdsuwanakij"); documenters[1] = 0; gchar *translator = _("TRANSLATOR"); if (strcmp (translator, "TRANSLATOR") == 0) translator = 0; about_dialog = gnome_about_new(_(prog_name), prog_ver, _("(c) 2000-7, 2010 Kriang Lerdsuwanakij"), _("A reversi program"), authors, documenters, translator, 0); g_signal_connect(G_OBJECT(about_dialog), "destroy", G_CALLBACK(gtk_widget_destroyed), &about_dialog); } gtk_window_present(GTK_WINDOW(about_dialog)); } /************************************************************************* Pixmap function *************************************************************************/ void default_pixmap_error(const char *str) { gtstream bufstr; gtout(bufstr, _("size of theme pixmap %$ does not agree with others")) << str; throw std::range_error(bufstr.str()); } GdkPixbuf *load_pixmap(const char *basename, const char *default_xpm[], bool use_default) { if (use_default) return gdk_pixbuf_new_from_xpm_data(default_xpm); else { std::string pathname = THEMEDIR; pathname.append(theme_name); pathname.append("/"); pathname.append(basename); std::string filename = pathname; filename.append(".png"); if (!g_file_test(filename.c_str(), G_FILE_TEST_EXISTS)) { filename = pathname; filename.append(".xpm"); if (!g_file_test(filename.c_str(), G_FILE_TEST_EXISTS)) { gtstream bufstr; gtout(bufstr, _("pixmap %$ missing")) << basename; throw std::runtime_error(bufstr.str()); } } GdkPixbuf *pixmap = gdk_pixbuf_new_from_file(filename.c_str(), NULL); if (!pixmap) { gtstream bufstr; gtout(bufstr, _("pixmap %$ contains error")) << filename; throw std::runtime_error(bufstr.str()); } return pixmap; } } void load_icon_image(GtkWidget *widget, const char *basename, const char *stock_name, bool use_default) { if (use_default) { gtk_image_set_from_stock(GTK_IMAGE(widget), stock_name, toolbar_icon_map[toolbar_icon_size]); return; } else { std::string pathname = THEMEDIR; pathname.append(theme_name); pathname.append("/"); pathname.append(basename); std::string filename = pathname; filename.append(".png"); if (!g_file_test(filename.c_str(), G_FILE_TEST_EXISTS)) { filename = pathname; filename.append(".xpm"); if (!g_file_test(filename.c_str(), G_FILE_TEST_EXISTS)) { gtk_image_set_from_stock(GTK_IMAGE(widget), stock_name, toolbar_icon_map[toolbar_icon_size]); return; } } GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename.c_str(), NULL); if (!pixbuf) { gtk_image_set_from_stock(GTK_IMAGE(widget), stock_name, toolbar_icon_map[toolbar_icon_size]); return; } GdkPixbuf *pixbuf2 = gdk_pixbuf_scale_simple(pixbuf, icon_width, icon_height, GDK_INTERP_BILINEAR); gtk_image_set_from_pixbuf(GTK_IMAGE(widget), pixbuf2); g_object_unref(pixbuf); g_object_unref(pixbuf2); return; } } void load_icon_image(GtkWidget *widget, const char *basename, const char *default_xpm[], bool use_default) { if (use_default) { GdkPixbuf *p = scale_pixbuf_from_xpm_data(default_xpm, icon_width, icon_height); gtk_image_set_from_pixbuf(GTK_IMAGE(widget), p); g_object_unref(p); return; } else { std::string pathname = THEMEDIR; pathname.append(theme_name); pathname.append("/"); pathname.append(basename); std::string filename = pathname; filename.append(".png"); if (!g_file_test(filename.c_str(), G_FILE_TEST_EXISTS)) { filename = pathname; filename.append(".xpm"); if (!g_file_test(filename.c_str(), G_FILE_TEST_EXISTS)) { GdkPixbuf *p = scale_pixbuf_from_xpm_data(default_xpm, icon_width, icon_height); gtk_image_set_from_pixbuf(GTK_IMAGE(widget), p); g_object_unref(p); return; } } GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file(filename.c_str(), NULL); if (!pixbuf) { GdkPixbuf *p = scale_pixbuf_from_xpm_data(default_xpm, icon_width, icon_height); gtk_image_set_from_pixbuf(GTK_IMAGE(widget), p); g_object_unref(p); return; } GdkPixbuf *pixbuf2 = gdk_pixbuf_scale_simple(pixbuf, icon_width, icon_height, GDK_INTERP_BILINEAR); gtk_image_set_from_pixbuf(GTK_IMAGE(widget), pixbuf2); g_object_unref(pixbuf); g_object_unref(pixbuf2); return; } } void load_pixmaps(bool use_default) { // Free memory used by old pixmaps if (black_pixmap) { g_object_unref(black_pixmap); black_pixmap = 0; } if (white_pixmap) { g_object_unref(white_pixmap); white_pixmap = 0; } if (empty_pixmap) { g_object_unref(empty_pixmap); empty_pixmap = 0; } if (hint_black_pixmap) { g_object_unref(hint_black_pixmap); hint_black_pixmap = 0; } if (hint_white_pixmap) { g_object_unref(hint_white_pixmap); hint_white_pixmap = 0; } if (black_last_pixmap) { g_object_unref(black_last_pixmap); black_last_pixmap = 0; } if (white_last_pixmap) { g_object_unref(white_last_pixmap); white_last_pixmap = 0; } if (highlight_black_pixmap) { g_object_unref(highlight_black_pixmap); highlight_black_pixmap = 0; } if (highlight_white_pixmap) { g_object_unref(highlight_white_pixmap); highlight_white_pixmap = 0; } if (highlight_empty_pixmap) { g_object_unref(highlight_empty_pixmap); empty_pixmap = 0; } if (left_pixmap) { g_object_unref(left_pixmap); left_pixmap = 0; } if (right_pixmap) { g_object_unref(right_pixmap); right_pixmap = 0; } if (top_pixmap) { g_object_unref(top_pixmap); top_pixmap = 0; } if (bottom_pixmap) { g_object_unref(bottom_pixmap); bottom_pixmap = 0; } black_pixmap = load_pixmap("black", const_cast(black_xpm), use_default); grid_width = gdk_pixbuf_get_width(black_pixmap); grid_height = gdk_pixbuf_get_height(black_pixmap); white_pixmap = load_pixmap("white", const_cast(white_xpm), use_default); if (gdk_pixbuf_get_width(white_pixmap) != grid_width || gdk_pixbuf_get_height(white_pixmap) != grid_height) default_pixmap_error("white"); empty_pixmap = load_pixmap("empty", const_cast(empty_xpm), use_default); if (gdk_pixbuf_get_width(empty_pixmap) != grid_width || gdk_pixbuf_get_height(empty_pixmap) != grid_height) default_pixmap_error("empty"); highlight_black_pixmap = load_pixmap("highlight_black", const_cast(highlight_black_xpm), use_default); if (gdk_pixbuf_get_width(highlight_black_pixmap) != grid_width || gdk_pixbuf_get_height(highlight_black_pixmap) != grid_height) default_pixmap_error("highlight_black"); highlight_white_pixmap = load_pixmap("highlight_white", const_cast(highlight_white_xpm), use_default); if (gdk_pixbuf_get_width(highlight_white_pixmap) != grid_width || gdk_pixbuf_get_height(highlight_white_pixmap) != grid_height) default_pixmap_error("highlight_white"); highlight_empty_pixmap = load_pixmap("highlight_empty", const_cast(highlight_empty_xpm), use_default); if (gdk_pixbuf_get_width(highlight_empty_pixmap) != grid_width || gdk_pixbuf_get_height(highlight_empty_pixmap) != grid_height) default_pixmap_error("highlight_empty"); if (hint_move) { hint_black_pixmap = load_pixmap("hint_black", const_cast(hint_black_xpm), use_default); if (gdk_pixbuf_get_width(hint_black_pixmap) != grid_width || gdk_pixbuf_get_height(hint_black_pixmap) != grid_height) default_pixmap_error("hint_black"); hint_white_pixmap = load_pixmap("hint_white", const_cast(hint_white_xpm), use_default); if (gdk_pixbuf_get_width(hint_white_pixmap) != grid_width || gdk_pixbuf_get_height(hint_white_pixmap) != grid_height) default_pixmap_error("hint_white"); } else { hint_black_pixmap = 0; hint_white_pixmap = 0; } if (show_last_move) { black_last_pixmap = load_pixmap("black_last", const_cast(black_last_xpm), use_default); if (gdk_pixbuf_get_width(black_last_pixmap) != grid_width || gdk_pixbuf_get_height(black_last_pixmap) != grid_height) default_pixmap_error("black_last"); white_last_pixmap = load_pixmap("white_last", const_cast(white_last_xpm), use_default); if (gdk_pixbuf_get_width(white_last_pixmap) != grid_width || gdk_pixbuf_get_height(white_last_pixmap) != grid_height) default_pixmap_error("white_last"); } else { black_last_pixmap = 0; white_last_pixmap = 0; } // Setup border pixmaps if required if (show_border) { left_pixmap = load_pixmap("left", const_cast(left_xpm), use_default); left_margin = gdk_pixbuf_get_width(left_pixmap); if (gdk_pixbuf_get_height(left_pixmap) != grid_height * 8) default_pixmap_error("left"); right_pixmap = load_pixmap("right", const_cast(right_xpm), use_default); right_margin = gdk_pixbuf_get_width(right_pixmap); if (gdk_pixbuf_get_height(right_pixmap) != grid_height * 8) default_pixmap_error("right"); top_pixmap = load_pixmap("top", const_cast(top_xpm), use_default); top_margin = gdk_pixbuf_get_height(top_pixmap); if (gdk_pixbuf_get_width(top_pixmap) != grid_width * 8 + left_margin + right_margin) default_pixmap_error("top"); bottom_pixmap = load_pixmap("bottom", const_cast(bottom_xpm), use_default); bottom_margin = gdk_pixbuf_get_height(bottom_pixmap); if (gdk_pixbuf_get_width(bottom_pixmap) != grid_width * 8 + left_margin + right_margin) default_pixmap_error("bottom"); } else { left_margin = 0; right_margin = 0; top_margin = 0; bottom_margin = 0; } GdkScreen *screen = gtk_window_get_screen(GTK_WINDOW(main_window)); GtkSettings *settings = gtk_settings_get_for_screen(screen); gtk_icon_size_lookup_for_settings(settings, toolbar_icon_map[toolbar_icon_size], &icon_width, &icon_height); load_icon_image(icon_new, "icon_new", const_cast(icon_new_xpm), use_default); load_icon_image(icon_edit, "icon_edit", GTK_STOCK_FIND_AND_REPLACE, use_default); load_icon_image(icon_exit, "icon_exit", GTK_STOCK_QUIT, use_default); load_icon_image(icon_undo, "icon_undo", GTK_STOCK_UNDO, use_default); load_icon_image(icon_redo, "icon_redo", GTK_STOCK_REDO, use_default); load_icon_image(icon_begin, "icon_begin", GTK_STOCK_GOTO_TOP, use_default); load_icon_image(icon_prev, "icon_prev", GTK_STOCK_GO_UP, use_default); load_icon_image(icon_next, "icon_next", GTK_STOCK_GO_DOWN, use_default); load_icon_image(icon_end, "icon_end", GTK_STOCK_GOTO_BOTTOM, use_default); load_icon_image(icon_empty, "icon_empty", const_cast(icon_empty_xpm), use_default); load_icon_image(icon_black, "icon_black", const_cast(icon_black_xpm), use_default); load_icon_image(icon_white, "icon_white", const_cast(icon_white_xpm), use_default); load_icon_image(icon_bw, "icon_bw", const_cast(icon_bw_xpm), use_default); load_icon_image(icon_finish, "icon_finish", GTK_STOCK_APPLY, use_default); } void init_pixmaps() { icon_new = gtk_image_new(); icon_edit = gtk_image_new(); icon_exit = gtk_image_new(); icon_undo = gtk_image_new(); icon_redo = gtk_image_new(); icon_begin = gtk_image_new(); icon_prev = gtk_image_new(); icon_next = gtk_image_new(); icon_end = gtk_image_new(); icon_empty = gtk_image_new(); icon_black = gtk_image_new(); icon_white = gtk_image_new(); icon_bw = gtk_image_new(); icon_finish = gtk_image_new(); if (theme_name.size()) { try { load_pixmaps(false); } catch (std::exception &e) { std::cout << std::flush; gtout(std::cerr, _("%$: %$\n")) << prog_name << e.what(); gtout(std::cerr, _("%$: reverting to default internal theme\n")) << prog_name; load_pixmaps(true); } } else load_pixmaps(true); } void resize_board_widget() { // Set board size gtk_widget_set_size_request(board_widget, 8 * grid_width + left_margin + right_margin, 8 * grid_height + top_margin + bottom_margin); // Set main window size // Setting to 1x1 automatically set // window size to smallest possible gtk_window_resize(GTK_WINDOW(main_window), 1, 1); } /************************************************************************* Toolbar function *************************************************************************/ GtkWidget *create_toolbar_button(GtkWidget *toolbar, GtkTooltips *tooltips, GtkWidget *icon, const char *label, const char *tips, void (*callback)(GtkWidget *, gpointer)) { GtkWidget *button = (GtkWidget *) gtk_tool_button_new(icon, label); gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(button), tooltips, tips, NULL); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(callback), 0); gtk_widget_show(icon); gtk_widget_show(button); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(button), -1); return button; } GtkWidget *create_toolbar_radio_button(GtkWidget *toolbar, GtkTooltips *tooltips, GtkWidget *icon, const char *label, const char *tips, void (*callback)(GtkWidget *, gpointer), GSList *list) { GtkWidget *button = (GtkWidget *) gtk_radio_tool_button_new(list); gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(button), icon); gtk_tool_button_set_label(GTK_TOOL_BUTTON(button), label); gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(button), tooltips, tips, NULL); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(callback), 0); gtk_widget_show(icon); gtk_widget_show(button); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), GTK_TOOL_ITEM(button), -1); return button; } void create_toolbar() { tooltips = gtk_tooltips_new(); gtk_tooltips_enable(tooltips); main_toolbar = gtk_toolbar_new(); gtk_toolbar_set_show_arrow(GTK_TOOLBAR(main_toolbar), FALSE); edit_toolbar = gtk_toolbar_new(); gtk_toolbar_set_show_arrow(GTK_TOOLBAR(edit_toolbar), FALSE); // Main toolbar button_new = create_toolbar_button(main_toolbar, tooltips, icon_new, _("New"), _("Start a new game"), menu_game_new); button_edit = create_toolbar_button(main_toolbar, tooltips, icon_edit, _("Edit"), _("Edit board"), menu_game_edit_board); button_exit = create_toolbar_button(main_toolbar, tooltips, icon_exit, _("Quit"), _("Quit GRhino"), menu_game_exit); GtkWidget *sep = (GtkWidget *) gtk_separator_tool_item_new (); gtk_widget_show (sep); gtk_toolbar_insert (GTK_TOOLBAR (main_toolbar), GTK_TOOL_ITEM(sep), -1); // Play mode button_undo = create_toolbar_button(main_toolbar, tooltips, icon_undo, _("Undo"), _("Undo move"), menu_game_undo); button_redo = create_toolbar_button(main_toolbar, tooltips, icon_redo, _("Redo"), _("Redo move"), menu_game_redo); sep = (GtkWidget *) gtk_separator_tool_item_new (); gtk_widget_show (sep); gtk_toolbar_insert (GTK_TOOLBAR (main_toolbar), GTK_TOOL_ITEM(sep), -1); // Play mode button_begin = create_toolbar_button(main_toolbar, tooltips, icon_begin, _("Begin"), _("Go to the game beginning"), menu_game_begin); button_prev = create_toolbar_button(main_toolbar, tooltips, icon_prev, _("Prev"), _("Go to the previous move"), menu_game_prev); button_next = create_toolbar_button(main_toolbar, tooltips, icon_next, _("Next"), _("Go to the next move"), menu_game_next); button_end = create_toolbar_button(main_toolbar, tooltips, icon_end, _("Last"), _("Go to the last move"), menu_game_end); // Edit toolbar button_empty = create_toolbar_radio_button(edit_toolbar, tooltips, icon_empty, _("Empty"), _("Fill with empty"), menu_edit_empty, NULL); GSList *group = gtk_radio_tool_button_get_group(GTK_RADIO_TOOL_BUTTON(button_empty)); button_black = create_toolbar_radio_button(edit_toolbar, tooltips, icon_black, _("Black"), _("Fill with black"), menu_edit_black, group); group = gtk_radio_tool_button_get_group(GTK_RADIO_TOOL_BUTTON(button_empty)); button_white = create_toolbar_radio_button(edit_toolbar, tooltips, icon_white, _("White"), _("Fill with white"), menu_edit_white, group); sep = (GtkWidget *) gtk_separator_tool_item_new (); gtk_widget_show (sep); gtk_toolbar_insert (GTK_TOOLBAR (edit_toolbar), GTK_TOOL_ITEM(sep), -1); button_bw = create_toolbar_button(edit_toolbar, tooltips, icon_bw, _("To play"), _("Player with first move"), menu_edit_player); button_finish = create_toolbar_button(edit_toolbar, tooltips, icon_finish, _("Finish"), _("Start game with board"), menu_edit_finish); } void menu_view_toolbar(GtkWidget * /*widget*/, gpointer /*data*/) { show_toolbar = GTK_CHECK_MENU_ITEM (menu_tools_info[0].widget)->active; update_toolbar(); } void menu_tools_evaluate_position(GtkWidget * /*widget*/, gpointer /*data*/) { show_pattern_evaluation = GTK_CHECK_MENU_ITEM (menu_tools_info[2].widget)->active; evaluate_position(); } void menu_tools_game_history(GtkWidget * /*widget*/, gpointer /*data*/) { show_game_history = GTK_CHECK_MENU_ITEM (menu_tools_info[3].widget)->active; game_history(); } void update_menu_and_toolbar(update_state_type /*u*/, void *) { bool b = (view_mode == VIEW_MODE_NONE ? cur_game_info.is_undoable() : false); gtk_widget_set_sensitive(menu_edit_info[MENU_INDEX_UNDO].widget, b); gtk_widget_set_sensitive(button_undo, b); b = (view_mode == VIEW_MODE_NONE ? cur_game_info.is_redoable() : false); gtk_widget_set_sensitive(menu_edit_info[MENU_INDEX_REDO].widget, b); gtk_widget_set_sensitive(button_redo, b); b = (view_mode == VIEW_MODE_NONE && (cur_game_info.num_history > 1)) || (view_mode == VIEW_MODE_HISTORY && (view_position > 0)); gtk_widget_set_sensitive(button_begin, b); gtk_widget_set_sensitive(menu_edit_info[MENU_INDEX_BEGIN].widget, b); gtk_widget_set_sensitive(button_prev, b); gtk_widget_set_sensitive(menu_edit_info[MENU_INDEX_PREV].widget, b); b = (view_mode == VIEW_MODE_HISTORY); gtk_widget_set_sensitive(button_next, b); gtk_widget_set_sensitive(menu_edit_info[MENU_INDEX_NEXT].widget, b); gtk_widget_set_sensitive(button_end, b); gtk_widget_set_sensitive(menu_edit_info[MENU_INDEX_END].widget, b); } // Called from Preferences dialog void update_menu_and_toolbar_pref() { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (menu_tools_info[MENU_INDEX_SHOW_TOOLBAR].widget), show_toolbar); game_mode_type g = get_game_mode(); if (g == COMPUTER_BOTH || g == COMPUTER_NONE) gtk_widget_set_sensitive(menu_settings_info[MENU_INDEX_SWITCH_AI].widget, 0); else // One AI player modes gtk_widget_set_sensitive(menu_settings_info[MENU_INDEX_SWITCH_AI].widget, 1); gtk_toolbar_set_icon_size(GTK_TOOLBAR(main_toolbar), toolbar_icon_map[toolbar_icon_size]); gtk_toolbar_set_icon_size(GTK_TOOLBAR(edit_toolbar), toolbar_icon_map[toolbar_icon_size]); } /************************************************************************* Main function *************************************************************************/ int main_real(gint argc, gchar *argv[]) { if (sizeof(int) < 4) throw std::out_of_range(_("cannot run on system with less than 32-bit int")); setlocale(LC_ALL, ""); bindtextdomain("grhino", LOCALEDIR); textdomain("grhino"); gnome_program_init("grhino", prog_ver, LIBGNOMEUI_MODULE, argc, argv, GNOME_PROGRAM_STANDARD_PROPERTIES, NULL); init_game_before_draw(); gtk_window_set_default_icon_from_file(ICONDIR "/grhino.png", NULL); main_window = gnome_app_new("GRhino", _(prog_name)); g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(destroy_signal), 0); gtk_widget_realize(main_window); gnome_app_create_menus(GNOME_APP(main_window), menu_main_info); init_pixmaps(); board_widget = gtk_drawing_area_new(); // Set board size gtk_widget_set_size_request(board_widget, 8 * grid_width + left_margin + right_margin, 8 * grid_height + top_margin + bottom_margin); g_signal_connect(G_OBJECT(board_widget), "expose_event", G_CALLBACK(expose_signal), 0); g_signal_connect(G_OBJECT(board_widget), "button_press_event", G_CALLBACK(button_press_signal), 0); g_signal_connect(G_OBJECT(board_widget), "button_release_event", G_CALLBACK(button_press_signal), 0); g_signal_connect(G_OBJECT(board_widget), "motion_notify_event", G_CALLBACK(mouse_move_signal), 0); gtk_widget_set_events(board_widget, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK | GDK_EXPOSURE_MASK); gtk_widget_show(board_widget); view_board_ptr = new byte_board_info(); GtkWidget *vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), board_widget, TRUE, TRUE, 0); gtk_widget_show(vbox); gnome_app_set_contents(GNOME_APP(main_window), vbox); status_widget = gnome_appbar_new(FALSE, TRUE, GNOME_PREFERENCES_USER); gnome_app_set_statusbar(GNOME_APP(main_window), status_widget); create_toolbar(); if (show_toolbar) { // Only dock toolbar when it is visible. // This is to avoid broken window size calculation when // dock toolbar and immediately make it invisible. gnome_app_add_toolbar(GNOME_APP(main_window), GTK_TOOLBAR(main_toolbar), "main_toolbar", BONOBO_DOCK_ITEM_BEH_EXCLUSIVE, BONOBO_DOCK_TOP, 1, 0, 0); main_toolbar_docked = true; } update_menu_and_toolbar_pref(); if (main_x != -1 && main_y != -1) gtk_window_move(GTK_WINDOW(main_window), main_x, main_y); gtk_widget_show(main_window); init_game(); new_game(); // Show other windows after game has // been properly setup if (show_pattern_evaluation) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (menu_tools_info[2].widget), show_pattern_evaluation); if (show_game_history) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (menu_tools_info[3].widget), show_game_history); gtk_window_present(GTK_WINDOW(main_window)); gtk_main(); return 0; } int main(gint argc, gchar *argv[]) { try { return main_real(argc, argv); } catch (std::exception &e) { std::cout << std::flush; gtout(std::cerr, _("%$: %$\n")) << prog_name << e.what(); } catch (const char *s) { std::cout << std::flush; gtout(std::cerr, _("%$: exception %$\n")) << prog_name << s; } catch (...) { std::cout << std::flush; gtout(std::cerr, _("%$: unknown exception\n")) << prog_name; } return 1; } grhino-0.16.1/highlight_white.xpm0000644000175000017500000000416711436423225017232 0ustar lerdsuwalerdsuwa/* XPM */ static char * highlight_white_xpm[] = { "40 40 23 1", " c None", ". c #000000", "+ c #26860F", "@ c #34891F", "# c #5B8F4E", "$ c #7A9573", "% c #8F998C", "& c #999A99", "* c #30881A", "= c #6C9262", "- c #9B9B9B", "; c #4A8C3A", "> c #91998F", ", c #528E43", "' c #478C35", ") c #298612", "! c #8B9888", "~ c #639158", "{ c #2A8713", "] c #969A95", "^ c #518E43", "/ c #719369", "( c #889784", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++*=----------=*++++++++++++.", ".+++++++++++;>------------>;+++++++++++.", ".++++++++++,----------------,++++++++++.", ".+++++++++'------------------'+++++++++.", ".++++++++)!------------------!)++++++++.", ".++++++++~--------------------~++++++++.", ".+++++++{]--------------------]{+++++++.", ".+++++++^----------------------^+++++++.", ".+++++++/----------------------/+++++++.", ".+++++++(----------------------(+++++++.", ".+++++++]----------------------]+++++++.", ".+++++++------------------------+++++++.", ".+++++++]----------------------]+++++++.", ".+++++++(----------------------(+++++++.", ".+++++++/----------------------/+++++++.", ".+++++++^----------------------^+++++++.", ".+++++++{]--------------------]{+++++++.", ".++++++++~--------------------~++++++++.", ".++++++++)!------------------!)++++++++.", ".+++++++++'------------------'+++++++++.", ".++++++++++,----------------,++++++++++.", ".+++++++++++;>------------>;+++++++++++.", ".++++++++++++*=----------=*++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/icon_bw.xpm0000644000175000017500000000523311436423225015476 0ustar lerdsuwalerdsuwa/* XPM */ static char * icon_bw_xpm[] = { "48 48 11 1", " c None", ". c #000000", "+ c #363636", "@ c #848484", "# c #BFBFBF", "$ c #E8E8E8", "% c #FCFCFC", "& c #494949", "* c #FFFFFF", "= c #989898", "- c #101010", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ........ ", " .+@#$%%$#@+. ", " .&#**********#&. ", " .=**************=. ", " -#****************#- ", " .#*****************... ", " .=*****************..... ", " &*****************...... ", " .#****************........ ", " +****************......... ", " .@***************........... ", " .#**************............ ", " .$*************............. ", " .%************.............. ", " .%***********............... ", " .$**********................ ", " .#*********................. ", " .@********.................. ", " +*******.................. ", " .#*****................... ", " &****................... ", " .=**.................... ", " .#.................... ", " ...................- ", " .................. ", " ................ ", " ............ ", " ........ ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; grhino-0.16.1/ad.append0000644000175000017500000001705311436423224015107 0ustar lerdsuwalerdsuwa# # Default target # all: grhino test gen_book gen_opening gen_pattern gen_table dump_pattern \ gtp-rhino aiai # Generate en_US.UTF-8, en_GB, en_GB.UTF-8 messages automatically. # Only used for packaging GRhino upstream source. default-po: if [ ! "@GMSGFMT@" = ":" ]; then \ cd po; \ $(MAKE) update-po; \ fi perl "$(srcdir)/scripts/copy-message.pl" \ -d CHARSET utf-8 \ -d DATE "`date "+%Y-%m-%d %H:%M%z"`" \ -d VERSION $(VERSION) \ -f "$(srcdir)/scripts/copy-message" < po/grhino.pot \ | perl "$(srcdir)/scripts/utf-quotes.pl" > po/en_US.UTF-8.po perl "$(srcdir)/scripts/copy-message.pl" \ -d CHARSET iso-8859-1 \ -d DATE "`date "+%Y-%m-%d %H:%M%z"`" \ -d VERSION $(VERSION) \ -f "$(srcdir)/scripts/copy-message" < po/grhino.pot \ | perl "$(srcdir)/scripts/en_GB.pl" > po/en_GB.po perl "$(srcdir)/scripts/copy-message.pl" \ -d CHARSET utf-8 \ -d DATE "`date "+%Y-%m-%d %H:%M%z"`" \ -d VERSION $(VERSION) \ -f "$(srcdir)/scripts/copy-message" < po/grhino.pot \ | perl "$(srcdir)/scripts/en_GB.pl" \ | perl "$(srcdir)/scripts/utf-quotes.pl" > po/en_GB.UTF-8.po if [ ! "@GMSGFMT@" = ":" ]; then \ cd po; \ $(MAKE); \ fi .PHONY : clean_curdir clean distclean_curdir distclean install # Delete object and executable files # Do not run rm -f ... if variables are empty clean_curdir : test -z "$(adINTFILES)" || rm -f $(adINTFILES) test -z "$(adOUTFILES)" || rm -f $(adOUTFILES) clean : clean_curdir $(adBeginSubdir) $@ $(adEndSubdir) # Also delete files generated by `configure' # Use `clean_curdir' to avoid recursive call to all subdirectories distclean_curdir : clean_curdir rm -f config.h rm -f config.cache config.log config.status rm -f Makefile distclean : distclean_curdir $(adBeginSubdir) $@ $(adEndSubdir) install_mkdir : if [ ! -e "$(DESTDIR)$(bindir)" ]; then \ mkdir -p "$(DESTDIR)$(bindir)"; \ chmod 755 "$(DESTDIR)$(bindir)"; \ fi if [ ! -e "$(DESTDIR)$(icon_dir)" ]; then \ mkdir -p "$(DESTDIR)$(icon_dir)"; \ chmod 755 "$(DESTDIR)$(icon_dir)"; \ fi if [ ! -e "$(DESTDIR)$(pattern_dir)" ]; then \ mkdir -p "$(DESTDIR)$(pattern_dir)"; \ chmod 755 "$(DESTDIR)$(pattern_dir)"; \ fi if [ ! -e "$(DESTDIR)$(book_dir)" ]; then \ mkdir -p "$(DESTDIR)$(book_dir)"; \ chmod 755 "$(DESTDIR)$(book_dir)"; \ fi if [ ! -e "$(DESTDIR)$(theme_dir)" ]; then \ mkdir -p "$(DESTDIR)$(theme_dir)"; \ chmod 755 "$(DESTDIR)$(theme_dir)"; \ fi if [ ! -e "$(DESTDIR)$(theme_dir)/small" ]; then \ mkdir -p "$(DESTDIR)$(theme_dir)/small"; \ chmod 755 "$(DESTDIR)$(theme_dir)/small"; \ fi if [ ! -e "$(DESTDIR)$(omfdir)" ]; then \ mkdir -p "$(DESTDIR)$(omfdir)"; \ chmod 755 "$(DESTDIR)$(omfdir)"; \ fi if [ ! -e "$(DESTDIR)$(helpdir)" ]; then \ mkdir -p "$(DESTDIR)$(helpdir)"; \ chmod 755 "$(DESTDIR)$(helpdir)"; \ fi if [ ! -e "$(DESTDIR)$(helpdir)/C" ]; then \ mkdir -p "$(DESTDIR)$(helpdir)/C"; \ chmod 755 "$(DESTDIR)$(helpdir)/C"; \ fi if [ ! -e "$(DESTDIR)$(helpdir)/C/figures" ]; then \ mkdir -p "$(DESTDIR)$(helpdir)/C/figures"; \ chmod 755 "$(DESTDIR)$(helpdir)/C/figures"; \ fi # Main installation # Only run scrollkeeper-update when not building package install : install_mkdir -$(INSTALL_PROGRAM) grhino "$(DESTDIR)$(bindir)/grhino" -$(INSTALL_PROGRAM) gtp-rhino "$(DESTDIR)$(bindir)/gtp-rhino" $(INSTALL_DATA) "$(srcdir)/row1.bin" "$(DESTDIR)$(pattern_dir)/row1.bin" $(INSTALL_DATA) "$(srcdir)/row2.bin" "$(DESTDIR)$(pattern_dir)/row2.bin" $(INSTALL_DATA) "$(srcdir)/row3.bin" "$(DESTDIR)$(pattern_dir)/row3.bin" $(INSTALL_DATA) "$(srcdir)/row4.bin" "$(DESTDIR)$(pattern_dir)/row4.bin" $(INSTALL_DATA) "$(srcdir)/diag1.bin" "$(DESTDIR)$(pattern_dir)/diag1.bin" $(INSTALL_DATA) "$(srcdir)/diag2.bin" "$(DESTDIR)$(pattern_dir)/diag2.bin" $(INSTALL_DATA) "$(srcdir)/diag3.bin" "$(DESTDIR)$(pattern_dir)/diag3.bin" $(INSTALL_DATA) "$(srcdir)/diag4.bin" "$(DESTDIR)$(pattern_dir)/diag4.bin" $(INSTALL_DATA) "$(srcdir)/diag5.bin" "$(DESTDIR)$(pattern_dir)/diag5.bin" $(INSTALL_DATA) "$(srcdir)/corner5x2.bin" "$(DESTDIR)$(pattern_dir)/corner5x2.bin" $(INSTALL_DATA) "$(srcdir)/book.bin" "$(DESTDIR)$(book_dir)/book.bin" $(INSTALL_DATA) "$(srcdir)/help/C/legal.xml" "$(DESTDIR)$(helpdir)/C/legal.xml" -scrollkeeper-preinstall "$(helpdir)/C/grhino.xml" \ "$(srcdir)/help/C/grhino-C.omf.in" "$(DESTDIR)$(omfdir)/grhino-C.omf" $(INSTALL_DATA) "$(srcdir)/help/C/grhino.xml" \ "$(DESTDIR)$(helpdir)/C/grhino.xml" $(INSTALL_DATA) "$(srcdir)/help/C/figures/gamelist.png" \ "$(DESTDIR)$(helpdir)/C/figures/gamelist.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/history.png" \ "$(DESTDIR)$(helpdir)/C/figures/history.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/mainwindow.png" \ "$(DESTDIR)$(helpdir)/C/figures/mainwindow.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/pattern.png" \ "$(DESTDIR)$(helpdir)/C/figures/pattern.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/prefs-ai.png" \ "$(DESTDIR)$(helpdir)/C/figures/prefs-ai.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/prefs-board.png" \ "$(DESTDIR)$(helpdir)/C/figures/prefs-board.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/prefs-theme.png" \ "$(DESTDIR)$(helpdir)/C/figures/prefs-theme.png" $(INSTALL_DATA) "$(srcdir)/help/C/figures/toolbar-edit.png" \ "$(DESTDIR)$(helpdir)/C/figures/toolbar-edit.png" $(INSTALL_DATA) "$(srcdir)/grhino.png" "$(DESTDIR)$(icon_dir)/grhino.png" $(INSTALL_DATA) "$(srcdir)/theme/small/black.xpm" "$(DESTDIR)$(theme_dir)/small/black.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/black_last.xpm" "$(DESTDIR)$(theme_dir)/small/black_last.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/bottom.xpm" "$(DESTDIR)$(theme_dir)/small/bottom.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/empty.xpm" "$(DESTDIR)$(theme_dir)/small/empty.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/highlight_black.xpm" "$(DESTDIR)$(theme_dir)/small/highlight_black.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/highlight_empty.xpm" "$(DESTDIR)$(theme_dir)/small/highlight_empty.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/highlight_white.xpm" "$(DESTDIR)$(theme_dir)/small/highlight_white.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/hint_black.xpm" "$(DESTDIR)$(theme_dir)/small/hint_black.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/hint_white.xpm" "$(DESTDIR)$(theme_dir)/small/hint_white.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/left.xpm" "$(DESTDIR)$(theme_dir)/small/left.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/right.xpm" "$(DESTDIR)$(theme_dir)/small/right.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/top.xpm" "$(DESTDIR)$(theme_dir)/small/top.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/white.xpm" "$(DESTDIR)$(theme_dir)/small/white.xpm" $(INSTALL_DATA) "$(srcdir)/theme/small/white_last.xpm" "$(DESTDIR)$(theme_dir)/small/white_last.xpm" if [ ! "@GMSGFMT@" = ":" ]; then \ cd po; \ $(MAKE) prefix="$(prefix)" DESTDIR="$(DESTDIR)" install; \ fi -if [ "x$(DESTDIR)" = "x" ]; then \ scrollkeeper-update -q -o "$(omfdir)"; \ fi # Run scrollkeeper-update. # Intended for installation script in pre-built package post_install: scrollkeeper-update -q -o "$(omfdir)" # # Development rules # $(srcdir)/aclocal.m4: $(srcdir)/acinclude.m4/cxxac.m4 cd "$(srcdir)" && aclocal -I acinclude.m4 $(srcdir)/config.h.in: $(srcdir)/config.h.bot $(srcdir)/acconfig.h \ $(srcdir)/configure.in cd "$(srcdir)" && autoheader && touch $(srcdir)/config.h.in $(srcdir)/configure: $(srcdir)/configure.in $(srcdir)/aclocal.m4 cd "$(srcdir)" && autoconf # Note: we should detect changes in source & header files too $(srcdir)/Makefile.in: $(srcdir)/ad.rule $(srcdir)/ad.append \ $(srcdir)/ad.prepend cd "$(srcdir)" && autodep grhino-0.16.1/ghistwin.h0000644000175000017500000000241411436423224015332 0ustar lerdsuwalerdsuwa/* ghistwin.h GRhino Gnome Frontend History Window Copyright (c) 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /************************************************************************* Configurations - GNOME specific *************************************************************************/ extern int gamehist_width, gamehist_height, gamehist_x, gamehist_y; /************************************************************************* Functions *************************************************************************/ void game_history(); void game_history_update(update_state_type u); grhino-0.16.1/boardio.cc0000644000175000017500000000325311436423224015255 0ustar lerdsuwalerdsuwa/* boardio.h Game Board I/O Copyright (c) 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "boardio.h" #include "iter.h" std::ostream& operator<<(std::ostream &os, const byte_board_info *board) { print_board(os, board); return os; } void print_indent(std::ostream &os, int indent) { for (int i = 0; i < indent; ++i) os << ' '; } void print_board(std::ostream &os, const byte_board_info *board, int indent) { board_iterator iter; iter.init_pos(); print_indent(os, indent); os << " a b c d e f g h\n"; int col = 0, row = 1; do { if (col == 0) { print_indent(os, indent); os << row; } switch (board->board[iter.pos]) { case EMPTY: os << " ."; break; case BLACK: os << " X"; break; case WHITE: os << " O"; break; default: os << " ?"; } col++; if (col == 8) { os << '\n'; col = 0; row++; } } while (iter.next()); } void print_pos(std::ostream &os, int pos) { os << char(pos_to_x(pos)+'a') << char(pos_to_y(pos)+'1'); } grhino-0.16.1/book.bin0000644000175000017500000124054611436423224014764 0ustar lerdsuwalerdsuwa"-% +* - ,) % , ,""42%', ". *"* "+#0- " " %"+&-+)(! $%35*7!12.-68%+, * " =,%dSF!%8* * 2!%^+*-9->+s),r*\- % C. +)-&*!a,J&X;   #  -+ %*$,, MG@o [*/!!%+, Z 'Av(w! * NI%U-1,.% - "0+<k,"3 -,c4!_ 3E*7%,!-3b,]*B%?!D"H ,%+K,~(V)P-}+*Q)y* R ,+,-T)e(!W Y i%u,*i-m,`,-f*"q*g2 l ,* h !n ,z %t"p, *|2{*!-%  ,*, 5 *+, ,% (*+-* ,+*.)%-,*++)+"%,"!, o* 3-%<54+!g,\*-!% +D,A)% ,& 243+ %$-, %, +%"+!3)21 I ",N +"*YF!   S H  x*!  * "+ "%O!",W#,82 "%&!"&,+*"' +*"f,B!+(-^*._*+~"*4"++*R, &".&c/ 0"; 3*z1+M!:*2, % 5 %p} 67% -"94>"+%?"!+@%-"C"E4*+G,-,J)."L,*4 w2y !P ,h-Q&|,Um)",V)s!X%[,&",] `&,"a,.d k"e&i&,j*+-"l- !)q"+r4t 5v43}",  !*"&  %-5432,+6 "*,*+3,*! 2,%,"*(*",!2+,-%*,&+*,(+%  2 -&,-34&*-%"3-+!)"&"%-%" ,&*-*-)%"+" -%+"4+"-% "-2%%2+-"+,*,.)" -,3%-2 ,"%""*,"+"*"-"&"!",!2 3%"+*,3( +""+,"- "+-% ""* 3*++%",+""+ *0+%+%+-,"+"+- +"4",*"",, -&,D)"-,*3-",++2 !& " *)!++& 53!+ ""*F"-*%+% +,"+4,+"+"""* ' " "*3" -"-+"-+*"""""+"+Q,*"+%%f,  42M ,a+*  )m  ,  42 * , * !)* B2\  5 4 * )+,  5 ! *- 4%!  <+-  * !, ) %- ,% 1  *+,!% i4,+*K!)%! !!"*,%+D# 3 %$!!%8, % &,- *,' 2*( **!: h+Iw%! ,+-.*p +/* 43! 0!  3  %- "5,+j*6 5 49*;J=%*+.?,+> @+* , ! ,*A+)C!%EO +],R%F G*H*L+ ) !  t N+*+P-!) R! (S,!nT%+i*U*V ! W"X-  *Y! 2+Z5[-,^_  ` - ,b4 g2 c d !e - % ,s%g4 *P)X+  *k,l+o,q+ - !r%+ %2+u% 3 )vy"x3 z + -%5! ){  *|%5 +! % }~& 7 o! -,%   +*,)+*  ! +,(  +*32!53,*!+ ))  ! ' %+! %4      * ,%%-  + *   %* !4 3     %- *%! +!* -% ,*  ! %+ , * + % +)*( + z+% , ,*+  *! * !%, , 2 *- , %,%! 3+**-  ,*)),+ * ,)- &%+*),,"!  %+** 3<2** .% *"  ,!]> !   * ! +  , +*  45 , *-  & , *+   * +  %  -%!, )   * , "  !*)-+  )  !  )  , %)    %,=*!3< 5,*!2  *%, ,%  *, ) % + -*,   ! - !-L) , *,+) !*- 4   " ,, +*)!!+, -,(- %&),*! ,%*+!,)* ! +-,   * %  !)  , * )  *+,),     % ;!% *-),45+-,  ,+!* ! )**!+, ) -  %  ,+ -",  * &, * +(% "+,4<* ! : ,,( , 5 3 ,  -3 3   ,  +! )+*,% !3!+!7  *  -   ,  "+ %- - ),4 ,-% 4, 2, -, % ",+  +"+* ) % ,*- . % -   ! %  +   &2  !2 &  *  ' + *%-*3   %  , & *&  +,* "+,, !+*  . % +  5!%+*2:, "+,("*235  + %  " * 2,+ * % +2,%:-  * 43", *%!%l" ,*   +, * ) ! %  +-   * +- ,&  -5. !, "* !(++% * +  ) +% -,+- *2 3**  !"  *!)   -*(!*  +& .-2" !     %  +/ ,*    % -,**  ! ! 0)  )+    - -+!"(**% 35(.,+ "3* - +!4% ,,, * !+%  * !  !    ,4*4-  3 )   %  , * *,),2 *&,  !   ) * !  * !)  +     , - 3, : 4 2! 3!)*), * ! ", +  + ! , *"   ,  +, *  ! -  4 ' * + , """ ,+% +   ,) + 3 *+*)*  &%   * !  -  +  ( * * ; % 3!*!   *  ),+-  %%+ 5 %,   !   ),2,. ' + G   4+ ) 2 ,-  ,* ( , ,   % , + )  ,   +* - " % +% 4 % , 3 :! ,    %  * 4 * +  "-  +  (+ *  )!  !   +  +  +  ! % !* +*-  &   , , *       +2 )   " * , , % +   *!) 3*  , ,  3 +  "%  "  *, -    + *)!e+)       *   + -   + ,  ,% "-4 ) * +  ,   *,)  + ,2,  " +) 3 ,, +  , + ) * % W " -  ,   % %  ! 3-  *% +   %  45 + , - * , + ,    *   % !  + * + !  )+  * * - *+ ),  % + -  "        +5% "* ,"  % ", +,   + +%,-4+-*!5 !32!4,-**"332!, , %"*,3%23*% .,+".&!*+* 543-))t.* o452* 3"3 j) ".* % 2-3,  4&4 " % *+& )2-3 4%.&! 3) 4 2  *,  -%>  +!L*( ,%2  ! ,*( %- <;* +"23 ), *"!   %# ,3<- ,  $ "&&* "+' ( & 24)"/! %+- "*%O) )--4 . *%, -1*0&++3 ! )*V!)45N4*6-  7 % 8  %9" : * ",;! *3="+?"@"B   +C%4*D+(,F+G+Hw ,%,I4m+J K  +M,%P  "Q  R,* +S,- T, "^U*!W-X +  , Y*+ ,+\,Z[+2 % 3," _   )4` 2 *ab %c  d -e f"g +&y"h !% i !W3 4+"  %k3% l 4 ,n%*    * " *45p3 -q3! r s ,u-),v-"w *, 4x223z+{ |%}"   ~,4. +  ". ! ) !"+ ,-+* & " *!.)-/&""&"%*4+*+% + +*  %, 4+%+%%!!", ;-%5 4 * !3*,-& +&+ *534&+* "!.  +" + , ! +! 2. ,3  +"  %" + *+2%!"!,*0" ,+ " 3% 4,+ ) %*,  3 42 <54*4  2  -,%4&%3 +",3- ,+24+ +%,3 , " &!  .  . !  "+ %!% -5 3 -, 3!+,*" *+ , 4.-%;5  2 *% -3"&++,%+++*5-% %"-43"! +    ", +,% *  , -+, *32 54 " !3"*, %+, +2, %.&" " +% ,2%  ,%,! -%54"*3  %-4%"% "*+ ,!% , +" )+%*-3   "*" +*  !&3 ,  -  !2 )   "  !   2" %    +%*( *-%5 -%  35423-4 2 +*  " !+* 8 +-    +    .&  ",   +*%,2*.4536"  !)- 4,%    ,, -,+   (*%-   !.& " *+, -& +*%"+P*, ," %- 4 ,2     *" +,, * 45 &     "+*%-!*%! 32.!*, ,+% ++,2"""*"+*. " *,*"2*+%-%&4 % !2)1.   (  +- !& 3!2)   & 35%  ! +%% , -4 &    342   +*,"%+,% 2 3 , -  , & +*" ! "*"* 4 "+". +%++"-& ,4!& ) +! , - +   "-  +4* !"  0(,4 &,, 3% -(*"3) "3, *% ,!*-%, +   ."* %!-&, ,+%" *+"  ",  +,)+" %" 4  % " -".-, "!24 "! ""***(*  * "2 4 , +,)   * "+, %3" "* ,  4+, ! " + ,+*, &."+*+ !* "+ & "! "" 2!4 %5-      ;! )  ""++% " ,3 -"  4%-" &     & ".&!*24& , 4,-  ,,! +,. , %  % %%  & *+.54"4",*  ++" !+*"%* , + -%**-4*%+*! 3, !   " ,+  +"!  "  * *, % 3-"%*."! ," &**, ,2  +*"   ! -, "& * +%2,"   +*,!3    &3 2!,+.&; )! 2 +  (&+  ,  "   "!+      +!2++,).  4+!%"*,&". "-%+ *   ,  *& 4 " +  &* .&+%,,*). * 0%5 * *! " +" &",%   (   % *   * ' ,)      % +  ,-*" ,   3 %+ ,  . %+   4"! 4+    4 2, ! 251)%  +,, 2 3 0%   &! %*  & %" &! 3 %+ "*-  * +  ) ! 4! " % *- , * 5 , + %%; 5   ,  ) +  % +     %    * !(* ,; ) ! 4+ 3 4+ !  *  + % * ( ,   + * (  + "! " "  !  *      +"4 ,  +  " !   +   "   %      )  ! , ,+ + 2--  * , +   ,  %  "   ,"-4 + , % %   4&*   , + +* + + !*  !    &   "+  3% "  4 %, *%2 3, ) 4  * "5 *   " ( -*.4 &  + * !    )+ + %   *" 4*!-*3 , %   3 %  * + %32,  & %  %  &   " " %,  %     "  % 2,    %     * ! " ) !  + +   3 !  + !% +! -  + " ,3 2   " 5 " &  &" (       %   ))  "  ! , 4 % * & 3%-2 4"4 +  3 5% &  !  !4+.++  % " +%%+4  !33!"+&-" %,,%--2 *4 % +%+,%,% "*+ ++*5 -   "*/  +"*+*  *% &-, %*((*+%!  /,"",-+* ,-4 - 4  ,%  " +,/*.,"% +"&%%"*,  ",, "3 2 4-  ,43*+4,-,**4, %-+!4  *-.3!-+*! - +,.& .5 * "%".,/-+3,;-  ,,  )!%,++."    * %- ""  3! ++3%,+,  "!+ -" ",2*, &",)"+4)*,+",  %)- 0+2"  "+ * -"4*%""42(* ,-%",*+(3** """"  *+%* +"+++,* "&2) -+*(%"3%"),+ ,<-+*+**" "./"%2+"*&%"!%+)-"+3!4, !++!5*-, , " +-4%",+ %4",""  + +  *,,,*3*(+,)+!+*" +%%4&,"Y" "" +*+,&. ,-*%!)*- **3"+!,24,*","-*!4**,%;%4,++!+ " "- 3   *4;3  ) +,"+,!!& "  +-"2!+"*! "3&++++*++"++-,""*+"%"* &,%%+,)*!,%-!"" "%4% *+**,*--%&"&*!*""*,,;,+4 3%+"***,",,"34"""+&5!4;"%%"-*!,*3* 4"%,"5*3*",,,+-"-53n! )3*%'24 &-!),$+F R "24 :!+ , 0-a 4&* ! 3% )2)! )24!354*!),4  *!% #)&  w !)+!7, s! +!4[" *3%%/*< )+ -# - %+"*.!) +$".$g+5 (!%%! +&! *'+@(  )!v-'*3-,+!#-*,3  -, 2$ * (+3. */+,*13*22 !*)3 *H23  %"( 56 '&*/8,%/3*9,&  +:5;!U3 4 =!/ )"*> "?  A ,,%- B C*'&*D % E4*G+,I%!+!!/J,//%KL ,-M*N O*2%P3!  ,S+&*(T)V,W)X,-&3 -2*Y%Z%\*!", ]+!,&^_ !,` " ( c&/&!/./d!  %+e !  f! i!h,) j23 54& .k --%,  l&-%m!5!)o 2q% +.+ ,-+"* (*t"!"*x !-  3 ! yz.{5|.*~  + -4  25- 54.*'  , ' -).   *"+& )!&-2+%%,&3 4! '%, !3 ! * 2 4*"&"+)+++3!* *&4 '5/% &.Q,% #/ ,+ ! .-! 42 $  /   +$%! )%+  -,*X .% !!0 %"+ &%! ) *m%-$'*.%+ !%- - 5,* -(!+   .4*5/  !"*!(*,,*   %""  "4/*&&+  !.+&.3*,$*"+ )/ % !! -&  +% #%%-'+ 54!%")4+5!"+%$)/! /!,  ) !  *%#/ &%+*,%!) 3 * 24+5*0,%-25(4 3)  ! /% %%+) * ! '%,34&%"2  +  %,*- #) 5 +4-+&   +! -4%  %*<&  - & *",,% +% =+<)43! &)+" ,%. > +%'.* -* * +3)%!-<, ,*#  !%%<&   * !% ,&,%)'!* , +- )   * /23,!', #3#52#!!(!)) .%,,%* 57* 34 & *,. *!  !)  (+*),+%+,%*+..(! *+   , !2( +*4*:< 42    )* -,(-4 !-$,!&%)" 35+ &. 5+- %  0 %$,) &+4* *- % .! 3 , +*)*+ * ,!+ #-  ')%+ * +*-  )"! (<   %/, + )* +[+(!,%)&/),%  3  , !3$ ))') 1.% "'-!.*2# 3*2 + !*+. * - * *,%! %."+#-%.! !*+ ) ! %%** + % .+,% , )-+  +!*#)',% ")",%  '% +&+ ,,%! +&)-.* !*    )!    %%3-' ()! *-*#%%+ %&  '*! )'*$ ! %'+'$,+*%*#., +* ),$) (%2)-+*% 5/ 2* ( ,!!  ,"&%)%+**%#  )*.-"! ( "*  %! * -%-+ *  ++,!  ++*,! 3/ 4 %*!)*  "5%!& 42 / / +&$# $   2%& +-  ") ! *+ $+ %-,+(4 * ,%  * ,0 2, *2,'    "-%" 5  !* " $& !* .-*, *, - %)&  %!( *.  + )!** *,+# #-) " ))'!* *+%!%-)!"*%,3%,*++ 4 '5+*4# * *  ,- &+) "*+".&+*(& %!"52) "!%  2! !%-$$) $)!   + !*    !!%,*   ,(,* ! -*-3 44+3#  3(   ,+  *& +",%- % !!#,%   *'%3"#+%(  -)-4)*%         ! %&,%!$4 *!3 "5&*+ 4% 5**$!# *%+$* %-#( -3,,*!  # ,* 5"4  *  *     /*%-( !,**e-(! -  + ! ,-*2+"&+$2!! "+**%5*-+! r+ -*-)+:  < 24 +,**<*+",*+ )* ++-P , '*! +  !%++ + %4#!  *  '!  ! + %  -*+%-%  % +  %+%,* % ,  !*!!%)%% * !+ * ' ,"+,*- )+,/*/"+u2+%%/."!,  "  %+%-,  3'!-*  !, /%)+ , +*%-4<$ !*+- +% )+*+-:;!)-  +% ,"#3#  % ",! %  2 -$ &% %,!) *,%+"! %**+&*4"3%5&- .# "+,) *+ ,$!% *"! % .!%$,)%,*.+,#% - !!* +&' ,(, " .+*- %  $ !2  '+! ,)+++* )!, +!*+- --,-/+&$!) ! 2$ %*5-  + +- +)*-+ -,''"2%+5,4'! ! *'4)#2(!:&  !  / !!"2*,%  %* % # % -.!+%1&+,+  -" +  ,*)+,% !++ +-3#% !) "& () +*&,)  !  ! !2 + *&-,$  #  )!   . ( *.+"""  "- 2<  + &  ", , " ! ) *& -   " ) 3#+   3 - . *  )   +  +/( (, % +  )$ % %  !  + "! , + + '!'* ,,  .4,.- +   +*    '+     +,! +  - +  - * *   -'35  !&%  -'.-+#  ,   +  ;):  +! )     -, + -!",%  + % ! & % , )  # "  %+,2&!  !&&-% *$- *% + . & 3 * :  !%+  #%   -,+ *)    +*$ . /4+ "   3+ $+ %   + ** + *  : + &+  *- 0+ >  %   ,)2$+ ! % ! -$30'- +  *   %  +-+, (/)%    4 )   -  * -  %% ,#- )+* +#&,-  )& .//% *# !  - +!,"&   ,*.%  %,  &  +*  *,(),'%$< ,  !! *   (+4 * . "+' *!,    )$) '   (0 ,+*/ %% 3 5 )!*(,  .+ ,  "+ #&&-0   " ! !,  4,+ "& , = !  +%+(  " +%     !" * , (   -*)$(+ -( <  - ,4 +  , )< 5   ((   %* + + *  2 .&( *  )3 +   % + ) +(, ,#,:!4 * 2,!/)  *, * * % )   )(  ,*#+*%%"& +%   ! %" (3 !* * +( , )  * ' %,$&&* +*,#%%+/, "**+)& !  (4  !  ) -! -)"/  $+ ,#   ," " $4 +'" +   ,-- ! % -! ,  + !* " +(,+ %& //   !- *  %)  3, ,3)2$, 5,2  ',. *   )!$+ +-+ -#, +$ /%!!%'  $+   -! } #+ #  +"( &% -$ ! + ! + ! !2"!- -  /2 2: ) ! 3 %  #* 2 *, 4% *  *. 4 3  ),+, (+ *, - /,# 3   +( 5% *, "  ! 2' + -&+  ),++  $ ,    &* 2// 0 *  % ,/+/2 ++-*.  % " * . %  ,*% ! ( * :%,%3)!!()*"+&%%% !-" ",!-/%&," %,,% ,$ %-!#,+("  * !+ #  " +!/,!#*-".+,+,))-,-%&'2,* ! +* )3%-',"!3,*% ,!* "!)$,2!+%,,+2.  $+ )%3+"", *!+%--%"5*    (%,    )*%%%, 22!%&"!%-'- *-:%5,,%,* ! - % )+ .+ &-% ,% (& !! *, 5.- &+, % % *-",-* !3$!&,"#!!* !/%,"!* , ,*+- +*3' ' + -&)+,)(,%%*-+*%% ),   4*+#,& ,* 0+ "$"'%%/&*%&*,&(3%,%)!'&*+!.*,+ )+%,33%--,' ' ,- "*;=-<-(< ,-%  (+%'%2-+" ,- -% )(2-!)-+!%5*%+ "&#*+),"')  ,  *!,,'*(* ) +%*,%, . * ,".*--)#!*., % +& " " ,.--(**")%,")4.3%"),* * * + ,%" *" &+ &*+  ' + ,$+*!)!" ' + *+,, +!  *+!- !%!:2< !4 -,#++!*!* !: "+-(-, , ,,+"! ,-*&: ; ,+3)-4!3,2+)*)+ )*( ,!%*&)(%*.54.!./,-+4:!;+- *), +-)! (':  2),  ,-%! .+2(&*&-3*)% .&"-(!""  +,+* % ,+"#+ !+ *++ +!#!  ** %-!++%/+&   *) *! , ,%! *+ ""(,$"+ !,  ,-(% * /%( ! *)+*+  "!'% .)*,!  *& ,+%*# ,,#+,+  " 3.,+!3<2*   !*+)+ ,!~+(K-%% !+**$ &-&,- & !+&!!%- ,%(* %+*+43&-*%-&& )+'(2'"+,),*+!#%&+!"$#.%!3& .$"4*. ! "!+,3,!!-"+!!0- '//+ *'+ ,*!*#%'!- ++(%+* +23,,!),""  !3 .,% ,!.3,+ %32,%*!%<&'5 '%- *++%  3, $%  #,+%!$,)'%*$  )%,)+)-).+* + !#%*$+%%4$*,*- /+ % +*((  %,%4(!+*)+. &#.& ($ $ ',!/*+&  !$ ) %')%) , -,#**!+!%( & + ,,',!*+% +  - (+"-!+-% **+%!,-.*,*": -'"+ ),  %,) ,, **.!/!,'+!*-'%"+ !!%+"% ! +%3-,(,#"+%4%:&-,(%- %  ".!-%"  #-#,,3!(*% )$!) / /),* , +,- !!#  +*,,+%%! 2* !%* % *43 &*!+4* ,!!,+0*- ,,% * + * +*,$5#*)+*&! $!,!!) %(( '(*,) $  !!* !+,.!('!%!&%%$* %2( /%!(/"),% "+,+,* ++-,!*,5!/-  !.%+-,. ) !( 4 %+%* /*&3)* *  ,#3#2!+**2+" /1!!)%+-+*" 2$3(!,*-*+-*+  (*!+%  *., &*$**3+'*4$"*),,%%,' -*,!*'"&+ ** +  !"/(,3 &*%-,("+!*-,- +,',/3-*#++, $% '**"-)# $+!-+,*/% 0 $+%--+,& -+*# ''+' * )+*  ,).' +(+" +* #%,!"* 24).*  )*% ,!-,'*-( ,3+4+3#)(&),-,*!&--" )/**+"'!+" %.* *-** )) *.+,*,"#  *"  !!2&*,+-* %+*+,"/ &+"++!%!# ,--30"2*%':  ,+%-*' +(  # %, )4/!((-"+,++,! .). /4)-)-+),++% &" %-. % 3/+-!%+-*+'++  ,%*3  - "  !+' ! )"    ,!* , * % % + -)*)*  + ! < 7    !(- .+ +,% " %#(,"! " #* . % - %% +#!! #"!*!,,!!$ '+!!*+!!!%"!%%"+! '!"!! *!!$ )!&*-$%,!*!"&%!,!2+!!+.!)# ! ,!+&+!!./)$4.+!*!!( ",!+! !%!!1/."+/ '(-.*!!*+!!*! * !!3!!+*""""-"  (*-""$*"-:""""++$!"+",",+","&""5/!"(*","$"%*""2#<""-'*.,'*'" &/"# *###* 2* '#!#'*)/-#* ' ,*#),"#,,/,-%. #+'%&+#+.%.%#,#!+#-##<*4)#+-+,%;+%-*$%2##*'%/#,##*##+ %(*#'+##+#.$&"$ &$,$$+$$/$,$$,$,$$$/$ -"$-,$&%,'-&+ ($$%$$$$*$%$ !$+!,,/$$$%,$+*+$',$!*+%%**.$"&%%<%%,*%%"%-3%,%&%)'*"%*+%%&&%3(+%*!),,,% (,%%%%&!%%) +"%*(+4&%,+%%. ( %%*)0,,%+& &&*&(-&5&&&,.+&*-0"/:(;&+!&"&&&--+(&+& &+*&)  && "/&)&&*&& -)++&,--!&&-!,!.! ',,'-- '+'(''.*%// ','*)'-' /+' !'('(,''%( '';'+( '(+(;(3(,*(,( (* -&(+(,'((,* (4(",( , .(2(%((+&(.((( +( - (*(3((%*.()+(*("(- * )%(,(*(*.())!)./5/ ))),) ))+-)-%#+**-*)()*))%)),)+,)) *))'++)+)!*.+ )*)+!)*),)%!!)) +)'*+)-,&))***!/%*%*+*)-!* * - **2* *****%*!*!** **:*,**2.%**,**)+***,***. (!)*'+ ++-,+!+,++, +,+,+++!,2,+*+-!&++&+!+++' ,+!-*,&-,+..*.."++.-;-:+.!+,,2,,5.,,,,-,!,3,%,,*,,.,- , ,,,* , ,,%,.!,3-,-,,,,+,+,,,#%,,3,,,%,,2-+, ,,"--%-----$*!--+!-+-+%--!--!- -)*--+-..4.5..+(..!/...,. 0. . .<.",..*.,....-. . ..*..,+,.+.*../ /+//"/ /,//%///"///)/+0 0/"-*//5/5// 0 0&000 0&0&00&+4 <  '+;)3p)r%$3245 .#  f 3%$% *3 -' & 4 5 "*)+ %&X3&( +<&%,3%9* % ->& 3# ,05( ,( *4 ) %!)!*$5B%"#-%&>5&[(,,,))*# +, ,!)3,,4"-- /430&%%) 1),2.+3 ,4.%5  ; 6+ *37%)N8 9,6 :-.*,+6 ;<,!< 3=3&>-4,$?)3@%A!C' B+* D/%E  *x435)y*z) 3@,,{: |}42!~ $ 2)3   !  (  ,!& 24    @ ?- 3 ,4-! 1,''- +)752!"+*0  )3-+3)4*2 %/  ) ? , 4" 23 3) 54$.))/(!% , +3 4&"-0!+4>3>(&03)%++, , %-%+2  4(,  %&*,43-'4-2#3""1%"@? @  *, 2-&*3 @* 3 4, &  -3%+)3 **,+ ,*0,+*-7,/ 136.)2; +!??.? %! %. B%+*"3) %)*3 C543!)/% , 44& .&&  , ) 3+,+%-633 3 %;.3!*) 3>+ &)+ /=,+2&!)3*)! +$ .?9&'"4 %,&  %A3++;)3*+4= ) ,%(+ 35B*29+ *5"33A*$&,&++! !)+/3-7C, 5%&  %  4 ,%*!% %4+-% 3 %3- 4 &' !"  &B %8+,%,2! 57 3- ",B*,% @+"*73 * 4!&-3)4$  23- >1)%  %  3!L+%,-0%3*+  ,!  ; & ." %% * ,  (,2.%%+84 5).@3#2%))!%4&.,-%52&@42 & .35%)*-63(%--*(,@*)0 4/*&%!;55@+! ; + *-)$ 1 *&,. '/3  +!() )(,"+6 ,5- +!"'34 +>! +,*+)-!1*+"!*??%-;3 +%(   )*-*4C()*."  ,-"'3! 47 (--3 &!3?( ,2& .7 % ()-%*'), 3* %%3<( 7,*  ,,+-33& %)? .4,-/(3$%&3" 1!.  -9(+ ;,!+  (+ ( /* 8+)!  %!+4 =,&% 3 + 2@ // ;"32.,< !$  3 -4+! )" :-:3"- *.+"%$-,> 2+% - 6  ! -:"*  --, 68)!, /$"+  88+34%/2@>.=&4.5  &' !,%/*3* 8++?!)4 -2 )$5'=%*$,$*! 2 9  ;%. ,):% 2"*0% )2',-32*# +9 2*+!3%>54/*". &-%:)+" %,;!9+/"44+" +!-#"  2&"+))3& %)%3%/=*-,(,!+ , 0"  "+-%"-+%/ %! ,", *,3* 4)0  ((:.%) +&: 2.2%+ !4 295>)2 3(95<*7? "3,2.)&A+!'-.=&00)7!2235'!;) )3@) +34 ,+* ",)*( , 1.5!<-*&4--'.*3&   ',4,33,AAA56*-,2.+*%/@ * ;,3 * /  +%-/-;,4( )52C3@*53/4/514 7 7+ A,B)#   % " =, !A%%*-!-4%/&"/ C-- 4- +,+6%33)  )&3- 2, >&%3)&0 92"  6+@ @%#( *%)5,*4 2%!-% - 1-,%7!59-%-" =,,% !*( +4-% +3& 64225%(+" "##%4"%"1=! / -* #!-3";&.-+1!1 ,4!7  -++%,%,-$.%"%$ ) ,+) + 2!@%4&1..457*<3;, * &+C  :):  3  2544 04)BC&6++30 (+)#-#++  + 1*8 ( ,   !  <+ =5-%+ 5 -)! &+3!4& +?%+-,9 & :,4 7 42.3 13*@!& ) 2,3482+& !& (  *%  5>%,-0 ","* "*51* +,!, 9 ) +* , 1/A-3-* *  &6"! ) % -%C 7!3@*-3".<%%( &:.#4%=%(*) & -. ! )  9%4 &.%!*%9235 +&(,  5- "  )-&!3(314,&"*$4$03*((  ,,,23 &  #!3( 4 ),-%, 4;3+! (,A42 2-!'45( +) %&34,)3!>** % &!%4 -A",&) =!"+- &,*$-% %, %- &%" 4) )$%"@248 !@% !!7.;&5&*-( : ,6%8 => *>3,)+!*3,"5>%*  @@!?%*0* ,) !)' ),!742+, *="@3?23%3+".%! -5 +&( !! B:+34"' #3!+4* +"?&"-&04!*4-!/)).2% *!4& > 4 = ?>  *# &$ :, +!*2*)#36)?4.32?3) 3-@ ' 2B*," 4,)6 %.*"  1*.*97 %* " !"2 !+.&8 =  383+- &    "$+@%, ,<& 5,..  -7,!3% 4%* !<  %30+3       29% )4 3)- ,/  % * @    4!  2, - ("   &4 3C+  4 &  ) & 4 % ( 2@ -50%0   " % -% 5- - % 524 2"  " + ,6)2 * )/#%9(. " +  / #/ &)&<*  )--,< % ) %&( - > %>*  ) ,- @+* "!!C B, ) )    ,& % 51 &7 -0  B3 !   -1.! 62&!#+   % ,   B, +%! * * >);% 33&%- -+, :!A-A* % + ) %$"- 4$%!582 !. * = ?  ( ! ( 2 4)  ! & % -# 0$.#(% +,  : +/ )# " & '  9  " !2  ,  48 )   *      "&3< - 233 , -(   +    *  5 475?20* 4!/#-94  *!,   " .2/ ; 4 !%7.   %)&&  *' ,,5/ 3 % 4  +   !3"4)%#* ,'& & &+ *9  , , "+&-2- ,1>. &0->" +/-&   %3!% + )  3) !/, *   3 !- . )9%  &B+    %   -   &8 %+%     7 0 %$"  " %    +   " + %**:5 2= + , & ";+ *4  ,  , *9:&  "- 1@4!>  3  +'; 3 <B ! C%+'"  & * =- + , 9)2+  .   &9, +  4" 5 ;92 ,  ?    9! )< * (    "  +3-2, * ( "$+ "2    4* 4+  % 5?&: 3?= -  '( ,- * ! %   .%     '-(-  "*  62 % !"% "- %   ; 3 %4,"-2 4 6  , - *+*  ))5 - <)4#;- + A5! ; " 7   9 4* &   % 36!   * %C5 + %) "/ !+'"4*9&+ !  ",19*2  +  * -6, + (+@%  $3 -),(&  4&, 2) "B- -  * 3)%20 ! ") * -9% 35$ 2 " $3*5 & B/B3 & "! "  % 2$+  ( ,)+  ! )( ;+    , 5%-4   ( "   ! <)" $ 2  8<%  2** < 7% &=% ! 3,*   8   + + 3 &0 1(  2&(% + ) &- 3 16-3 & 2! )'3 (2-% !;, ,   3- !8  2% !   +  )! %  ) & * ! 3,  020+  ' 7  4 5%   ,73 ) &55)! -5#:%:9) :  ! "  ,??$! &!%%"+-3&2.+&,2'"%"+%63&+1!=) 5 6.!0+&!B 4!&(*)30 3(*!33!% %-323**(.%;3=2?4=,%-*9 7-+(2**. ("-( 2%:A2"+1 =1!;&*72 A0+%>!.!*%2,)%3+ 4 43*2+ "*!"23 03,.34 &+#,*/ ;4*0/&-0  " % 4- C 9** + A""+3.,756(07" - -",%5-"!7%':*7%.,$+)&8-*34'7&4"'* )* *,, <,&* &% +=,23: 21*+  ! 2 $0;!!, 1*+ 13 838*-.$) 2( B*%5 +"*C4! (,#)7 <2==, %;+3*  !/-2;=!!32"23 1 !.   2/ 5),2)3*-)4* )!0/32&.-38%+* 3+B-%!=%; !)5 ,&#,+)>"+>*>!=%: $*-"#">%2,<*,$%+,*!-22-)&0+-*"#-%3-   ! (- 4 * :- ,-!;  ! ,!!3 ),A)%3&*%)3  4 2:, ,4" .)2/*7- ;+3 ()3 3,4" %B% )!-;."%.   " 4<5A3A2*-=&%&- =*"=" & $" "45<@,% h*1*+4242 :*+=-0 2 1%51&4" %2*8- A+*=-*,=%&=28*9!%-! ;2/.5-&%=   &,;+;*  #+*  -%+   .-)%*=-+! " - 6)+ A,) <3-*%,7-*%%+23#)-   + =>*$-&,%!&;3%442, +%35!4(!&*-*-2 !3+,6 !.++ * !  %? ? ?2%  5*)0 8 7 =- &)))&/!!; A#**5 :,)4+ 7!3 03543$,/,-,2;(?!4"+4+.C3#",.+6 ,*& =%45 7  8,"5 , + "%!// 9" ("),3(**-!.,%*) )-;,<&#")+ &"+5).4#-!'2'   -!'% %%;0 -&7%*-)&,-C4!!2)(%2 )!3#(7!(**3%-?,*)-'4-!@,.%32-%5!==,(%!**,-7&3* &%4!B-/-03#42%)"&+*%9 -9 5!)02  <& .-5 -,%( *&-**B(  ",1 2-!.5-%11%)+ %!!24, #4 -@"  (/,*&-3&1+' /  4  %),&(0* '$%!,# 2("-*-+2&7.%<%":-32! ))2+44%"  *&6 &504-44-% 7.7+7%*;5?+%!%)+;:2+ >!?3 >'&#4#*!,6 -!+5"7*5 !) 9*,!!**! $ + "*-%)5:+4&-0;7!*% -: 02 +%!%:? ! %,%<(4%*+  '(. 6( 1;(+0%04%-)4!-)*;+<#+"3-43(* A4( ".%%!!1)'<9%+!*  -423) % 3  &" <5+%$ #& +1" (+' 6   !=@*! +B'&. 3/. ,B1>>"+!'4,* ")@2)!-4".#:)4");!*2B+**!:&%-4 4 2$4@  <% ,3&!",4-3*'!9*$! 1%A,& ! +, ++3-1.!-*!(""&* -"$*%  0  !$34,!4B  $," .3  ' -!- +C%,"#2(! * 2# 5 &+2&,-/ -+7 !#+& * @ =&%-3563C% A)$%# 36"*B@2.';#%%#*529 0 @4# ++"* 3>$--%"A .-2/ "!<(3")- )4,.!1! ."2 : 5 (+*;30:" & 5++'!<,,*:&?,(-+% " "+$,?""4?+ 4$+;*!,&3-%&>" -%+ +!" +- #*  3 ' !0* @2-%9  4".97*6-- ,B , !)*3B*;*,)%  +/4 ,3!*"9,*%  A +*). %*"!2 .-&%,-*%  *$>)> ?'8-# 54((*q%1% *++ ") 7&$+ *2?% %$!5*3+,*03$""3 39=!@) 4&<++#*1%13?  $+%2(*)* / *"2C,.!> 8:4*-  5-+40 0")+(4--&2/32"147-72"45&.:;, -     0*2@5! ,+' 2!"32' !  !.$+ ! 5"2"435;%,5 *- +(-*249%""2*3$;6,- =)A< +,3A !%3-= ,!9(+! ,=34>3= &* 4C4-+ ./&  +,4B%+32-* <"6+ +4*$"" %:/*!5",3$3,-  4%%24(+# $(% -)6- < ,!6!3, .7B%2$%-  %)(-**-26(6#8/?;*-=&%%-.*).94%*  &$4.)52,, **%:" #>()?!'*-<-A!3" 6  3'-$ /", +*;*:"<,*4&+,9"9 *!8  #=B+ '4A )*@2/B%C"%*1%+(!<3& %-$+2 1*00,* 64 )-   )(2:+1*),!&+%-1+ %4(36 8 2B*,F + & =+<4 :"-3!%"! !3+(029 *0+&@ C,4 8* 4@*=%!@ " "!3=-  ) '0 3 C-%36+405>+&, --=:# 4+0"/&/+ ) 2& 4+'( ' ) .+C (" A* +-"3*+=7!(  A,80 "'+= %%+!323-5)3 =  /) 2"4  C0 !2(' .00> + "7*   %0 7& #3 +-+ % (')@    - < & *   !   * (  $ - ) /  %-!*31+  !  :: B4  , 2<<< -6 +  " &*0*, 3 - B,0 % % & "2 0 !(B B!!!!(0%3!" !!! +)%,7+! !5**!!! ""!!$!!*! #"5-!<! @!2!%53!41!#%96 &)!!!*!,!/4,-#*!.=,5 !*!9*' !,9+! ,+#-!-!+! !* 0&!453@&-!)#,# '! !"!@#-5&5"3*5%!!7-!!*+ -=2/! "3!-5!4@0!%!!"*!2# !228&! 4!3#)!2!+!3"*" " "". #"4*,53"5:"4#5"+""%"+"3-%" A"""""+""*2+*"5""B 7),";""+"5,53"""3+ " *(>%" 4*"+"%""%""""- "","%#3""""*;0+"-*B+"%#63",""4"+*&0+""": (+"*","2",( &44 75".;" $+###1# #,#*###,#%##+#)-#(4 ?*:4&#*2#$">/3+*# #+#)C,#*$5<!3 #,#3+*#2A#*'#*#*01# $(0,##&&4&>..#%#-0( # +###+**-( ?4&6!##!5'####+'#,#' !$+#( ,*"*+.%$'$$.-"$54,$ $"$%$, $$+$?'$3$2+&B ,' $-&- 1$& ($8$*B,2 %+$$&$2$"$"(=+$8$$$ $B?-)/$$ 1 $,C'<$.2$,(%( $,$$ A )3 /? $%$35% 1$$3 1$$3!$B!B394$,-6$ %$& '$$3 C4 ','*0 B&%"&*' &&%% % &>%%&%.'"7 *,%*% %%.*%%:,%:%<%,) :% % %?-*7(+%% )%,%% '%="1,,4%0!% % B %4%!3,,!%? /)A6 @%!* %,%"%%>*'-%*%%%%2<4(.%+%%>% %%%%%&%-%%!A3A-%%,0%=>%%"+&&('-&%&+&!&%&-&&&*&!(&.)&&&&&&&&*&+0 &&&&&&&3&"@!&"&&>* +&&1*3& & ( &.B4 6"&:'!5+&.&6&: 1&+&=&"&-& 65+&&&-&*&)7!/)&-.*0%&))&&+&!?*&+*&,' '*'63' 0''2'''')'%'*'+2''''5*p,''+''/!''%' @,',;+''*:*'' *5)5'4'"  ''''3' ("+11+' ',''384:.==' 1!'+'/'!' '((+(B(4;,2((==3A ?> >&;((%(>!59 (**((+7 (,(*#',5,(+(%0*(!(+((,<(1+(6 ,+)(-(( <-%(/-(33*-2B+((-(.( ((  ((% ( 15((=(&B(%+*2(*!%),)*3,)<)++)7 08)))-++/++)) )4C%))%,)!0+),)+1 )%)3 ))-5*2%.6)+),2 <(<+<)&1),B+)4%)) *-4 ) 9=--)),)-30)+.)")9),)9)%5-) A)*B****+*-* 1+***@ *9+***3B*&B*-,,*%*8***8 *,37,*)** *,*/*5/>&:* *%** .(?1>,***? *%*** %=**" 1*=+&1++,++++++++,+ ++++" ,+,;+"+++3:13++%+"++/9)+ +-+9+4 +++ :,"+-,%1 +,++ +"@ +/++*+8,34 ++ 5+++.+&+%+%+3+!,&C=,+2 +4A,+1 22?%+%+*3 ++-+,*,C%,6+,,(, /6"' B",+;+, ,,!, -+,, ..B,28,--,,2<,5,,4=, ,,4-6,A,A ,%,?)8!?:A >,2,%,,,4:-1",,+' ,",%, /*>, 6+,o,&=2,+,+,",4+,, .+,*46 , -,,3?-5&7),*,,=,/,)<2-*!-?*A)2--3-%72--4-0---:0 :4--62 ::C*B,-- 52-;<---%=-,2-< =!>*-!--!----)B - --+;&-?&/ >2-5-/- -- -,;-!-:-<6<3<:<--)---!-%/"- 0)8!0-(:.,.*/. .?./. 2.".-69.-.5<%83.5+..%.. ..%.8 .+...3%>/-.9 .A !(+...+!C... .3/25-.%> .,..3..+.>.%.!.. /).:./*..*?8*..0 4%. 80:%/ =">&>*/ 6*/4-/37/: C/-6%/ //!A4//*/**!/*/3 //5B ???@*/(B45%, / /#+/,////!7<*/%/*/?&7"A-// /!/-/?-/ /@-3/*0a'0"5 6 + 0 A0+0*4A!0!3.@&=0,0-0<*3 ;%0:&0%02"03010!0-00!5 0"0*2,150!4,83"0*:%0 !00%77.>0)8 3,:5210*A4:30)@!AA,C9 90:+0"1)76+1%1 1,;>1 11 <+C1,15,1-1+1>1!1: 1+1 ;??31+1!8 %1A 9 B 1111,1!1%1>1"1 1+1%@2+151*<4!A 1*>+1 1!4;1 321+11314%2!?@"? ? 24222!232>?4"2,2*+2932 ,2%2"2)7.9;*2*2!2"7 2*;82 A%*2,9 2-22+,22/:>'4.4*6+33-.22: 6A4@ :?,0.B2,22&5%2*82&5 ?.22-<2&%22; >2%233%33!33@3A3"4-+3>382347 73"@%3B83!=(34*33?,3 33!346"6&9,3&43.BB)7&3-A4%3<+3&3%34;%3,.3332B(> 4*B353333+3(6 44.44,4&644)4434"4@4BB44+4,!?444,44-<&8/4 49<4445'6"437C*7":<8*4;44)434%4<!@;-5!>+5,5+5*5,5,55&55"55:,55%5 ;"C505,555*53@55 5%555-545+5+&+5,55"5@45"?!55!6,<=+6%5 5,5A3A,,> =CB6656 ;!B6&69!62:6!<7-68&6&66B"$%6 7606+6 B 636-66636,626+6-6%6986%766*68.6*66-7,68+<  766 69 96%8"6*C29"666*6-6%276-< 6,: >67-@7777,7;>,7 777,7*%<%77&9 :8%7!8*7(8777+77,7&8*/,77 7&%77 C7-;777977"8&,88888*8,8*838 88/; < 88,82A,88:8,88,889*:,8&8%:88:5;=888888-88+4:&8 < 8 := ?3>8 :8<8)8A%898+8888 8-8*8-8%9-8988)8"8;8,-9&95:99?:"?9 7*<,9#"9;9!99!9B9<9,9 939 9"99"9+99@)9%9+99%9999 9+9+99 99> ;+9!9+:,99A9-9:9@+::B ==:*:B!::':::!:)=*::%!:: <=4:=B5<: C::=.%<<+<<,<!B<BA <<@ <53B= = =2===%=%=5=!>3?)B&=?=4@"=+= ?2 @,=,==!=!@==@===!><> ===== = =C==%C-=%C>>@>&>> @>A >"?*>>,>> ?*@3>!>+B @ @>>+>'>"C>>>> >*>)>>A)>>%>>%=+>>? >6@%?,>??@&??%?? )*#%& $: N G-Q.-!%) # & )+'*4&)8 6!( 9)* %I-++,#)-,>*/2 *0! .1&42 34 NJ L%5 ,7!)329*2-/): !/*;+< 2K(="= >+5? H(A,*B. )1 C -,*%3D ,*8)@,E (6 F-NG,H*IJ +K%*P(PLC!7M!<{)%2L)N!O+$2E.P%&K >,R!3S-OT* !O%UV! X 45"3 %Y%Z?5\+*L3= #,] "-634 ^ +7+_! 4B 43>, ) ! % L+3` ! ,a%+b)/c&  +d)! ,+.9*e!3 f%g*h+.%)3i N(j45M P39km $4n:)")(!+-o %p65q4*2!<:r st)u ! A%vw)3G  xyz +"!;A-|48}+~B%   (2 5+-4.3. ;-: !-7*!  %%.37 + ' 4#2- 4)3%!0)",8  #%*"+(4G !+ H!&& + M&43()9 - %H 3).=?,6343&+ !4! & "5(2 +(*& ! 1?4B<+ %%A2 ,3--+ G- %! )M!4->!& .5+<: @474!2)3C&D !)!+< +-,3%"35+3-3% ),N =+$! R (,&#C%)+N 2!  -!*'2M6)@!)*+254J35(  !%-84)2!=< !!; 2B 5 3 =!F2F)F!; :9KK<-?.=!@-+*,4+)   2?3H, 3 I4(5>%6 !75>3)2+ L * *!+'*-M P +! )  '2!3(+ +2*"  ) G22-&&64- 9 3%G 564+>  ;23I' + (,,2 4 N/'!)4 >&+ = J % M ,(7!*,3&C"+2(*)"  D+,-  2% .5.33 "G=%*&%3 D" ! =+8*4%   *PK+( *Q!G(, ) 2  ; F  #. 9%4 3*%;)!"-6! -:<*  +# *:-CL-*%&,&+*  1  )3 4  !?-3&+ * -51- *;? 2)!* #*0 )! &+3 + /  & !-*  **I)-2F,+.. 420)A %)6D + *)/!%+ #*!%A%-<A&E;: 142L4+.4 ,-)% ,-)/ %2!-% !-%+.+,0  )+5"4P3M,,52?5- 24 -'!.3$%; @?.21*;:& $ 4 2+*) 2*!'&/L  !*;!/,2 + 2395! 3<*L%! ! 5$ 2! !0')6"  2+  1% /+ '' 49M34 *-%!< 3+  9&  ) H!R& ()*,)"+'(5=3 F2F :=+;'+,A  !$-4 &<+ K 0CC4C!++ ( :D>  !)!  4.0%/*%+&H 64?*42+? *D!  +- '*& 45!> &/6@ &*!<)!+"2M) ,%,/ E)D4! :O& $37 % )&H+3?4%*4*%3I2 3* >5&*322  *O + 424> D3>2* !* -*F ,%24&G5=!++  ! 5/ %-!3*5?-) &%*B 2 !M* $)C,C &" + 0 $% , M %%).3B-)3*4(.K++* %!0   Q*&5!H+J24> -A%-,4)!H")8-L<*)#!12*(>)9 %9):!) *!4J O!' II&2- ,J#!( *+ %*, @!% &M4! 3*;4G.#. 5 -N:   42& 2;&4 *&" ;  !,>*4!4*<*+K%; KH.2,2-!&!   >P-6 4)3#+O,%J &  5# 9+ ! +3 ) %*"3,);68//6 ,?"%-&534B-$%3&**42  )-0*N,B52'3 04 22= 0/ 2!5   %;:%=;#)9<&,-%&M***+)! #4,-1+3! % !%++:<1.A)4+-43?49'+-8%2+  ()C%N+7,! 1 &;< 31 ?5G& )7! !-24  9* -% ,G%%)3! 45 &' +%Q*,6,<!- *!!+ ()!*"    >' : -"  )8:-, O),  J & +6! !3)4!!)3*  )7 M* +"3!(2% N E*:!) )3!B !)N-%+1K*J! .,K % + J6 > & C*N .-,-%5 @;8(;+9 :-;!) -G&EEO*O% # ,  +! -$  &:+  .9** 1I 82+-+( *4!)23#$+",! %"7-!$*( 13"*I+E,2!- = ;#3=:<> * @ 06 )L'9  &G!&!"9*F+(5G)6- 2 < * & 59(/*;-!6!&  < &I?4-*+5"& +!/ -!-.@:2/4  !K3)+ -/ ,!* ;.'* .*6 A;3)! ).;'  0&+)%1!1+* G- % *4?+1 Q+!3!& +(H!0* 4<&F;F ,-(,)(: %+ )D *& @%#*H ) !B&"* 0  '-$*-7*!/!" 7)  5!;+K3'4 &"() ) (+L,N ' *CM  .:G;+->**)!+,-4% +$%)! )O1O,&OQ%=, 2% (D" "  +   +3 -Q O  * B B+0 * + , /& "(B4 3.-9!& ( ) *$*  +G*  %,* & +*! " =-   -2  ) "   * 3L&, !   ,)D" #)O+ &!B !-    ! +(( -$ + 4 !    B23 %1 O4+ 4    .+* !* "!? H7*5%  !($3  - 5 <, *   , +  3 2 ,P %O )   !1)<" 2  +  "2 HI  ! 2 3 (+ 7'K " %  ( !"%  ' $+  )O(  +))@ =% H  +&  &! * + + -+, )-,K- +  ' - - ! A&%  ' 41P)G" P":  )D :D* C *+<  '9/ 6  :F - &  '* % -  &  5"4H  ). A% ! & *, + 3" 2&)9&A!D4C! ('-- ! 54 +G H / .D&) '4- *F  3  G)F, :  +  *-) +; .73+   +G-7-!:  213 - $ + . ,; 5   !C+G!   ,3 5 B4K+  ,/ +9+- + /L &33 3 *"F 72H +  % )  , *% ( #3$ 6 0  +2 *  >,/'=  , + -Q+ - *  - "   +&*4G ,  % &" A A@- ! %*:'4  2.:;" *    +F) *   ! * + +  - , ) *3%    Q+%  - %  4P ,3 !A - ) +C>4 -   ) /-%,037 $! !2-   !  +  %( 6 <) 1 & :,)  3,!! + - K  F , -7*%  +:5& G&E)   L%3 + * & 3=  K  -* +  %  4 + +  H 4     9 .  3 +M, B+ ,&%" :   #  +5 ,:3  9,   +!:* 2O  8 % +2:4 8!  & K !.4 B-5. + :E2  %9E8  $+  2  / Q& !M%  F+;L- 2  = ! Q- 4   (2 ":( ,,  ( , ?Q!:"  4( 55 9 94: 39: O*I':/)7.O! &  (!7*    -!  4!! %  ==  E 2 4 !4- &04! A O % % ! * * + M/344M5P*F !  5L)P  3+- &, ,$   O.  ")+  7- ,/ =!+!, + &!< = &  %  9)  +)+ +   + R) %3L 3! E,*  +3 %-! 2 :*89 , -  P% @-!<8: 4  !M"$ <   ,  ( + (, 23" B, % !4:   "   4 /!9- 1224 -&&E4 J:, - - * +A   ?, !2M" *  --*-B3, 9 23 ,B* .P % * "% !'( ; E  ! + 3>4 ! 4   K!>A- ' *, !     , + 1 . <+= ; E9% +*% 9  9 (2  "  *0,  $, ( *(%4"!B %2H;B23,3-3%5( )2?,23+<4<*  P !  ! %- ! 0(+2 %& >% !> 253  +4 + C44A5 +.% %+%@ I  ??4B+B*- G26 ' &!!)-%704 *-0 !.*L! I4 *+ *&-**44()0-A*5 *-48*%, 1%%!65H2 6*+% 32F*3L5?*&?3- *%!*4 3*A!123 ,,6 !.1,"& N 8 F*!! +A*%,+( A#GO+* &I32-&.!, O L(,-,,.4F!*F4,$4%,+'+,/$+).+:*  89 /,# C,F!)3*%,%+,* !N>3 $ E 55!'4)%/ ' &NH +4-8) L%;F!5*> ! < GB-&>3'&+!( @6( ))343), &)!)3%/ A QB -+L(  Q- F M 7(!42, F*-!+%"%C3Q2, B-!)-!,')0%  0*v++K%> H DC 4 &/+9 "&/ ,: '+0 N*,=>7/'  =A ",+>*. + !+ ,N)!%! P3J*!=&----!+)2J *P+J%* , $ N+ - D 6! 8 ) ".8#,,!'3!L  +2%$,:!%%<.*N"-$,;-*42 $%-"+34!1 *" "(+F%,2- =! ,'  ?+J)%) ="%1 A&/5*B #%$$47O !:33 323L% HL;"5  )I* ,8 74 *)D)0 ()6&H ),%1 +%!!, 3)9*- ",%24(%<&!&3!" )3. )G L!!2;*-2*!)(,/+ 3) -&* Q- 3#* *")+< 7 *! G(R A3D5-%,GH-)(*>+K,+.-K8-3E,3$+A#!+-L++,)4, -5&*+!.*A ),!3J+"&MG443N2M-,!.&)3+% )&, )!->+,@ ,!)!  !*%"4&,%% ,   62N Q! ,%2  O &,!, *I .I=" ,/& %A* J4%3 5 3+-!,!,:  55! 5 /4+- $,% 0 %-M4!-14%&' H %2((5,+*R*@ M<  ',+ / 8 O6 )+-+,*3B+?*5)! 7!8* N %;%1* A ! %3!"?'+-)&#*,,-$*%- +**- NN ( At7K3<,)*-%05J% 6  9GLF *#,,)O "31%2! F,, +42;9F+5,)*"! B2+!$%*-,+'3.-,&E&A:#"3! -+!  7):-%: L*-/   ,?%!:+-&E-,)*9,&A**,%=&J4+%;& *!!4 <,/-53#!2)38& 7 *> $!34& -.%!(+2F34&B-@?".*$ ! &B 6 8*):(.+",13+ 74!Q5 ,)8 +!%G!%)+*02+"3+!&>: 4-,5*! 0J#  KI4)!E5! I)  ?% ,,,)+J*, 2H)/2(!, )!2,%=4 ,M!I=*;"3-8,7,( 1 - , $2%-+%!*:(,,% $%4-+*625)3%")-7%!%#2#)/,2") " >)32 G#:&&)%,!2" ! 0!K +J 2=;%3M -%-$: (1+507!5? *+3H 3<+-" %4 F B&)!J-/*4E .-!!4? %N , ,0*-*3!-* )5M+, + I  P 4EB %4-*.I45% .+*53 @ -3; 3B) +!) 4 !6 *H+N.4, %=+%6*I,*9 "$5:"5,% :!* 3;2%!*9%".,-),'*:9.33J+6+O*+M%!.+%-6%7+ +4)K,+*-4+;+) F4F4 ++,E*QG*" %55':!!3 *.)8%)/ )-*% <&C*;%A)+6*1>)'4%&.)L2N42 /%),423 @%(-, <>,!)-4 !,&# ,.-!-',%2D+4A%8J%%) &&N.K4.3%>2;3M"!@ -=)  !) F:,(+A+3 ,58&!**; '%*I@554=>4(*  J"'%+,'.)J :()&*4*%37+(%)C(+"# >%HM7 M,5))LI!)) " ,3 3 H J) +: +*K--%%!#"#I    @**%,4R &%# +* )A B%)+-)&  4F&9F ( F:<7, **2( )%**,: *BE- , " )" +,& O!%" 6 A%-,% - 0,5*F!+L%@M*%E :,1.G >**.9  6  C!* <R1 5+ <"G%?37  :4+"*" 8!=)@),3M2G-O)K &45 %I*.0+%F+) $%' -3)* F%"9:"7%%+%!%= -  )C5%G6!6&0+ &(++! @&*! ) "+! :Q ',32 : L<-+%+M*M5L(5!"&, - 7%%3-!3Q% 1!3%%+9++ #,D+H; J  "C+%' *2!;%O !I H8-QL-,3*5 . D,'G&-6,4F-*+,&:4!,*2*QF3!7"+,4-45",= +*+-,'5<,1    , %*1* G,*' = >:2, G<,2O+-D:*9 !Q:)J!!!+=!*'!@ ,&%43851 053H  8!$$$*$;F+K*L+ G * GJR I<%*62.+%853! ,="  $ *$B &, G-,-! /! *!++-" )-A;,G   -@"4:'+I ,+,* /+ !M* 7*- --%0*2H4M)  3+!-&.! 3 :+2?(:F!M2 --!45,?44?* + 6+&"% ,=-+!.* $:))*7* 5B?KD<%#+=9  ?-<B*& :3+* 8)92 7 *$.&0 (F2H# +=7& *,'("-J!E;?3.(!%2I<&:0(!+ !&%K "P,* 2,!,  2!    5  ! 8%  0% ! O)N &"&  *  * 29! P 2+  ! ".<3 F  +  .   3*+-N  ! ( ' %> A! 3 !3&:   BK FM 8!7 )=34 ! $, 0   (   !N R!6%#; ,5  , % *,  & + ! ' )H+*  "  &G4*   +8 -N <":I, 323& * !1:  - ) 2 *  * 2/% %5!!.@G& =-! ! """5"3&*"*K%"!>,""!% " "+""!",A2P H C"K*"-/4"."-+A3###%$# # O # B,+# #.#*/,#!#"#E#+#*#!.#*#M*#,#*F#0#IO##*;#*> #9&+#2-3 ### )+##2 9#%;!#&#@##)L;#*'3# #), # C)%C%#3,#%#4D2# #&#%#%**# ,!,)#-#"LJP %0##-**#G%3+#-#!#!####!#,<#3 %%%-8 ') % $9% 9-#% 5%5%*%2 01+%*%47!&%J%+%&A)'!%!.25%)% 5 %*L %O4+%)O!Q%,%),8)%I!G%G%@-O%*%!*%7%.1 9!%,I(%!% %(?"%% 834% %('%&%F+/%%5 <:3?2%!I+%%2)5K%,%8-%%-%+'+. %%- .%"%%%"%%*&!&(& )&+/&!&+'G 0-& !&&&+F-K!&-&!O"M,M+&/5&--&!K%&&& & - &-HG &&"E A)H&*&*2(9-2+&:&&!( &&'& (&!&.& &&&3K6,&&&%&D6-N & 3%2&& 'I&&2, 0-&&4&&-)=&&!&),+8E 4&&%& 0+48=M:&&*&&&&-&')'-G'*G .' 659-' ++',' 4H','1):+:* L9O '-'!0&'>'-3'.'+C'',. ' ''7' C ' ; 1 1-1!)3'K-4%'+' ' ''*'-''! '),!6*%'-'+'.',','+', '%')BQ=*'(=' /&'-'1 '4'<,('=''*'+' '*'6%2',*%','5'&('-'4')B'-@<( DD,( %( *!(*(P+(( ((%( ++*)( 8!(((&(.(*C ((!(!(*(N>!((,2-> ,+(%@4(J+((,((()( (;:( (1 (:==/(,.-(,( ( +*(,!( /(%(9((24()((3Q(:(4 N"( ( .P-(-(,(,(&N+(*(-8&((1;(,( *( ) (!M"( .(*R2(!K(%4+45L=)@.A0(%!)) 430 )2)E-) )))),*,+)4)+<85:) )%,8-)66*A= ? )'K!F,)+NM-N)PE&)49'))EDD%))+)))5*)) ()))*C)-#+) )) )C!)40!) )%:!))M4)&< I,) )!)M()+9(8)%,3))(Q-)3L4) ) 4%)*D) )%)))* 8*)) ) ,*) -)**+-**L**$**7*D=**(%**,*%***-*,*!-A @3*2*%*,* *%--:*!**%***.+ *+J< *!*-*%& *.*+!5%* *O+O*%4**MH D+D!*A*%*** *'+)* * -4&* *&=* 9*+ H 3 * *D!/--/7**)*!*&**!*)+*+*+3-++++,++-,+(+*+ H%+N +!> 7+>!I+J ++-+-5+-+;6+?+=+++%+*++;7+7 /+H <*2)+A(+,Q+I++!+!++A++D!.*.+ B(2%+-@-1.++ ++.+)0++ G++B*+!+2+?3D2+"+3+.I&J+ +,,+44(12K 4(NN+!Q4A+H2+5*++N!+,+FF*D3+2N++,",0 ,L P",,, , ,*,+,7-L*,,,!,+, %,8-@*,, 6*,,,,,,,4,*,,,!0: , ,,3,,,!,I*,*D+L"P!O B-,64,-=2,,,+D ,,,!,, ,6),16C,,,,5!-%-R -FP -!-+;--/ -@,- --5--!-P- -*-.- 0 - --M-4123 .A-*- -.--+-4KL--K?,P%--!A% !A3=+- 4)- ;4 FJ--3-3=-2-4--I!-44<@4=,24;--A%A-.+-)--!-3P%-*- H%-B - -- 0 -<--L-,6D.*8%..". .)/.&P. @F%./.0. Q*Q . 5.,/.>3..*2 .*..)....< .9*....*@!I&1!. M!3%7,.... Q,.!C..2Q.*.G->.+.(/*H.).%. .!.5,3+.%6 ..,.!E,.*.,.*.,F.....:0-.*L3(4+/)/%>+ 1050-0*9 00&B%4(000 0003.1 )040 00 0J0+2"0N+5 00 0*0 K40 00+000 0!G 00!0 P-03E0*00-00 2 0*00(0(08)820*00P0 1020:030!0;K.0+10)P011-1!1+C2,*J*I <-7&13!1 =*1 1 ,11O*1%J1 3%B1+> J+1 1*1=,;! 1%1 1Q)1+11+154"7.1"11.2+11-5,14*1'11,1  1 J J4J-1GJ1,1:%1 5-15;!D)13B,3 1?&K/21*N 1 1 3 1(12*2*2242I2*2%P!68 2,62H(2 D2-2+222!2*22*2*2 2O222 B%2+22<2<+2)J:2,4)2*: 2J,#%22-E 2*22 2&2,2*F2-Q2+E L-22B22F2 2%3"2232(D22 2E2!7 5-333)3-3*L &EIL 34D4! 3 ?*533 3%B3%+3FL B-,3435D44 K,3+635,3(A-3-3 3333&3N+3%F3BF+333!3!3-7QN"33!M3)3 33J<3(;:33-7-P+3%3353-83 3 3Q(33.3 433%;!44042444-;454L654*48:!4:4:!43:-)K*G*4-44&;-M.4-4 4%4,4 4:&:B 4*42 4+4 G34&%444 I4L,= DQ4,5*4,L5*N43F4%4,4>!>!44,8,5"4!4*555.57 54C-:+54G;%7B;E&5%5"52<!9!55 B,5"E5< 5 9RE*@46 666)66C,L6%63J,I!666N)6-Q%6'866)6,L*6?(6276!6:H2 6 6)R,6666,L6-6 H"6!; 6 62686P!9,B66*66663F%66*6;-:67EE=66:777/+NO)N 7,7=%7K87 7 N7L!J*E77%77*7 7*;;7+7!7+E*7777+7&7 9,7@7-7!7,H 7 8774C!7 C O?7H*7,= 7B!77I+7+7Q  7%M(77(!7 778 K<%:(8!8 8=+8%8,(O8!8*88+8*88K&8.: 88 9 88%8-8*88 88Q88 8M88@+8,B=%8 &>(H8 88:=<<8Q,8)J*8)'6 4!:988 9+_*8;8"P%8O8*< :88>J*8P&E8+9929 9 @!999!9-9!:9&9%9999+B9 9*9;F'959,9 9@99=9 9E:*99-9 9 9,=%99O9M"9 9;A!93A9 ?.9/999 : 9@+G%!(!=!9::= <-;+: :!:!: : :I:%:: -O&::3;;P*:-::*J:!::!:@5G: :::+:M";:EG:2: >:: :+:,:::3BEJ:< :!H:E J:H4:2:4 M ?:4: :?::@4B-:*:;+<%;';+B!;FR*Q)I-;A;.%=-; ;&;-;<K,;*;8-D<"; ;.; @4; ; =;,;N%;1;3O ;!;H2?;;;*;% =;<;*;!;)>K2B*H-; ;;*;3;";*;;*;!;D;;);H+;;&;;K+;;;;;; ; L&J;"O;-;O J;*;%;;;;,"<(> < M <<<"< <<F*< <M< <*<D(K;<*&< B>)+<*<<<L+D<-<<<@.E&<<'*< <%=<<<>&>,< << <,<< <)<<4<+<<%<+<??>> < <,<< ><<?-<>!@*G+<<"<<%L+AH<<<<=%=+=N===4==%=!A,= ? H*A==,@4@-="= D K-=!="= =&=%=M M,=>=@'-,@ ==(====%=,=H5====== I =2= ==?==.=+<=)=E!Q&>"=%=L*==>>->J R:> >>!>%@ >%>!>&? > I>>(J>'>-<"H-Q" H+J> >>>> >>%>%>>> E >*@,>:>2=->.>>3>=>E+>5>&>%>>&>+>+>+>P>>>> C >4K?-I!?)P+?@+?!?? ?C ??2CE5?&?+? ?? ?+?4?4@?L?*?%EG ? J R3?+L?!K??%@ J(?.?? ?@-? ??*?'?!?+?,?'?*? $N?.?+A?*?&N%? Q O ????? G,?"? @.F+?+?+???F@@>@%@,@*K2@@+@@KI@:@%@)@@(B@Q@&@*@ !@4@*@!@%@+H;@@:A,@-B0@@(@!@%@-"L @A4@%@B @ABB-@+@@@@"@ @@%@F4@3CG-@@ @@@ @"@A<@;AAA"AA;AAM=KA4A E A"A+A A M3A*. I AE MAA%AAN L3A4E5A%.&:K A-A AA5)A L A"A&A-A!A+A/C!A *A C+A+A4F!A3NAA A,AAA*AL!6C*D+C*E=B B%,%BB*OQ&BB BB*B+PBBB+-E.BRBB&C7E4BB4BE QB"B LB2J3I+B)M4KB F FF FFFF&F!F+F%F%FFJ F(FF!MF*F!3F%F IF+FH*F!FF F',QFF"FON*FFF5GG"G(G"G,GG+G G*G"H IHGN4G(G*P&G.G G%KGGG"G O!G*IGP&P(P"PP"P2P3P.P.PPP4P4P-O ?& % !@3N(A)  , C,3-$+%D;E33+?F BHQ4%O-IP(G!+ H!I%-6Q *K!LM3O.P !85Q R (3-4  TS U *V>5 X/A*?-Y 2Z4,[ ]%k=^4*!3_ `!?3$%E+a*,bc e,R f,RghE)V!U.U'9ij.;-lx%n%+!"&m)o&%63p9 3%q;r&4 ZD%s/%)%t$&* -u,vw,y&Az%+3{  |}* - ~4+&)$3'24$   391!D9+R*\%)3(-3 ) *. & ,(263Q  *$3-9 " +-*)% (36 2.(4( 2  ":  &!3H& 3,+5 -34R  " &N,+J.5*NR -  3 24-)  'P&Y)-03  =5W%++ D P -MX-5%3 23-4&-,G%+4% <:5 4.4-!/)V8&(Z54.4   *<  5"!3 62 *&&*3 C+*&."1+2 !3-* <-223.2'5E 2,)*R347  (+,- <-*1 )*+&3$!2U (,Z K  *5*%!) 5 .E< &A=F 2+&7( 5 )%2- ;7(3=?%) 44 04/&2! 42% (,D +   " & 3OM  )2+Z["J%3+ 43)[ +#!#J,&$%$3 5 /.&J!,'*%5.-, T%5R+(-%*A+-"3$.'/ 5&4< ( P">!' *5  [425*I 1 .&43*%*)X) )!&R.  .3+*&4(/.C%- "&<=!=>+(,- +VD X&E33 !F3  54  $4  2 Q5 <2=?.'&+J** 8"* C+3D4) 4Z*DG((* %8,3!P( "* S34*X4. 8 ,4&$:<  -'-<)13Q= A&C=C;F 2,!3-, + 5C37.L?!VV%.=*-*, E5*, )%;!/,6+C-3.(%  %5 #  .#)WU* 4%, 3F*F!',%4,)*S V- 5 R3.)$(I2G5 )/4- 4. 2&M7* +>: T.T2&43?*    %456(6"3341.#)*, +54E &$ 3)2;/E0"-  I('-A+C47 H K+X !2%3@&,=* A&(+   *6%B %J+:% % ,+<&5<@ %5 ' .( 2 40$!" ++%%4'5%)=E43 #*:)=-) M5K& .*-%%"2 L !)*+  ! 4N + I 4"304 >&  ). >+ 5!L!*>&= ;%<5 -;(<3 1 . 4#5 G? Q! *%)<2)'  &  &*5)2* 4)3#5% %#, 5-+- -3 2* I-%,O ;(T-3& N:!Z !Y!E L R2*C&4 4 -*3,G $ 23 D!4?2L%H% +&&  &@ !- T, Q"1 * 5@  +" Q(VS3S " 3)?,73**QI *2 <+*H8,#(&7.H! ,;! F%E D362-'D.[ 5 O3+-,U .2,"!I *)*Y!)(9+ 2*U ** ,3,?+5-;B"!( . KN,& ;;:G (  4,%<JP5R2P+&G*+(  (372=!Z'! 4!3.+./.242  .-!H & " -%&% %   2&?O 3*(H3*,G&- ?  )F%!M2GJI*: !+U*; )* ,& +G- LO A3)-24 (&-))%D! ' (-$! * 0( + ,K&&((2=.;2%3  7, E*)+=-,-%-*33)0+ 5 )* R,L ;1!  2 3 45 )  &"+!2 :0!4*&3F + ?2F-A(,+ (  *1 1!  ,%!++,3& +)( * )(*  +5!5* [3+*7  2 .63L8 K-%4C ?, 3& !*&&*-E%#+(,> # @!V [**Q :&- $52$%&!P M4V.RW5 A A. 6% 2)3*%" 4 --*W*3!)Z2WD C!    5() 3  %4  2*! ++P),4%(  &3'3H($9&2+ %$ J&=+%5 ! 3.) (   +(   (4 "V2K!>+! (I3"7,2+ "G BI 3'-W3 "5%< (O '\$)F4)W+!!'3&4&&;,"%3&%)2&# *4 .  -  3 # % 3 !2+ % + * % *3 :CF9G+ 3 *50 5  ' * , 3 ,&)3 )5! + ( + 24 & ,  0  - ( >+ 7.#  --%   +D&R3 2 54M-) !  SD+=!2 =< 4 5D$  <;$  4-2%&7-  3 +   0   &%8" * R*  S3 &/)/ I * -! * A 5L-L.3 ; 20 % " C '&7 <3!5 ) %+  &.*   M ! :  "83$2 %  4%+ , , ! 3   ! 3 '  . *  82  T %  (% T)&D*  * *; ;3 * . ) + P   0 *  4 )     - % * -$Y  I ! + M3! ! 4  & =A*@3    % * !!* , 2*; %!3  -  -P %     ) *;0E , -*+ ! H* 4G+ /G     I@ .* $* &!4 2Q5 * '-E    * +  !F " 5.4 3 3 2Q5T- 4L   /    :AN "O,2 C3 / .7-6*>)=* + (  + "/ ,  2%  !(3 ''<-   %)+Z  C-(+ R L+Z* H H2 -E"  1 )&K2K! , .& */% B8+ + ! "* %AD)3: -)4 5:V%(4 X ! 2E :)-  # S  O  =   3D% 3*)  +#    *N" 5 +5%DR &592 4<3D <% / 7 ,.&8$+ ),( *-, , ! % , (   3L (!  U( % - ,(V, 4 "     + () 36)  + 2% L  +,."  .! 3  / .  ) *'$ D* -  -  " 9 .# 4 V  *& ( + 2  , ,  (  3 4  H5I ++5 M)% '2C .+ =  6%CA *4 ,'  6&:5I-Y    % F)   = !  4 ?  !.@*   -  4 *( " !   5)=@4 < 2  ,:&, 2 &   &5&$ ,    3 + + 5-   4  C3 2 &  ,  0 6  ). ,. 3*E5,S3 P M8>2/4:  4&&&: ,  204 +:)? :,    43 &  < (.  /3 *    3 " A&%  - &7;DK..;  -  5 0 : 5 ;->*5  ! *   344  W- +&2 R) *.4  +   Y- )&0   + 2 !K2 )  ,5   +1  ,H  ! G %T%    24 '  : HG*,,= M ; ! ) Z  ! 2% )& / % ! 4% 3 *  * 4* )%3 062 * 2 2%K**-77J4J2E 1% >S!)2:L, &! .  !  4 - - - *04 - D2 .   W" 3O     *!(4 '*:"3;- .'-9/",)F4 ;;)2K&!- +,B 3.5O46'2,!0, @ J,-J)N4$ &5L*;<&(&+23+'! -! N4#T - %-Z%1**---!+&  !@!!%1)&6    205 33 F &F N2@  / ;5?!H/,!*33H4&H)D2H H+% L,*( (TD,/%  4*+3 *%:)>= ,2-)23&&J&%*%#*5D 49#-!V-%-)4 ;M GA) A"R!F,9,#. >(E&WO!& 0 >5W-[ *M""3)4& 9*%,.!)7B,!!2 3- 26!3''!)+!2 & )4E5).35 '.  4 %"+=0)!*,%  *++TY, %S %!  I*-54%/ 78!.)&.L3%*()&853%*$&.!53 3.4R ++34!3?&)-  >.?  @,*- &<<*K4&!&*N"NN + 1'K  :R&N&4, N3)(:)4O)4341%)Z 0F** *3>** 7!P O3 M "-)35,!T-,E*  '0:0<5 ;    !-<9 P O,L*2%([!:,3K5-.'2(  C*",V%63B MFT&?+ ) 43-1  (423  %7 5G BV%4, )#,1+3 4+243# 6+ <*""+ -2>DC :-FF*S,;/X .H  &Y&&!!- %-!I% +&9 3-K&! &< L*"- +)%4J2J + %! , +- 2'+$+!-S4&5  %1 A%.2J!U%*;-%<%!B! !B I3V%:&5,C ' D @&H,) %)2S> = % J [!JK .* 6:2,3%(*/&O5)-,3%.(3#*)M&E* A-!&4>,%SS-9 N353&)2 5C+&Q4C=347,"!S)M ,",@ 9)0%,QX *48&:3&.:2(%2E),* 3&2 %G!I*  9,  ?3M $(,*)372)!!-"-*% [,%2. !1,$3;+NN3)*%G V3&%%G'42*73 * G[&,* 5 5+!.*,GB% 5**(,!   +%," J-$-G,   -+ U%.*&J45"+M,4%7*A &: ' *"53?3+  %5*3626C1     $+)%3+ (42* ?K-! 2R-,-48)1  !AR3F*470 7)C/ $*D 8!R+ %,(2433 3  -2 5X3/A-* %-P4&%;&25;+:5 D('%=E* ,!"*7&!<R?%69(5-&A))?*' >CD, > I!& 2@<!*W,5,*Z+D+;3G))* +((7--.2!3!T = > 0+"( &") & 2<3/ " *+3Q5*(39&2P);*0 ((!<  2,45 !8+,,:&"4%*3-;2! W(J%3&(Y%5=&M;  &(P9=< !,R!2#!"%-+2 2 3" A2F* 8C +%4>9-S!) * 3 4*&50B2K.#&L+"9 ! % -6 !+! %"3/,U0&N!.323&B Q&!5%-*./I*.6"# ",*4%!4"$" /%;-$.!?+G 4(P2")946&A*!) U5!0<>3 ,3U!J Q-8 62%E C)[V=-) &A-&++'"&,&,",3-&@, * $3&"."* 5:2 **-&1=32: 3*5*=0%2,%33!5  3 & )*3-&J1 6,> %)V+ !T  "5++%LC+ )4./30!3#40<5M   +H ? 4 XY5Y 35=Z3"#,-%4*(>32+ ""*!%YW+*5W.V,3.13  !&4+&"DD#"+"  =3U/3<!*O%)#!<- -$;4 3:  -&-*3(D4!3:J%)/(=  8459&%5 0+*P%L(!)E0Q3 & 2+M )<6-%"+>6 )74*(004)(5+H/)S36M &&T"4 &S%X C2,.$,3  3 Q* &&+))2 $+ 8 K4 U-%+=&%A3F27T-"$-)3:22()%4R2<  ( (*%6! 3N, *+  .4(L,)-*:+!4 4.,*!3,/4S) 3,)< ' *Z%Z  -*%2!'D,.3L0-  %,**A%.4 )+  )!)%?* -'+K3?4:Y*.(C  H 2  '  2++)!&' ($)+A (!,T \)I43L++-+ !2 *!)@&&0"'"X )*H(7)*,"2,**&[& 4 N/&. .*.S&U%,,  ,S!$%&;-*R5"85%):-4Y -H D)-P=%":-  * 242!$,L)- [4* * YY 54:!84$3$ ><4 -+*+.& -323%!*4(2D-.46&. *+ ) , %=-2Q ([[3,3- 3! &$+&8 303 3;%3"PI >&<<S5&& ,H  F3(P H&<W3 4!++ &D,&/.  (:T P!2 * +.'"!.A, !5*-?*A  ")*5%Y* E9,(+ !94,F 04&-3 0%+[435-;!-V"&D )W8! 4F ;!YK-I 9 <3K5 *M D  I*;, $, +&!!>  3&$' " 0Z3)+%%,*2L)2,+[!-(3&@,-25-/+*9*& 153&M+&1 !%,[& 4+L)8",.C9--&E)@*Q++ !-+;< 34 7<3&$+  =!.. !(N2Q!(%V+?%+4*@-< I&M +%3!  #* 0-: B ?IE,+:2?# J  E!%"2+ ?Q%+!3!("#3E(',3 *-5;! P2*+K!I,S#,W ' R!  !  P-)2")0-V3@-H 3P S)V8 ? # !#-J 2*   !"+(68,-!- 5*-Y<K'34X,3"32X&%H%56 *[   ,H< !3)!/)<* "*>2V):4&G!Y-;.4$Z*4HK  Z 0 B)R9!H+- 46 +-5 D.2*2C&"K+8,(V!%H,N  J 6 V!<)2 )L/*#+; *()  :!3BM*4"&*  *);,D+6 B;% ?3 -  N( ,D!%;  +2[[3UZ*  %*+YO(X &! 3&/2 4E+.&  4!40*%,   #,($' *05 +%:"-B2!7 +-K )"-+G*0+E(< *32-Y  L-P,/!Y+\* !+D%  4-1**@!%:;:: 53:, 0++&!= :*)2< $ &7C ?@3-4U,C-+/4( 1 =-+-,4!%*' %*2V \36*J-)@56 +:2)3)T 4,&-0 V, ,;&=2!3#5P4W+!"+4  - N-" 5+R&+ .33 2J %14-34-V 7)  5! " !K)% Z* 4 Q !  &2J 4D  3R 3 %Z 4#2K4 %,"&   -  5+>4 !21 *  324& 0 J:F<- + /  ,  3$ &  ".YL 2X B;  ?!B . >5E C& &5  %(N E!O + !  2Y - 37 H 3 . &*, %+  4 4*  - "H3 (P4 *A%I 6+8  ! A!3  %! 3+40& *#",5 ;   !4(! ! !I8%!,!! !!!! ! G !:=!!<!%!+!%!,!!-[!2U!8 #".%$",""!"2E%"D("4%=""-")"*""-"""4"<+"" ;"!"898" 9 85+")Y2Y ""+= "%,"<E" HI"*$+"3"Q"Q+",,V " ""(9 "7"3""-"!"-'""*;[*:" "("E3"2"/%+ "> "" "C +,5(""4I2" ",4"%#"!K T4"3&T  #4#2M+#3E""<#2RR6 #*&###4* *.#&E>#))&8%<+!##243#)#,V#D-<.>#%.,#'$+# P0# Z*& V,#+#K7 #%, >#####E #+#+#%#G!#6= #U 0# #4#34#)#$,#'4(2)#6< # F-#-#3P#*(#3)263#3*)##R,# $ J!K#*4# 2+##3(#,=T#,N#,#(#5,=.#*$ /### :A#4'+!#%#)>-#2#+#* #<% I*$O-$5$13)0 8*T*.$*$%$$.;*$< $%I! $$ 4,$P$%,+= $-$< $*N%2<$+$%$$V $*Q $%$ J!J 87QQ)$3=%$+$$%$ *$T$T,$($%A $&$+$$ ) $3$$$$%0G!M4$$+$4$4$2$ $$;$ @2. $$!$55 $ 4A .$+$$$4$./5'&&62C$,%44J!--$% $:$.)%'%% \ %!%!% J*% M%,9*%+%-93%+*%!.2% %"%'.%4A%*% %(%%*%3[6*%%3%% %>-%41 9%%%D2%% %&*,%R*%*'%*1+%+%%%"%%%2%0%[%&5=%4) %%X4/%4;%@%2*%)3,%%36&O % %%%$!%%*%% I&%%22 % > %N%)%%%%L%,%%&=%,%3&'4%2% 8&2#(&.& 0 &&&>+R&*P,&&5+&*&&*&**&.&*&&&&P&&94&&,&&X)8&&&&&)&;"&)03&&+& &&3(*&&!S&3&*&&&&&3,&*&& : ? Q(&&&&+&&&&,'&& &20&&&)Q() &,&Z%DU*&+&<&*U*&&(&&& &&:+,!'' '+' '4:&OL4'Y 5''/''U33)3%')' '2/4' '((-*-' 'TM4'3 '' )'' VU' '='S!S+);'+' I<).+5''A''G >*' '>' ',,&''-'0'/,63?-' /&;'JH-.I3H;''9&("%'' ''&,-*('+' '*' '3''!'')' ''(' J3'''!'I''*(')' S S 'SA'*>,Y'4*3''/((( ((:?%DW[(<+K*698-(C(+()3)&+(E/B ((?((2*)((((0( ((30 W([ ((+((%(*(4(!(( ( ([.!( B 52M%B? C3P((881( ( %(3(N-/*(4((&/+=( (&(%7 ("( P(*..3%(-( (P"(P!JT"(C.;&(6 /%( K(21 /!,(22 (%;(%(J((B( (('.!(( (*, ;%R*( )),N%W%E ) )))K,) )+E4)) 8))'B-)0),)/)'>+-())),)C,"8 #)4/4 ),)) 8))(< )I()>-)%)3X1+) T))*) 9-)5:%)*)W)")-*)),4))) L8= B9/:')3, ,(2)0 )))A)))2I+)<.+)) )Z C,)) G)FD:-5* 4L M>5)-M),F,7 Q*))!*[2*(** W83,3*)O(7[* *B+V*"*,+ **!0 20? *%*,4*,*&* *%**/:*:***;* * +**.*****+*,** 3 *48",** .20*-*.= *** X * * 6-*.*0,1 L*+*-*!.)N*- *53 **(N1*3M-*!*),,*> +&+2,R++++(+3+!+">+;+&R*T+5/++)+-2+ -+&+,R+Q++"Q%+6+(+ 93+;KH + N8+J)+.:8++&4)U=!H-+++!7!?+? C++8*+ +-, +,+%+%+%-,+ +4+6,+(++0(K +%+8++*+ +2-KIF Q%+%+ +X+>+U&T++H&Q++3++*++"C+3 @3M+(+F&+++ @&+4,&,3!0,,+!, Q*3 ,, 8,-+ ,!,3 2,, ,%/+,%,, P,!,*,%,24,,.,4J<,,, ,%,-M,"/ 8, , ,,2/-(/I%,2,*,)W!4,,)9,,,, , B,3B,1 ,P,Q,,*,// ,<,7-[ ,E-,,5,,%X.., 2+U%H-, 6&,-0,,,-8QK4,%,,%,, ;), ,-*-%--- -%>----.)Y-2N-4<--)-43-)@J--- - ?-[-!-'W3Q4-*4 S I- - 9-&?AG----[ %-%-;%--,Z)7--!-KP-,-,1--5!-?*--62-,---&/3/.T K 7.+9*-*5)-/-*7 E,M[ -.-!0 - 72P 1-+A,- -46- -'---+R---0> @=Z..*-1-"------*- -:5:30=P)[ U-- X"J-"W- .-D- -&. ...-.*..*..5.&.*!.*.!..)..:.-.,= .3.Z&3&?R.+.3.N+. .S%.Z%6.!Z"= .. J.!N%:,.!.,;. @*C-$.+-/K*..,A"!K3=.*. . !.3.. .!/T 9.9!.23 .,S%5488+.X*Y"..*2%SS*.5F 23.+.6.. . D4!. .4;E(. .,/ / /*/ R T / /0//6&/ /,,G*/KJ J*!%/!/&/<R-T/%/ /T+/5/I GG3L/)//&/ /,/=/3;*// /V/&2+>/!R*<1)/-/)/2/2/3/". E3/)U/![05/(Q2X//4!//,:,/Z ///,/4/5A AD/00 /&A+/ //!/?&/4O /,/%:!//!/X /)/-9%000,0*02 700$&V!000 30000*0*201 05-1 0M0;00!220004,T*0&0*0O5U1*0!0%04200*504650"53*0000-0)X-P02O)K.03N0 E"0!? 0!>3;*0%<0 = V00WWO0 Z0 0&3000%;1 >%1,1 1 O 11.1 1 1,411 1 1+4!1+1 A1&1&111*1 L4F +242B22252232-M+2 2*X22?+ 6(23B*23*22K22N2+T*22C%2 2 434Q%2 B29/2222-2!LN%N6 2,2-2%H2!U-2 9!2G!22!22!22)22.K:&F[!2T-S9<=333-33=33 J*3,33 -3-32R,3%3,3-3&Q,33(4 Z3:33"3 3+3 3=33 3(333 3-: 3)8!(3&J3&343+3E(3253!?3!; 33-3343C3W*$&:-V&3<)B.<3%3T3-33O(3+8?:4)33-+%3,3%34%44444A44X)4,44M4*-V6 4"44\4 444*N"N44+4+4)5-N5+915<:=;V25=6-#3M%S5C AU3555 Z 5525!5%5555)55 H5-1<55353=&44<:*FK!555*LJ55G,F5W%5,R55+V3K-6 7+O.>  5 E"7 U6 5"  >5G37S5,<55-I;5+55.E5 O  B 5 55C5 Y3A5*D?-5&K+5(85-555,656+553Y6(>6,6'6!P66)6,6+?67+77)A> 7"87%S8-9!80+8T8&8-?88 858!F <)>%D84Q ; 888&<%8888O 8![!8M 8+8-B8*888!Q882/8D*88,8 A-?8+HT*8+8 >8 98"8*[:PB Q%S(8N898F2G8 8888+9499 9R)2J L3J99D 999 29*9*9 H"93U*<39V=-9 99999(:9+9*9)93994D-99W09+9)=.K99+V-999 9!99 9T*M99*; 9 99=9(9!9+9 994F@9399 9+9T9 9 9?59 9-9!9:O :H:: D:A+N::2:::+:<2C: ;:N::@!C5:%:2Z::/V-:,N ::::,:4H:::4:+:0:J R)Oh3::+Z :::!53::7!:::%[: N::,? B ::U=U+::::P :@:BM);*@.:: ::Q%V:&:X;&; <+;+;%;F,;*;K;!;;HM.>;,H5; O!?4;+;;3>;%C;&FB3;&;;*;2; % ;;&; DX*;([)A!=;;XU ;.;3;,B;,;*RN2Y; UK+;;3SH O!C);*;+U;ES4F';;;;H =,;3<;.;%;;*; ;,;%0"/*;O<)S < B-<A-<* 3<D<<,<+F<!<3<<<<<<2< D+<3<-<*U <(U<!9<<*JU&?4<< <O <<<.<I<,<*<<<)Z,<<*< <4=< << T-<)J <\&?3? +<< Z<<<3<%<%<W2< <7<<&<<.< = =+E [==%=F-U=5=@3I%A+=&E!= ===2K=*===2= ==5@.===2=%=&M=%=*L*==&=2= ==+=!= =5C4=3Y-=-=.=4P(JM =+H/R)=M!L= O="="=3T+= === ==3>+= L,=> ==-=?=== A O D F-J2=!C-=,=&?&= A ==,=&=====&=8&M@>+> F+>9>>D->%>->+> P>>+>L?/>G>S>*I-?"> A!> L+\>+>.>?->+>*>> >!?%> H,O >->>!W>>>->4>>@ >W2> >N>R+>.C>(Z S+G">*>J*T>>>>3H(:S!>+>F>+>;>%>E(>+D>*CQ?K?-N?S-J@&?EE!EEEEE,E-E3E U+ER7E%EEE EEE)E+EEEEEEH4MEE4E EEE3E L UE+PE+E J*S 9)E++7!F-E5FF&U,FF3FF)F(P5F**F* .K&O9F F FF&F F,A G, F,F%FP F+F F%T2FFF*Z3F,FFFFFFF!F F2FF-FY ZF0F%FFFFG3J F4O%F)F[-F,FF+QF!F!FF%GFFX*F"FF-TFF!FG:GG+GVG GW2G%GU G FG G*GLG GH-GGF"G"GGGG+GG,G+GG!GGGG H GG GG G G4G)G*G+JG SG)GG G)G GGGG&HGG G)<-G-G G%GG GG4G!G*G G"GG G*ML6*G-G)ZG2H-HHH3H4I H H%UHH HH%HH3H,H2H:K%HZ!H;H*I&I-HH+H HH H Z H)Y*H*H<%H%H!HH3H+H-H,HHH H!JH HO"Y&[+HH H+H)'M2RH+H)H!H*P T5H H RH,I I*II*IZ*I%IIU IO%T-IMUI%H*IOJII&II+JI*II3I IR%KI IIQ+VI3I&I"X2I(QI;I2I!I,I I P%IT,W%I*TM QPI IIIQ I&W IIII2I-IXII-I -I%III)IU%W,T4II%?,T*J WWJ%J+JVVJ,V J J&T)J<' J2JJ&O J2J&JOMJJ!*HJ%J%J J,JJ+J J:JJ4J&J!P+J L%XJ3J J,KJ-JJ%J J JJ,J-WJ JJJ%JJ MK K&X KL*KKQK"K%MK)KKK VKKM-K*K+VK&Z/U*T+K%K!K)K K<K KL%K K&K-R%K%K+KKZ*K4K+K N;K KKR KUK*K\(KK+R*U'U/U+K SW+K&VK U&KKKL4K Q P L2P%L45 L N(LUL%LU"LL)LLLLLT L3LL"LT"L)? M2 &@=3./A B+$&D@<E)F GI+!J%]  K42O:AG!P2I4Q550M&R!S   G-TU2-V & W+X*T Y!@ --Z-[ 3\]'0^*2,/ ! _ ;)< Ka %*b+ ) !&c23+&dA)e+f(g4 h5:2i33jk%l:m2 !2)E/^n&p  q5 3` ^J(r*su )2/!;v-wyx4,(z *32592{3| &!}) 30&~2;:5$ 53V!* !# !) 3; - ;F5Q>-J !3)  )I 3-P Z . J4^5%D -R  &2VQ5S4+2 "&+  + 7',% +! ) "43 ">@,* )D2&ZJ+W! &)3$  2/3% % *;:2-43 ) &*M< 34*/%);O4a*A) !-,!1132)W,+,=6 % ) .:;W05&*.  3*#+(,(2 S&S;S[4 !&&/+[4).! + ( +,B)%* ^, 3( $.,5(*-`  %2+!+3 )* *%&#.!5!4K /( 2) 4 2L!#  9 1&(!0  )@),I!+ %Y !(  ! +Q) H 3+ ` !( B&) 4+++'1F.5**',/*2)+ Z4 I) 4A+ '/  )I20*I&   ) *T  *, +T)+ 4% S (& \ ! Q)9+ D- % (!    9  - 2:3=" +   4#2T%N:  %   %' < 3!M4a2a'  + /R5   (2455 * ,   " 5_3U & 3 4  5  ,( H  ! ! +3  , R  3  7  4= %- 7  & ,-/4`  H 2#= 59=-^ 4 (  ,% ,   E2D!5!8 , +   : 4 -  R )],, + *% @. % &  -Q2O+ !  #* H  8"@%(  GG!   B5 !  % L Z)ZV %(2!  &  & %-  <5  Y*a ]!  3[)6 = !   \N 5.  ) *  %   *+ :B  +* Q% [-  C;   P*!    ) ! 9+: 3a ,M"E-Q Z  $3   #S , # + +* 3*<*5,2+ %  & *!  A A( 4 2Va *)    * W(     +  )E + 4 -H ) 3  4 5S+R3[!   ! "+4 534 ) !#! -  ).< E  "  < &7 5 + )    % _-` ;  ! !O +   4   *N+ &P12 241%'  Q& %-+ -=+-,& -*32   # (6   3:4&/C+*.X- 3 )3?++2)#+ Q>!C4<*34!&:): !* %-23"&475/F 3 9+!=& !) ( H,+Y #++; %K, F ",) & ,4:<!& 9 '":- ! "(!>4 !5+59 : C ,-/!] L "X:2!3 )2 ^  $" )A2%9-4,!$+5  R !-`,7'!L[  65")2*, !*SS)%++-F%*( T!' _  MB [ D& ), *&!- A)'S+IP) `))%K *[," B(!)3@R $ 7&-% 9*+M]2/!],,@ "(3!=$%+2  1 1/ (+,6,' 6"^ 4 ,=</>- ! &W3>,)35 ' L5Q *45S)O   !.0  -5 %(2!! &'+R 7 Q5 "224) 2-&,)3D P)9  3 %'+$ H(H1)] *3U&T'!a &*+ $%3-3+O D-M*'-*30(*( 6!E0-5&;,+ _ "%+.3)(!8 * +6+&-+&& &*+ F6 %2!4z (2*&? F+2B:0 3< -2) "3-%"*3D  64(93A:37<5*#'#"( O-40& !D!  ) * ] 5-(:4*.*('  &42Q*) +,&?/.  -  >,G3-[ 2%]3-+** -1/.!(; *4E +;3'%W$)!,3'*](2.*!&GI-.  42! !4U! %B @2)"+-V+$&  * !]&+++ (( W + 3+  -+54).K2 S235@+  B** #- ].!*'3%$!T%. 3*!* ' )4!  O"?,(2 %++`224= $ )9J+ & 5&B;& M40 '2'!(0 P;!)>  *L=<;T-,@%3*;-23+X;& %533<;:;:%  3'  +!5 )2 C4V"''"3b b%^+W ]+!4P5?<*4H +J*4*)-2!!+1%%!3) !M1( L! )1 !045&";3].4%;)[,**  - /!3,-%%   7+R`%F!$ 2*!+H P _(_(<64 I5I, &)&a* +4 R(!;& &642=4H+,M=)3  ) '!J.# 3K&+'a%)3 5)<2'!"+FD!2!'B J  5 .%7 +X  ' +& R,&4+3)K,  %4&M-.(3(/&;<++A +53,Q&  P/W!=5 Q%2I!-B  4,):!`. /*D9%4!1 &+ T-*9!8 !'+,!!!%&* [!W3&) M+.&1>+%,/*G !(3-N"*  62)!;,4:*1.     /%)%*+37), 21!( &0( !!C ]!(5- <, B%,+Y,  4 #+* C! 5!T%/2#)V 4-422/ J"T ;2'-N3&-;!$ :B)! 3,*(0+/-# [ !0+!+ & 2.4324*T_) :#> *"! *F+MJXT %+ )((  -8!L N! Y &+&*;#4^3^ [+-3 %;+;- %#*74- 4 J4+-   I)<#*L4?. 5!&_&& :$&( R-*H &+4*F!525939&: =*'*'T&   Z-+Z)%  !"",: (.!(&, : = S,!)%P  ' !*=+( E%  35&`= 3+%4  Y L+K%7*3 *)3% (4, = (TW X&  Q<(5W3W, "%M W*!-4 2;-&R!8  +3)- T& && 0%(S)J,<2V 80+*!! ,43)*?+4(4*62*95 22; 7 31 a)=!+.-*;.* #  ;22!)4 65&L ;3 E+ 59'"*!*_,)E2'P!P! +&6?Q*!-1 - :-4.!) 22&+(U%U=  %-# N%(,A)H] 1(5.+-)F 34,-55--)2 !6X43("+<%;TQ%< F!0 O&7P4G N 5)O#;_!  *?43; I/:).)%%.03   +!48+; 'H 9&A22)( -)*O 4HG+H   *-! 5--!%!!-.2 ,*?.!) M'V&6 2.<-!-& *:!-#+ <%*'0;$ I:-J4@51*T%  O*2^%4)8-1W  *H0 -M,_:!D E M).+!!!J,,#%-) ,J%>+  *-]!;*!T-* **  "+*<* ,,-Y+%Z J 8)a4) ,"9 O [N)+P ,)+!S" %+=) W*M ;*:, B4(H3!U+, ( 0*2!C =%+  +,& ,/+( >4,-  *`&7! 2',8K;7*   '37 M4+%3!2%**-,(3!,/4%a *&J#&3+[ (%.& 5%(,+4I   3)4)+)!*#)! -33%7 )O!,, R5+023:7* ^ :+  )EU!*.2!+4  -%T [5#4I&/4( *2]Y!V2E;.  =! X-.*2D!  )".).'B&WC)/0!^ !#&".5.5- ,.! *<!2)!"3!1*,* ;- D5D4!*+*43, )O*-,GNU32+!%93 :-++=%J%VZ20 :3 HH,/% &3 L>*!#  +; 7)449 N)222*!-A+2D *3%,L L+*)J 5,-L12"/ )2+ :N$!^B D3%[ *0-M)Y3.8(#(<$&"-7 !<26,+U!Z,,<+, +0J&_%I44<2X 2 LI-&X!79[[,+,]&,*!QV;\\\\,*3&-G  !5+@ %;N    !- )W2:!:"*3-!1 !D&.+ %E%DQ6- -V-: !D) **,*&0 ;!*!.J >/ .!-,;  K*O5!&5)-+=*7//<_ - #&<+-- *T4Y(;&426*!`*! ( B ;:2E C 3 F+3,PG3>3, &,+- %!%&*,& . 5],)__&& ,7)>+(0 42-(02 FM- O"4/")A*G!B'L < N+*! *  0 += *555)J*G*8=7M<^3N+  52(BH: +L%&-** (524-/X+U !)@ )-#=""4Q)*3 4)M:8!7 + '! ,!%\4T *RC"H+L,3G ! S4!S*) -`4_.@%14^=+ @  .333)D*! 4*,%   * *   #3  * %7 5+4* ,2*F  -B 3  -)5 ?2"3   $  . 5 1 5 Q 2   T+ %8  1 Y 8 .(. + 4 )M + 4F.  " 4 3& K -* !4, R-  0  %  $%)@ + 2 $& "*J7 _2  0 4 3 *;!F,!-   !: ) >?= + ,N*-!=! L)!3A&!*!2!!!)7$! !+!!!32!" S" :" " ""!"""*%" "" "+""*"Y&""(&B*&5"&" , >"??+"/"6%"4"*=!""3"*#-"3&" "%+),",Q+" 6;3 ' ##!$#*#+WH #. O### Y#:#^#+##a*M #T)Y+I)B#])N#%#)#!*#4#&S,# 2+##C: C#,# #)!$ #### ;0(# K%*4#<-# #,A# ##4;-#(#%##!#&#(7%*#*#2$,K+$$ $$$%$+$($$ $,$$ $ $!.@F'( ("S4$", $"50%$&$,$$%Y/$$*$$ ' $)' $0( $J R$ $)C!KY,$$-: S*$'3R$&:$-$$4$ $ $*$+=$+V %@$(@$$ $+> $=$> $$$$$0%$ $$+$)]$Y$"$$$3: $!F$ $&< > $ $%$+$0$ A$5/ W!AW >$%$)$,+$FJ*:T)P $2T"$!%%,%4%%)*%3-%1%*H% F-%*V%+ZT*%%4% .( %"%%%!%% %2%.%%%5/+R5%%%.%%5=%!%% %&;%%4% >-4 %%+%(%3%&4!%>.%>> %2%%!%%%+D%3*33%,%.%,(> %&%%E %%3<2O(%+74% M%)%(+%-%S*%+%> S+%">C:%%%3%!%27X &*a :-%>%*% S):%% %%(%%&C & &*&5&4U,/ -2&405((&&&X&)&!> +&&;2&?-&-&!&!6!V& &!B&&%'& [4&38 &;,:,9-(4<&&2&20%&>2& &!@A[ & b5&& &2& /&*.)&&,*;&-&& & ; & I*&& 84? & ;2&!&&&&&H :&4&4&403D&M:&!&*&V%/2*&&I+WT V&;&+5&&(-&&*&L&&3&4:;%&+&.\2^&+&X&;5&.) '*[4),')'-X5P '= *''4',' M'5]3(4'' ' ''' ''4T&A3''C Q ' '3<' <'.')' ')4X!+K*' ' '*+W',.'''=,'"L'&==U'"''('+''&' '' 0,0'^' *2#'!/%a*N+T'&U0-4'5 . ]7,' E4)'39 ' ' b ^%'4'4( +C'( '%'V''-+3' 9 @,1 \,' ','J F*' '4 '3')'%'+'/!'R%P R':*;-9 9],.' ' 2='!O' ,/'%'(/ !6 '- +'-(,(4,3E"((*("(((2 (((3E(8.(()B( (;.)( ((((&SB)(((2EE.,%(2*!A4(-( ( (;.(4( ()<@3(((5( (-(V)3_(( ((-( (+B,(!(%?(*(4 ; %*,(2"( (-1)((4( ((`%((4.((5E(32 ((,(((&P + O(!F-(&;+((2(] H4((!(( E F: a( ( (2((*(( (2)E F3= F G))4)3@((4) ) S!-*)()V)*) )E-_2))*!?5)3[3)) ),) )/)+)&)))))-)!)() @4,1) )3G )I 77-9 );+)-)!)8)*)))%) ))&*3) )4)9/) ))) )-)9%)-! N-)I U )[S ^)X))")) )*Z))))-Y!) )) N) `2L))))) )=93*,** /(**U!* *.* *+**-!8!***G47* * 3 ; **+5* M***"*%**3*,V.**J * ;, 0P!*"****-*!* * 6,*[*,+*/.3+I*(+- *47!_)**!8*4/ ,*<+*,*2GB.* +?%*4]*",* *,**.+* *L*)RA* ** . .F3*[%*!* 0*(* *4*4Q0**%*+++ + ++ ++.+%++%+3+++3+2+ + 5'+ ++*++9+*Z3+)+H+ :U6++13*+!3L;A!+ W4+3B44 +* 55,+@2++ +,+ +%A +*P+=S&+ +*+ +;=+%G +3+!]+-#+(++%+++4L-+ + +++ ++1-135!+4,+<+)++Q+LR&+)D4++%,",+0 .!/*,,,+,-:,D, -, ,?*;, .5A+, ],%,),3,, ,",4]]5] a%K-, ,3,Z),(,,%,3,,K,&,=E 2,!5 +%K ,;, E, ,,O",,,!=,*,=[ ,@4, ,V%,- B",,,9*,,*, , ,,,,)5,/,,,,,S ,.R/E,5.2, ,)X%.<,!,+,Q ,B-,%, J4--,*<!,---+-0--3-%A - ---[--!I)- --4- -52--M -+- ?--%- 0-,-,P4G!-.-+-J- V)-S J -!-)- .4*_%-*----+>--3- -2-*-=)-! -!15-*-- -!-!--% .- -%--+9-).- -4- 4- `-!5J I-!-)-,-2.. .W<.. .. .-.!./.<)..!.+.51 .*.!=Q.1"4 .)?%.@%. .+. .%.!.+.-S%/%... %.%C.,;F..5. */=).-.@).(RI`.%7 .- ...%; ;.75.%...F..+G ..4L+.% *./ ..(.%L:I..(. . . .4A.3/A2:&@ R(/2//L,/ /1G5/+/ O+/3+="5-?/)/4/&/,///,/-D-&;/)R/// 2'/+O*2,R2 /)/)/%7/!/!/ //4S,/2A,/-1;"1 W1 1 1W 1 R*D,C+1^Y*1<1!1+R 131-21 1aaY!1S(S F*H 1V)E 1,YCC)41!8 A 1%'Q51 31%1214A11.1119191-1 8)131 6 1:`1)131"1\ 1D)1,Z11!1B1 1,%11 12&2F!228?42&5 22 2E22'2-2 2 [+2X 2,2 64222Y*2;K)\&222 2%23J@2AI 2 J2*2!224 Q=.222;.;44<22.`=]2 2;2+]*_ _ 2-8K322242 2!-82 2%23*2"2,2"2222+X F2 2`%22KL D2!2W+2!3%4N3 3:^3\3-P-3 Z ] Z3 ]*323 G!@ N*4533)^*3"333]233)8:33 3 333 3*3<3'&3)`*C!33333*33*3%3 M%3 33 H<37>53-336+3%3-363*3-I!8 8 3*9)Y!3-R3433=5+3!3 3333%B`*3)5.@-3%3)3"!3!_&36,4*X*4*4'#*444,4%4! 4444 L*4*44#4+4[4"F4M44 44= ?,4 783>W,J!444 V443U4!_J?4: 4,4<4 4+44(44 94R544-D 4%4 4 44=3?4+46-4?%442444+5-C4(45 C77-448+4 44 4W+4H4S 46 4[)47444"5;<)5 6 55,6 "-5+5 >*8*5%75 5 555)=Q45555!\ 5665!?5 5+5*545-555 5*K+55J 5*5,5355%5*55 5*54625!55 U*_.535 V/BN4?+5a 5*6(5555&5855&V*Y 555a+5&5!5I!U)54M45I 5%555=5 5 ` 5C5 55)5,555555<-6 B6<6 6-#6,6*6-` 66+6 C6+6 H06 _ W)62[%6P>57+W66B 6%;!;6X93928 6)U :6!H+W <.6!6A&V66 6 9[6*< 6V)6=H'6 6)X6V 65K26<6*F"6!6%6626*V 6%626)76G 6*^ 6 ]66'V6&6!JG+F63_6 Y6 67&<5Z*6'_/_69&2)^ 6 66C63,V)G-7*78 7;27L X"7 7 73I-U7+7@77B<V(7,7?J%737*$"77%=3733%7!> 7)7E7[&7*7M+7)7a <"<;737!1747 H7+7[ 77N57K)777:9 V,7-T2<!773]Y7A4787 7727N)78B ;!G737*7 7574S57"K!7N L!7!V\7"7&7!77 ;,7%'8>.88'8E"8,8 Z3I*&+8.8&8=8'8+FZ8%8-:)888 8 Q-8%8&888884O8!C4L&8 888*8QK5N28 A8F289]+8897 9)@H8 8+8+8&888%8*8[!OH8 8 a48&<8!8848H*CH8H(888&8!8B484N8R 98`3O 8"@ 8*O%8S*T"8 8,8!899 H9-93<9*9999 999 :&9*999 9; 9:9>t9*9-9 9>D9,9&9< 9&99*A":,9 99E;9+9%99*9&99 9!9 : M%9 9 9:!929 99+9&A,99A*99? 99B3N9&Q(9(9 I3:I!: = 9&9 <9:9E999=>U5<39-B4: L W4ST%T: M:,::>>:=: :;::;:<=<*:':":!K::?M ;: :&: F)<+:.:+L,JB*L%J)L!:::3W?*:: :::: \ ]:*: :I!N4K%::2/I?+W: T :TTI ^:*:-::P':%@<)K3:@*:::9:L%F*I;*:4::=;,:2:O I::>&:R,::A3@&:+CT":!:: F::3:; ; 7;;+_?!; ; B OO;*;M*;;!P;/=,;2(; K;%;4;; ;;%;&;;<-;]!;&V%;;5;";K;5E ;);;;+;*;;+;!;;";;3;Y4;*;a=*;3;; ; Z;;;D;; ? ;>;--; :A'<;); ;J2OM)N N FO L%;+FX,L&>->;;<<<4<!D-<.<<*<)<<<<</<*<W <%<2C< <Q%< <5<+X"J '&<< <<O(<,<<<O*<+<4<(>5<> Z ?&< <+>3?<5C&-Z<3<5<B<<< <<4<<'< <+< <*@@<%< <<&<<'?.<><<<-I&< I+K _<-A<-G>3=&J)==.==&= =@ = ===%==D)=== =*== =E4= A =+=5=!=)===!K!=!=&?2==>)ES%=,=+@ @=])G(=-Q =(=== R+=<=5===)C=%C3=]== ==L==&=== I= ='='==<=] ==%.B =,==&=-=;=>4>!++>+>*>>%>2>+>(,>>&>> >&AN!>>4> G> >">+>4>+N!>+>3I/A>">>5>!D+>D D >> > ?+>>.>">&R!R%P>*O>X>3A4@'> >->!>>%>>@<> >@>>I>F@>'>&E N >>*><>;> `>%T,>!A?/????I*_4? ?O+??!B*[?? ?+??'=?(I.??!K-?,? ? ?*????B ?)??4??G@?+= ''??' ?%???'?/?A!?2`)` ?? %?&?&??)?"W@&???,A? ?SN???2?3?? ? ?,C??(?"N?@@5 @&@@/@@@@+@@@@ @-AQ@"@E@A(@@@+;@@!@ @'@&A @!@@!@@ @@;B*@A& 4@ @D!@*@A,TSB ['AAL A-1(A AaJD*A4S,A-A AA"C!AAA[)AAA;AA+A!A*AA @ \(a RAB B&B,BBH,B B BV%B&B+BOFOB+BK ^3Z2B!F&B`-B.BBB BMB&B!L5F%B4B)O B'BB4BX/XF BBBU*GB BBBB*B B+B KB-B4B E*BB"B!B B3BP B*B X=B7B.B%B B'SBB\a+B,HB%0B C C)UEC CY2DC&D!KC"PCC&CCC+ C%C*CZC!CI;P)HC!C%C!CC2C4C=CSC*CCF-C, CI%C C-CJD*C,CE%CW X+C C C C5C,C*C"C*CD C X C5CC5C,W*D(C,HC%CC.FCC&C&CC2C!NDEDD D(LY4Y,[ D3R DN*Q&D&D"D,^ D D8D*DDDD DDVD D)JK*X!DXD+D D!G5D3D*T%DD D3D!D+DD"D!DDD4F D=K-FD( &DD D4D%DD5DT4N+DD,DD D"D D/R D-D DGN:G4D,D!D D2CF2I D D%DFDED)V R+D P,D&D E-_E5EE%EE P[ E!EE EE2E%EEE&E4^E2E&Z,M E E RQE!HIE!E3E ^%E!EEWWE*S ]&*EE%EL?EE)E+E+E&EE*FE,E%YQE[2M EEE EEEE;E-E)E2E+E)P E E,E GE-E'E74E%E,EE EVG&F&F&FZOFLIF_ __` _ _,B+__!__*_ `+_` a& _=___ _ ____ )_)____ _(_ `,__ __'` `+`a`-`` ``-``"` 0`:``-`,`*`!` ` `` ``,`,``)``-`-`"``a ``)`!` ` `%` ``%<+``*``*``` `,` `+`` `` `a` ``4`-`*a"a%aaa!a aa*aaaa aa.a%a,a+aa a!a aa!aaaa a aa(a*a.a a a"a a!a,a%aaa&a&a*X&a+a2aa aa)a*aaaa)aa!a!a!aaa+a-aa2b a!a(a,aaabbbbb,bb<* j.<2))3 & +5<+  /*= 3 )8. -*+/ = E; %>23+!4*.5! "5 K628*'$*&u%c &.-*(5&G O3  &(%! ' 3E4N(b *!-".#N(%* !&S '4(2!2b ) =-+3,&9h-%;#,." /" *031474236-*3 *4445:627 /:',"W ;<=4>:30 +? 6 - @0&A; I.COBC-D  5F ; ! G"5(I X:bJG K4LM)-N P+Q ')D  60 4RS3-%T+U4*V A764W3F!&X):  Y+/x'Z[ \]4/ 51 ^H4 _% `a 9b47&Y<=!c d!.e-,f-g%" kmn   o4p3 + =24q{,I&Lr5< s.:#t45 &v &w-3 y ).C2z0M-|  !-+)}5$ ~ -3& >24-2:*= ^&. !=93 --<'%&3 AE -2#4&( + 4 K   .&9O H4)F<=+ )* &a+_"3L34,).!3! )%5 .&  O-* ?2&Q)3"( "425(*  .!'=9 &8K43  +4*$- &2%!;;/ + 5V2F4& ).!)P5 "&2;4Q3 ?&T+ (K % +(23%* !. G!3 )!3C4+*$!)<&-.=)-6*/ @H7!'(%Q5< .!>3E+%%3) 2E 2!'.& &-+-2)  */% &)3 ."> -F&I2&*3M.94; ;& 3!:-32&)!:%(-* *+@%I(?!_"c =)%! (*-P-P +W2A!( !=43(= 3 5'4'!2 ! )( d  ()B!  4.4%,()"1&*)0d!P%5&+;=) )&!> P3*& 3"5*& !(+( =; +*4(29 =.J 2  (  N  & - K4<  C,&:;0-<%J7442$3.5# 4E'P)'. 4+)2 4 D 5:! 4 44 R&4!6!3%=&I*  ) +  *  /'5.+* C4(%%; S3A*O=; -+) P"&)' 2 5.> 6&< 3&J 44705&*9=</6./L- +  & ( &  =; )= , , %"-.;;! ,"  Y4(4--! *4%(R / => ?@224 )'/.-]2 ) / ](Q S2&*30-`. ""/%\.)-A>  3(- & / >-3U -)%).V IG,*&!,  2(!-;-2 &,) (24< )&(,+3.;3532)  3!=+3%5 ! ) 4d M!)4G.JE:; 52 ! `+ **-&&= % 4 C:?)  9%4 )85 ., %"N4!E < L:4 <+>> * 5+ * + U, *3  !()P!*<)=N*+6 B , & <4;Wd- c6&&(C* 3*9B*=' +*5 )*#5Y% &5S3(K(T< ! 20 ( 3QD ,E*9 3)D&?,(( 2 < T3% 2+543-13!* B /*131"& ! )3))$3- Y * -+'<):?,U &V%*Q Z* 9<(,"  5 34 4 &]%3Z(*  ==* )Y*;3 3  *4 3 3 '!7*!2K !+KK&S,2%4!,),,& !<29 %*))* CY,;S ;&X- X-5?=&* &3(5&!+((%<%' %?,  ()A ))238*%*=4W3-+'. AR5!4' 4(3$..(2> b2&C !E9- 4<5'*>5:),-;3 ) 184B&  '  3 56.N34*+* !!:25 3 . & 6!  :,6 *4'- D-5 !)&/ '4:+*-@ 2.4 6; M3-0&%5 6 !)` ^!+[  83+9 ,;,_. - 6-6/-&%%-4304F0&* "NM %:4 5  <.&2+*& >N7473/<A3< H  3) * ( &62/)^)9 32O5^, +"Q 1.,C3+*<5]b.O  ,N* (  % , 3 2 +  ' .S*W EP50/  / -   * ,$3 5 %OQ"G.  '' ;@!     3O= '0U 5  R! F!   ($ =(    )) a+  3 5 * @3B +,,N  (+  *  .5#* **   &  %5XH   8 3 +)   3 4X b 4 4 2<W U4 3 % 2 Y +    <  -! *%  *3   5  - /  T   >  5N)2 4 %  ?! &' > 8)    5    C%   &.I < !$ &^2B3A3)- /;< ) ()*  $5#-24 )  )  - 3 2  ]-/+ )    J K. 14 3-+5 !2A 3C*  *Y,2 2024  ,  -Q,. (3  = 4 . :4A* : ;Y:FN& ]+  - Z )  _: ! * (  , 2,     1 :')  +L( ,  "/    (   [ ) +;5 !  - ; 8 2?36 4/  ) )A %G ! 3    "5* ! &8( (%* - 4 ;  4  `_  "H9 +, *    2 4 + & % ;2 + )  !) 3 ()% +  - 3 (& 54 ,= 4 - * )%    J!F  b A42 ,%2>, a&  =4 ;^<`; '<X3- & P (4 )2 )( T 2  3  - ) +  4  ] 6 !;4Q&# >@H & ! .( * -c! ! '> '=!= %6 2Y ` .)) 3+@/4 5 !  & ;/ *$+ 5  M3 3$2 ,S  ] =  ! - ) H % * B 4 .( &S.X$( #3 (*4 3  7!-  2-3  M5$-    C 3! 0)3 2 - &  2 3Z"  .95X& * )  ,&  !   %"-(*   4 4   4D - , %().+4P %K   . %5$4 ' * - % 5 GWbb3%4  , !4 ! &  W -K&  ),)  -C. !Q( 2 .' ,3 (3   /<( -S%" L' F Z #% . +T+ &54'&*3E2 6 F  !L.^ ,c !  5/) '(  - & 3 &L2     4   ,=2W -C   D      5 ;) * &1  (_  0  Q,     33  7K+ + ) 4J Z  ! 5 3 <5$ 54+*7,43 4< .!L&T)` 5`- a3`(%&)4 ; +/ 5/(+'"(:(2+' " )&+!,)(4) 3$->41+:  %!&E 03&C%+- **-)A.,V,4!-  #_%30&('2)( Z .,32*&-L3;*  5 > MT%R,0&,! *%)3-!!:44"+-))  %1- %3+-%*-(%2,2 .4!%O+ 3'0 ` 53(* *4 ().*D&3!IO %,.:( '! .&! -21<:A;<< -35*2K3!F+032;34K&,.J *3 V*2 )&&-2-=3*2B5/ &/4%)3#*!A!233H+H&K ,%4%2 6 "<!  4-?+ 5%; )b'=  !O31 &*: LQ! !  24 ([ '242 6*)43a$ 44Y-=33C'/$3*A,54 43.#b!P &!54 +Q*3 %4 4B( &%=*")! < V "4*32& 5 !)5+I393&D&&`  3&<C  +2?&5: 4# -T(&!* 3  !9! !A ( 5=;4*3*, -Y+!,<-5!+;4*H-4<5H2  88==&'3&+,a,A&   ((3   % 50 B )3 * %/ !;<% !5 ,2 F*N88<&+ !B )P-!&L=4A-2+ ,.!2440% c +03(%P*&6 %#(#^&I*T4'5 /.4,32 " 274/5*&&0( -]!+=[.3 +;N4T) ++/&5"" 2.  *W!\ G3K .  %!Z+ ,?+ $4Z2_  4*=22D*L+)3..E2?4/J:.<2 S=4;-"4-!L5,- A-2%0+@.<0>4,_-&!42+!,[=<\;;# FQ,!)3V2%S+>3*`2 ,,B%D (3?434a4 ,( -A- S* 23&//* '2-%=%&*.] .* !7') * ,!(&V*#!3" .,3V% *4&5 ! +' W-Z2G%J 3 .#,-6-14:5& 4 &;W 5) 4_.3&-)&(-!F. C .3+/3>J!2* 3J+P (S:  H= 3<);!L,?(*!*W, % )**$+$" + .2 / ,? (;!3&;-4=! 4%  );*44+&43/.1 +MI!V!) +(2  A+>?4Z <#:*#,!0<0)F@43-.))5!M 3L!.%,E 4 -*3 %     @ (U4-H; &1J*P!K3P K=2BS++%!2*L )b.+4-* 2  4-\.%+2 0?&#. 3%1!+!4,<)3 .(9%Q -)#-()  %-O ,( .63)Y I+5)#5 &=&VP.&E +/.0%!"A-O$0(.3& O%S32!.: ,+F 3,(53)# $:8-,*3 4! "36+Z%(A2"2%I"9;'D`,(%  *' cQ_&*'!3I'2,2[,!44&.$*  '!)&42*)6! +2T;"* 3 4WQ&" =(24 "1. 3C&M(L( ,%50(  (Z4$.B!(!   3`%3= +! +R8   .!4PP!*4 ? ! K8D   NR26 &.,)= -2,W.2a   !,B  8Q &) .-^&* A:3E+8(*4%+  3S 96 /-9+-7*  +*C-+-%!   3M M:()4Q,=3 + 40-(-I02&523&.-(%32.=#:&$"I)$-F( (0 4$2*H*&3L "+ 42\4\\ !2E3) [!+ .('@5I 8 ,4&( &2 * 2G%!2! &  "-G) -&L &UE3 "%&+-31!3! ,Y!% 1 >%!)*(`34-C"6++33&5L4;<.!L2!!*243"&($%U \32b "*8 8$3: $$  4NS5$!'+ )=-S&$33 *4+)H/'  FL  I 3H(&: ,(,-M+7')!2HC("D+D%;;-A !+Z a ^(  %3%-2-:J*5 1&--R])N53&2&5)_*'5-&&*O+=<> !$5 =H!<2 &T".L +4&3EH ,3<)/'3!21,,"5%4&./2$ I<  (R-1 S3 !5[2L 2`/( !&432,H& % 0F'L!?+ 3) 53:=%4_-$&`(4 - 3M4?@ ;!!3B0*<5',I3 +')-/3%(( ?. ,2')'&3.&0)41$  X,(B)/4./ (Q  - )Q35D[!2*I !&.K3 =2= 43&!*-!* 3":$+ *T!!;-`&A3)B57+& %D"+; &.)E&9<2()]-X&]-3S!H--,:!*3G*!  5 4%*24!O%+(!!%#) )W,))5&%Q&S)(  32 ]*O%C**4&E!.'7%'!(4E+# V!J:-.!3)'&54M42`**G!--5:: = 5,:"&,#.4&2"  -&3)!&!! %!)9>4 ) ,'  $3)b(R 43]+2&F3F(a3H+3 b4;!(2)-"\H& % + 3H 5;322Y(I bb E+ 0 @( ?3++"2Z c(a#44( +*& ']&Lc 4+, &# "( #(G4 24/)N&*AK(..) +0!.I 4&[+/%*O(-,@=-" 42=-D(&5;!*(>! -+/H T-)X !-X&&N3T. * 53 ( )9*%='+1+ < /*36.@'9<&!13+_(--2 :+6+*  +,"! 6 2*d 3:'0 D3O5O. I  I&]/S2 )&3LO4W  "&!@0&H E 5&&2%Q* %9&"./5"  M 3 "  > 3R (W 0>;4+  Y Y!RY3+A%X,!_ a9 :+)0I":-.H+%-!-& ]!!%7"V <3%,X/-V% 53%*`V)V3F. )Q-(-& !)%,0.3 "/ &5.4 -3(X ;3H5 -  A  ; *   7? *?,  3 (+%( ! *!% , 3 * ) 5 ( .)4H( )*, 5 D2D - %. 0 )      46 3 '& MH+O!5+ *   &.1+ 5 4H;O    L3J*  ! &Z_!+% 0&  2  4 !: C !- " &B R3  , ,,) ( R%, )F%   2Q3% -Z=+  -.)&>%    2*"/-   'L !8!&  +  K,$- 3X  b4 + !  &!)/ ! !!;!=)<, -!(!9(!+T(!6.T&G , !*U D!($3(.!-!!*!5!+ ! !%!! N&!+a5!!! !!!"!E! =,%!(!%!S2V%4!!:!2!;!%S+!+R,S!!!R!)!!!,!4!2>,!!.!,!3!!!;!:^)!!! !<*!,!=A!! ?!! !!%! !8/!=3!(C3%!! !!+[ !=)!! $, *!%%)!%%!> !O %!!( +4!%"""-""""!" """4"C "> W-" I'."&#3(<")" "P*"D"/X""O4"32":("!"A">!"53$ 8""+ ,"!Y)_"""",") 5P"*Q 5*#" " &3>"-"D4.C4M" :3.5#%"" P "*.+3"">"F "("F4"%# .")" "+<H"X," "%""%BP_T*"+"*" "*" )!",,"" <&,"")""-";"()2"-"" """0"" "" "0""%" P,""62" /#-##_3`*#])#-7 #4###"J#4# >-@#&# #3##2T(#&###3#(#4*# #Q#### &GdD #.1#,`# '3#&#='*#(F"092B(#%J@# ##'## ###N4 #%#-; #.)#4#"L #$9(R# #*W# W2# # +)#(Z)#(#Z #'#.O3F4#)05##4##5[3##:##<# #9#-#3##!1 #&##!###!"!#.$5P$ $;$$&?$4R$( $$)E2`($)P:N$3]I)$3$$$$$5?+$$$$ $$$)$&$& $3$ $(R$$-$"Q $2*;!3$*$'%$5$$ $ $!$$6+$('$ 9(\3$'$ $$$$:)2$$-$+$&$./3/!$$T!^$ S($.<,$$$ P*$2$ R,.J+$"$Z9$ -! U $,)$$$$$$ b R,$)$ $$%4%@%%%6 % %%%3H%2M%310%4)%4%%-%*+D. Z*2%%*%%:%%S%)%&%'U*)4%%(%-% %%:@%IH*% %+%%1%(<%%%(%-%3%*%*%7 I%%%!^%;%%&E% %,1!% %*%=%!S %"% %&E/%%9 . **!Y% 63%%-%3, %%%%+% R (*%%%;%3%%%%4J(@-%!&&,#%&&!& &&*&&,&&&,&&8,&&*E3&;&&&(2)4N4& 3&%& D4<Q&K*&2& '&&&&-] & -0 S&&*&&)&L!& && &5J&&4/ 8&)&*5&0&+&S& &"<:&&&5`-& Z + > &4*-&)&3,&'3&&&& &>*&&-&4&&'&R&(& &4N**(&,K-&3&(&)DN22&&+&&+*& M+-&4*R+& /X-'5'/'4<95''*')' ,'%''' '-'D '' W(''!..''-' IJI%'E%';'-,!'+42''2'&'4'.'' ''4'<'-''+'*'&','Q6=I+4' ''P8 ' '9'' 3 ''''' ''' 0'4(&;!'' K%=' '4' '7'+'^+'*''5''3'/:*3'-*)'='-* ^' '(''%('S'*@!V^&V'' (((((%IK( @=(4(*(.(&3 (4J(+(,E**(A=( T+Q (3.2/(2I&F (=!L3(B ()(*((+(),((-(4(4( G* (/('8;-(+)(,(( C-5 ( (( (4(5 ((!(()((+(((((c,(3(47/-4(5(.(8 ((/(*( (*(3(()%( (<(!()(%(3("(,(&(+0( (4) )4)%),)+A)E3)-) 2,))%X)9)4:())*)-4<2)*),) ))")-)C') )))*)))&));)=9:C )*)a,)3-)()!+ )2,)!)3).Q C4)5))) 65)+K"\ )3-A)R3))\c5))>!)4?))))()3L-)L)!)-+S2)))2K),)3))-))*T4*(*49*!**(0)C ** ** 38&] *!**)*S S *;*%*)*",< *)L,*-*****!X,W;$ +5**3*2***7S'3* U5a-* 8'4544-*!***2 ,@*+*<="*J /*(* 3*JJ K K5K K&L4L!**"*1!*****8 Oa3* D-!**K,*.*G*^*+V***+*&[3[*%*036(*(V*=3A2*****&2,**.* ,]+*C)X+O*_a ab +4+=T +0)64+)A+++!+++++4&,+E)H0+)+!++4E] ] ]5++++G+I+C4+)K+@++=I;P+ +/+ +0++!C+H+((D+-+ +J;++N&+G O20++23+%++*++ ++ P*+%++,!*+U5+'A!+:d*+ +++0+ ..++*.-:+( +*H+M+.4++%+,+,++-5++X,+&+ ++4/2++B.+ ^!R+++,-5 , ,3,*,,!,,,,C*,),(?@ ,,Z,,, , ,-,3,%,,5<+T%, ,`5,5,40[3^3,,!,,,(,DC-,,R,31 K,.,3,U4U),*,43-;!M ,*, ,!,2N',N3M P4PQ.M/,., 4,;D4E,L-,&8,&,+3,,+F/ '@, , ,.L+..&@(Z ..-*.).&;/4504/"/,/ //3//A:(//0/9 //Y/1`'c 1[ O;8151A 1&11 4--<&1 11*@1"1&9&1511+6'a11F`*13F5X2U!12%111@111211!2&2G 2G.72 2*2"2+22+2N&P :B 222+JD+282 25 2222*2(2); 2Sb*J52/R+b25222!22&22=B&8D<2)2D2/232-22 22%2532)2&P.2;2-^!@2'22,272-2*2.222+2X222322 C2H22& ]-@*2>,22%2 2!2&2T=2 D F 334<3538/3'436'33*4!4*6444(4 44<554+7 4"4 444\44R4!44.4&4"4+4)444,444 4;4-7 874:4 4*7-4 43/F344"4*42b4 44):+444%C424*4434 43U )%4 Q :+43G*4!46 454 4,84 4:4 472_3O 4,84,44-="4+4(Y]])]47*74+7!97B4 9 4 4 ?444 44+44 =54'4H04)7*5!4%435N 55C+VC_ 55%&8455+5 5*Y!55*]55,5)555A)5 K 7!5 5!5F3I%-555-555535 5<5 56B5555"5 5 765375 55 5.5 5(T5 5 A+;,5[5 O)553Q5&5:: 5275!V55%5525 5 C5(N5+53?*5=55+5!555*5 5 5[666 66+6'] 6 _6 6626+,666'66 6/6  < ;+6 666)66 ' 6 C-6:)6(L)L6"64\6 66&66(66 66 >&6,@3J626+6/6 H+[P56!6 6;6!<6366!6 66 6*66 64^b4646 PD66-6!6+766+6W-K!67)C&74747 77 a&77!;*7747!70L29477)7U7757:928;7%><77/777777"LU&7 7473]77MS&S R77 72O74DH77%M7+H*N)7 7;%<7G7/7;7&7 ?7+7H-NO(X%7 77 7 77!7!b 7&779%7<7777*7 7477I377*7 777N-7-748d83>::88F,888%98> D8D8/8*8*88'B/C+B48<829 8 8 8(V*8,8RY,8+8.83b828 88=%8-:%8+88 =84=8&8 8 8&8&:A!S 8 =:.8J8A4@ :<<8/@ =8>@ :,C"8*8N888 ><:8 8)880888*8 8+8838!<8+8> 8*F)8*888):8 LJ!K8>+858859)G!;"^%9.9YK(93M*89 9 9,9%9 839994:<[F399LGO[!M9 I(99-9*:49*9%9 99!99499&J 999 9; 99/9/9-9*9 AM*9!99999'2 99594 E9 G%U)9&993Q92999!9?9+99!939 9*99,N*Q'J*999+9999!9,9!E 9!A!DSW 995:2:-:: :)::*::: :: = :!: ::/: : ;:::-:: @:%:>::-::*: : :+:/A4A:::3E: :!:M.:H:F&DR?Q,::::/:5@-:+%:):+::B::/:2::(5,BE:G':*G::%4(: 3Q*:4:*:!:-: :%:,:::: :,@2:(:+:D!:;Q; ; _;!;;%;;; ;(U;4; ;;H ;;=+;;+;;5;K&;*X(*;:<+M2;;%;%;N;%>;%;,= ;;;%;(;;J,;+A,;AM=;3;(>2;+;2;'A;+` ;E; ;%;.=&;.;2I&; ;<; ;);,;;;U U;P3V!V;4F,;,;,;!]2;<3<'5F&N<;d <<<<,<<4C<<<<<,<2<F,<4=<Z< A'<5<4<< <<P<3$N:R< < %<'<4<"><.<&< =4%=<+<+<E <(<M2J]<!J [<5<*==O*<42%<%<< =)= =4=5=*S@)== =4B =*= ==!= =>=*=52O&K =4=,2K&=.==)==I=&?=='?Y=H+=+=:==*2S==!==4= ==3_2=3=*=&K)=N*=OOE="W= QQ= ==(I:= ====&= M,=3=M=X%=*=A=>,L2V+>> U(>A>8E>-> b C C>!?A ? >>>>> JM,>"P\>%>+>I!@D>&J >)>5S3> > P"Y>>&> >)Q>3>4>>->->>>>&C3Y>>>5">> >(>>&RP >)>>DD2M)H->(c+?!> >+>0>4>/?>>>*> >2>>3>>>0>>>4\Y4?&? ?*GN ?,? B?!?3?&?? @ ?*@ ?c? ???3????*?0? ?&A? ? ?&??3A%?+?B? ??+??!?!??E? ?4?"B d,? ?&??4?)M?"?&??S? ??? ??4@(?* B%??,??V)??*??%&3S.J ?? ?F(??!@4L ? ?/B?4A3G? ?V/@&W@@(@*@R+@3O @J E@(V&^ @@@@4@,A4"@;@@@)@ H@,B+@@,@+"@-@+@+@/E!@@@@+@-@"@ @D@@ @ Y aa4@@@-@&@@@ @A@3A`@@5@"@*@@,@%S+@@@2@)N!D `+@!@-@@@@!@@@5%+F2A FHAA^3R A>4A+ACA MA%A AAA4K'GA M,-AA _ A*AWA%ARb;A3ADA+AA3A/A A3AA AAAA3AX4A AAA A+B5C4BAV-A"A'AA4AA A-A*PB3A+A"XAAA4F%"F c B-BB BB B5OB2IC&B ZX4BS V-B(B3BB BB T-B-BIBF BBD D3DDD2D4ID4DE[EV E&E%E*EO!E % EEE%`4EEE,E:E%E F"F+HE EEEME2E3E*X,EI E4E4=2E*E G-E-EL!FE MH ENE EE EEP EEb5U&U;O EF^E E*E F `]!WP-PU"PP P&] _P.P&[3P UVPPPPP-P^>PPR4PP"PP!T P,P-Q3Q]Q!Q*QQQ]QQ R Q-Q%SQ Q,QQQ3QQ V3TV*X*Q Q)QR+QQ2c NQQ-Q"Q_.Q,Q-Q(` QR!Q4)QQ QQQ-Q UQ*QQ*QU"QUQ*Z QQ+TQQU Y"Q5Q%QQ%Q+QQQ)QSQXW%QQ3R!Q&RR!R,RRRR W RR?@%(A3CA)B GD3<36E!F HI4JL 8 3M N) O+!Q/  R)4*]KST')U4-VW2X!1 Y37Z4[Lcc\!8'4]+7D^{ ! _` :  m+a 7+b  -f$&g+ ;.&h4)!2i 3 j3kl # )(!#n $ ,+4o 5 p q )r!3y49+s `<- t5v)w!> + &!< x z 63|}~P-!O & B35 ! 8+ A) !/! '.4)   (=+.!5 7J.3*;2 50$& ' '&!:/3 -6 B'+B;3L D4 =3&3:2B; </:'J _ W+ H 8+$ ++ 2044U ";? D Z2 ,!+5 &!14L4 #4?- K !!e),! /2  )9**SQ)38 G2T! .'!I)G ,22&/3D/ &  N<!  *+0Z&>++ %!  )E!32(3%3.4&  B.*& G  J ; %c+B  3P  >)9H 7 " W 42).!% + +3_% N.2*^J-+R2 # H* "c  43=? +/ !A+  /2+$*(2  )&<; ( f)" '6* &R=4+ 39!L!>],"(,)')5!842=2!M39: ! 35)V9)C    5." 4) & ;  & !4W) $  '!?!   )J- ))=)!&/ %.4a '. ]  ,*&M* & /(!]!)3*  '*4 !(2B5 ! )53 ;/++& **42V  M 2)%&.  2'+3  '&')=<4%+2* $-&R0 - 34+&4 )!/  D ").4&9'.(+(  > %B2$&.!/ S)( J: -)_4*>/  &: 3'"  !4 ,-(+* 9 P  +(--,)1,4";4N'!N 3(3 $<3   -? ),:4S!<:=.3! 2 -!/+!.3& H "!P;+2!56=;4  * )J ,)% 5  L3+*9&4O O  8E!!*4 :<!). -/,T 6 a3 P& 433H!& 474POQ&43 &8+B)) 38I52&)#<-+<4*3;+/.'+ &! Q- )  .=;.@3!I3&5>;&".!<) !3)*26 ( . ?+?2* G +-2 S%!%250 "8'4\*M T "B5U!2^.. +4'+! =;< '  ,O+N!$3.5:&)DN%3 )A   5-  %:45!)=IS324  25%() !!!3>;)"/:2 32 )!4U5T!&* +('2&3  &8 ! 3!9 7 <(=0/)"  ).2.=) +6 & 0)+(!A!!&653>!=)?)9  2$  )&2*# -)) -)!D QT43Z)5L=!M2(-3&) 2 X% & -,;**C! C!5 2 5J) =- ?% !5 [//.% !** )D %7!.+E )% ! %35 3*-P+(+&2 3 / '!) /' NW! T=4 $5&'7 0YO/0 3 G*c G =< *3) *R'J/W)J++4!;) 3A3';):;? H +K ) 9+?= :-f*BE ? 0+6(< 4(    4c23: ')!;3*< 0 3#/):  F)@ &345  ,CV-!N)-P*2-PP+  ; Y.YY23) < -f+;! %<6. <!/  #%'R* 4); (=**2<. )33 !;;M* )&7 C. G!G%> b  !2 4% d 4*M'-4+2 )+'*,<; !!5 5P-N,K@ Y*+> ++&35 !,30')2(.2> ++ !!'!)(43++4*03(943*<7)!=</;!e :[ +!5;$.= '483 .&+/4N c-5"!< S,(*+(.(2:,&  -S   4 4" 2W)A* )+  4$4 4N.032" 24+  =)H /. # !Cd M*42Z "5 4H+'! () [ W 3+ 3!$"4%  *4/"&!)J2 :W!N%  /3>47*28 32L( <4//'C2.?593 - &5I=*73B2L %4 M3 . * 3* *$4O%*#,+O 8: +*2)2D.'/"%4&_ +% V4)?3H&&U:@  55J923%:);) 33@52 "  3- K=48*% ^  ; !  (B &S+).X4$2:83  15:! 2),30& 8/Z5* 34<?+!4 &4- !   3 5)  ; ; =/;% 3O] $: 4V!V< < B  !)^  3 '   &     B! E  7 +6 )  )a-f   +  .    !  S4   + 3%&   A,  &  3 )   =./J* *  ! 3! = +  +4 A !5   ( 3+ -,  )# !  P/ )   + N4  / +=  .      )@!7 L ' 2R393   " & ! 4 M3F;G`(`  ! 2   & !  f*  &   (e!e  43% ! 3   - )" +%  +  )   *FH  -  ,  ; FH4  &  !     *2B !  3     4 , ._4 4 ! !+ 0  ; 3       ")/ 36<*< * ' ,  E F5     5 3 ! 3 & -<4"3 - 4 4 , * ) =C3+' * \&. ;* !  =  , %  ! : < < :) 0* '8*SR4 ),   #  *2   - B4 31'*/ $   ) 4 + ' ; %= ,R )c ) =D?, (%   * -(.3 .K, )/: 2 /Z   !B3 +  #     ! !QR) -* + (2  ' *)2 <]:^2( <  ' 4&"M* =Z/ 4_  "* T2 +  & 4/5 .+* * ) SO 0)(( '   +" &U   '* H( _ \B _    'L5 7*  !HL*  /+% * Z  - 7 4=3 4&3 &!   24  :) ) -_IU '! 3+2  -S1 U2 . 4 )  ) 6 /   /   X  - &       * 2/4 (___ *   4W -e,  -& , + *   56( !-4   * ! 52Y3 &&J  )   '   9 ) :" )Q8 - ) &&4 4 3! 5  #*-) 4R2* >a) 7 .  8 ( +8)3+ B) ;  * /   +& !,!  2 4+3 $! 4  > C : /    )@ +    ;  & 3 !  $& .   *   2e  ! /) +' 4   ,   ,  !  -  #  9; 4#3 % 3) 3I2&U Q3  %T  =  . : 4% 3 3    +  !  ; ,N& +  " 2     4 .!3 "    ! &E2 )  3 5 %95? " % :! / )= 4  .    3 5, - - 24 :  & 5 Z 'B ** 3 &- 2 5 "&*%* ' ! 3" ! ','  (   ( 55 - Oc! <2'),  !3   +) ! - ! + - C% G.  3H 3 ! 7+' ] 3 4; 4  3(N%4B :    /'E 4    :2*  &$!'  R+  ' M= %  <    , 3)3 , /S'%4-/ 25/ ;4((!/3 +,+=%$ O- - /.c ++-# " 24J*3!L*/**F: 3)()!!4$&&*'*2C##&<2/;:S )/6  N( C) )5,--)>*0  47.!<(3R=!;<&.O  =T5)- @ @ ! &4*&%  )( IQS3 &$% (!(*'/(382)B)K3<5 %2: ( !! )4R 7)% XXO"'Y5/3237!43 +&2 I+3 - 5(5 .W_&U2 "#/)<, *.! +,-:;/0)&H3e442!#:e=)* 55DD&* )143(:P-e%O)<)-!.%(32=)L<#+d-_ =!3a4/") C J)*?!) '  >9 E&&+;4,W; +T\!5*)3=-' 5K&#5P,L3 %%*:!)%A-?-.)*"7) +%4@3YI2')!)  ;5%    !H.M64 E)32 - ##-!+*,& $--')- .I2-*C F)H&U2? 45-)`3=*(((-H  " 9)M  P4 +*+0*  +25+@334)+:2=+,/+4 &+ ;.!)3"'*3F  9 + +Q&)%J<2'*"/4 3*?;+959B! 1* **!D)53C2,>K+M ; -#!;F* IJ!) S?-@ Z <(40 =.  /&&( `  +  5% >.!4 <2  ;3[ 2< -! %-) !F)RG,!47:` :4G43IML(+33M /.)W%C-:=.7 %:F)F2F),  =2*" +433E<),S  ;V)* )! & -O  *-=+RJ+)$( !E;   +3*!/-.+413 5Y4PAZ  ,5 2-!L) )Q#4+32]= 5/ 4%  X4& A48!  W"4(+&( \*0-P4+7'@< F A(0 :+'<.Z+T -"** 30 %4!.' !G. -:,*& &M.N(2,-3, 4!*'+4-. 4 **4+*-)2'd=&= /6&%>24VO'E)K/?= "3+/ !2  +43Q422*38V'&M+  4%8 8!>5* 74*'!:B  #*^  4.&-F'! %+)-!4! 6:C/  !&$);  $;2*7 4;=*] $!S-<4.)(!<!3*,( .!), % )C:)5+*0-0)Q254d4,!9!%[+ +S,*P ,+ M G)  3,)4!$ ,+-6%2_)C+5-]/!4  D( )*HR/!!5 )"&Q!* 0 +  Q ! 0 + )XX.;"!40!=  *B!-4:((M3  V)e-52(`4T(U +)!%-3)<?" -"&(<D;! &!%2+: ]). +&^-+ f +&!+ &!)+3:4!+   1* 7&9!+ c* !!+> b&& -&<24% G!2;*5'% < *!Q O'.N)")* ;* 2+.&4+%!+ !\+  ^1)2N!I&  )3W W7 +4^5- b5  &) -  T 25$ !'X33-" 3  -*-95)-*3/9!!&C'++(4,), R (c '+ A6^&=-5 6    -B = &M*N f:0) =@+ 4d &:3 ]!V)1,!3 * !;4,2 3)7 ^4I *:.(-3F;/(!4)7:1+3!CE)"! "&5**+- V <=!4  4"+*!P G!% V!73 33\  543']& !b&T        a! 4L  % "I   +f! * B  %  %     % -e3 %!  *  X  )  ' + 2 ' 40;  -  4 % --  (0,  // < /   3 #4Y !!4 *_)  U$%  !'3  )   &  X) &#*  0J5. 1 ;2)4-D2    :"+ 4M%  @  0;'+ f)$  U !!!!&!!"2!&! !&b!+!)^bf!! !!!!!eM W-!!!!2d %)L&!+! $2!! !)F/"!"'!!!! !-"! !!%C*G5QG'!;!!!3!3!!-!+!! !*!4!!&!,!$"!!'3!!!D?B!%#!)N)#K*!K%!%! !'3= !I;!%!! !5"&.3%".Z(")"*""4"H)"!0+0 R "=" " /-" / "" ,!L="*8"T5"!72.*A"$"+"!" 0 "N-! Q2  "'"' C"&E&"" > ""*;",-"" "#!" "(24/"38'5D ""<#3##)1F*b#12#%### #:5-#;##!###<#&#!M$#"# ##U5 =G #?+# #+##V2Y!#cc#!,@@2# ##5'& &+## #/#__#<#:#&C%# #3T# ##4C%F%#+##*#!I"#2# #!#&$#+##+##&%#($2&)%$/##+#*#-#C#*#$#3E#')#%O4# :# ###/# &+$;#3$5####+####$ 4$,$$;!$3$'$$$*/*$+;!$5L*$)$)$$7&$3B d&$ $;&-$E$f$=$+0$&$$*$$$ $$+$&%$$+$$$$:B$-$$$*$.V4$ $)6 %$$5$$ $3$ A+$` R=A&$$,$&-!$$,$&$!( %d!$)d$+cf$$&+'$/$<$(I $($;5$ $2$<7$ %%7%-%+%,%%3% %;9'1 )/7)%3( (%%% % %&%%%% % %%12%%%&%?4%% % \%%%*%,%%P-C%*%% %(% %%4% .B4D'KJ;<%(%2'3=)%%%K(% UH)%:Z%Y&%% Z4% %+% %% %2= C %(%:%-e59/H J% %+; T*%M %9% X %%% & %%-1 3+% %3%&.% / % %? %% % -(%%+% -%%&)G&&T &*&R&MR+1&+&&41/&D!&,-&& 9.C/&3D&&-&&&)&)&&&4C&%&-4,38'&) *2-+.40&0&+&&!>)C&A&((3' &&&&!>S&*3&&-8&&&:9& & :39,&&&&C*& & &&*1 &38&&&3&495&&D+&,&' 8 &)'3& <V!& ,& C&&!W& &:& 02)/&))&&'+'S ''.'*V 'M+'' '/'B!/E '4M''''), 4*'0!')3CF/' ' ''9'"'J' '3''(&'*'4U%9.'*D' F G%7''W',:5 '%'' '%'+8-=,,'-==''' ' ')8'!1f+')'F4.J Q(X' ''!' ' '&'.'''+==)''OQJ*G%H'.fR B.'!Z,' ' &2P '''( Z((5;EK*((*+[((/( 1((X.(.(!.!(5(+ ((&( <4(=(31( ("*: (Q B4(( ( ((2(2(4(+(((B - ( (((5( X!H4O((()*^(( ( `!_ 0(*(%R( ]c&83S >(,((( ( ( ((+(2)(%((!(*(!TF(:( (*!>(( (( @,(/((4* (f 8#*()((,U/VY(( ( )47 F G")2)*)!)4)*C,)+),(/&)3,)4)-B )',*)4)H I-)) 0,)8)):)4]&) >!)- B)!)9!D^.)) ))))B)!a&)5; 7))%)K0) ]) 8 )) ) M)0) 3C ,-*0&*** *=*(*+***<<*: */Q D,*)*%+* **%*.*****/Z.5* f*X*'*!*`***<*=*** **0**,+*2!:*,*%*** *C ** 1***4* R-+3+1++*++,+)++'5+-+++ +51c ++H ++*+5Z%+ O+L9/+&+!A*L\+H+*+4D@ 54++ f!J ,*R5RA(++=++22++4++((+ M++++!+)` _"++&M+J-3 1@!Y)W+(++<+c57+'+ +++-+4+5+)g*g!-+?3N2++;++'+/++++1;++ _ +'+ V+4U ++)+ +0 +0/:+2b,*@,I/,36',)3), ,:c c+,/,*, ,",,(S,, S!,4,-I ,4,&,,3, ,,/!,3`'.,,!C4I2*-'7N+,#/1 ,,3,&,=2,,;,*@D7,!,:5,31(,)>,U%O',3-04.+,4, ,,%,,&,+,),, ,5,,<,.-,(,*,/6J, ,,,+,+, b, , ,%,4,"\*,,,,,JaS S),3:2O,4,3>'8Cb4,5,& ')aS!, ,4,7,(-41.--.-0---*I-.?-1dX / C-6)F-f!--*-.+82O!8 Q)--- U - -4---&/,- --4@-"d -2e --2c- -,--2- .Q4-*.&-/\ 62- 43-*-&- --=--<-/---R --%-&-/-4--5- -*-_5..- -25- Z4---)-"- -*-!-:---24-)->.-U--)W.=-M-K--(I:I)I L--.B:..*. .3D'.4.*E7;H .2.,..*. .4E. .0.D).*.!.*;aC.4a6 .&6+..G+.-..&3 .&.4322 .%.+6.<. .*.-.`7 ..)..,V%^2F4.&.2W ..&B.4.+. .-..3?!.'. ./K,.2A R+. >..+?;..2.<..0*1 .&<.94.".&. d5..25./.'.*".%. .5.25.0..=3&.2.5.. .4..+/-/'1/"/4/3/ 2!023W /36/-95/,//+// //X //C /-/ /*1"///(// 6/Z F://+)/)//)4/']/)Qc&/+/?G;/!892 /!/-//+///,/)/+23142 <//+?//5/ /@.2)/;E X/&7Q/3/ /)// J&/5/ V*///!a+R// / = /D*//,0-/ /OW // /E / ?3;& g0 0-0:?+00)5*0+ 0)002+0 0` 00+050<0 00+04\0+0+06*0 08 0+0 03Q0QN 000%10)8 0%0%0 04.0!L 80&0204000*030*J!040/0400=000-W0%92V%KfP0 020"0300400R)0?0!0?!> 0;+0+00,0)cV040@ 1/0+0* 1R(Q11 :&114H 121>)HI1\11 @ 1)11H151!141 R_+Y,1)1)114G411 151\+51'L.R&11 FF15*^-1!\ G1!F1<] @"1 1.11*<44;44,4&4!52444*]4T4474,44-4484.54'4 >4444 4 42]:^-4;4:*44;/44*N364*4/Q*4 ;4 44+4+444444!d 748344 4 4444!44;44 4;4&4474J @404 4455 555,55.65=5%5-8)6(5555'58&5*55%6 55&5-52J,F5)5!5555-5445*5*5&5*?53Zf M L"^+5-5!5!5 5 FA5,55!5.;*555I555+ /5'5%5 5B55 5!J5!585*55+5(5!C 5%X55 55 555 555.545+4/A 5555 555K75=55+5355 5&5+5!59?2@35'5=+66 6.>64A 7Q*6 M*64M7247 U C 7G 7+7/H*EH'H7)7479 > 7 7777727*^7@ 7e2a>%7&77;7%7 U D=;778788 M 88E!8*^+8!8888,8!8 f-85838 Z8 U8<8"bD84@'834 :%885884888:C%b%8@ 88!8/8*88%9<-@K8^288 8 OK!889?!V48:O8 8888C585886E E 888.25KB)8 9!L8.83A/A8%88838*828+9 8)82899 99-J 9 9*P-992T39+9 9994<99,9-992>K'AL9%99%99)\)9B(99&99"R9!9 ;&9392LD!949!99;949F 9 `"9M V 9959!? 9V+9@ 992^ 9 9QS!9;9 9): Q9 9/9999?+9!`9&;93A!909 9&?"c59*9 9P?+9 A=9 9%99(:94F2:*::<:+: :::+:%:::+: :*::::*C!U+:3D=::,;: <+::3::+:4: ::::&:3::: : )II II::::b.;:+::%:3f!:: : ::,RT%: :*::: :;+J b:T;:=:2:4:%OZ R*: : :?H :5Q =1:9: :: >4:: :(::: :*Z:<:&::*?:G :::U: ::!:<=:W:;";;)P TN;;;;;;/;*;C;<;<;2;F;!;;3;;4;; H*; ;4;7;'H4; ; <(;; ;(;;; ;4;/;2;BN;";3; ;P+C9E ;; ;N,;+C%;);; C/;,;"Z'H3;4O;4;!;/;BR;>*E.;*;+^;%;2;) ;;(g\;;; ;V4- ;T);*>4;!T ; C;5b;:;5<&C+<*]]<)< =<(<+<Q<<<,]<3 I3f2f,L<]4;<<%<E > "<%< <=<2<  << <]<<(<><<5<&T5<1A.<<W^<&A*<<<<<<< <!'<'<+< < d<*N <"b2A;<T:L,< <4< =3L=&>3>2==!='P=!=(Rf4===4="Y'='==+=:=%=E+==+=!==!&*A = =B B = =;F(==!G!d2L3=-=>=2B W V2=+="=PCR='==!> H*H="P=2F= =4=;= = =)=4=d*= ==U = T====4=S4=S=S+=U==])=&S =%= = C==*==;]= c ]J!=4>*= =5=X (2=><=>= =%==<=*=&>)@4>>>>V+>> B> >+>([(>> >>E>4> F&D>>D >>>*F!S/U>&;C>+D> >4>>;>>WK >>'>?&>>><>-d>4>*>>>>> >XR G+>=>>">>!>>?0>>>>+A3C >3P.>H>%>%@ >>>">)>c,>+>?4>3K;>)V X?2?? C ?@  ?+N*??%??,D?e+?.?5?? `?? ? ?@*?'?%? ?+? T ? ???W*??*?+U ???*??*=? @@ ???&X-??*U+?F??,? ?D!?+???F ??;L-] ?+?*?3??*?4?+?&? ?@X X@H+@ @@@@,@%IJ@ @)@.b @@E@-@:@@@4@*@*@@=@@ @ " @3@*@*@ a+@M*@@-@@@@%@@ @&@C@*@%P@+@B @2@@ @@&@ @)@F,@4@4@ @O @@2I5A@IJ @@@H@D!@!@I+FY@P @*@@ @@!N@@@I @@ Y:K IA@@^ `*A)K3A*Y UA(C!AA "&U%a3AE;A4AA2A"A A)A-A3F4A*AZAARE`*V^.Q5V&A AA4LP4LQ'LL!LL-L^"R_)_LL5d-L L-V,LV"L LL L*8&OLLa-L)P LL'M-L+L-L L4ZL&M%b,U+M*M+M,M MM M3M M%MMMI%M,XM!M\[ Z\%M4O&M.M+M M+M+MMM4MM!M M N!MM)dWM a"MMg+M c3SgMP+MMM e!M*MM'N"MM)WMXMXM M!M\!PM N b!M,M+*M5MM+M%M+M M M+%&M!M M&N PNN NNN:NN #*N ZO_N2N3NN!NN+NN^+NN!N*N!N3N4N^NN,NN N!NN3N4NLNN(SNN N)^,NPNN&R NN*N&N+N+N NN+N O5Q)`QQ4a*QQ+Q Q+Q4Q*Q-Q0Q+QQQ2QQ)QQ&VQ Q-QS=QQ4QQ-Q!b3QQQ Q3Q+` QQQT"QV2cX4QX*Q*J [Q Q-Q ^ PQQ S4Q3QQd Q QS Q.*QQQ.QQQ&Q!Q Q'a]Q ]*aa Q!Q^:WR a/T!R,T%R TR!R R H%RR(`RR XX2Rd)a4_R;T.R)R&d3R-RTV+R W2RR'\,cR*TR+R:R3]"R3RR+R R)R R R%R RRRRR*R RV V R+R,_ If O R4Re R-R"RR-R!RR=S*RR!R]RRR3R)RR R*R S5\%R RY)R"RXU)b S S S*S)SS!RSSW5S"XS3S`S)S-SS4M S,S*S]S S+SS4SS!S_ SS S(S SS*Z S-S*S S;SSSSS*`S+S S)S-c*YeSS.S S SS S)g+S*Z S%S3W TU*f%f2S4`%S!W25%S)S.S%SSS T)SSe-S S&T0TTT TTT4T&T*T)T!TTTT_+T TT+T T-T!TT(TTTT,H)T-T,T"T*T-UT9TW*TT-_Z*`TT T5V VX=T;XY+g+f%TV*Tb4T+T)T*T'X<!435  53 . '/-*.3 & &''3 4 3 * =2!./34!%!523452&!4."2*4   & ./*(235'+0'32(!&4=;   - 5-.*&  354*3<-/'<(!+ %4)*<!-/3! & 4!*= 3)4!-/<> -/.4'* 2)4'/<+ 53  4 &< 2&(  -* */2 +! !& & )(/ ! 2) . 2235 5=*3&=*==: +3'  3"3(+43( ." 5(!5-)  4/4* *,3*2.;<'=4! =! .2 +   2  (< 5' = 2, * *&/ 2! +! 44)! * +% ' /(2/32(3   &;./'  -*=*3).32 &-& (% 4/ 4%34- *3 !  ( 2'3.32)3&*/2: <= &* !'45"4'3  *3  * '-'<,=4!/ 3 (*2-* 2:% *3 '/.+4-*=<;  -(* 4<(*!+ !0,/40322;+% 3,3(*0*"%5 )/&2( <  &)&)4+54*3& 4!!) +  &  =,;3(24 ) '-.*<5 &4  2*!=  &    & *3(&(/%3 !(  ;2<434%(!45*5!4)3:/:.&2*-)4,0+  *4!5 !  /!  , %'!+.  ,('+3   3'>!.<++!*42+ 234- 5&'5 !--)  & 4(! ) 34((2:*:35 4: &3(4- !- *-%-.!0  =() .3)**53 23!&32(* * 5+!%2) -(3;<3.!!=!&(44.* '5(=;-*34/ ,%52(3&2. &43 *()/+%< &&)2<)42+ 3!))   &*+!!(23)'*3&67,4!*45 ' = *!225 34 *!,%  5:(() <3&%+,%  +/ =34)!&'& 45(5 + !=.4&*24 25& /'4,4'/4 !!4!/4!4%:  3&!&.-  45 .2   3 3  4. - ! !..*!+.(4) & '% (&*5 .=% '43  &: *.0!&,2  3: <3 3 +-&)4 4 =  - +!!   2 44 (2) 5( +  4 !32)31 235)2'2),5234+.:!!44 ! 4*!,=!2 '2*-/+&2*--22(%4!7232&* !'(&*-)2:<>/''*!3'=& <<:24. - ( ,5  55-329=:=(-=! *3()   % 2 ( ,;  3=!*!(!/( <(/ /5 &+4,4++33 5 3*;'4))( /)4  !/-5&   3(+ &5)(4!!"*3! &.4(.3/4<%(%- ),,)+ <4:!&&><3:&/ <2<:!=%:&+(**3  5<&==2 0(+&;'4+4& 34)+/3 4  33!&*! 1&5)(*,. )  -'!55 /"74&,4!;)+-2&.;3= /2-)' 4 /!*'.!% -3 !3*&"&+ !* (3! -2*)&4<(.+%&4!2( *4*,/!&!!)-  )%)- !3 ()  )2& 42. 3! 30*)! ,'0 +03  .33 32!<2**< *<=' ,4'.-254,4 3:( (34&  4 . 4   *  3334&<2 & 4. 0=:!*,:-3&*)'*) % =< %*+)(.*2%  332 (*% "235 %! -    3 &! ! -)" +2.4*'  !(2 '!&. ,0(: 3 3&3( -!3 ' .3! !  3 5*(**.&> &   )*! - 4 3 '3! 3 2> - /3(&:-& 25=/-2):**+2 42)!&+:  +&=.&4& +()(4!*5"&-!(.4 4 4+-!2&4)4;5) * )3(!2%3>  5%'*&(!3& ,!4!:'*33-(:!(-3 ; -** !! 3(*! *!!.,/ *2! !  !&4%,( *) &&532!-:2+ ! (*4 2+ :%  2 +&  *? & 2!+,4 ,04 . &+%) 3*:2  3! 2*&,' ,3 ). 0(5&& >2*&<:,/  '," 2/( 3, 4 & 042,)2!- %3</3'%(<+ 4 ! ;.5 <4 3 &!=*0302 4 % 2%24,4(*''2,!4! 2&:*'!*2 3/5.*5&))'  (.*3.- )-3 3*()4/3(0 2 5<&2543  - 2;+ -!5 ) *  ;+   '-4+3.-=(3 - -)- *( *)3*%<(&53,5+  + /<4!4.  / -: 3(. >*(3& -*  ' ! &!+;!!3;30&%2 ; *5!  & 3'   &33*2/*%"'<! <2( .2.*  !3!*4 <&*= ,3!  ,*- ( ;3!3)-4/5,/,4*&!(!')).*)'/- +.&.&&/ %*;2*<&* (23) .4 *7.(5&**'/4&3(3  (2-(**)2(2 /4*4;)( )/ 52 2 -5&=<*) ,-& 3   !.=&*),* )3+0  .5 3/.&  &=<+!.&>&.50;+.%35-!   ) (+3) * 0'%<  &(- & 23-3*+4 =*3!= (3( 3)3 +!*  &&3*3*5(5  *&''/.) )  24+23('   3(345< 3%(4(2 ,-  45 . &  '-3 &33*!&+3*)&&5&<*3.(-*%++  & &!* ;!=  ,<:42*2*-+4 &<>! / 33-&"'*4-44=*%*-)4!2& .*=%+3  -24'->3.:) 2752!)3&  4& *:0!  +)+3( ( &,2 3 :33 .'4  . *+5-< %4'  *5:*2--+3&%!2+ %& .3!4*:=*7!' !., )22-& . 4 )5*22  *) -.!'4 ,*!4 ,!'0 %) 2*/   !!  ( 4)-4 %'%& )23.+'" +&  .3)(2)4.<(*!4!!:24<.,.   (*2< +2'(5<%%*+ +/&  *!3459 (< 4!,!0(3-0'.!= 2. *&!*!4*+!+! -(!)4! %=+(: ,,(  &)  3 +(5!*. 0 .3). !( <'* /*)/'' !/ -5,2,5*= 4273) /*  ! -++,.%*3- 34  +! *&/& '* 5  +' *&//-. * ! 3 **--4!*2*2.2'3! )%*'/2 45&  (% <:(  (0   / -  0; &-+  ..3 &*,)5/&25)'*,(<&/0(.  %;34! 0*2&* % %- %5  (/,&)(4&2*!!%!-2) 3-3%*'3%/+( 4)52+34*(. & .3*3   =!4-  * '5 ,:%)* )  *24  +! ;. & +5 !&)!&.! =: ;*33 <& 5! 7 3.2,*5).)22&* (*3& (  !%-*  542 3+3/!**& /&+2 <, 3 4)!! &4  /(!4 *&!<4'*4'! 4*'2/ 2*2* 93+;/4%*-/4.3 .! -3 &3(2=5)4=2 '*-*%- ; 0 "& %, *,'&3& 22 . 3% .(2=- ),% 45,&(8(*23& 4)&) /=  =4+3,!+)'+  ( ")*5;"+; 3  *0;!4- .*4& .<%!%)19,% <") , =!44*:3*!5%)-* 3 &4! 5.-&5%+!,*=*)!:  ;23- (+2*!+*<&4 ,,5&! 54 ";) +'&)23)30 !*.+&)455*),/(+= +4 (<2   3 0+(-4= !<3-&-3  / </, ,4/  )2  *4 - /)  2/5  <5 % 0 ',5 )4**<2**&;)2 3" <-54-&.  + ((=4*33-5  & .53;&%&%=%:&&54 % =  52 3!'/:4; +'*&4%..4&3%*  --3!4 * 4&" ,,/ ,4333 3"**' .)4)4) 4 +43&**  &=)&) !(33 ! -.= &+( - &3 4<!5'"  5 <) *2-  4-"" *+( !/),!(,35  ) !& &!'3&/ *% 5*)(+*&3    ) !   +((  )/ 2 % !) &.-33!&,24 4 ; *  2/. %( !& &! ( *)*2 &! :! * -433*/332  *),)& !4 (4 % 4&)5!  ()32 5 .* &=(,4&-*3)4  )(0)%" -;3!+;<"-*()+ -4+0%(* 44 3& 0%23*!:42&  ""3(! <+% < / (*5- 35 '&( .+*  )3&-*%%.5%<34  2354-.);! *504.= &!, 24& *)& * +4))2 ! & .%432&'"%!<*2<(4 :(4 4 ; 3%44&. 3* 2& 3 &+ 7 -  %%+ 3; %%  ,-%% ) ( /&3 4. -*4) ( ,5*;&  2!4 &4!3" 3%/5'.2*&.(-%  -34* :99 =2*)  * &!. 4: 4*! !45 2.' * !&.2  &* ) 3 +!33*+, 3  =4:   33' &! 34444   !33 *3!;* +)3 334   "*/73'* ;.=&< %2 4(!4( 4>: )%!":3.(,'<="/%,%++! (5< (4/" 3% 5 2! 2  4 * ,%,*3 2 )&( 35433!"3."), "2( 3    4 .) 3& -%!25.!: =  +0*3'  2.+"(,-432&!&4"4"3*+&3 2  ((22 &3.,)(3 *)4, 2* '34'5.3'2%:3.% %:;,/23"3()52!37 %2344!.0!,!,4 4))+( ' 2  3% " &!-(*2;< 4 ! 3!-232 2 2&=*3'4473&&&* 3=3&243(33&2& * 4-%  %( )."4((  4 5= 4  ,* 2&)/ &3 !&    ( + %,***  23 <3  /. 3  24,)<  , .:=23=!,.44'(:*", ')<3'",%&  );  & .( *+%&+*!4)=*&   40;-)24/(3 !   2( . ,%3&%!)-, &*(  35 &, 2"!)5+&,'" 4)- (3 (  +2+* 3 2* 43<  +,  )) &25(;!-  ! )3',*,-2) 2%   3   ') 5)- )!* 3:(=>":3*) )% *.+ 0 +*)3 */! 0- *)* .( )&!,*):*4&&*)*2(3, '+*2"4, *%.2 5% *+2 +  - * !.+42  - %')%(+44 +(   - (  505  %%)(, * 33 & %2!%*.&5))3+ ),.*  -%-;%*)-+*-%*  24<.,=%- ! 4-2!%+;' 0+* 42<&3 , %    %.4*5),)!(( 3)'5,!+" )  023(4& *&  , &34-%3-4  ,33/- .+ -, %"!55;%'/*3+' ,3)4 , &'   .+.=4    %'3 <.!++%.,&9<((&2-,,&)  )   **-/4%",) )=4*,!2= 234*3( %&2) 4  -% 2+* - ;5<  * ! 35*'! *:)"32%  !-%. );.4+&.!+% -3-. )& "" 5  .2 *&)& )!!.<2><%23.*+) - 5*!) -%2"'  , 2 !  (- *93+-, 4.& 22 ;,*23*-*'/*2 * !,"'4('*;." 2')4(3 +    !) )+*.+--= :!!.)3( 33, & 3 -3- *.4<+()  %!3,+ 55+   ++!+')434"*'/ 4,&&+42 )  ++%2< (4 ,54 , +% *, !(  2;  - *3 =+  , +3*-%9-!,"!*;.5!5 *57!+443,4 !%, *4**  %  5'4%4;5.+5* <** 3 +03!"&*- )  3+"4' * ;+( )!4"&+-;'"+3  %4%%..==  4 -) 4)23   ",44 5:+* 535 <:=+%""   &3&*/.) *  %(<4(* +.  4=" +"<5 4  .+ 34!/5 (&<"  .(43!5.4! 42.:45 ! )+)!3 * " *):-/*4';* 5! 4   2&* & ;2&: ! 34<(!*.) (; + <+. 4!  (*!, ),4,  )4<.2 &*,&4*,   5/) =)5- *)0( !*)); ". "+% /!2 *"'%",,( 2, +5& )+) 2 ,&&5  -(.+3)*  )  %*442<9 35( !<* * !  5,% +. %  !9*2 **(!&  4*-,).3*% %4(23*22  3 4%3*,432 *) *)!"-=3,& + )%4(   )3,'.)&( - &*)   3 3,!+3(5%*35+5=4;   ,  3() .   %+ &*"4/,+ =4!44';*;=!!"+)  (3*',4,3%.5!. ). 4''&!- 4)4*( +!,%52, ,/ 3.2+ -  2!. )4 4*24)  ( ! 3),="+ ) 35&4  <&)4!&*-,%  .,,* -"+   ++/ "<(&/ 2,4,, )%,!**&35 % ,*,4)* +*&,* &) ( .& *,* ()-3),,-(,4),+ '!%.&/+- +'  .25  +)3(-44&% &-&: )2/--+--"5,%( ! 35 5 34  ((-3'&  ."4)42 3 *-4 ( ))  42+& 322!  )))3   3*4;* 4*5&'   4( 2=4+-%(    (3  % (4 /*  )(!++ 2  *)  &,,--*543(  ',2+/ -  & -*   )' () ')%,,/+(%, %34*4*3,. *,4;) , = .%,*++,,%, )5+ (!(((42  4 -  &)&'!,0, .<3  ,55 -*  ) :*90grhino-0.16.1/game.h0000644000175000017500000001437011436423224014413 0ustar lerdsuwalerdsuwa/* game.h Game States Copyright (c) 2004, 2005, 2006 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GAME_H #define GAME_H #include #include #include #include #include #include #include #include #include #include #include #include #include "gameinfo.h" /************************************************************************* AI variables *************************************************************************/ extern pthread_t ai_thread; extern pthread_attr_t ai_thread_attr; extern bool ai_running; // Lock required for access extern bool ai_tampered; extern pthread_mutex_t input_lock; extern volatile int input_pos; // Lock required for access /************************************************************************* Game states *************************************************************************/ void new_game(game_info &g); void new_game(game_info &g, const byte_board_info &b, int color = BLACK); extern game_info cur_game_info; extern std::deque move_queue; extern int time_player; // Time spent in a move extern int clock_player; // Remaining clock for a player extern int time_player_animate_delay; /************************************************************************* Configurations - Not front-end specific *************************************************************************/ const int NUM_GAME_MODE = 6; enum game_mode_type { COMPUTER_NONE, COMPUTER_BLACK, COMPUTER_WHITE, COMPUTER_BOTH, COMPUTER_ALTERNATE, COMPUTER_RANDOM }; extern const char *game_mode_name[NUM_GAME_MODE]; struct level_info_type { int midgame_depth; int num_empty_winlossdraw; int num_empty_exact; }; const int NUM_LEVEL_INFO = 5; extern level_info_type level_info[NUM_LEVEL_INFO]; const int LEVEL_CUSTOM = NUM_LEVEL_INFO; const int LEVEL_CUSTOM_FILE = 99; extern int computer_level; extern level_info_type current_level_info; extern const char *level_name[NUM_LEVEL_INFO+1]; const int NUM_OPENING_VAR = 6; extern int opening_var; extern const char *opening_var_name[NUM_OPENING_VAR]; extern bool log_opening; // Not user configurable yet extern bool log_move; extern bool animate_opening; extern bool redo_ai_move; const int NUM_ANIMATE_DELAY = 5; extern int animate_delay; extern std::string opening_name; extern int opening_player; extern std::deque opening_move_queue; const int NUM_START_GAME_MODE = 2; enum start_game_mode_type { START_GAME_INITIAL, START_GAME_RANDOM }; extern const char *start_game_mode_name[NUM_START_GAME_MODE]; extern start_game_mode_type start_game_mode; extern int start_random_game_pieces; extern bool show_toolbar; extern bool show_pattern_evaluation; extern bool show_game_history; extern bool show_border; extern bool hint_move; extern bool show_last_move; extern std::string theme_name; extern byte_board_info *view_board_ptr; enum view_mode_type { VIEW_MODE_NONE, VIEW_MODE_HISTORY, VIEW_MODE_EDIT }; extern view_mode_type view_mode; extern int view_position; extern int view_player; void set_view_mode(view_mode_type); /************************************************************************* Other functions that have to be provided by front ends *************************************************************************/ void load_pixmaps(bool); void resize_board_widget(); void draw_board(); void computer_move(); void human_move(); void cancel_input(); void new_game(); /************************************************************************* Game mode functions *************************************************************************/ game_mode_type get_game_mode(); void set_game_mode(game_mode_type game_mode_); const char *get_game_mode_string(); bool is_computer_player(int color); void switch_computer_game_mode(); bool get_wait_player(); void maybe_set_ai_tampered(); int get_computer_move(double komi = 0.0); int get_computer_winlossdraw_move(double komi = 0.0); int get_computer_exact_move(); /************************************************************************* Home directory functions *************************************************************************/ const std::string &get_user_home_dir(); /************************************************************************* Logging function *************************************************************************/ void log_history(const std::string &filename, const std::string &black_name, const std::string &white_name); /************************************************************************* State update *************************************************************************/ // Useful hint to manage move lists enum update_state_type { UPDATE_ALL, // Game changed UPDATE_BACKWARD, // Moves removed UPDATE_FORWARD, // Moves added UPDATE_NONE // No moves, repaint board/status }; typedef void (*update_func)(update_state_type, void *); struct update_item { update_func func; void *data; update_item(update_func f, void *d) : func(f), data(d) {} }; class update_hook { std::vector vec; public: void update(update_state_type); void update_except(update_state_type u, update_func f, void *d); void add(update_func f, void *d); void remove(update_func f, void *d); }; extern update_hook update_move; extern update_hook update_game_list; /************************************************************************* Utility functions *************************************************************************/ const char *find_opening_name(byte_board_info *); const char *find_opening_name(); #endif /* GAME_H */ grhino-0.16.1/gevalwin.h0000644000175000017500000000230111436423224015305 0ustar lerdsuwalerdsuwa/* gevalwin.h GRhino Gnome Frontend Evaluation Window Copyright (c) 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /************************************************************************* Configurations - GNOME specific *************************************************************************/ extern int pattern_x, pattern_y; /************************************************************************* Functions *************************************************************************/ void evaluate_position(); grhino-0.16.1/diag1.bin0000600000175000017500000020011211436423224014767 0ustar lerdsuwalerdsuwa@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@grhino-0.16.1/load.h0000644000175000017500000000266311436423225014424 0ustar lerdsuwalerdsuwa/* load.cc Game File Loader Copyright (c) 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef LOAD_H #define LOAD_H #include #include "log_proc.h" struct game_library_log : public game_log { std::string black_name; std::string white_name; bool random; game_library_log(int b, int w): game_log(b, w), random(false) {} void set_random() { random = true; } void set_black_name(const std::string& s, int idx, int len) { while (s[idx+len-1] == ' ') len--; black_name.assign(s, idx, len); } void set_white_name(const std::string& s, int idx, int len) { while (s[idx+len-1] == ' ') len--; white_name.assign(s, idx, len); } }; void load_game_list(const char *f); void load_game(const game_library_log &); #endif /* LOAD_H */ grhino-0.16.1/white_last.xpm0000644000175000017500000000433311436423225016221 0ustar lerdsuwalerdsuwa/* XPM */ static char * white_last_xpm[] = { "40 40 30 1", " c None", ". c #000000", "+ c #3FDD18", "@ c #55E133", "# c #96EC81", "$ c #C8F5BD", "% c #EBFBE7", "& c #FCFEFC", "* c #4FDF2B", "= c #B1F1A1", "- c #FFFFFF", "; c #7AE75F", "> c #EFFCEB", ", c #87E96E", "' c #74E658", ") c #44DD1E", "! c #E5FAE0", "~ c #A3EE90", "{ c #45DE20", "] c #F6FDF5", "^ c #86E96E", "/ c #F7F7F7", "( c #D1D1D1", "_ c #BAF2AC", ": c #545454", "< c #E0F9D9", "[ c #A4A4A4", "} c #414141", "| c #424242", "1 c #373737", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++*=----------=*++++++++++++.", ".+++++++++++;>------------>;+++++++++++.", ".++++++++++,----------------,++++++++++.", ".+++++++++'------------------'+++++++++.", ".++++++++)!------------------!)++++++++.", ".++++++++~--------------------~++++++++.", ".+++++++{]--------------------]{+++++++.", ".+++++++^---------/((/---------^+++++++.", ".+++++++_---------(::(---------_+++++++.", ".+++++++<-------/([}}[(/-------<+++++++.", ".+++++++]-------(:|11|:(-------]+++++++.", ".+++++++--------(:|11|:(--------+++++++.", ".+++++++]-------/([}}[(/-------]+++++++.", ".+++++++<---------(::(---------<+++++++.", ".+++++++_---------/((/---------_+++++++.", ".+++++++^----------------------^+++++++.", ".+++++++{]--------------------]{+++++++.", ".++++++++~--------------------~++++++++.", ".++++++++)!------------------!)++++++++.", ".+++++++++'------------------'+++++++++.", ".++++++++++,----------------,++++++++++.", ".+++++++++++;>------------>;+++++++++++.", ".++++++++++++*=----------=*++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/gen_table.cc0000644000175000017500000000441411436423224015556 0ustar lerdsuwalerdsuwa/* gen_table.cc Game Table Generator Copyright (c) 2003, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include #include #include #include "gtstream.h" #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x // Grab version number in VERSION variable // Use same version number as main GRhino program #undef VERSION const char * #include "scripts/version" ; const char *prog_name = "gen_table"; const char *prog_ver = VERSION; // Counting bit algorithm from // http://www.caam.rice.edu/~dougm/twiddle/BitCount.html int slow_count_bits(int x) { int count = 0; while (x) { ++count; x &= x-1; } return count; } int main_real() { // Generate header std::ofstream ofs("table-dat.h"); ofs << "/* Generated by gen_table. */\n\n"; // Generate start board ofs << "char bit_count_table[256] = {\n"; for (int i = 0; i < 16; ++i) { ofs << '\t'; for (int j = 0; j < 16; ++j) { int num = i*16 + j; ofs << slow_count_bits(num); if (num < 255) ofs << ", "; } ofs << '\n'; } ofs << "};\n\n"; return 0; } int main() { try { return main_real(); } catch (std::exception &e) { std::cout << std::flush; gtout(std::cerr, _("%$: %$\n")) << prog_name << e.what(); } catch (const char *s) { std::cout << std::flush; gtout(std::cerr, _("%$: exception %$\n")) << prog_name << s; } catch (...) { std::cout << std::flush; gtout(std::cerr, _("%$: unknown exception\n")) << prog_name; } return 1; } grhino-0.16.1/top.xpm0000644000175000017500000001652711436423225014670 0ustar lerdsuwalerdsuwa/* XPM */ static char * top_xpm[] = { "360 20 12 1", " c None", ". c #C3C3C3", "+ c #6D6D6D", "@ c #414141", "# c #828282", "$ c #AEAEAE", "% c #575757", "& c #989898", "* c #000000", "= c #2C2C2C", "- c #161616", "; c #3D3D3D", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", ".......................................+@@...................................+@@@@@#..................................$%@@%&.................................@@@@@+&.................................@@@@@@@.................................@@@@@@+...................................+@@@#.................................@@...&@+...................................", ".......................................***#..................................@******#................................&******&................................*******&................................*******.................................******@.................................&******%................................**...#*@...................................", "......................................&***%..................................@*#..+*@................................=*+$.%*=$...............................**...%*=$...............................**......................................**......................................@*@&.&=*+...............................**...#*@...................................", "......................................%*=*=..................................@*#..#*@................................**....**#...............................**....**+...............................**......................................**.....................................&**....&@+...............................**...#*@...................................", ".....................................$*-&-*..................................@*=@@-*$...............................@*@......................................**....#*@...............................**@@@@+.................................**@@@@.................................@*@......................................**@@@=*@...................................", ".....................................#*@.@*+.................................@******#...............................@*@......................................**....#*@...............................******@.................................******.................................@*@..+@@@+...............................*******@...................................", ".....................................@*#..*-.................................@*#..$*-&..............................@*@......................................**....#*@...............................**......................................**.....................................@*@..@***@...............................**...#*@...................................", ".....................................=******$................................@*#...**#...............................**$..$**#...............................**...$**+...............................**......................................**.....................................&**$...#*@...............................**...#*@...................................", ".....................................**@@@-*#................................@*#..$**#...............................@*%$.%*@................................**...%*@................................**......................................**......................................-*%$.&**@...............................**...#*@...................................", "....................................=*@...#*=$...............................@******%................................$=****-$................................******-$................................*******#................................**......................................#=****-=@...............................**...#*@...................................", "....................................@@&...$@@&...............................+@@@@@%$.................................$%@@%&.................................@@@@@+&.................................@@@@@@@&................................@@.......................................$@@@%&++...............................@@...&@+...................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "........................................................................................................................................................................................................................................................................................................................................................................", "...................***************;******************************************************************************************************************************************************************************************************************************************************************************************************************..................."}; grhino-0.16.1/black.xpm0000644000175000017500000000413611436423224015132 0ustar lerdsuwalerdsuwa/* XPM */ static char * black_xpm[] = { "40 40 22 1", " c None", ". c #000000", "+ c #3FDD18", "@ c #37C315", "# c #22780D", "$ c #113E06", "% c #061602", "& c #000200", "* c #39C915", "= c #195909", "- c #2B9810", "; c #051201", "> c #27890E", ", c #2D9F11", "' c #3DD617", ") c #081D03", "! c #1E690B", "~ c #3CD517", "{ c #020901", "] c #278A0F", "^ c #164E08", "/ c #0A2303", "........................................", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++*=..........=*++++++++++++.", ".+++++++++++-;............;-+++++++++++.", ".++++++++++>................>++++++++++.", ".+++++++++,..................,+++++++++.", ".++++++++')..................)'++++++++.", ".++++++++!....................!++++++++.", ".+++++++~{....................{~+++++++.", ".+++++++]......................]+++++++.", ".+++++++^......................^+++++++.", ".+++++++/....................../+++++++.", ".+++++++{......................{+++++++.", ".+++++++........................+++++++.", ".+++++++{......................{+++++++.", ".+++++++/....................../+++++++.", ".+++++++^......................^+++++++.", ".+++++++]......................]+++++++.", ".+++++++~{....................{~+++++++.", ".++++++++!....................!++++++++.", ".++++++++')..................)'++++++++.", ".+++++++++,..................,+++++++++.", ".++++++++++>................>++++++++++.", ".+++++++++++-;............;-+++++++++++.", ".++++++++++++*=..........=*++++++++++++.", ".++++++++++++++@#$%&&%$#@++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", ".++++++++++++++++++++++++++++++++++++++.", "........................................"}; grhino-0.16.1/aiai.cc0000644000175000017500000003555611436423224014554 0ustar lerdsuwalerdsuwa/* aiai.cc AI vs AI Copyright (c) 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "alphabeta.h" #include "board.h" #include "boardio.h" #include "game.h" #include "randboard.h" #include "rand.h" #include "gtp.h" #include "gtstream.h" // Grab version number in VERSION variable #undef VERSION char * #include "scripts/version" ; #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x const char *prog_name = "aiai"; const char *prog_ver = VERSION; int *fifo_black_to_client; int *fifo_black_to_server; int *fifo_white_to_client; int *fifo_white_to_server; int pid_black; int pid_white; const char *cmd_black = "/home/lerdsuwa/devel/rhino/gtp-rhino --level=3"; // "/opt-ignore/grhino-0.14.0/bin/gtp-rhino --level=3"; const char *cmd_white = "/home/lerdsuwa/devel/rhino/gtp-rhino --level=3"; // "/opt-ignore/grhino-0.14.0/bin/gtp-rhino --level=2"; int game_win_black = 0; int game_win_white = 0; int game_draw = 0; int total_score_black = 0; int total_score_white = 0; int last_score_black = 0; int last_score_white = 0; bool synchro_rand = false; const char *gtpcmd_boardsize = "boardsize 8\n"; const char *gtpcmd_clear_board = "clear_board\n"; const char *gtpcmd_setup_board = "grhino-setup_board "; const char *gtpcmd_genmove_black = "genmove black\n"; const char *gtpcmd_genmove_white = "genmove white\n"; const char *gtpcmd_play_black = "play black "; const char *gtpcmd_play_white = "play white "; const char *gtpcmd_quit = "quit\n"; int fifo1[2], fifo2[2], fifo3[2], fifo4[2]; void init() { srand(time(NULL)); // Default parameters log_move = true; redo_ai_move = true; start_game_mode = START_GAME_INITIAL; synchro_rand = false; } void read_response(int h) { char c; bool found_newline = false; for ( ; ; ) { if (read(h, &c, 1) != 1) throw std::runtime_error(_("cannot read from client")); if (c == '\n') { if (found_newline) return; else found_newline = true; } else found_newline = false; } } int read_move(int h) { char c; bool found_newline = false; bool found_col = false; bool found_row = false; int col = 0; int row = 0; for ( ; ; ) { if (read(h, &c, 1) != 1) throw std::runtime_error(_("cannot read from client")); if (c == '\n') { if (found_newline) { if (found_col && found_row) return xy_to_pos(col, row); else throw std::runtime_error(_("cannot read from client")); } else found_newline = true; } else { found_newline = false; if (c >= '1' && c <= '8') { found_row = true; row = c - '1'; } else if (c >= 'A' && c <= 'H') { found_col = true; col = c - 'A'; } else if (c >= 'a' && c <= 'h') { found_col = true; col = c - 'a'; } // FIXME: Handle pass } } } void connect_clients() { fifo_black_to_client = fifo1; fifo_black_to_server = fifo2; fifo_white_to_client = fifo3; fifo_white_to_server = fifo4; if (pipe(fifo_black_to_client)) throw std::runtime_error(_("cannot create pipe")); if (pipe(fifo_black_to_server)) throw std::runtime_error(_("cannot create pipe")); if (pipe(fifo_white_to_client)) throw std::runtime_error(_("cannot create pipe")); if (pipe(fifo_white_to_server)) throw std::runtime_error(_("cannot create pipe")); pid_black = fork(); if (pid_black == -1) throw std::runtime_error(_("cannot run black GTP client")); else if (pid_black == 0) { if (dup2(fifo_black_to_client[0], STDIN_FILENO) == -1) throw std::runtime_error(_("cannot redirect client")); if (dup2(fifo_black_to_server[1], STDOUT_FILENO) == -1) throw std::runtime_error(_("cannot redirect client")); close(fifo_black_to_client[0]); close(fifo_black_to_client[1]); close(fifo_black_to_server[0]); close(fifo_black_to_server[1]); close(fifo_white_to_client[0]); close(fifo_white_to_client[1]); close(fifo_white_to_server[0]); close(fifo_white_to_server[1]); if (execlp("/bin/sh", "sh", "-c", cmd_black, 0) == -1) throw std::runtime_error(_("cannot run black GTP client")); } pid_white = fork(); if (pid_white == -1) throw std::runtime_error(_("cannot run white GTP client")); else if (pid_white == 0) { if (dup2(fifo_white_to_client[0], STDIN_FILENO) == -1) throw std::runtime_error(_("cannot redirect client")); if (dup2(fifo_white_to_server[1], STDOUT_FILENO) == -1) throw std::runtime_error(_("cannot redirect client")); close(fifo_black_to_client[0]); close(fifo_black_to_client[1]); close(fifo_black_to_server[0]); close(fifo_black_to_server[1]); close(fifo_white_to_client[0]); close(fifo_white_to_client[1]); close(fifo_white_to_server[0]); close(fifo_white_to_server[1]); if (execlp("/bin/sh", "sh", "-c", cmd_white, 0) == -1) throw std::runtime_error(_("cannot run white GTP client")); } close(fifo_black_to_client[0]); close(fifo_black_to_server[1]); close(fifo_white_to_client[0]); close(fifo_white_to_server[1]); write(fifo_black_to_client[1], gtpcmd_boardsize, strlen(gtpcmd_boardsize)); write(fifo_white_to_client[1], gtpcmd_boardsize, strlen(gtpcmd_boardsize)); read_response(fifo_black_to_server[0]); read_response(fifo_white_to_server[0]); } void disconnect_clients() { write(fifo_black_to_client[1], gtpcmd_quit, strlen(gtpcmd_quit)); write(fifo_white_to_client[1], gtpcmd_quit, strlen(gtpcmd_quit)); read_response(fifo_black_to_server[0]); read_response(fifo_white_to_server[0]); close(fifo_black_to_client[1]); close(fifo_black_to_server[0]); close(fifo_white_to_client[1]); close(fifo_white_to_server[0]); waitpid(pid_black, 0, 0); waitpid(pid_white, 0, 0); } void game_loop(bool reverse = false) { if (reverse) { int *temp = fifo_black_to_client; fifo_black_to_client = fifo_white_to_client; fifo_white_to_client = temp; temp = fifo_black_to_server; fifo_black_to_server = fifo_white_to_server; fifo_white_to_server = temp; } time_player = 0; if (start_game_mode == START_GAME_INITIAL) { write(fifo_black_to_client[1], gtpcmd_clear_board, strlen(gtpcmd_clear_board)); write(fifo_white_to_client[1], gtpcmd_clear_board, strlen(gtpcmd_clear_board)); read_response(fifo_black_to_server[0]); read_response(fifo_white_to_server[0]); } else { std::string buf = gtpcmd_setup_board; for (int i = 0; i < 64; ++i) { switch (cur_game_info.board_ptr->board[i]) { case EMPTY: buf += '_'; break; case BLACK: buf += '@'; break; case WHITE: buf += 'O'; break; } } buf += '\n'; write(fifo_black_to_client[1], buf.c_str(), buf.size()); write(fifo_white_to_client[1], buf.c_str(), buf.size()); read_response(fifo_black_to_server[0]); read_response(fifo_white_to_server[0]); } int color = BLACK; for ( ; ; ) { if (!cur_game_info.board_ptr->can_play(color)) { color = switch_color(color); if (!cur_game_info.board_ptr->can_play(color)) break; } if (color == BLACK) { write(fifo_black_to_client[1], gtpcmd_genmove_black, strlen(gtpcmd_genmove_black)); int pos = read_move(fifo_black_to_server[0]); std::string buf = gtpcmd_play_black; buf += pos_to_x(pos) + 'A'; buf += pos_to_y(pos) + '1'; buf += '\n'; write(fifo_white_to_client[1], buf.c_str(), buf.size()); read_response(fifo_white_to_server[0]); cur_game_info.place_piece(pos, time_player); time_player = 0; } else { write(fifo_white_to_client[1], gtpcmd_genmove_white, strlen(gtpcmd_genmove_white)); int pos = read_move(fifo_white_to_server[0]); std::string buf = gtpcmd_play_white; buf += pos_to_x(pos) + 'A'; buf += pos_to_y(pos) + '1'; buf += '\n'; write(fifo_black_to_client[1], buf.c_str(), buf.size()); read_response(fifo_black_to_server[0]); cur_game_info.place_piece(pos, time_player); time_player = 0; } color = switch_color(color); } int black_score = cur_game_info.board_history[cur_game_info.num_history-1].board_black_score(); int white_score = cur_game_info.board_history[cur_game_info.num_history-1].board_white_score(); switch (cur_game_info.get_game_result()) { case game_info::game_result_end: adjust_score(black_score, white_score); break; case game_info::game_result_timeout_black: black_score = 0; white_score = 64; break; case game_info::game_result_timeout_white: black_score = 64; white_score = 0; break; case game_info::game_result_resign_black: black_score = 0; white_score = 64; break; case game_info::game_result_resign_white: black_score = 64; white_score = 0; break; default: black_score = 64; white_score = 0; break; } if (reverse) { last_score_black = white_score; last_score_white = black_score; } else { last_score_black = black_score; last_score_white = white_score; } total_score_black += last_score_black; total_score_white += last_score_white; if (last_score_black > last_score_white) game_win_black++; else if (last_score_black < last_score_white) game_win_white++; else game_draw++; log_history("gtp-rhino.log", "black", "white"); if (reverse) { int *temp = fifo_black_to_client; fifo_black_to_client = fifo_white_to_client; fifo_white_to_client = temp; temp = fifo_black_to_server; fifo_black_to_server = fifo_white_to_server; fifo_white_to_server = temp; } } int main_real(int argc, char *argv[]) { unsigned num_game = 1; bool num_game_set = false; if (argc > 1) { for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; unsigned u; if (arg == "-h" || arg == "--help") { std::cout << prog_name << ' ' << prog_ver << _(" - AI vs AI for GTP-Rhino\n"); std::cout << _("(c) 2005 Kriang Lerdsuwanakij\n\n"); gtout(std::cout, _("Usage: %$ [options] [num_games]\n")) << prog_name; std::cout << _("Available options:\n"); std::cout << _(" -r N, --rand=N Use random board with N initial pieces.\n"); std::cout << _(" N=4..32, N even\n"); std::cout << _(" -s N, --sync=N Use synchro random mode with N initial pieces,\n"); std::cout << _(" i.e. for each board an additional game is played.\n"); std::cout << _(" with players switching their assigned color.\n"); std::cout << _(" Actual number of games played = 2 x num_games.\n"); std::cout << _(" N=4..32, N even\n"); return 0; } else if (arg == "-v" || arg == "--version") { std::cout << prog_name << ' ' << prog_ver << '\n'; return 0; } else if (process_unsigned_option(argc, argv, arg, i, "-r", "--rand", 4, 32, u)) { if (u % 2) { gtstream bufstr; gtout(bufstr, _("invalid argument for option `%$\'")) << arg; throw std::runtime_error(bufstr.str()); } start_game_mode = START_GAME_RANDOM; start_random_game_pieces = u; synchro_rand = false; } else if (process_unsigned_option(argc, argv, arg, i, "-s", "--sync", 4, 32, u)) { if (u % 2) { gtstream bufstr; gtout(bufstr, _("invalid argument for option `%$\'")) << arg; throw std::runtime_error(bufstr.str()); } start_game_mode = START_GAME_RANDOM; start_random_game_pieces = u; synchro_rand = true; } else { u = 0; size_t i; for (i = 0; i < arg.size(); ++i) { if (arg[i] < '0' || arg[i] > '9') break; u = u*10 + arg[i]-'0'; } if (i == arg.size()) { if (!num_game_set) { num_game = u; num_game_set = true; } else { gtstream bufstr; gtout(bufstr, _("extra argument `%$\'")) << arg; throw std::runtime_error(bufstr.str()); } } else { gtstream bufstr; gtout(bufstr, _("unknown option `%$\'")) << arg; throw std::runtime_error(bufstr.str()); } } } } connect_clients(); std::string file = get_user_home_dir(); file += '/'; file += "gtp-rhino.info"; std::ofstream of(file.c_str(), std::ios::app); if (of) { of << "---------------------------------------------------\n"; if (start_game_mode == START_GAME_INITIAL) of << "Board: Initial\n"; else if (synchro_rand) of << "Board: Synchro Random " << start_random_game_pieces << '\n'; else of << "Board: Random " << start_random_game_pieces << '\n'; of << "Black: " << cmd_black << '\n'; of << "White: " << cmd_black << '\n'; of << "Start time: "; char buffer[80]; time_t t = time(0); if (strftime(buffer, 80, "%Y.%m.%d_%H:%M:%S.%Z", localtime(&t))) of << buffer; else of << t; of << '\n'; } for (unsigned i = 0; i < num_game; ++i) { if (num_game > 1) std::cout << "Game " << i+1 << ' ' << std::flush; eval_new_game(); new_game(cur_game_info); game_loop(); std::cout << last_score_black << '-' << last_score_white; if (synchro_rand) { byte_board_info b(cur_game_info.board_history[0]); eval_new_game(); new_game(cur_game_info, b); game_loop(true); std::cout << ' ' << last_score_black << '-' << last_score_white; } std::cout << '\n'; } if (of) { of << "End time: "; char buffer[80]; time_t t = time(0); if (strftime(buffer, 80, "%Y.%m.%d_%H:%M:%S.%Z", localtime(&t))) of << buffer; else of << t; of << '\n'; of << "Game: " << game_win_black << '-' << game_win_white << '-' << game_draw << '\n'; of << "Score: " << total_score_black << '-' << total_score_white << '\n'; } if (num_game > 1) { std::cout << "Game: " << game_win_black << '-' << game_win_white << '-' << game_draw << '\n'; std::cout << "Score: " << total_score_black << '-' << total_score_white << '\n'; } disconnect_clients(); return 0; } int main(int argc, char *argv[]) { try { init(); return main_real(argc, argv); } catch (std::exception &e) { std::cout << std::flush; gtout(std::cerr, _("%$: %$\n")) << prog_name << e.what(); } catch (const char *s) { std::cout << std::flush; gtout(std::cerr, _("%$: exception %$\n")) << prog_name << s; } catch (...) { std::cout << std::flush; gtout(std::cerr, _("%$: unknown exception\n")) << prog_name; } return 1; } grhino-0.16.1/boardio.h0000644000175000017500000000221011436423224015107 0ustar lerdsuwalerdsuwa/* boardio.h Game Board I/O Copyright (c) 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef BOARDIO_H #define BOARDIO_H #include "config.h" #include "board.h" #include std::ostream& operator<<(std::ostream &os, const byte_board_info *board); void print_indent(std::ostream &os, int indent = 0); void print_board(std::ostream &os, const byte_board_info *board, int indent = 0); void print_pos(std::ostream &os, int pos); #endif /* BOARDIO_H */ grhino-0.16.1/gameinfo.h0000644000175000017500000000661111436423224015266 0ustar lerdsuwalerdsuwa/* gameinfo.h Game States Copyright (c) 2004, 2005, 2006 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef GAMEINFO_H #define GAMEINFO_H #include "board.h" // Initial board (num_history = 1, min_num_history = 1, max_num_history = 1) // board_history . // move_history // player_history B // time_history // clock_history_black 15:00.00 // clock_history_white 15:00.00 // After first move F5 (num_history = 2, min_num_history = 1, max_num_history = 2) // board_history . . // move_history F5 // player_history B W // time_history 5.00 // clock_history_black 15:00.00 14:55.00 // clock_history_white 15:00.00 15:00.00 // After moves D6, C3 (num_history = 4, min_num_history = 1, max_num_history = 4) // board_history . . . . // move_history F5 D6 C3 // player_history B W B W // time_history 5.00 3.00 4.00 // clock_history_black 15:00.00 14:55.00 14:55.00 14:51.00 // clock_history_white 15:00.00 15:00.00 14:57.00 14:57.00 class game_info { public: enum game_result_type { // When game_play = false game_result_end, game_result_timeout_black, game_result_timeout_white, game_result_resign_black, game_result_resign_white }; private: bool random_game; int random_game_pieces; int player; bool game_play; game_result_type game_result; bool use_clock; int clock_history_black[NUM_MOVE+1]; // Unit 0.01 sec int clock_history_white[NUM_MOVE+1]; public: byte_board_info *board_ptr; // Opening information included bool first_play_is_pass; // For board byte_board_info board_history[NUM_MOVE+1]; int player_history[NUM_MOVE+1]; int move_history[NUM_MOVE+1]; int time_history[NUM_MOVE+1]; // Unit 0.01 sec int num_history; int min_num_history; int max_num_history; private: void new_game_remaining(int queue_size); void set_game_play_from_board(); public: game_info(); ~game_info(); void new_game_from_begin(int queue_size = 0); void new_game_from_board(const byte_board_info *b, int p); bool is_undoable() const; bool is_redoable() const; void undo(); void redo(); void place_piece(int pos, int time); void player_timeout(); void player_resign(); void game_end(); bool is_random_game() { return random_game; } int get_random_game_pieces() { return random_game_pieces; } int get_player() { return player; } bool is_game_play() { return game_play; } game_result_type get_game_result() { return game_result; } bool is_use_clock() { return use_clock; } int get_clock(); }; #endif /* GAMEINFO_H */ grhino-0.16.1/scripts/0000755000175000017500000000000011436423225015014 5ustar lerdsuwalerdsuwagrhino-0.16.1/scripts/copy-message0000644000175000017500000000046611436423225017341 0ustar lerdsuwalerdsuwatitle = "GRhino PO Files" copyright = "Copyright (C) 2002 Kriang Lerdsuwanakij author = "Kriang Lerdsuwanakij , 2002" package = "grhino" translator = "Kriang Lerdsuwanakij " language_team = "Kriang Lerdsuwanakij " grhino-0.16.1/scripts/config.rpath0000755000175000017500000003744411436423225017340 0ustar lerdsuwalerdsuwa#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2006 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; darwin*) case $cc_basename in xlc*) wl='-Wl,' ;; esac ;; mingw* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux*) case $cc_basename in icc* | ecc*) wl='-Wl,' ;; pgcc | pgf77 | pgf90) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; sco3.2v5*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) wl='-Wl,' ;; sysv4*MP*) ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we cannot use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; interix3*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; linux*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix4* | aix5*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix5*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 hardcode_direct=yes else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if test "$GCC" = yes ; then : else case $cc_basename in xlc*) ;; *) ld_shlibs=no ;; esac fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | kfreebsd*-gnu | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; openbsd*) hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. libname_spec='lib$name' case "$host_os" in aix3*) ;; aix4* | aix5*) ;; amigaos*) ;; beos*) ;; bsdi[45]*) ;; cygwin* | mingw* | pw32*) shrext=.dll ;; darwin* | rhapsody*) shrext=.dylib ;; dgux*) ;; freebsd1*) ;; kfreebsd*-gnu) ;; freebsd* | dragonfly*) ;; gnu*) ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac ;; interix3*) ;; irix5* | irix6* | nonstopux*) case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux*) ;; knetbsd*-gnu) ;; netbsd*) ;; newsos6) ;; nto-qnx*) ;; openbsd*) ;; os2*) libname_spec='$name' shrext=.dll ;; osf3* | osf4* | osf5*) ;; solaris*) ;; sunos4*) ;; sysv4 | sysv4.3*) ;; sysv4*MP*) ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) ;; uts4*) ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # This shell variable is my proudest work .. or something. --bje set_cc_for_build='tmpdir=${TMPDIR-/tmp}/config-guess-$$ ; (old=`umask` && umask 077 && mkdir $tmpdir && umask $old && unset old) || (echo "$me: cannot create $tmpdir" >&2 && exit 1) ; dummy=$tmpdir/dummy ; files="$dummy.c $dummy.o $dummy.rel $dummy" ; trap '"'"'rm -f $files; rmdir $tmpdir; exit 1'"'"' 1 2 15 ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; rm -f $files ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; unset files' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. cat <$dummy.s .data \$Lformat: .byte 37,100,45,37,120,10,0 # "%d-%x\n" .text .globl main .align 4 .ent main main: .frame \$30,16,\$26,0 ldgp \$29,0(\$27) .prologue 1 .long 0x47e03d80 # implver \$0 lda \$2,-1 .long 0x47e20c21 # amask \$2,\$1 lda \$16,\$Lformat mov \$0,\$17 not \$1,\$18 jsr \$26,printf ldgp \$29,0(\$26) mov 0,\$16 jsr \$26,exit .end main EOF eval $set_cc_for_build $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null if test "$?" = 0 ; then case `$dummy` in 0-0) UNAME_MACHINE="alpha" ;; 1-0) UNAME_MACHINE="alphaev5" ;; 1-1) UNAME_MACHINE="alphaev56" ;; 1-101) UNAME_MACHINE="alphapca56" ;; 2-303) UNAME_MACHINE="alphaev6" ;; 2-307) UNAME_MACHINE="alphaev67" ;; 2-1307) UNAME_MACHINE="alphaev68" ;; esac fi rm -f $dummy.s $dummy && rmdir $tmpdir echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD $dummy.c -o $dummy \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 rm -f $dummy.c $dummy && rmdir $tmpdir echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD $dummy.c -o $dummy && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 rm -f $dummy.c $dummy && rmdir $tmpdir echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`$dummy` if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi rm -f $dummy.c $dummy && rmdir $tmpdir fi ;; esac echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD $dummy.c -o $dummy && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 rm -f $dummy.c $dummy && rmdir $tmpdir echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3D:*:*:*) echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` rm -f $dummy.c && rmdir $tmpdir echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:3*) echo i386-pc-interix3 exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i386-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` rm -f $dummy.c && rmdir $tmpdir test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` rm -f $dummy.c && rmdir $tmpdir test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) echo `uname -p`-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && $dummy && rm -f $dummy.c $dummy && rmdir $tmpdir && exit 0 rm -f $dummy.c $dummy && rmdir $tmpdir # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: grhino-0.16.1/scripts/rpcp0000755000175000017500000000275111436423225015713 0ustar lerdsuwalerdsuwa#! /usr/bin/env perl # rpcp - replace text while copy file # Copyright (c) 2000 Kriang Lerdsuwanakij # email: lerdsuwa@users.sourceforge.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. $prog_name = "rpcp"; $prog_ver = "2.0.0"; if (@ARGV != 3) { print "$prog_name $prog_ver\n"; print "usage $prog_name RPCP INFILE OUTFILE\n"; exit 0; } @key = (); @replace = (); open INFILE, $ARGV[0] or die "$prog_name: cannot open $ARGV[0] for reading\n"; while () { @list = split ' ', $_; push @key, $list[0]; shift @list; push @replace, join ' ',@list;; } close INFILE; open INFILE, $ARGV[1] or die "$prog_name: cannot open $ARGV[0] for reading\n"; open OUTFILE, ">$ARGV[2]" or die "$prog_name: cannot open $ARGV[0] for writing\n"; while () { for $i (0 .. scalar(@key)-1) { s/$key[$i]/$replace[$i]/g; } print OUTFILE $_; } close INFILE; close OUTFILE; grhino-0.16.1/scripts/config.sub0000755000175000017500000007145311436423225017011 0ustar lerdsuwalerdsuwa#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002 Free Software Foundation, Inc. timestamp='2002-07-03' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | freebsd*-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa64 | mipsisa64el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c54x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipstx39 | mipstx39el \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon) basic_machine=i686-pc ;; pentiumii | pentium2) basic_machine=i686-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3d) basic_machine=alpha-cray os=-unicos ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; windows32) basic_machine=i386-pc os=-windows32-msvcrt ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; c4x*) basic_machine=c4x-none os=-coff ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* | -powermax*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto*) os=-nto-qnx ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: grhino-0.16.1/scripts/commit0000755000175000017500000000562111436423225016236 0ustar lerdsuwalerdsuwa#!/bin/sh # commit # Copyright (c) 2000, 2002, 2010 Kriang Lerdsuwanakij # email: lerdsuwa@users.sourceforge.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Set temporary filenames # PACKAGE=grhino DIFF_FILE="/tmp/$PACKAGE-cvs-diff-$USER" LOG_FILE="/tmp/$PACKAGE-cvs-log-$USER" CHLOG_FILE="/tmp/$PACKAGE-cvs-chlog-$USER" RPCP_IN_FILE="/tmp/$PACKAGE-rpcp-in-$USER" RPCP_OUT_FILE="/tmp/$PACKAGE-rpcp-out-$USER" # # Sanitiy check, abort if fail # # Must run this script from package root directory scripts/dircheck || exit 0 # Clean up previous results, if any rm -f $DIFF_FILE || exit 0 rm -f $LOG_FILE || exit 0 rm -f $CHLOG_FILE || exit 0 rm -f $RPCP_IN_FILE || exit 0 rm -f $RPCP_OUT_FILE || exit 0 # # Get diff file # cvs diff -cp "$@" > $DIFF_FILE if grep "^cvs diff: I know nothing about" $DIFF_FILE; then # Errors are already shown during grep, exit rm -f $DIFF_FILE exit 0 elif grep '^diff -c -p' $DIFF_FILE; then # Changes detected true elif grep 'no comparison available' $DIFF_FILE; then # Files added or deleted true else # Report errors or no changes then exit cat $DIFF_FILE rm -f $DIFF_FILE exit 0 fi # # Prepare ChangeLog template # # Create date stamp date +"%Y-%m-%d" | tr -d \\n\\r > $LOG_FILE # Get user name and email from scripts/commit-template using $USER echo " $USER" > $RPCP_IN_FILE echo "" >> $RPCP_IN_FILE echo "" >> $RPCP_IN_FILE echo "" >> $RPCP_IN_FILE scripts/rpcp scripts/commit-template $RPCP_IN_FILE $RPCP_OUT_FILE cat $RPCP_OUT_FILE >> $LOG_FILE # # Edit ChangeLog # $EDITOR $LOG_FILE $DIFF_FILE # # Commit # if grep ':' $LOG_FILE; then # Use $* here so that it is expanded to only one argument if test -z "$*"; then # No arguments present in the command line, commit all file cp ChangeLog $CHLOG_FILE \ && cat $LOG_FILE $CHLOG_FILE > ChangeLog \ && cvs commit -F $LOG_FILE "$@" else # Commit only ChangeLog and files given in the command line cp ChangeLog $CHLOG_FILE \ && cat $LOG_FILE $CHLOG_FILE > ChangeLog \ && cvs commit -F $LOG_FILE ChangeLog "$@" fi # Cleanup rm -f $DIFF_FILE $LOG_FILE $CHLOG_FILE rm -f $RPCP_IN_FILE $RPCP_OUT_FILE rm -f $DIFF_FILE~ $LOG_FILE~ exit 0 else # Cleanup rm -f $DIFF_FILE $LOG_FILE $CHLOG_FILE rm -f $RPCP_IN_FILE $RPCP_OUT_FILE rm -f $DIFF_FILE~ $LOG_FILE~ exit 1 fi grhino-0.16.1/scripts/mkinstalldirs0000755000175000017500000000132611436423225017624 0ustar lerdsuwalerdsuwa#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain # $Id: mkinstalldirs,v 1.1 2002/07/20 17:52:54 lerdsuwa Exp $ errstatus=0 for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr fi fi pathcomp="$pathcomp/" done done exit $errstatus # mkinstalldirs ends here grhino-0.16.1/scripts/dircheck0000755000175000017500000000013611436423225016516 0ustar lerdsuwalerdsuwa#!/bin/sh if test -e alphabeta.cc; then exit 0 fi echo cannot run from this directory exit 1 grhino-0.16.1/scripts/makepkg0000755000175000017500000000446111436423225016366 0ustar lerdsuwalerdsuwa#!/usr/bin/env perl # # makepkg # Copyright (c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij # email: lerdsuwa@users.sourceforge.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. $package = "grhino"; $ret = system("scripts/dircheck"); if ($ret) { exit 1; } if (@ARGV > 1 || (@ARGV == 1 && $ARGV[0] ne "release")) { print "usage: makepkg [release]\n"; } system("make default-po"); $ver = `cat scripts/version`; chomp $ver; $ver =~ s/.*\"(.*)\".*/$1/; if (@ARGV == 0) { $ver = "pre$ver"; } $tmpdir = "/tmp"; $pkgdir = "$tmpdir/$package-$ver"; $rpcp_file = "/tmp/$package-$var-rpcp"; system("rm -rf $pkgdir"); system("rm -f $rpcp_file"); system("echo \"%VERSION% $ver\" > $rpcp_file"); system("echo \"%RELYYYYMMDD% `date +%Y-%m-%d`\" >> $rpcp_file"); system("echo \"\@VERSION\@ $ver\" >> $rpcp_file"); system("echo \"\@RELMMMYYYY\@ `date \"+%b %Y\"`\" >> $rpcp_file"); mkdir "$pkgdir", 0700; open (MANIFEST_FILE, "MANIFEST") or die "cannot find MANIFEST"; while () { chomp; s/\s*$//; # Remove trailing spaces @list = split(/\s+/, $_); die "invalid line $_" if (scalar @list > 2); $file = $list[0]; if (scalar @list == 2 && $list[1] eq "RPCP") { $rpcp = 1; } else { $rpcp = 0; } die "$file not found" if ! -e "$file"; if ($file =~ /\//) { $dir = $file; $dir =~ s/\/([^\/]*)$//; if (! -d "$pkgdir/$dir") { system "mkdir -p $pkgdir/$dir"; } } if ($rpcp) { system "rpcp $rpcp_file $file $pkgdir/$file"; } else { system "cp $file $pkgdir/$file"; } } close MANIFEST_FILE; system "cd $tmpdir; tar cvzf $package-$ver.tar.gz $package-$ver"; system "mv $tmpdir/$package-$ver.tar.gz ../$package-pkgs/"; system "cp NEWS ../$package-pkgs/$package-$ver.NEWS"; grhino-0.16.1/scripts/makepkg-release0000755000175000017500000000201611436423225017776 0ustar lerdsuwalerdsuwa#!/usr/bin/env perl # # makepkg-release # Copyright (c) 2001, 2004 Kriang Lerdsuwanakij # email: lerdsuwa@users.sourceforge.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. $ret = system("scripts/dircheck"); if ($ret) { exit 1; } system "scripts/makepkg release"; $ver = `cat scripts/version`; chomp $ver; $ver =~ s/.*\"(.*)\".*/$1/; $ver =~ tr/\./\_/; system "cvs diff && cvs tag ver-$ver"; grhino-0.16.1/scripts/copy-message.pl0000644000175000017500000001222311436423225017745 0ustar lerdsuwalerdsuwa# copy-message.pl - Copy message from msgid to msgstr # Copyright (c) 2000, 2002 Kriang Lerdsuwanakij # email: lerdsuwa@users.sourceforge.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Program information # $prog_name = "copy-message.pl"; $prog_ver = ""; $description = "Copy message from msgid to msgstr"; $copyright = "Copyright (c) 2000, 2002 Kriang Lerdsuwanakij"; # # Main program # sub parse_arguments; sub subst_string; %var_hash = (); parse_arguments(@ARGV); print "# Automatically generated by copy-message.pl\n"; @msgid_list = (); $begin_multiline_msgid = 0; $in_multiline_msgid = 0; while () { # # Process line immediately after the string # 'msgid ""'. This requires special treatment # only if it is immediately followed by # 'msgstr ""'. # if ($begin_multiline_msgid) { if (/^\s*msgstr/) { # Information print $_; $begin_multiline_msgid = 0; $in_multiline_msgid = 0; } elsif (/^\s*\"/) { # Continue multiline msgid print $_; push @msgid_list, $_; $begin_multiline_msgid = 0; } else { print $_; $begin_multiline_msgid = 0; $in_multiline_msgid = 0; } } # # Process all other lines after the string # msgid "". If 'msgstr' is found, we expand # with string collected earlier. # elsif ($in_multiline_msgid) { if (/^\s*\"/) { # Continue multiline msgid print $_; push @msgid_list, $_; } elsif (/^\s*msgstr/) { # Start msgstr $output_tag = 0; for $line (@msgid_list) { if ($output_tag == 0) { print "msgstr" . "$line"; $output_tag = 1; } else { print $line; } } $in_multiline_msgid = 0; } else { print $_; $in_multiline_msgid = 0; } } # # Beginning of 'msgid' cases # elsif (/^\s*msgid\s*\"\"/) { print $_; @msgid_list = (); push @msgid_list, " \"\"\n"; $begin_multiline_msgid = 1; $in_multiline_msgid = 1; } elsif (/^\s*msgid/) { print $_; @msgid_list = (); push @msgid_list, $'; $begin_multiline_msgid = 0; $in_multiline_msgid = 1; } # # Other cases, comments, etc. # else { if (/# SOME DESCRIPTIVE TITLE/ && exists($var_hash{TITLE})) { print "# $var_hash{TITLE}\n"; } elsif (/\# Copyright \(C\) YEAR Free Software Foundation\, Inc/ && exists($var_hash{COPYRIGHT})) { print "# $var_hash{COPYRIGHT}\n"; } elsif (/\# FIRST AUTHOR \\, YEAR/ && exists($var_hash{AUTHOR})) { print "# $var_hash{AUTHOR}\n"; } elsif (/\#\, fuzzy/) { ; } elsif (/Project-Id-Version/) { s/PACKAGE/$var_hash{PACKAGE}/ if exists($var_hash{PACKAGE}); s/VERSION/$var_hash{VERSION}/ if exists($var_hash{VERSION}); print $_; } elsif (/PO-Revision-Date/) { s/YEAR\-MO\-DA HO\:MI\+ZONE/$var_hash{DATE}/ if exists($var_hash{DATE}); print $_; } elsif (/Last-Translator/) { s/FULL NAME \/$var_hash{TRANSLATOR}/ if exists($var_hash{TRANSLATOR}); print $_; } elsif (/Language-Team/) { s/LANGUAGE \/$var_hash{LANGUAGE_TEAM}/ if exists($var_hash{LANGUAGE_TEAM}); print $_; } elsif (/Content-Type/) { s/CHARSET/$var_hash{CHARSET}/ if exists($var_hash{CHARSET}); print $_; } else { print $_; } } } # # Subroutines # sub display_version { print <) { if (/^\s*(\S*)\s*=\s*\"(.*)\"/) { set_variable ($1, $2); } } } sub parse_arguments { my @parm = @_; my $i; my $num_i = scalar (@parm); for ($i = 0; $i < $num_i; $i++) { if ($parm[$i] eq "-h" || $parm[$i] eq "--help") { display_help(); } elsif ($parm[$i] eq "-v" || $parm[$i] eq "--version") { display_version(); } elsif ($parm[$i] eq "-f" && $i < $num_i-1) { load_file($parm[$i+1]); $i++; } elsif ($parm[$i] eq "-d" && $i < $num_i-2) { set_variable($parm[$i+1], $parm[$i+2]); $i += 2; } else { die "$prog_name: unrecognized option $parm[$i]\n"; } } } grhino-0.16.1/scripts/commit-template0000644000175000017500000000007711436423225020044 0ustar lerdsuwalerdsuwalerdsuwa Kriang Lerdsuwanakij grhino-0.16.1/scripts/en_GB.pl0000644000175000017500000000254711436423225016333 0ustar lerdsuwalerdsuwa# en_GB.pl - Generate en_GB messages from en_US # Copyright (c) 2000 Kriang Lerdsuwanakij # email: lerdsuwa@users.sourceforge.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. print "# Automatically generated by en_GB.pl\n"; $translate = 0; while () { $line = $_; $done = ""; if ($line =~ /^\s*msgid/) { $translate = 0; } elsif ($line =~ /^\s*msgstr/) { $translate = 1; } if ($translate == 1 && $line !~ /^\#/) { # English words s/(c|C)olor/$1olour/g; s/(r|R)ecognize/$1ecognise/g; s/(p|P)rogram/$1rogramme/g; # Date/time formats s/\%b \%d, \%Y/\%d \%b \%Y/g; s/\%b \%d/\%d \%b/g; s/\%b \%e, \%Y/\%e \%b \%Y/g; s/\%b \%e/\%e \%b/g; $done = $_; } else { $done = $_; } print $done; } grhino-0.16.1/scripts/utf-quotes.pl0000644000175000017500000000364411436423225017474 0ustar lerdsuwalerdsuwa# utf-quotes.pl - Generate UTF-8 nice quotes # Copyright (c) 2000 Kriang Lerdsuwanakij # email: lerdsuwa@users.sourceforge.net # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. print "# Automatically generated by utf-quotes.pl\n"; $translate = 0; while () { $line = $_; $done = ""; if ($line =~ /^\s*msgid/) { $translate = 0; } elsif ($line =~ /^\s*msgstr/) { $translate = 1; } # Skip comment lines # and lines containing eval `...` if ($translate == 1 && $line !~ /^\#/ && $line !~ /eval \`.*\`/) { while ($line ne "") { # Find first occurance of either # ` or ' if ($line =~ /([\`\'])/) { $pre = $`; $left = $1 . $'; if ($1 eq "`") { # ` found first if ($left =~ /^\`\`\'/) { $done = $done . $pre . "\xe2\x80\x98`\xe2\x80\x99"; $line = $'; } elsif ($left =~ /^\`\'\'/) { $done = $done . $pre . "\xe2\x80\x98\'\xe2\x80\x99"; $line = $'; } elsif ($left =~ /^\`/) { $done = $done . $pre . "\xe2\x80\x98"; $line = $'; } } else { # ' found first if ($left =~ /^\'/) { $done = $done . $pre . "\xe2\x80\x99"; $line = $'; } } } else { $done = $done . $line; $line = ""; } } } else { $done = $_; } print $done; } grhino-0.16.1/scripts/version0000644000175000017500000000002111436423225016415 0ustar lerdsuwalerdsuwaVERSION="0.16.1" grhino-0.16.1/row1.bin0000600000175000017500000020011211436423225014673 0ustar lerdsuwalerdsuwa@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@grhino-0.16.1/book.h0000644000175000017500000000260311436423224014430 0ustar lerdsuwalerdsuwa/* book.h Open book database Copyright (c) 2001, 2002, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef BOOK_H #define BOOK_H #include "board.h" typedef int *symmetry_type; int read_int(int handle); void write_int(int handle, int i); int read_char(int handle); void write_char(int handle, int i); unsigned read_unsigned_compress(int handle); void write_unsigned_compress(int handle, unsigned i); symmetry_type get_symmetry(int first_move); const char *get_book_file(); const char *get_book_data_file(); void set_book_random(size_t r); size_t get_book_random(); void book_init(); int book_move(byte_board_info *board, int move_history[NUM_MOVE+1], int player_history[NUM_MOVE+1]); #endif /* BOOK_H */ grhino-0.16.1/alphabeta.h0000644000175000017500000000250111436423224015414 0ustar lerdsuwalerdsuwa/* alphabeta.h Alpha-Beta Pruning Copyright (c) 2000, 2001, 2003, 2004, 2005 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef ALPHABETA_H #define ALPHABETA_H #include "board.h" #include "iter.h" struct search_info { byte_board_info *board; empty_endgame_info empties; }; void set_eval_random(int r); int get_eval_random(); void set_midgame_depth(int depth); void eval_new_game(); int eval_midgame(byte_board_info *board, int color, int *store_pos); int eval_endgame(byte_board_info *board, int color, int *store_pos); int eval_winlossdraw(byte_board_info *board, int color, int *store_pos, double komi = 0.0); #endif /* ALPHABETA_H */ grhino-0.16.1/opening-dat.h0000644000175000017500000006427311436423225015717 0ustar lerdsuwalerdsuwa/* Generated by gen_opening. */ opening_info opening_data[] = { { N_("None"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0, "" }, { N_("Diagonal Opening"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2, "\x1a\x12" }, { N_("X-square Opening"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x12\x13\x22\x09" }, { N_("Snake, Peasant"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x12\x13\x22\x11" }, { N_("Pyramid, Checkerboarding Peasant"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, -1, 1, -1, 1, -1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11, "\x1a\x12\x13\x22\x11\x1d\x21\x19\x2a\x2b\x25" }, { N_("Heath, Tobidashi \"Jumping Out\""), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x12\x13\x22\x19" }, { N_("Mimura variation II"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, -1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 13, "\x1a\x12\x13\x22\x19\x0b\x0a\x1d\x2b\x2a\x25\x2c\x35" }, { N_("Heath-Bat"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 1, 1, -1, 1, 0, 0, 0, 0, 0, 1, -1, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x12\x13\x22\x19\x0b\x2b" }, { N_("Iwasaki variation"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, 1, -1, 1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x12\x13\x22\x19\x0b\x0c" }, { N_("Heath-Chimney, \"Mass-Turning\""), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 1, 1, -1, -1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6, "\x1a\x12\x13\x22\x19\x14" }, { N_("Raccoon Dog"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x12\x13\x22\x21" }, { N_("Hamilton"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, -1, -1, -1, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x12\x13\x22\x29\x2a\x21" }, { N_("Lollipop"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, -1, 1, -1, 0, 0, 0, 0, 0, 1, -1, -1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6, "\x1a\x12\x13\x22\x29\x14" }, { N_("Cow"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, -1, 1, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x12\x13\x22\x2b" }, { N_("Chimney"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, -1, 1, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6, "\x1a\x12\x13\x22\x2b\x14" }, { N_("Cow Bat, Bat, Cambridge"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x12\x13\x22\x2b\x1d\x19" }, { N_("Bat (Piau Continuation 2)"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, -1, -1, -1, -1, 0, 0, 0, 1, -1, -1, -1, 0, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11, "\x1a\x12\x13\x22\x2b\x1d\x19\x29\x21\x2a\x11" }, { N_("Melnikov, Bat (Piau Continuation 1)"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 1, -1, -1, 1, -1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11, "\x1a\x12\x13\x22\x2b\x1d\x19\x29\x21\x2a\x25" }, { N_("Bat (Kling Continuation)"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, -1, 1, 1, -1, 0, 0, 0, -1, 1, -1, 1, -1, -1, 0, 0, -1, -1, 1, 1, -1, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 17, "\x1a\x12\x13\x22\x2b\x1d\x19\x2a\x21\x11\x29\x14\x0a\x18\x20\x28\x0b" }, { N_("Bat (Kling Alternative)"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, -1, -1, 0, 0, 0, 0, 1, 1, -1, -1, -1, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9, "\x1a\x12\x13\x22\x2b\x1d\x19\x14\x11" }, { N_("Rose-v-Toth"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, -1, 1, -1, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x12\x13\x22\x2b\x1d\x25" }, { N_("Tanida"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, -1, -1, 1, -1, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8, "\x1a\x12\x13\x22\x2b\x1d\x25\x0b" }, { N_("Aircraft, Feldborg"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, -1, -1, 1, -1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9, "\x1a\x12\x13\x22\x2b\x1d\x25\x0b\x21" }, { N_("Sailboat"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, -1, -1, 1, 1, 1, 0, 0, 0, -1, -1, 1, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10, "\x1a\x12\x13\x22\x2b\x1d\x25\x0b\x1e\x33" }, { N_("Maruoka"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, -1, 1, -1, 0, 0, 0, 0, -1, -1, 1, 1, 0, 0, 0, 0, 1, -1, -1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10, "\x1a\x12\x13\x22\x2b\x1d\x25\x2c\x2a\x33" }, { N_("Landau"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, -1, 1, -1, 0, 0, 0, 0, -1, -1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9, "\x1a\x12\x13\x22\x2b\x1d\x25\x2c\x2d" }, { N_("Buffalo, Kenichi Variation"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x12\x13\x22\x2d" }, { N_("Maruoka Buffalo"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x12\x13\x22\x2d\x0c\x2a" }, { N_("Tanida Buffalo"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10, "\x1a\x12\x13\x22\x2d\x14\x2a\x25\x1d\x26" }, { N_("Hokuriku Buffalo"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6, "\x1a\x12\x13\x22\x2d\x25" }, { N_("Wing Variation"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4, "\x1a\x12\x2c\x22" }, { N_("Semi-Wing Variation"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4, "\x1a\x12\x25\x22" }, { N_("Parallel Opening"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2, "\x1a\x22" }, { N_("Perpendicular Opening"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 2, "\x1a\x14" }, { N_("Mimura"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6, "\x1a\x14\x1d\x22\x2b\x2c" }, { N_("Shaman, Danish"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, 1, -1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x14\x1d\x22\x2b\x15\x2a" }, { N_("Inoue"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, -1, 0, 0, 0, 0, 1, 1, -1, 1, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x14\x1d\x22\x2b\x15\x13" }, { N_("IAGO"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 1, -1, 1, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8, "\x1a\x14\x1d\x22\x2b\x15\x13\x12" }, { N_("Bhagat"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 1, 1, 0, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x14\x1d\x22\x2b\x15\x0c" }, { N_("Rose"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 1, -1, 1, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c" }, { N_("Flat"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 1, -1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c\x21" }, { N_("Rotating Flat"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 1, -1, -1, 0, 0, 0, 1, 1, 1, 1, -1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c\x21\x25" }, { N_("Murakami Variation"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, -1, -1, 0, 0, 0, 1, 1, 1, 1, -1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 13, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c\x21\x25\x11" }, { N_("Rotating Flat (Kling Continuation)"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 1, 1, -1, -1, 0, 0, 0, 1, 1, 1, -1, -1, 0, 0, 0, 1, 1, 1, -1, -1, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c\x21\x25\x19\x2d\x0a\x34\x0b\x32" }, { N_("Rose-Birth"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 1, -1, -1, 0, 0, 0, 0, 1, 1, 1, -1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c\x29\x25" }, { N_("Brightstein"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 1, 1, -1, -1, -1, 0, 0, 0, 0, 1, -1, 1, 1, 1, 0, 0, 1, 0, -1, 1, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 16, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c\x29\x25\x19\x2d\x26\x33" }, { N_("Rose-birdie, Rose-Tamenori"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, 1, -1, -1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 13, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c\x29\x25\x26" }, { N_("Rose-Tamenori-Kling"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 1, 1, -1, -1, 1, 0, 0, 1, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 14, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c\x29\x25\x26\x2d" }, { N_("Greenberg, Dawg"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, -1, 1, 1, -1, 0, 0, 0, 0, -1, 1, -1, 1, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11, "\x1a\x14\x1d\x22\x2b\x15\x2c\x12\x13\x0c\x0b" }, { N_("Ralle"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8, "\x1a\x14\x1d\x22\x2b\x15\x2c\x2a" }, { N_("Horse"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, -1, 1, 1, 0, 0, 0, 0, -1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x14\x1d\x22\x2c" }, { N_("No-Cat"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4, "\x1a\x14\x25\x19" }, { N_("Swallow"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, -1, -1, -1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x14\x25\x19\x15" }, { N_("No-Cat (Continuation)"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, -1, -1, -1, 1, 1, 0, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 12, "\x1a\x14\x25\x19\x15\x1d\x0c\x2c\x26\x2d\x2b\x2a" }, { N_("Italian"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x14\x25\x2c\x13" }, { N_("Cat"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, -1, 1, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x14\x25\x2c\x1d" }, { N_("Sakaguchi"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 1, -1, -1, 1, 0, 0, 0, 0, -1, -1, 1, 1, 0, 0, 0, 0, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10, "\x1a\x14\x25\x2c\x1d\x22\x2b\x2a\x35\x15" }, { N_("Berner"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, -1, 1, -1, 0, 0, 0, 0, -1, -1, -1, 1, -1, 0, 0, 0, -1, -1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 11, "\x1a\x14\x25\x2c\x1d\x22\x2b\x2a\x35\x26\x2e" }, { N_("Ganglion"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 4, "\x1a\x14\x2d\x19" }, { N_("Tiger"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 5, "\x1a\x14\x2d\x2c\x25" }, { N_("Stephenson"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x14\x2d\x2c\x25\x22\x12" }, { N_("No-Kung"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8, "\x1a\x14\x2d\x2c\x25\x22\x12\x19" }, { N_("No-Kung (Continuation)"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, -1, -1, 1, 1, 1, 0, 0, -1, 1, -1, 1, 1, 1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 14, "\x1a\x14\x2d\x2c\x25\x22\x12\x19\x2b\x2a\x21\x28\x29\x32" }, { N_("COMP'OTH"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, -1, -1, 1, 1, 0, 0, 0, 0, -1, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8, "\x1a\x14\x2d\x2c\x25\x22\x12\x2a" }, { N_("Kung"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 8, "\x1a\x14\x2d\x2c\x25\x22\x12\x26" }, { N_("Leader's Tiger"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 0, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x14\x2d\x2c\x25\x22\x13" }, { N_("Brightwell"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, -1, -1, 0, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 7, "\x1a\x14\x2d\x2c\x25\x22\x2b" }, { N_("Ishii"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 1, -1, -1, -1, 1, 0, 0, 0, 1, -1, -1, -1, -1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 13, "\x1a\x14\x2d\x2c\x25\x22\x1d\x26\x1e\x15\x2a\x13\x2b" }, { N_("Mainline Tiger"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1, 1, -1, 1, 1, 0, 0, 0, -1, -1, -1, 1, -1, 1, 0, 0, 0, -1, -1, 1, -1, -1, 0, 0, -1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 18, "\x1a\x14\x2d\x2c\x25\x22\x1d\x26\x1e\x15\x2a\x13\x2b\x11\x12\x19\x0c\x29" }, { N_("Rose-BILL"), -1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, -1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 9, "\x1a\x14\x2d\x2c\x25\x22\x1d\x2e\x35" }, { N_("Tamenori"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0, 1, 1, -1, 1, 0, 0, 0, 0, -1, 1, 1, -1, 0, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 10, "\x1a\x14\x2d\x2c\x25\x22\x1d\x2e\x35\x13" }, { N_("Aubrey, Tanaka"), 1, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, 1, 1, -1, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 6, "\x1a\x14\x2d\x2c\x25\x2e" } }; const int NUM_OPENING_DATA = 72; grhino-0.16.1/dump_pattern.cc0000644000175000017500000001121611436423224016336 0ustar lerdsuwalerdsuwa/* dump_pattern.cc Dump pattern database Copyright (c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include "pattern.h" #include "gtstream.h" #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) (x) // Grab version number in VERSION variable #undef VERSION char * #include "scripts/version" ; const char *prog_name = "dump_pattern"; const char *prog_ver = VERSION; int num_log_move_index = 0; int log_move_index[num_move_index]; // Return true if pattern for move_index should be displayed bool is_log_move_index(int move_index) { for (int i = 0; i < num_log_move_index; ++i) { if (move_index == log_move_index[i]) return true; } return false; } int main_real(int argc, char *argv[]) { use_private_files(true); pattern_table_init(); if (argc == 1) { gtout(std::cout, _("%$ %$ - Pattern dumper\n")) << prog_name << prog_ver; std::cout << _("(c) 2001, 2002, 2003 Kriang Lerdsuwanakij\n\n"); gtout(std::cout, _("Usage: %$ PATTERN MOVE_INDEX\n\n")) << prog_name; return 0; } else if (argc < 3) throw std::runtime_error(_("bad arguments")); pattern_t pattern = PATTERN_UNKNOWN; if (strcmp(argv[1], "row1") == 0) { pattern = PATTERN_ROW1; } else if (strcmp(argv[1], "row2") == 0) { pattern = PATTERN_ROW2; } else if (strcmp(argv[1], "row3") == 0) { pattern = PATTERN_ROW3; } else if (strcmp(argv[1], "row4") == 0) { pattern = PATTERN_ROW4; } else if (strcmp(argv[1], "diag1") == 0) { pattern = PATTERN_DIAG1; } else if (strcmp(argv[1], "diag2") == 0) { pattern = PATTERN_DIAG2; } else if (strcmp(argv[1], "diag3") == 0) { pattern = PATTERN_DIAG3; } else if (strcmp(argv[1], "diag4") == 0) { pattern = PATTERN_DIAG4; } else if (strcmp(argv[1], "diag5") == 0) { pattern = PATTERN_DIAG5; } else if (strcmp(argv[1], "edge-x") == 0) { pattern = PATTERN_EDGE_X; } else if (strcmp(argv[1], "corner5x2") == 0) { pattern = PATTERN_CORNER5X2; } else { throw std::runtime_error(_("bad pattern name")); } int handle = open(get_pattern_file(pattern), O_RDONLY); if (handle == -1) { gtstream bufstr; gtout(bufstr, _("cannot open file %$\n")) << get_pattern_file(pattern); throw std::runtime_error(bufstr.str()); } for (int i = 2; i < argc; ++i) { char *end_ptr; int p = strtol(argv[i], &end_ptr, 10); if (p >= 0 && p < num_move_index && *end_ptr == '\0') { log_move_index[num_log_move_index] = p; num_log_move_index++; } } raw_pattern_info *pat = new raw_pattern_info[get_pattern_size(pattern)]; for (int move_index = 0; move_index < num_move_index; ++move_index) { int size = sizeof(raw_pattern_info) * get_pattern_size(pattern); if (read(handle, pat, size) != size) { close(handle); gtstream bufstr; gtout(bufstr, _("cannot open file %$\n")) << get_pattern_file(pattern); throw std::runtime_error(bufstr.str()); } if (!is_log_move_index(move_index)) continue; for (int i = 0; i < pow_3[get_pattern_piece(pattern)]; ++i) { std::cout << move_index << " ["; show_pattern(pattern, i); std::cout << "] " << static_cast(pattern_table[pattern][move_index][i]); std::cout << " B:" << pat[i].black_win << " W:" << pat[i].white_win; if (pat[i].black_win + pat[i].white_win == 0) std::cout << " *"; std::cout << '\n'; } } close(handle); return 0; } int main(int argc, char *argv[]) { try { return main_real(argc, argv); } catch (std::exception &e) { std::cout << std::flush; gtout(std::cerr, _("%$: %$\n")) << prog_name << e.what(); } catch (const char *s) { std::cout << std::flush; gtout(std::cerr, _("%$: exception %$\n")) << prog_name << s; } catch (...) { std::cout << std::flush; gtout(std::cerr, _("%$: unknown exception\n")) << prog_name; } return 1; } grhino-0.16.1/po/0000755000175000017500000000000011436423225013743 5ustar lerdsuwalerdsuwagrhino-0.16.1/po/remove-potcdate.sed0000644000175000017500000000007211436423225017535 0ustar lerdsuwalerdsuwa/^"POT-Creation-Date: .*"$/{ x s/P/P/ ta g d bb :a x :b } grhino-0.16.1/po/Rules-quot0000644000175000017500000000337611436423225015757 0ustar lerdsuwalerdsuwa# Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header grhino-0.16.1/po/Makevars0000644000175000017500000000350011436423225015435 0ustar lerdsuwalerdsuwa# Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = grhino # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Kriang Lerdsuwanakij # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = lerdsuwa@users.sourceforge.net # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = grhino-0.16.1/po/Makefile.in.in0000644000175000017500000003322111436423225016416 0ustar lerdsuwalerdsuwa# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2006 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.16 PACKAGE = @PACKAGE@ VERSION = @VERSION@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ datadir = @datadir@ localedir = @localedir@ gettextsrcdir = $(datadir)/gettext/po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, @mkdir_p@ is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = @MKDIR_P@ mkdir_p = @mkdir_p@ GMSGFMT_ = @GMSGFMT@ GMSGFMT_no = @GMSGFMT@ GMSGFMT_yes = @GMSGFMT_015@ GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = @MSGFMT@ MSGFMT_no = @MSGFMT@ MSGFMT_yes = @MSGFMT_015@ MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = @XGETTEXT@ XGETTEXT_no = @XGETTEXT@ XGETTEXT_yes = @XGETTEXT_015@ XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = @MSGMERGE@ --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-@USE_NLS@ all-yes: stamp-po all-no: # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-@USE_NLS@ if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: grhino-0.16.1/po/Makefile0000644000175000017500000004425411436423225015414 0ustar lerdsuwalerdsuwa# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2006 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.16 PACKAGE = grhino VERSION = 0.16.1 PACKAGE_BUGREPORT = SHELL = /bin/sh srcdir = . top_srcdir = .. prefix = /usr/local exec_prefix = ${prefix} datarootdir = ${prefix}/share datadir = ${datarootdir} localedir = ${datarootdir}/locale gettextsrcdir = $(datadir)/gettext/po INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, /bin/mkdir -p is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = /bin/mkdir -p mkdir_p = /bin/mkdir -p GMSGFMT_ = /usr/bin/msgfmt GMSGFMT_no = /usr/bin/msgfmt GMSGFMT_yes = /usr/bin/msgfmt GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = /usr/bin/msgfmt MSGFMT_no = /usr/bin/msgfmt MSGFMT_yes = /usr/bin/msgfmt MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = /usr/bin/xgettext XGETTEXT_no = /usr/bin/xgettext XGETTEXT_yes = /usr/bin/xgettext XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = /usr/bin/msgmerge --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = en_GB.po GMOFILES = en_GB.gmo UPDATEPOFILES = en_GB.po-update DUMMYPOFILES = en_GB.nop DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ ../alphabeta.cc \ ../alphabeta.h \ ../binfile.cc \ ../binfile.h \ ../bitboard.cc \ ../bitboard.h \ ../board.cc \ ../board.h \ ../boardio.cc \ ../boardio.h \ ../book.cc \ ../book.h \ ../config.h \ ../dump_pattern.cc \ ../game.cc \ ../game.h \ ../gameinfo.cc \ ../gameinfo.h \ ../gen_book.cc \ ../gen_opening.cc \ ../gen_pattern.cc \ ../gen_table.cc \ ../gpref.cc \ ../gpref.h \ ../grhino.cc \ ../gtstream.h \ ../gtstream.cc \ ../hash.cc \ ../hash.h \ ../iter.cc \ ../iter.h \ ../log_proc.h \ ../opening.cc \ ../opening-dat.h \ ../opening.h \ ../order.cc \ ../order.h \ ../parity.cc \ ../parity.h \ ../pattern.cc \ ../pattern.h \ ../proginfo.cc \ ../proginfo.h \ ../rand.cc \ ../rand.h \ ../randboard.cc \ ../randboard.h \ ../table-dat.h \ ../test.cc CATALOGS = en_GB.gmo # Makevars gets inserted here. (Don't remove this line!) # Makefile variables for PO directory in any package using GNU gettext. # Usually the message domain is the same as the package name. DOMAIN = grhino # These two variables depend on the location of this directory. subdir = po top_builddir = .. # These options get passed to xgettext. XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ # This is the copyright holder that gets inserted into the header of the # $(DOMAIN).pot file. Set this to the copyright holder of the surrounding # package. (Note that the msgstr strings, extracted from the package's # sources, belong to the copyright holder of the package.) Translators are # expected to transfer the copyright for their translations to this person # or entity, or to disclaim their copyright. The empty string stands for # the public domain; in this case the translators are expected to disclaim # their copyright. COPYRIGHT_HOLDER = Kriang Lerdsuwanakij # This is the email address or URL to which the translators shall report # bugs in the untranslated strings: # - Strings which are not entire sentences, see the maintainer guidelines # in the GNU gettext documentation, section 'Preparing Strings'. # - Strings which use unclear terms or require additional context to be # understood. # - Strings which make invalid assumptions about notation of date, time or # money. # - Pluralisation problems. # - Incorrect English spelling. # - Incorrect formatting. # It can be your email address, or a mailing list address where translators # can write to without being subscribed, or the URL of a web page through # which the translators can contact you. MSGID_BUGS_ADDRESS = lerdsuwa@users.sourceforge.net # This is the list of locale categories, beyond LC_MESSAGES, for which the # message catalogs shall be used. It is usually empty. EXTRA_LOCALE_CATEGORIES = .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-yes all-yes: stamp-po all-no: # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Special Makefile rules for English message catalogs with quotation marks. DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot .SUFFIXES: .insert-header .po-update-en en@quot.po-create: $(MAKE) en@quot.po-update en@boldquot.po-create: $(MAKE) en@boldquot.po-update en@quot.po-update: en@quot.po-update-en en@boldquot.po-update: en@boldquot.po-update-en .insert-header.po-update-en: @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ ll=`echo $$lang | sed -e 's/@.*//'`; \ LC_ALL=C; export LC_ALL; \ cd $(srcdir); \ if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "creation of $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi en@quot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header en@boldquot.insert-header: insert-header.sin sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header mostlyclean: mostlyclean-quot mostlyclean-quot: rm -f *.insert-header grhino-0.16.1/po/boldquot.sed0000644000175000017500000000033111436423225016266 0ustar lerdsuwalerdsuwas/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g s/“/“/g s/”/”/g s/‘/‘/g s/’/’/g grhino-0.16.1/po/POTFILES.in0000644000175000017500000000077211436423225015526 0ustar lerdsuwalerdsuwaalphabeta.cc alphabeta.h binfile.cc binfile.h bitboard.cc bitboard.h board.cc board.h boardio.cc boardio.h book.cc book.h config.h dump_pattern.cc game.cc game.h gameinfo.cc gameinfo.h gen_book.cc gen_opening.cc gen_pattern.cc gen_table.cc gpref.cc gpref.h grhino.cc gtstream.h gtstream.cc hash.cc hash.h iter.cc iter.h log_proc.h opening.cc opening-dat.h opening.h order.cc order.h parity.cc parity.h pattern.cc pattern.h proginfo.cc proginfo.h rand.cc rand.h randboard.cc randboard.h table-dat.h test.cc grhino-0.16.1/po/en_GB.UTF-8.po0000644000175000017500000004076511436423225016073 0ustar lerdsuwalerdsuwa# Automatically generated by utf-quotes.pl # Automatically generated by en_GB.pl # Automatically generated by copy-message.pl # GRhino PO Files # Copyright (C) YEAR Kriang Lerdsuwanakij # This file is distributed under the same license as the PACKAGE package. # Kriang Lerdsuwanakij , 2002 # msgid "" msgstr "" "Project-Id-Version: grhino 0.16.1\n" "Report-Msgid-Bugs-To: lerdsuwa@users.sourceforge.net\n" "POT-Creation-Date: 2010-08-29 16:18+0700\n" "PO-Revision-Date: 2010-08-29 16:21+0700\n" "Last-Translator: Kriang Lerdsuwanakij \n" "Language-Team: Kriang Lerdsuwanakij \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: binfile.cc:54 dump_pattern.cc:128 dump_pattern.cc:150 gen_book.cc:322 #: gen_pattern.cc:344 pattern.cc:223 msgid "cannot open file %$\n" msgstr "cannot open file %$\n" #: binfile.cc:88 binfile.cc:103 gen_pattern.cc:362 pattern.cc:233 msgid "cannot read file %$\n" msgstr "cannot read file %$\n" #: binfile.cc:179 gen_pattern.cc:119 gen_pattern.cc:389 gen_pattern.cc:428 msgid "cannot create file %$\n" msgstr "cannot create file %$\n" #: binfile.cc:208 gen_pattern.cc:145 gen_pattern.cc:402 gen_pattern.cc:523 msgid "cannot write file %$\n" msgstr "cannot write file %$\n" #: board.cc:114 msgid "invalid initial board" msgstr "invalid initial board" #: book.cc:174 msgid "invalid file format in %$\n" msgstr "invalid file format in %$\n" #: dump_pattern.cc:79 msgid "%$ %$ - Pattern dumper\n" msgstr "%$ %$ - Pattern dumper\n" #: dump_pattern.cc:80 msgid "" "(c) 2001, 2002, 2003 Kriang Lerdsuwanakij\n" "\n" msgstr "" "(c) 2001, 2002, 2003 Kriang Lerdsuwanakij\n" "\n" #: dump_pattern.cc:81 msgid "" "Usage: %$ PATTERN MOVE_INDEX\n" "\n" msgstr "" "Usage: %$ PATTERN MOVE_INDEX\n" "\n" #: dump_pattern.cc:85 gen_book.cc:514 gen_pattern.cc:619 msgid "bad arguments" msgstr "bad arguments" #: dump_pattern.cc:122 gen_pattern.cc:659 msgid "bad pattern name" msgstr "bad pattern name" #: dump_pattern.cc:181 gen_book.cc:551 gen_opening.cc:225 gen_pattern.cc:673 #: gen_table.cc:96 grhino.cc:1873 grhino.cc:2192 msgid "%$: %$\n" msgstr "%$: %$\n" #: dump_pattern.cc:185 gen_book.cc:555 gen_opening.cc:229 gen_pattern.cc:677 #: gen_table.cc:100 grhino.cc:2196 msgid "%$: exception %$\n" msgstr "%$: exception %$\n" #: dump_pattern.cc:189 gen_book.cc:559 gen_opening.cc:233 gen_pattern.cc:681 #: gen_table.cc:104 grhino.cc:2200 msgid "%$: unknown exception\n" msgstr "%$: unknown exception\n" #: game.cc:117 game.cc:139 opening-dat.h:4 msgid "None" msgstr "None" #: game.cc:117 grhino.cc:2006 msgid "Black" msgstr "Black" #: game.cc:117 grhino.cc:2011 msgid "White" msgstr "White" #: game.cc:118 msgid "Both" msgstr "Both" #: game.cc:118 msgid "Alternate" msgstr "Alternate" #: game.cc:118 msgid "Random" msgstr "Random" #: game.cc:134 msgid "1" msgstr "1" #: game.cc:134 msgid "2" msgstr "2" #: game.cc:134 msgid "3" msgstr "3" #: game.cc:134 msgid "4" msgstr "4" #: game.cc:134 msgid "5" msgstr "5" #: game.cc:134 msgid "Custom" msgstr "Custom" #: game.cc:139 msgid "Very low" msgstr "Very low" #: game.cc:139 msgid "Low" msgstr "Low" #: game.cc:139 msgid "Medium" msgstr "Medium" #: game.cc:139 msgid "High" msgstr "High" #: game.cc:139 msgid "Very high" msgstr "Very high" #: game.cc:155 msgid "Initial board" msgstr "Initial board" #: game.cc:155 msgid "Random board" msgstr "Random board" #: game.cc:350 msgid "error obtaining the user home directory" msgstr "error obtaining the user home directory" #: gen_book.cc:279 gen_pattern.cc:318 msgid "invalid game moves" msgstr "invalid game moves" #: gen_book.cc:508 msgid "%$ %$ - Open book generator\n" msgstr "%$ %$ - Open book generator\n" #: gen_book.cc:509 gen_pattern.cc:614 msgid "" "(c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij\n" "\n" msgstr "" "(c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij\n" "\n" #: gen_book.cc:510 msgid "" "Usage: %$ init|gen|FILES\n" "\n" msgstr "" "Usage: %$ init|gen|FILES\n" "\n" #: gen_opening.cc:104 msgid "%$ %$ - Game opening generator\n" msgstr "%$ %$ - Game opening generator\n" #: gen_opening.cc:105 msgid "" "(c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij\n" "\n" msgstr "" "(c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij\n" "\n" #: gen_opening.cc:106 msgid "" "Usage: %$ \n" "\n" msgstr "" "Usage: %$ \n" "\n" #: gen_opening.cc:116 msgid "cannot open file openings.txt" msgstr "cannot open file openings.txt" #: gen_pattern.cc:516 msgid "pattern symmetry error" msgstr "pattern symmetry error" #: gen_pattern.cc:613 msgid "%$ %$ - Pattern generator\n" msgstr "%$ %$ - Pattern generator\n" #: gen_pattern.cc:615 msgid "" "Usage: %$ PATTERN init|gen|FILES\n" "\n" msgstr "" "Usage: %$ PATTERN init|gen|FILES\n" "\n" #: gpref.cc:69 msgid "Small" msgstr "Small" #: gpref.cc:69 msgid "Large" msgstr "Large" #: gpref.cc:252 gpref.cc:295 gpref.cc:687 gpref.cc:717 msgid "DEFAULT" msgstr "DEFAULT" #: gpref.cc:280 msgid "Theme problem: %$. Revert to previous theme settings." msgstr "Theme problem: %$. Revert to previous theme settings." #: gpref.cc:405 msgid "Preferences" msgstr "Preferences" #: gpref.cc:413 grhino.cc:606 grhino.cc:609 grhino.cc:621 msgid "AI" msgstr "AI" #: gpref.cc:418 msgid "Computer player" msgstr "Computer player" #: gpref.cc:438 msgid "Computer level" msgstr "Computer level" #: gpref.cc:458 msgid "Mid game search depth" msgstr "Mid game search depth" #: gpref.cc:474 msgid "Winning move search empties" msgstr "Winning move search empties" #: gpref.cc:490 msgid "Perfect end game search empties" msgstr "Perfect end game search empties" #: gpref.cc:506 msgid "Randomness" msgstr "Randomness" #: gpref.cc:522 msgid "Open book variation" msgstr "Open book variation" #: gpref.cc:549 msgid "Board" msgstr "Board" #: gpref.cc:552 msgid "Log game moves" msgstr "Log game moves" #: gpref.cc:559 msgid "Redo also repeat same AI moves" msgstr "Redo also repeat same AI moves" #: gpref.cc:566 msgid "Animate opening" msgstr "Animate opening" #: gpref.cc:575 msgid "Animation delay" msgstr "Animation delay" #: gpref.cc:591 msgid "Start game from" msgstr "Start game from" #: gpref.cc:612 grhino.cc:621 msgid "Opening" msgstr "Opening" #: gpref.cc:633 msgid "Random game pieces" msgstr "Random game pieces" #: gpref.cc:656 msgid "Theme" msgstr "Theme" #: gpref.cc:659 msgid "Show possible moves" msgstr "Show possible moves" #: gpref.cc:666 msgid "Show last move" msgstr "Show last move" #: gpref.cc:673 msgid "Show board border" msgstr "Show board border" #: gpref.cc:682 msgid "Theme directory" msgstr "Theme directory" #: gpref.cc:727 msgid "Toolbar icon size" msgstr "Toolbar icon size" #: grhino.cc:207 msgid "_Edit board" msgstr "_Edit board" #: grhino.cc:207 msgid "Edit board and start game" msgstr "Edit board and start game" #: grhino.cc:223 msgid "_Begin of game" msgstr "_Begin of game" #: grhino.cc:223 grhino.cc:1982 msgid "Go to the game beginning" msgstr "Go to the game beginning" #: grhino.cc:224 msgid "_Previous move" msgstr "_Previous move" #: grhino.cc:224 grhino.cc:1986 msgid "Go to the previous move" msgstr "Go to the previous move" #: grhino.cc:225 msgid "_Next move" msgstr "_Next move" #: grhino.cc:225 grhino.cc:1990 msgid "Go to the next move" msgstr "Go to the next move" #: grhino.cc:226 msgid "_Last move" msgstr "_Last move" #: grhino.cc:226 grhino.cc:1994 msgid "Go to the last move" msgstr "Go to the last move" #: grhino.cc:232 msgid "_Toolbar" msgstr "_Toolbar" #: grhino.cc:232 msgid "Show/hide toolbar" msgstr "Show/hide toolbar" #: grhino.cc:234 msgid "_Pattern evaluation" msgstr "_Pattern evaluation" #: grhino.cc:234 msgid "Show/hide pattern evaluation score" msgstr "Show/hide pattern evaluation score" #: grhino.cc:235 msgid "Game _history" msgstr "Game _history" #: grhino.cc:235 msgid "Show/hide game move history" msgstr "Show/hide game move history" #: grhino.cc:241 msgid "Switch _computer color" msgstr "Switch _computer colour" #: grhino.cc:243 msgid "_Save Settings" msgstr "_Save Settings" #: grhino.cc:257 msgid "_View" msgstr "_View" #: grhino.cc:603 msgid "random" msgstr "random" #: grhino.cc:606 grhino.cc:609 grhino.cc:620 msgid "human" msgstr "human" #: grhino.cc:612 grhino.cc:618 msgid "%$ (%$)" msgstr "%$ (%$)" #: grhino.cc:613 grhino.cc:619 msgid "Black's turn" msgstr "Black’s turn" #: grhino.cc:613 grhino.cc:619 msgid "White's turn" msgstr "White’s turn" #: grhino.cc:626 msgid " [%$]" msgstr " [%$]" #: grhino.cc:636 msgid "%$ (%$-%$)" msgstr "%$ (%$-%$)" #: grhino.cc:637 msgid "Draw" msgstr "Draw" #: grhino.cc:638 msgid "Black wins" msgstr "Black wins" #: grhino.cc:638 msgid "White wins" msgstr "White wins" #: grhino.cc:644 msgid "White wins - Black ran out of time" msgstr "White wins - Black ran out of time" #: grhino.cc:647 msgid "Black wins - White ran out of time" msgstr "Black wins - White ran out of time" #: grhino.cc:650 msgid "White wins - Black resigned" msgstr "White wins - Black resigned" #: grhino.cc:653 msgid "Black wins - White resigned" msgstr "Black wins - White resigned" #: grhino.cc:659 msgid " (%$ %$)" msgstr " (%$ %$)" #: grhino.cc:966 msgid "Select a file to open" msgstr "Select a file to open" #: grhino.cc:1092 msgid "There must be at least 4 pieces on the board." msgstr "There must be at least 4 pieces on the board." #: grhino.cc:1103 msgid "The center 4 pieces must be filled." msgstr "The center 4 pieces must be filled." #: grhino.cc:1489 grhino.cc:1492 msgid "Kriang Lerdsuwanakij" msgstr "Kriang Lerdsuwanakij" #: grhino.cc:1494 msgid "TRANSLATOR" msgstr "TRANSLATOR" #: grhino.cc:1499 msgid "(c) 2000-7, 2010 Kriang Lerdsuwanakij" msgstr "(c) 2000-7, 2010 Kriang Lerdsuwanakij" #: grhino.cc:1500 msgid "A reversi program" msgstr "A reversi programme" #: grhino.cc:1519 msgid "size of theme pixmap %$ does not agree with others" msgstr "size of theme pixmap %$ does not agree with others" #: grhino.cc:1541 msgid "pixmap %$ missing" msgstr "pixmap %$ missing" #: grhino.cc:1550 msgid "pixmap %$ contains error" msgstr "pixmap %$ contains error" #: grhino.cc:1874 msgid "%$: reverting to default internal theme\n" msgstr "%$: reverting to default internal theme\n" #: grhino.cc:1949 msgid "New" msgstr "New" #: grhino.cc:1950 msgid "Start a new game" msgstr "Start a new game" #: grhino.cc:1953 msgid "Edit" msgstr "Edit" #: grhino.cc:1954 msgid "Edit board" msgstr "Edit board" #: grhino.cc:1957 msgid "Quit" msgstr "Quit" #: grhino.cc:1958 msgid "Quit GRhino" msgstr "Quit GRhino" #: grhino.cc:1967 msgid "Undo" msgstr "Undo" #: grhino.cc:1968 msgid "Undo move" msgstr "Undo move" #: grhino.cc:1971 msgid "Redo" msgstr "Redo" #: grhino.cc:1972 msgid "Redo move" msgstr "Redo move" #: grhino.cc:1981 msgid "Begin" msgstr "Begin" #: grhino.cc:1985 msgid "Prev" msgstr "Prev" #: grhino.cc:1989 msgid "Next" msgstr "Next" #: grhino.cc:1993 msgid "Last" msgstr "Last" #: grhino.cc:2000 msgid "Empty" msgstr "Empty" #: grhino.cc:2001 msgid "Fill with empty" msgstr "Fill with empty" #: grhino.cc:2007 msgid "Fill with black" msgstr "Fill with black" #: grhino.cc:2012 msgid "Fill with white" msgstr "Fill with white" #: grhino.cc:2020 msgid "To play" msgstr "To play" #: grhino.cc:2021 msgid "Player with first move" msgstr "Player with first move" #: grhino.cc:2024 msgid "Finish" msgstr "Finish" #: grhino.cc:2025 msgid "Start game with board" msgstr "Start game with board" #: grhino.cc:2096 msgid "cannot run on system with less than 32-bit int" msgstr "cannot run on system with less than 32-bit int" #: log_proc.h:632 msgid "Processing %$\n" msgstr "Processing %$\n" #: log_proc.h:637 msgid "cannot open file %$" msgstr "cannot open file %$" #: log_proc.h:660 msgid "" "\n" "%$: fail at line %$\n" msgstr "" "\n" "%$: fail at line %$\n" #: opening-dat.h:14 msgid "Diagonal Opening" msgstr "Diagonal Opening" #: opening-dat.h:24 msgid "X-square Opening" msgstr "X-square Opening" #: opening-dat.h:34 msgid "Snake, Peasant" msgstr "Snake, Peasant" #: opening-dat.h:44 msgid "Pyramid, Checkerboarding Peasant" msgstr "Pyramid, Checkerboarding Peasant" #: opening-dat.h:54 msgid "Heath, Tobidashi \"Jumping Out\"" msgstr "Heath, Tobidashi \"Jumping Out\"" #: opening-dat.h:64 msgid "Mimura variation II" msgstr "Mimura variation II" #: opening-dat.h:74 msgid "Heath-Bat" msgstr "Heath-Bat" #: opening-dat.h:84 msgid "Iwasaki variation" msgstr "Iwasaki variation" #: opening-dat.h:94 msgid "Heath-Chimney, \"Mass-Turning\"" msgstr "Heath-Chimney, \"Mass-Turning\"" #: opening-dat.h:104 msgid "Raccoon Dog" msgstr "Raccoon Dog" #: opening-dat.h:114 msgid "Hamilton" msgstr "Hamilton" #: opening-dat.h:124 msgid "Lollipop" msgstr "Lollipop" #: opening-dat.h:134 msgid "Cow" msgstr "Cow" #: opening-dat.h:144 msgid "Chimney" msgstr "Chimney" #: opening-dat.h:154 msgid "Cow Bat, Bat, Cambridge" msgstr "Cow Bat, Bat, Cambridge" #: opening-dat.h:164 msgid "Bat (Piau Continuation 2)" msgstr "Bat (Piau Continuation 2)" #: opening-dat.h:174 msgid "Melnikov, Bat (Piau Continuation 1)" msgstr "Melnikov, Bat (Piau Continuation 1)" #: opening-dat.h:184 msgid "Bat (Kling Continuation)" msgstr "Bat (Kling Continuation)" #: opening-dat.h:194 msgid "Bat (Kling Alternative)" msgstr "Bat (Kling Alternative)" #: opening-dat.h:204 msgid "Rose-v-Toth" msgstr "Rose-v-Toth" #: opening-dat.h:214 msgid "Tanida" msgstr "Tanida" #: opening-dat.h:224 msgid "Aircraft, Feldborg" msgstr "Aircraft, Feldborg" #: opening-dat.h:234 msgid "Sailboat" msgstr "Sailboat" #: opening-dat.h:244 msgid "Maruoka" msgstr "Maruoka" #: opening-dat.h:254 msgid "Landau" msgstr "Landau" #: opening-dat.h:264 msgid "Buffalo, Kenichi Variation" msgstr "Buffalo, Kenichi Variation" #: opening-dat.h:274 msgid "Maruoka Buffalo" msgstr "Maruoka Buffalo" #: opening-dat.h:284 msgid "Tanida Buffalo" msgstr "Tanida Buffalo" #: opening-dat.h:294 msgid "Hokuriku Buffalo" msgstr "Hokuriku Buffalo" #: opening-dat.h:304 msgid "Wing Variation" msgstr "Wing Variation" #: opening-dat.h:314 msgid "Semi-Wing Variation" msgstr "Semi-Wing Variation" #: opening-dat.h:324 msgid "Parallel Opening" msgstr "Parallel Opening" #: opening-dat.h:334 msgid "Perpendicular Opening" msgstr "Perpendicular Opening" #: opening-dat.h:344 msgid "Mimura" msgstr "Mimura" #: opening-dat.h:354 msgid "Shaman, Danish" msgstr "Shaman, Danish" #: opening-dat.h:364 msgid "Inoue" msgstr "Inoue" #: opening-dat.h:374 msgid "IAGO" msgstr "IAGO" #: opening-dat.h:384 msgid "Bhagat" msgstr "Bhagat" #: opening-dat.h:394 msgid "Rose" msgstr "Rose" #: opening-dat.h:404 msgid "Flat" msgstr "Flat" #: opening-dat.h:414 msgid "Rotating Flat" msgstr "Rotating Flat" #: opening-dat.h:424 msgid "Murakami Variation" msgstr "Murakami Variation" #: opening-dat.h:434 msgid "Rotating Flat (Kling Continuation)" msgstr "Rotating Flat (Kling Continuation)" #: opening-dat.h:444 msgid "Rose-Birth" msgstr "Rose-Birth" #: opening-dat.h:454 msgid "Brightstein" msgstr "Brightstein" #: opening-dat.h:464 msgid "Rose-birdie, Rose-Tamenori" msgstr "Rose-birdie, Rose-Tamenori" #: opening-dat.h:474 msgid "Rose-Tamenori-Kling" msgstr "Rose-Tamenori-Kling" #: opening-dat.h:484 msgid "Greenberg, Dawg" msgstr "Greenberg, Dawg" #: opening-dat.h:494 msgid "Ralle" msgstr "Ralle" #: opening-dat.h:504 msgid "Horse" msgstr "Horse" #: opening-dat.h:514 msgid "No-Cat" msgstr "No-Cat" #: opening-dat.h:524 msgid "Swallow" msgstr "Swallow" #: opening-dat.h:534 msgid "No-Cat (Continuation)" msgstr "No-Cat (Continuation)" #: opening-dat.h:544 msgid "Italian" msgstr "Italian" #: opening-dat.h:554 msgid "Cat" msgstr "Cat" #: opening-dat.h:564 msgid "Sakaguchi" msgstr "Sakaguchi" #: opening-dat.h:574 msgid "Berner" msgstr "Berner" #: opening-dat.h:584 msgid "Ganglion" msgstr "Ganglion" #: opening-dat.h:594 msgid "Tiger" msgstr "Tiger" #: opening-dat.h:604 msgid "Stephenson" msgstr "Stephenson" #: opening-dat.h:614 msgid "No-Kung" msgstr "No-Kung" #: opening-dat.h:624 msgid "No-Kung (Continuation)" msgstr "No-Kung (Continuation)" #: opening-dat.h:634 msgid "COMP'OTH" msgstr "COMP’OTH" #: opening-dat.h:644 msgid "Kung" msgstr "Kung" #: opening-dat.h:654 msgid "Leader's Tiger" msgstr "Leader’s Tiger" #: opening-dat.h:664 msgid "Brightwell" msgstr "Brightwell" #: opening-dat.h:674 msgid "Ishii" msgstr "Ishii" #: opening-dat.h:684 msgid "Mainline Tiger" msgstr "Mainline Tiger" #: opening-dat.h:694 msgid "Rose-BILL" msgstr "Rose-BILL" #: opening-dat.h:704 msgid "Tamenori" msgstr "Tamenori" #: opening-dat.h:714 msgid "Aubrey, Tanaka" msgstr "Aubrey, Tanaka" #: randboard.cc:91 msgid "invalid number of pieces %$ in random_board" msgstr "invalid number of pieces %$ in random_board" grhino-0.16.1/po/ChangeLog0000644000175000017500000000141711436423225015520 0ustar lerdsuwalerdsuwa2006-11-19 gettextize * Makefile.in.in: Upgrade to gettext-0.16. * Rules-quot: Upgrade to gettext-0.16. 2002-07-21 gettextize * Makefile.in.in: New file, from gettext-0.11.3. 2002-07-21 gettextize * Makefile.in.in: Upgrade to gettext-0.11.3. * boldquot.sed: New file, from gettext-0.11.3. * en@boldquot.header: New file, from gettext-0.11.3. * en@quot.header: New file, from gettext-0.11.3. * insert-header.sin: New file, from gettext-0.11.3. * quot.sed: New file, from gettext-0.11.3. * remove-potcdate.sin: New file, from gettext-0.11.3. * Rules-quot: New file, from gettext-0.11.3. 2002-07-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.38. grhino-0.16.1/po/en_GB.po0000644000175000017500000004070711436423225015265 0ustar lerdsuwalerdsuwa# Automatically generated by en_GB.pl # Automatically generated by copy-message.pl # GRhino PO Files # Copyright (C) YEAR Kriang Lerdsuwanakij # This file is distributed under the same license as the PACKAGE package. # Kriang Lerdsuwanakij , 2002 # msgid "" msgstr "" "Project-Id-Version: grhino 0.16.1\n" "Report-Msgid-Bugs-To: lerdsuwa@users.sourceforge.net\n" "POT-Creation-Date: 2010-08-29 16:18+0700\n" "PO-Revision-Date: 2010-08-29 16:21+0700\n" "Last-Translator: Kriang Lerdsuwanakij \n" "Language-Team: Kriang Lerdsuwanakij \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: binfile.cc:54 dump_pattern.cc:128 dump_pattern.cc:150 gen_book.cc:322 #: gen_pattern.cc:344 pattern.cc:223 msgid "cannot open file %$\n" msgstr "cannot open file %$\n" #: binfile.cc:88 binfile.cc:103 gen_pattern.cc:362 pattern.cc:233 msgid "cannot read file %$\n" msgstr "cannot read file %$\n" #: binfile.cc:179 gen_pattern.cc:119 gen_pattern.cc:389 gen_pattern.cc:428 msgid "cannot create file %$\n" msgstr "cannot create file %$\n" #: binfile.cc:208 gen_pattern.cc:145 gen_pattern.cc:402 gen_pattern.cc:523 msgid "cannot write file %$\n" msgstr "cannot write file %$\n" #: board.cc:114 msgid "invalid initial board" msgstr "invalid initial board" #: book.cc:174 msgid "invalid file format in %$\n" msgstr "invalid file format in %$\n" #: dump_pattern.cc:79 msgid "%$ %$ - Pattern dumper\n" msgstr "%$ %$ - Pattern dumper\n" #: dump_pattern.cc:80 msgid "" "(c) 2001, 2002, 2003 Kriang Lerdsuwanakij\n" "\n" msgstr "" "(c) 2001, 2002, 2003 Kriang Lerdsuwanakij\n" "\n" #: dump_pattern.cc:81 msgid "" "Usage: %$ PATTERN MOVE_INDEX\n" "\n" msgstr "" "Usage: %$ PATTERN MOVE_INDEX\n" "\n" #: dump_pattern.cc:85 gen_book.cc:514 gen_pattern.cc:619 msgid "bad arguments" msgstr "bad arguments" #: dump_pattern.cc:122 gen_pattern.cc:659 msgid "bad pattern name" msgstr "bad pattern name" #: dump_pattern.cc:181 gen_book.cc:551 gen_opening.cc:225 gen_pattern.cc:673 #: gen_table.cc:96 grhino.cc:1873 grhino.cc:2192 msgid "%$: %$\n" msgstr "%$: %$\n" #: dump_pattern.cc:185 gen_book.cc:555 gen_opening.cc:229 gen_pattern.cc:677 #: gen_table.cc:100 grhino.cc:2196 msgid "%$: exception %$\n" msgstr "%$: exception %$\n" #: dump_pattern.cc:189 gen_book.cc:559 gen_opening.cc:233 gen_pattern.cc:681 #: gen_table.cc:104 grhino.cc:2200 msgid "%$: unknown exception\n" msgstr "%$: unknown exception\n" #: game.cc:117 game.cc:139 opening-dat.h:4 msgid "None" msgstr "None" #: game.cc:117 grhino.cc:2006 msgid "Black" msgstr "Black" #: game.cc:117 grhino.cc:2011 msgid "White" msgstr "White" #: game.cc:118 msgid "Both" msgstr "Both" #: game.cc:118 msgid "Alternate" msgstr "Alternate" #: game.cc:118 msgid "Random" msgstr "Random" #: game.cc:134 msgid "1" msgstr "1" #: game.cc:134 msgid "2" msgstr "2" #: game.cc:134 msgid "3" msgstr "3" #: game.cc:134 msgid "4" msgstr "4" #: game.cc:134 msgid "5" msgstr "5" #: game.cc:134 msgid "Custom" msgstr "Custom" #: game.cc:139 msgid "Very low" msgstr "Very low" #: game.cc:139 msgid "Low" msgstr "Low" #: game.cc:139 msgid "Medium" msgstr "Medium" #: game.cc:139 msgid "High" msgstr "High" #: game.cc:139 msgid "Very high" msgstr "Very high" #: game.cc:155 msgid "Initial board" msgstr "Initial board" #: game.cc:155 msgid "Random board" msgstr "Random board" #: game.cc:350 msgid "error obtaining the user home directory" msgstr "error obtaining the user home directory" #: gen_book.cc:279 gen_pattern.cc:318 msgid "invalid game moves" msgstr "invalid game moves" #: gen_book.cc:508 msgid "%$ %$ - Open book generator\n" msgstr "%$ %$ - Open book generator\n" #: gen_book.cc:509 gen_pattern.cc:614 msgid "" "(c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij\n" "\n" msgstr "" "(c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij\n" "\n" #: gen_book.cc:510 msgid "" "Usage: %$ init|gen|FILES\n" "\n" msgstr "" "Usage: %$ init|gen|FILES\n" "\n" #: gen_opening.cc:104 msgid "%$ %$ - Game opening generator\n" msgstr "%$ %$ - Game opening generator\n" #: gen_opening.cc:105 msgid "" "(c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij\n" "\n" msgstr "" "(c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij\n" "\n" #: gen_opening.cc:106 msgid "" "Usage: %$ \n" "\n" msgstr "" "Usage: %$ \n" "\n" #: gen_opening.cc:116 msgid "cannot open file openings.txt" msgstr "cannot open file openings.txt" #: gen_pattern.cc:516 msgid "pattern symmetry error" msgstr "pattern symmetry error" #: gen_pattern.cc:613 msgid "%$ %$ - Pattern generator\n" msgstr "%$ %$ - Pattern generator\n" #: gen_pattern.cc:615 msgid "" "Usage: %$ PATTERN init|gen|FILES\n" "\n" msgstr "" "Usage: %$ PATTERN init|gen|FILES\n" "\n" #: gpref.cc:69 msgid "Small" msgstr "Small" #: gpref.cc:69 msgid "Large" msgstr "Large" #: gpref.cc:252 gpref.cc:295 gpref.cc:687 gpref.cc:717 msgid "DEFAULT" msgstr "DEFAULT" #: gpref.cc:280 msgid "Theme problem: %$. Revert to previous theme settings." msgstr "Theme problem: %$. Revert to previous theme settings." #: gpref.cc:405 msgid "Preferences" msgstr "Preferences" #: gpref.cc:413 grhino.cc:606 grhino.cc:609 grhino.cc:621 msgid "AI" msgstr "AI" #: gpref.cc:418 msgid "Computer player" msgstr "Computer player" #: gpref.cc:438 msgid "Computer level" msgstr "Computer level" #: gpref.cc:458 msgid "Mid game search depth" msgstr "Mid game search depth" #: gpref.cc:474 msgid "Winning move search empties" msgstr "Winning move search empties" #: gpref.cc:490 msgid "Perfect end game search empties" msgstr "Perfect end game search empties" #: gpref.cc:506 msgid "Randomness" msgstr "Randomness" #: gpref.cc:522 msgid "Open book variation" msgstr "Open book variation" #: gpref.cc:549 msgid "Board" msgstr "Board" #: gpref.cc:552 msgid "Log game moves" msgstr "Log game moves" #: gpref.cc:559 msgid "Redo also repeat same AI moves" msgstr "Redo also repeat same AI moves" #: gpref.cc:566 msgid "Animate opening" msgstr "Animate opening" #: gpref.cc:575 msgid "Animation delay" msgstr "Animation delay" #: gpref.cc:591 msgid "Start game from" msgstr "Start game from" #: gpref.cc:612 grhino.cc:621 msgid "Opening" msgstr "Opening" #: gpref.cc:633 msgid "Random game pieces" msgstr "Random game pieces" #: gpref.cc:656 msgid "Theme" msgstr "Theme" #: gpref.cc:659 msgid "Show possible moves" msgstr "Show possible moves" #: gpref.cc:666 msgid "Show last move" msgstr "Show last move" #: gpref.cc:673 msgid "Show board border" msgstr "Show board border" #: gpref.cc:682 msgid "Theme directory" msgstr "Theme directory" #: gpref.cc:727 msgid "Toolbar icon size" msgstr "Toolbar icon size" #: grhino.cc:207 msgid "_Edit board" msgstr "_Edit board" #: grhino.cc:207 msgid "Edit board and start game" msgstr "Edit board and start game" #: grhino.cc:223 msgid "_Begin of game" msgstr "_Begin of game" #: grhino.cc:223 grhino.cc:1982 msgid "Go to the game beginning" msgstr "Go to the game beginning" #: grhino.cc:224 msgid "_Previous move" msgstr "_Previous move" #: grhino.cc:224 grhino.cc:1986 msgid "Go to the previous move" msgstr "Go to the previous move" #: grhino.cc:225 msgid "_Next move" msgstr "_Next move" #: grhino.cc:225 grhino.cc:1990 msgid "Go to the next move" msgstr "Go to the next move" #: grhino.cc:226 msgid "_Last move" msgstr "_Last move" #: grhino.cc:226 grhino.cc:1994 msgid "Go to the last move" msgstr "Go to the last move" #: grhino.cc:232 msgid "_Toolbar" msgstr "_Toolbar" #: grhino.cc:232 msgid "Show/hide toolbar" msgstr "Show/hide toolbar" #: grhino.cc:234 msgid "_Pattern evaluation" msgstr "_Pattern evaluation" #: grhino.cc:234 msgid "Show/hide pattern evaluation score" msgstr "Show/hide pattern evaluation score" #: grhino.cc:235 msgid "Game _history" msgstr "Game _history" #: grhino.cc:235 msgid "Show/hide game move history" msgstr "Show/hide game move history" #: grhino.cc:241 msgid "Switch _computer color" msgstr "Switch _computer colour" #: grhino.cc:243 msgid "_Save Settings" msgstr "_Save Settings" #: grhino.cc:257 msgid "_View" msgstr "_View" #: grhino.cc:603 msgid "random" msgstr "random" #: grhino.cc:606 grhino.cc:609 grhino.cc:620 msgid "human" msgstr "human" #: grhino.cc:612 grhino.cc:618 msgid "%$ (%$)" msgstr "%$ (%$)" #: grhino.cc:613 grhino.cc:619 msgid "Black's turn" msgstr "Black's turn" #: grhino.cc:613 grhino.cc:619 msgid "White's turn" msgstr "White's turn" #: grhino.cc:626 msgid " [%$]" msgstr " [%$]" #: grhino.cc:636 msgid "%$ (%$-%$)" msgstr "%$ (%$-%$)" #: grhino.cc:637 msgid "Draw" msgstr "Draw" #: grhino.cc:638 msgid "Black wins" msgstr "Black wins" #: grhino.cc:638 msgid "White wins" msgstr "White wins" #: grhino.cc:644 msgid "White wins - Black ran out of time" msgstr "White wins - Black ran out of time" #: grhino.cc:647 msgid "Black wins - White ran out of time" msgstr "Black wins - White ran out of time" #: grhino.cc:650 msgid "White wins - Black resigned" msgstr "White wins - Black resigned" #: grhino.cc:653 msgid "Black wins - White resigned" msgstr "Black wins - White resigned" #: grhino.cc:659 msgid " (%$ %$)" msgstr " (%$ %$)" #: grhino.cc:966 msgid "Select a file to open" msgstr "Select a file to open" #: grhino.cc:1092 msgid "There must be at least 4 pieces on the board." msgstr "There must be at least 4 pieces on the board." #: grhino.cc:1103 msgid "The center 4 pieces must be filled." msgstr "The center 4 pieces must be filled." #: grhino.cc:1489 grhino.cc:1492 msgid "Kriang Lerdsuwanakij" msgstr "Kriang Lerdsuwanakij" #: grhino.cc:1494 msgid "TRANSLATOR" msgstr "TRANSLATOR" #: grhino.cc:1499 msgid "(c) 2000-7, 2010 Kriang Lerdsuwanakij" msgstr "(c) 2000-7, 2010 Kriang Lerdsuwanakij" #: grhino.cc:1500 msgid "A reversi program" msgstr "A reversi programme" #: grhino.cc:1519 msgid "size of theme pixmap %$ does not agree with others" msgstr "size of theme pixmap %$ does not agree with others" #: grhino.cc:1541 msgid "pixmap %$ missing" msgstr "pixmap %$ missing" #: grhino.cc:1550 msgid "pixmap %$ contains error" msgstr "pixmap %$ contains error" #: grhino.cc:1874 msgid "%$: reverting to default internal theme\n" msgstr "%$: reverting to default internal theme\n" #: grhino.cc:1949 msgid "New" msgstr "New" #: grhino.cc:1950 msgid "Start a new game" msgstr "Start a new game" #: grhino.cc:1953 msgid "Edit" msgstr "Edit" #: grhino.cc:1954 msgid "Edit board" msgstr "Edit board" #: grhino.cc:1957 msgid "Quit" msgstr "Quit" #: grhino.cc:1958 msgid "Quit GRhino" msgstr "Quit GRhino" #: grhino.cc:1967 msgid "Undo" msgstr "Undo" #: grhino.cc:1968 msgid "Undo move" msgstr "Undo move" #: grhino.cc:1971 msgid "Redo" msgstr "Redo" #: grhino.cc:1972 msgid "Redo move" msgstr "Redo move" #: grhino.cc:1981 msgid "Begin" msgstr "Begin" #: grhino.cc:1985 msgid "Prev" msgstr "Prev" #: grhino.cc:1989 msgid "Next" msgstr "Next" #: grhino.cc:1993 msgid "Last" msgstr "Last" #: grhino.cc:2000 msgid "Empty" msgstr "Empty" #: grhino.cc:2001 msgid "Fill with empty" msgstr "Fill with empty" #: grhino.cc:2007 msgid "Fill with black" msgstr "Fill with black" #: grhino.cc:2012 msgid "Fill with white" msgstr "Fill with white" #: grhino.cc:2020 msgid "To play" msgstr "To play" #: grhino.cc:2021 msgid "Player with first move" msgstr "Player with first move" #: grhino.cc:2024 msgid "Finish" msgstr "Finish" #: grhino.cc:2025 msgid "Start game with board" msgstr "Start game with board" #: grhino.cc:2096 msgid "cannot run on system with less than 32-bit int" msgstr "cannot run on system with less than 32-bit int" #: log_proc.h:632 msgid "Processing %$\n" msgstr "Processing %$\n" #: log_proc.h:637 msgid "cannot open file %$" msgstr "cannot open file %$" #: log_proc.h:660 msgid "" "\n" "%$: fail at line %$\n" msgstr "" "\n" "%$: fail at line %$\n" #: opening-dat.h:14 msgid "Diagonal Opening" msgstr "Diagonal Opening" #: opening-dat.h:24 msgid "X-square Opening" msgstr "X-square Opening" #: opening-dat.h:34 msgid "Snake, Peasant" msgstr "Snake, Peasant" #: opening-dat.h:44 msgid "Pyramid, Checkerboarding Peasant" msgstr "Pyramid, Checkerboarding Peasant" #: opening-dat.h:54 msgid "Heath, Tobidashi \"Jumping Out\"" msgstr "Heath, Tobidashi \"Jumping Out\"" #: opening-dat.h:64 msgid "Mimura variation II" msgstr "Mimura variation II" #: opening-dat.h:74 msgid "Heath-Bat" msgstr "Heath-Bat" #: opening-dat.h:84 msgid "Iwasaki variation" msgstr "Iwasaki variation" #: opening-dat.h:94 msgid "Heath-Chimney, \"Mass-Turning\"" msgstr "Heath-Chimney, \"Mass-Turning\"" #: opening-dat.h:104 msgid "Raccoon Dog" msgstr "Raccoon Dog" #: opening-dat.h:114 msgid "Hamilton" msgstr "Hamilton" #: opening-dat.h:124 msgid "Lollipop" msgstr "Lollipop" #: opening-dat.h:134 msgid "Cow" msgstr "Cow" #: opening-dat.h:144 msgid "Chimney" msgstr "Chimney" #: opening-dat.h:154 msgid "Cow Bat, Bat, Cambridge" msgstr "Cow Bat, Bat, Cambridge" #: opening-dat.h:164 msgid "Bat (Piau Continuation 2)" msgstr "Bat (Piau Continuation 2)" #: opening-dat.h:174 msgid "Melnikov, Bat (Piau Continuation 1)" msgstr "Melnikov, Bat (Piau Continuation 1)" #: opening-dat.h:184 msgid "Bat (Kling Continuation)" msgstr "Bat (Kling Continuation)" #: opening-dat.h:194 msgid "Bat (Kling Alternative)" msgstr "Bat (Kling Alternative)" #: opening-dat.h:204 msgid "Rose-v-Toth" msgstr "Rose-v-Toth" #: opening-dat.h:214 msgid "Tanida" msgstr "Tanida" #: opening-dat.h:224 msgid "Aircraft, Feldborg" msgstr "Aircraft, Feldborg" #: opening-dat.h:234 msgid "Sailboat" msgstr "Sailboat" #: opening-dat.h:244 msgid "Maruoka" msgstr "Maruoka" #: opening-dat.h:254 msgid "Landau" msgstr "Landau" #: opening-dat.h:264 msgid "Buffalo, Kenichi Variation" msgstr "Buffalo, Kenichi Variation" #: opening-dat.h:274 msgid "Maruoka Buffalo" msgstr "Maruoka Buffalo" #: opening-dat.h:284 msgid "Tanida Buffalo" msgstr "Tanida Buffalo" #: opening-dat.h:294 msgid "Hokuriku Buffalo" msgstr "Hokuriku Buffalo" #: opening-dat.h:304 msgid "Wing Variation" msgstr "Wing Variation" #: opening-dat.h:314 msgid "Semi-Wing Variation" msgstr "Semi-Wing Variation" #: opening-dat.h:324 msgid "Parallel Opening" msgstr "Parallel Opening" #: opening-dat.h:334 msgid "Perpendicular Opening" msgstr "Perpendicular Opening" #: opening-dat.h:344 msgid "Mimura" msgstr "Mimura" #: opening-dat.h:354 msgid "Shaman, Danish" msgstr "Shaman, Danish" #: opening-dat.h:364 msgid "Inoue" msgstr "Inoue" #: opening-dat.h:374 msgid "IAGO" msgstr "IAGO" #: opening-dat.h:384 msgid "Bhagat" msgstr "Bhagat" #: opening-dat.h:394 msgid "Rose" msgstr "Rose" #: opening-dat.h:404 msgid "Flat" msgstr "Flat" #: opening-dat.h:414 msgid "Rotating Flat" msgstr "Rotating Flat" #: opening-dat.h:424 msgid "Murakami Variation" msgstr "Murakami Variation" #: opening-dat.h:434 msgid "Rotating Flat (Kling Continuation)" msgstr "Rotating Flat (Kling Continuation)" #: opening-dat.h:444 msgid "Rose-Birth" msgstr "Rose-Birth" #: opening-dat.h:454 msgid "Brightstein" msgstr "Brightstein" #: opening-dat.h:464 msgid "Rose-birdie, Rose-Tamenori" msgstr "Rose-birdie, Rose-Tamenori" #: opening-dat.h:474 msgid "Rose-Tamenori-Kling" msgstr "Rose-Tamenori-Kling" #: opening-dat.h:484 msgid "Greenberg, Dawg" msgstr "Greenberg, Dawg" #: opening-dat.h:494 msgid "Ralle" msgstr "Ralle" #: opening-dat.h:504 msgid "Horse" msgstr "Horse" #: opening-dat.h:514 msgid "No-Cat" msgstr "No-Cat" #: opening-dat.h:524 msgid "Swallow" msgstr "Swallow" #: opening-dat.h:534 msgid "No-Cat (Continuation)" msgstr "No-Cat (Continuation)" #: opening-dat.h:544 msgid "Italian" msgstr "Italian" #: opening-dat.h:554 msgid "Cat" msgstr "Cat" #: opening-dat.h:564 msgid "Sakaguchi" msgstr "Sakaguchi" #: opening-dat.h:574 msgid "Berner" msgstr "Berner" #: opening-dat.h:584 msgid "Ganglion" msgstr "Ganglion" #: opening-dat.h:594 msgid "Tiger" msgstr "Tiger" #: opening-dat.h:604 msgid "Stephenson" msgstr "Stephenson" #: opening-dat.h:614 msgid "No-Kung" msgstr "No-Kung" #: opening-dat.h:624 msgid "No-Kung (Continuation)" msgstr "No-Kung (Continuation)" #: opening-dat.h:634 msgid "COMP'OTH" msgstr "COMP'OTH" #: opening-dat.h:644 msgid "Kung" msgstr "Kung" #: opening-dat.h:654 msgid "Leader's Tiger" msgstr "Leader's Tiger" #: opening-dat.h:664 msgid "Brightwell" msgstr "Brightwell" #: opening-dat.h:674 msgid "Ishii" msgstr "Ishii" #: opening-dat.h:684 msgid "Mainline Tiger" msgstr "Mainline Tiger" #: opening-dat.h:694 msgid "Rose-BILL" msgstr "Rose-BILL" #: opening-dat.h:704 msgid "Tamenori" msgstr "Tamenori" #: opening-dat.h:714 msgid "Aubrey, Tanaka" msgstr "Aubrey, Tanaka" #: randboard.cc:91 msgid "invalid number of pieces %$ in random_board" msgstr "invalid number of pieces %$ in random_board" grhino-0.16.1/po/insert-header.sin0000644000175000017500000000124011436423225017205 0ustar lerdsuwalerdsuwa# Sed script that inserts the file called HEADER before the header entry. # # At each occurrence of a line starting with "msgid ", we execute the following # commands. At the first occurrence, insert the file. At the following # occurrences, do nothing. The distinction between the first and the following # occurrences is achieved by looking at the hold space. /^msgid /{ x # Test if the hold space is empty. s/m/m/ ta # Yes it was empty. First occurrence. Read the file. r HEADER # Output the file's contents by reading the next line. But don't lose the # current line while doing this. g N bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } grhino-0.16.1/po/grhino.pot0000644000175000017500000003171211436423225015761 0ustar lerdsuwalerdsuwa# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Kriang Lerdsuwanakij # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: lerdsuwa@users.sourceforge.net\n" "POT-Creation-Date: 2010-08-29 16:18+0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: binfile.cc:54 dump_pattern.cc:128 dump_pattern.cc:150 gen_book.cc:322 #: gen_pattern.cc:344 pattern.cc:223 msgid "cannot open file %$\n" msgstr "" #: binfile.cc:88 binfile.cc:103 gen_pattern.cc:362 pattern.cc:233 msgid "cannot read file %$\n" msgstr "" #: binfile.cc:179 gen_pattern.cc:119 gen_pattern.cc:389 gen_pattern.cc:428 msgid "cannot create file %$\n" msgstr "" #: binfile.cc:208 gen_pattern.cc:145 gen_pattern.cc:402 gen_pattern.cc:523 msgid "cannot write file %$\n" msgstr "" #: board.cc:114 msgid "invalid initial board" msgstr "" #: book.cc:174 msgid "invalid file format in %$\n" msgstr "" #: dump_pattern.cc:79 msgid "%$ %$ - Pattern dumper\n" msgstr "" #: dump_pattern.cc:80 msgid "" "(c) 2001, 2002, 2003 Kriang Lerdsuwanakij\n" "\n" msgstr "" #: dump_pattern.cc:81 msgid "" "Usage: %$ PATTERN MOVE_INDEX\n" "\n" msgstr "" #: dump_pattern.cc:85 gen_book.cc:514 gen_pattern.cc:619 msgid "bad arguments" msgstr "" #: dump_pattern.cc:122 gen_pattern.cc:659 msgid "bad pattern name" msgstr "" #: dump_pattern.cc:181 gen_book.cc:551 gen_opening.cc:225 gen_pattern.cc:673 #: gen_table.cc:96 grhino.cc:1873 grhino.cc:2192 msgid "%$: %$\n" msgstr "" #: dump_pattern.cc:185 gen_book.cc:555 gen_opening.cc:229 gen_pattern.cc:677 #: gen_table.cc:100 grhino.cc:2196 msgid "%$: exception %$\n" msgstr "" #: dump_pattern.cc:189 gen_book.cc:559 gen_opening.cc:233 gen_pattern.cc:681 #: gen_table.cc:104 grhino.cc:2200 msgid "%$: unknown exception\n" msgstr "" #: game.cc:117 game.cc:139 opening-dat.h:4 msgid "None" msgstr "" #: game.cc:117 grhino.cc:2006 msgid "Black" msgstr "" #: game.cc:117 grhino.cc:2011 msgid "White" msgstr "" #: game.cc:118 msgid "Both" msgstr "" #: game.cc:118 msgid "Alternate" msgstr "" #: game.cc:118 msgid "Random" msgstr "" #: game.cc:134 msgid "1" msgstr "" #: game.cc:134 msgid "2" msgstr "" #: game.cc:134 msgid "3" msgstr "" #: game.cc:134 msgid "4" msgstr "" #: game.cc:134 msgid "5" msgstr "" #: game.cc:134 msgid "Custom" msgstr "" #: game.cc:139 msgid "Very low" msgstr "" #: game.cc:139 msgid "Low" msgstr "" #: game.cc:139 msgid "Medium" msgstr "" #: game.cc:139 msgid "High" msgstr "" #: game.cc:139 msgid "Very high" msgstr "" #: game.cc:155 msgid "Initial board" msgstr "" #: game.cc:155 msgid "Random board" msgstr "" #: game.cc:350 msgid "error obtaining the user home directory" msgstr "" #: gen_book.cc:279 gen_pattern.cc:318 msgid "invalid game moves" msgstr "" #: gen_book.cc:508 msgid "%$ %$ - Open book generator\n" msgstr "" #: gen_book.cc:509 gen_pattern.cc:614 msgid "" "(c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij\n" "\n" msgstr "" #: gen_book.cc:510 msgid "" "Usage: %$ init|gen|FILES\n" "\n" msgstr "" #: gen_opening.cc:104 msgid "%$ %$ - Game opening generator\n" msgstr "" #: gen_opening.cc:105 msgid "" "(c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij\n" "\n" msgstr "" #: gen_opening.cc:106 msgid "" "Usage: %$ \n" "\n" msgstr "" #: gen_opening.cc:116 msgid "cannot open file openings.txt" msgstr "" #: gen_pattern.cc:516 msgid "pattern symmetry error" msgstr "" #: gen_pattern.cc:613 msgid "%$ %$ - Pattern generator\n" msgstr "" #: gen_pattern.cc:615 msgid "" "Usage: %$ PATTERN init|gen|FILES\n" "\n" msgstr "" #: gpref.cc:69 msgid "Small" msgstr "" #: gpref.cc:69 msgid "Large" msgstr "" #: gpref.cc:252 gpref.cc:295 gpref.cc:687 gpref.cc:717 msgid "DEFAULT" msgstr "" #: gpref.cc:280 msgid "Theme problem: %$. Revert to previous theme settings." msgstr "" #: gpref.cc:405 msgid "Preferences" msgstr "" #: gpref.cc:413 grhino.cc:606 grhino.cc:609 grhino.cc:621 msgid "AI" msgstr "" #: gpref.cc:418 msgid "Computer player" msgstr "" #: gpref.cc:438 msgid "Computer level" msgstr "" #: gpref.cc:458 msgid "Mid game search depth" msgstr "" #: gpref.cc:474 msgid "Winning move search empties" msgstr "" #: gpref.cc:490 msgid "Perfect end game search empties" msgstr "" #: gpref.cc:506 msgid "Randomness" msgstr "" #: gpref.cc:522 msgid "Open book variation" msgstr "" #: gpref.cc:549 msgid "Board" msgstr "" #: gpref.cc:552 msgid "Log game moves" msgstr "" #: gpref.cc:559 msgid "Redo also repeat same AI moves" msgstr "" #: gpref.cc:566 msgid "Animate opening" msgstr "" #: gpref.cc:575 msgid "Animation delay" msgstr "" #: gpref.cc:591 msgid "Start game from" msgstr "" #: gpref.cc:612 grhino.cc:621 msgid "Opening" msgstr "" #: gpref.cc:633 msgid "Random game pieces" msgstr "" #: gpref.cc:656 msgid "Theme" msgstr "" #: gpref.cc:659 msgid "Show possible moves" msgstr "" #: gpref.cc:666 msgid "Show last move" msgstr "" #: gpref.cc:673 msgid "Show board border" msgstr "" #: gpref.cc:682 msgid "Theme directory" msgstr "" #: gpref.cc:727 msgid "Toolbar icon size" msgstr "" #: grhino.cc:207 msgid "_Edit board" msgstr "" #: grhino.cc:207 msgid "Edit board and start game" msgstr "" #: grhino.cc:223 msgid "_Begin of game" msgstr "" #: grhino.cc:223 grhino.cc:1982 msgid "Go to the game beginning" msgstr "" #: grhino.cc:224 msgid "_Previous move" msgstr "" #: grhino.cc:224 grhino.cc:1986 msgid "Go to the previous move" msgstr "" #: grhino.cc:225 msgid "_Next move" msgstr "" #: grhino.cc:225 grhino.cc:1990 msgid "Go to the next move" msgstr "" #: grhino.cc:226 msgid "_Last move" msgstr "" #: grhino.cc:226 grhino.cc:1994 msgid "Go to the last move" msgstr "" #: grhino.cc:232 msgid "_Toolbar" msgstr "" #: grhino.cc:232 msgid "Show/hide toolbar" msgstr "" #: grhino.cc:234 msgid "_Pattern evaluation" msgstr "" #: grhino.cc:234 msgid "Show/hide pattern evaluation score" msgstr "" #: grhino.cc:235 msgid "Game _history" msgstr "" #: grhino.cc:235 msgid "Show/hide game move history" msgstr "" #: grhino.cc:241 msgid "Switch _computer color" msgstr "" #: grhino.cc:243 msgid "_Save Settings" msgstr "" #: grhino.cc:257 msgid "_View" msgstr "" #: grhino.cc:603 msgid "random" msgstr "" #: grhino.cc:606 grhino.cc:609 grhino.cc:620 msgid "human" msgstr "" #: grhino.cc:612 grhino.cc:618 msgid "%$ (%$)" msgstr "" #: grhino.cc:613 grhino.cc:619 msgid "Black's turn" msgstr "" #: grhino.cc:613 grhino.cc:619 msgid "White's turn" msgstr "" #: grhino.cc:626 msgid " [%$]" msgstr "" #: grhino.cc:636 msgid "%$ (%$-%$)" msgstr "" #: grhino.cc:637 msgid "Draw" msgstr "" #: grhino.cc:638 msgid "Black wins" msgstr "" #: grhino.cc:638 msgid "White wins" msgstr "" #: grhino.cc:644 msgid "White wins - Black ran out of time" msgstr "" #: grhino.cc:647 msgid "Black wins - White ran out of time" msgstr "" #: grhino.cc:650 msgid "White wins - Black resigned" msgstr "" #: grhino.cc:653 msgid "Black wins - White resigned" msgstr "" #: grhino.cc:659 msgid " (%$ %$)" msgstr "" #: grhino.cc:966 msgid "Select a file to open" msgstr "" #: grhino.cc:1092 msgid "There must be at least 4 pieces on the board." msgstr "" #: grhino.cc:1103 msgid "The center 4 pieces must be filled." msgstr "" #: grhino.cc:1489 grhino.cc:1492 msgid "Kriang Lerdsuwanakij" msgstr "" #: grhino.cc:1494 msgid "TRANSLATOR" msgstr "" #: grhino.cc:1499 msgid "(c) 2000-7, 2010 Kriang Lerdsuwanakij" msgstr "" #: grhino.cc:1500 msgid "A reversi program" msgstr "" #: grhino.cc:1519 msgid "size of theme pixmap %$ does not agree with others" msgstr "" #: grhino.cc:1541 msgid "pixmap %$ missing" msgstr "" #: grhino.cc:1550 msgid "pixmap %$ contains error" msgstr "" #: grhino.cc:1874 msgid "%$: reverting to default internal theme\n" msgstr "" #: grhino.cc:1949 msgid "New" msgstr "" #: grhino.cc:1950 msgid "Start a new game" msgstr "" #: grhino.cc:1953 msgid "Edit" msgstr "" #: grhino.cc:1954 msgid "Edit board" msgstr "" #: grhino.cc:1957 msgid "Quit" msgstr "" #: grhino.cc:1958 msgid "Quit GRhino" msgstr "" #: grhino.cc:1967 msgid "Undo" msgstr "" #: grhino.cc:1968 msgid "Undo move" msgstr "" #: grhino.cc:1971 msgid "Redo" msgstr "" #: grhino.cc:1972 msgid "Redo move" msgstr "" #: grhino.cc:1981 msgid "Begin" msgstr "" #: grhino.cc:1985 msgid "Prev" msgstr "" #: grhino.cc:1989 msgid "Next" msgstr "" #: grhino.cc:1993 msgid "Last" msgstr "" #: grhino.cc:2000 msgid "Empty" msgstr "" #: grhino.cc:2001 msgid "Fill with empty" msgstr "" #: grhino.cc:2007 msgid "Fill with black" msgstr "" #: grhino.cc:2012 msgid "Fill with white" msgstr "" #: grhino.cc:2020 msgid "To play" msgstr "" #: grhino.cc:2021 msgid "Player with first move" msgstr "" #: grhino.cc:2024 msgid "Finish" msgstr "" #: grhino.cc:2025 msgid "Start game with board" msgstr "" #: grhino.cc:2096 msgid "cannot run on system with less than 32-bit int" msgstr "" #: log_proc.h:632 msgid "Processing %$\n" msgstr "" #: log_proc.h:637 msgid "cannot open file %$" msgstr "" #: log_proc.h:660 msgid "" "\n" "%$: fail at line %$\n" msgstr "" #: opening-dat.h:14 msgid "Diagonal Opening" msgstr "" #: opening-dat.h:24 msgid "X-square Opening" msgstr "" #: opening-dat.h:34 msgid "Snake, Peasant" msgstr "" #: opening-dat.h:44 msgid "Pyramid, Checkerboarding Peasant" msgstr "" #: opening-dat.h:54 msgid "Heath, Tobidashi \"Jumping Out\"" msgstr "" #: opening-dat.h:64 msgid "Mimura variation II" msgstr "" #: opening-dat.h:74 msgid "Heath-Bat" msgstr "" #: opening-dat.h:84 msgid "Iwasaki variation" msgstr "" #: opening-dat.h:94 msgid "Heath-Chimney, \"Mass-Turning\"" msgstr "" #: opening-dat.h:104 msgid "Raccoon Dog" msgstr "" #: opening-dat.h:114 msgid "Hamilton" msgstr "" #: opening-dat.h:124 msgid "Lollipop" msgstr "" #: opening-dat.h:134 msgid "Cow" msgstr "" #: opening-dat.h:144 msgid "Chimney" msgstr "" #: opening-dat.h:154 msgid "Cow Bat, Bat, Cambridge" msgstr "" #: opening-dat.h:164 msgid "Bat (Piau Continuation 2)" msgstr "" #: opening-dat.h:174 msgid "Melnikov, Bat (Piau Continuation 1)" msgstr "" #: opening-dat.h:184 msgid "Bat (Kling Continuation)" msgstr "" #: opening-dat.h:194 msgid "Bat (Kling Alternative)" msgstr "" #: opening-dat.h:204 msgid "Rose-v-Toth" msgstr "" #: opening-dat.h:214 msgid "Tanida" msgstr "" #: opening-dat.h:224 msgid "Aircraft, Feldborg" msgstr "" #: opening-dat.h:234 msgid "Sailboat" msgstr "" #: opening-dat.h:244 msgid "Maruoka" msgstr "" #: opening-dat.h:254 msgid "Landau" msgstr "" #: opening-dat.h:264 msgid "Buffalo, Kenichi Variation" msgstr "" #: opening-dat.h:274 msgid "Maruoka Buffalo" msgstr "" #: opening-dat.h:284 msgid "Tanida Buffalo" msgstr "" #: opening-dat.h:294 msgid "Hokuriku Buffalo" msgstr "" #: opening-dat.h:304 msgid "Wing Variation" msgstr "" #: opening-dat.h:314 msgid "Semi-Wing Variation" msgstr "" #: opening-dat.h:324 msgid "Parallel Opening" msgstr "" #: opening-dat.h:334 msgid "Perpendicular Opening" msgstr "" #: opening-dat.h:344 msgid "Mimura" msgstr "" #: opening-dat.h:354 msgid "Shaman, Danish" msgstr "" #: opening-dat.h:364 msgid "Inoue" msgstr "" #: opening-dat.h:374 msgid "IAGO" msgstr "" #: opening-dat.h:384 msgid "Bhagat" msgstr "" #: opening-dat.h:394 msgid "Rose" msgstr "" #: opening-dat.h:404 msgid "Flat" msgstr "" #: opening-dat.h:414 msgid "Rotating Flat" msgstr "" #: opening-dat.h:424 msgid "Murakami Variation" msgstr "" #: opening-dat.h:434 msgid "Rotating Flat (Kling Continuation)" msgstr "" #: opening-dat.h:444 msgid "Rose-Birth" msgstr "" #: opening-dat.h:454 msgid "Brightstein" msgstr "" #: opening-dat.h:464 msgid "Rose-birdie, Rose-Tamenori" msgstr "" #: opening-dat.h:474 msgid "Rose-Tamenori-Kling" msgstr "" #: opening-dat.h:484 msgid "Greenberg, Dawg" msgstr "" #: opening-dat.h:494 msgid "Ralle" msgstr "" #: opening-dat.h:504 msgid "Horse" msgstr "" #: opening-dat.h:514 msgid "No-Cat" msgstr "" #: opening-dat.h:524 msgid "Swallow" msgstr "" #: opening-dat.h:534 msgid "No-Cat (Continuation)" msgstr "" #: opening-dat.h:544 msgid "Italian" msgstr "" #: opening-dat.h:554 msgid "Cat" msgstr "" #: opening-dat.h:564 msgid "Sakaguchi" msgstr "" #: opening-dat.h:574 msgid "Berner" msgstr "" #: opening-dat.h:584 msgid "Ganglion" msgstr "" #: opening-dat.h:594 msgid "Tiger" msgstr "" #: opening-dat.h:604 msgid "Stephenson" msgstr "" #: opening-dat.h:614 msgid "No-Kung" msgstr "" #: opening-dat.h:624 msgid "No-Kung (Continuation)" msgstr "" #: opening-dat.h:634 msgid "COMP'OTH" msgstr "" #: opening-dat.h:644 msgid "Kung" msgstr "" #: opening-dat.h:654 msgid "Leader's Tiger" msgstr "" #: opening-dat.h:664 msgid "Brightwell" msgstr "" #: opening-dat.h:674 msgid "Ishii" msgstr "" #: opening-dat.h:684 msgid "Mainline Tiger" msgstr "" #: opening-dat.h:694 msgid "Rose-BILL" msgstr "" #: opening-dat.h:704 msgid "Tamenori" msgstr "" #: opening-dat.h:714 msgid "Aubrey, Tanaka" msgstr "" #: randboard.cc:91 msgid "invalid number of pieces %$ in random_board" msgstr "" grhino-0.16.1/po/remove-potcdate.sin0000644000175000017500000000066011436423225017556 0ustar lerdsuwalerdsuwa# Sed script that remove the POT-Creation-Date line in the header entry # from a POT file. # # The distinction between the first and the following occurrences of the # pattern is achieved by looking at the hold space. /^"POT-Creation-Date: .*"$/{ x # Test if the hold space is empty. s/P/P/ ta # Yes it was empty. First occurrence. Remove the line. g d bb :a # The hold space was nonempty. Following occurrences. Do nothing. x :b } grhino-0.16.1/po/Makefile.in0000644000175000017500000003322411436423225016014 0ustar lerdsuwalerdsuwa# Makefile for PO directory in any package using GNU gettext. # Copyright (C) 1995-1997, 2000-2006 by Ulrich Drepper # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU General Public # License but which still want to provide support for the GNU gettext # functionality. # Please note that the actual code of GNU gettext is covered by the GNU # General Public License and is *not* in the public domain. # # Origin: gettext-0.16 PACKAGE = grhino VERSION = 0.16.1 PACKAGE_BUGREPORT = SHELL = /bin/sh srcdir = . top_srcdir = .. prefix = /usr/local exec_prefix = ${prefix} datarootdir = ${prefix}/share datadir = ${datarootdir} localedir = ${datarootdir}/locale gettextsrcdir = $(datadir)/gettext/po INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 # We use $(mkdir_p). # In automake <= 1.9.x, $(mkdir_p) is defined either as "mkdir -p --" or as # "$(mkinstalldirs)" or as "$(install_sh) -d". For these automake versions, # @install_sh@ does not start with $(SHELL), so we add it. # In automake >= 1.10, /bin/mkdir -p is derived from ${MKDIR_P}, which is defined # either as "/path/to/mkdir -p" or ".../install-sh -c -d". For these automake # versions, $(mkinstalldirs) and $(install_sh) are unused. mkinstalldirs = $(SHELL) @install_sh@ -d install_sh = $(SHELL) @install_sh@ MKDIR_P = /bin/mkdir -p mkdir_p = /bin/mkdir -p GMSGFMT_ = /usr/bin/msgfmt GMSGFMT_no = /usr/bin/msgfmt GMSGFMT_yes = /usr/bin/msgfmt GMSGFMT = $(GMSGFMT_$(USE_MSGCTXT)) MSGFMT_ = /usr/bin/msgfmt MSGFMT_no = /usr/bin/msgfmt MSGFMT_yes = /usr/bin/msgfmt MSGFMT = $(MSGFMT_$(USE_MSGCTXT)) XGETTEXT_ = /usr/bin/xgettext XGETTEXT_no = /usr/bin/xgettext XGETTEXT_yes = /usr/bin/xgettext XGETTEXT = $(XGETTEXT_$(USE_MSGCTXT)) MSGMERGE = msgmerge MSGMERGE_UPDATE = /usr/bin/msgmerge --update MSGINIT = msginit MSGCONV = msgconv MSGFILTER = msgfilter POFILES = @POFILES@ GMOFILES = @GMOFILES@ UPDATEPOFILES = @UPDATEPOFILES@ DUMMYPOFILES = @DUMMYPOFILES@ DISTFILES.common = Makefile.in.in remove-potcdate.sin \ $(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) DISTFILES = $(DISTFILES.common) Makevars POTFILES.in \ $(POFILES) $(GMOFILES) \ $(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) POTFILES = \ CATALOGS = @CATALOGS@ # Makevars gets inserted here. (Don't remove this line!) .SUFFIXES: .SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update .po.mo: @echo "$(MSGFMT) -c -o $@ $<"; \ $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ .po.gmo: @lang=`echo $* | sed -e 's,.*/,,'`; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo .sin.sed: sed -e '/^#/d' $< > t-$@ mv t-$@ $@ all: all-yes all-yes: stamp-po all-no: # $(srcdir)/$(DOMAIN).pot is only created when needed. When xgettext finds no # internationalized messages, no $(srcdir)/$(DOMAIN).pot is created (because # we don't want to bother translators with empty POT files). We assume that # LINGUAS is empty in this case, i.e. $(POFILES) and $(GMOFILES) are empty. # In this case, stamp-po is a nop (i.e. a phony target). # stamp-po is a timestamp denoting the last time at which the CATALOGS have # been loosely updated. Its purpose is that when a developer or translator # checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, # "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent # invocations of "make" will do nothing. This timestamp would not be necessary # if updating the $(CATALOGS) would always touch them; however, the rule for # $(POFILES) has been designed to not touch files that don't need to be # changed. stamp-po: $(srcdir)/$(DOMAIN).pot test ! -f $(srcdir)/$(DOMAIN).pot || \ test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) @test ! -f $(srcdir)/$(DOMAIN).pot || { \ echo "touch stamp-po" && \ echo timestamp > stamp-poT && \ mv stamp-poT stamp-po; \ } # Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', # otherwise packages like GCC can not be built if only parts of the source # have been downloaded. # This target rebuilds $(DOMAIN).pot; it is an expensive operation. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed if test -n '$(MSGID_BUGS_ADDRESS)' || test '$(PACKAGE_BUGREPORT)' = '@'PACKAGE_BUGREPORT'@'; then \ msgid_bugs_address='$(MSGID_BUGS_ADDRESS)'; \ else \ msgid_bugs_address='$(PACKAGE_BUGREPORT)'; \ fi; \ $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --files-from=$(srcdir)/POTFILES.in \ --copyright-holder='$(COPYRIGHT_HOLDER)' \ --msgid-bugs-address="$$msgid_bugs_address" test ! -f $(DOMAIN).po || { \ if test -f $(srcdir)/$(DOMAIN).pot; then \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ else \ rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ else \ mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ fi; \ } # This rule has no dependencies: we don't need to update $(DOMAIN).pot at # every "make" invocation, only create it when it is missing. # Only "make $(DOMAIN).pot-update" or "make dist" will force an update. $(srcdir)/$(DOMAIN).pot: $(MAKE) $(DOMAIN).pot-update # This target rebuilds a PO file if $(DOMAIN).pot has changed. # Note that a PO file is not touched if it doesn't need to be changed. $(POFILES): $(srcdir)/$(DOMAIN).pot @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ if test -f "$(srcdir)/$${lang}.po"; then \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ else \ $(MAKE) $${lang}.po-create; \ fi install: install-exec install-data install-exec: install-data: install-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ for file in $(DISTFILES.common) Makevars.template; do \ $(INSTALL_DATA) $(srcdir)/$$file \ $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ for file in Makevars; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi install-data-no: all install-data-yes: all $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ fi; \ done; \ done install-strip: install installdirs: installdirs-exec installdirs-data installdirs-exec: installdirs-data: installdirs-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ $(mkdir_p) $(DESTDIR)$(gettextsrcdir); \ else \ : ; \ fi installdirs-data-no: installdirs-data-yes: $(mkdir_p) $(DESTDIR)$(datadir) @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ dir=$(localedir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $(DESTDIR)$$dir; \ for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ if test -n "$$lc"; then \ if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ for file in *; do \ if test -f $$file; then \ ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ fi; \ done); \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ else \ if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ :; \ else \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ fi; \ fi; \ fi; \ done; \ done # Define this as empty until I found a useful application. installcheck: uninstall: uninstall-exec uninstall-data uninstall-exec: uninstall-data: uninstall-data-yes if test "$(PACKAGE)" = "gettext-tools"; then \ for file in $(DISTFILES.common) Makevars.template; do \ rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ done; \ else \ : ; \ fi uninstall-data-no: uninstall-data-yes: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ done; \ done check: all info dvi ps pdf html tags TAGS ctags CTAGS ID: mostlyclean: rm -f remove-potcdate.sed rm -f stamp-poT rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f stamp-po $(GMOFILES) distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(MAKE) update-po @$(MAKE) dist2 # This is a separate target because 'update-po' must be executed before. dist2: stamp-po $(DISTFILES) dists="$(DISTFILES)"; \ if test "$(PACKAGE)" = "gettext-tools"; then \ dists="$$dists Makevars.template"; \ fi; \ if test -f $(srcdir)/$(DOMAIN).pot; then \ dists="$$dists $(DOMAIN).pot stamp-po"; \ fi; \ if test -f $(srcdir)/ChangeLog; then \ dists="$$dists ChangeLog"; \ fi; \ for i in 0 1 2 3 4 5 6 7 8 9; do \ if test -f $(srcdir)/ChangeLog.$$i; then \ dists="$$dists ChangeLog.$$i"; \ fi; \ done; \ if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ for file in $$dists; do \ if test -f $$file; then \ cp -p $$file $(distdir) || exit 1; \ else \ cp -p $(srcdir)/$$file $(distdir) || exit 1; \ fi; \ done update-po: Makefile $(MAKE) $(DOMAIN).pot-update test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) $(MAKE) update-gmo # General rule for creating PO files. .nop.po-create: @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ exit 1 # General rule for updating PO files. .nop.po-update: @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ tmpdir=`pwd`; \ echo "$$lang:"; \ test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ cd $(srcdir); \ if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.po failed!" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ fi $(DUMMYPOFILES): update-gmo: Makefile $(GMOFILES) @: Makefile: Makefile.in.in Makevars $(top_builddir)/config.status @POMAKEFILEDEPS@ cd $(top_builddir) \ && $(SHELL) ./config.status $(subdir)/$@.in po-directories force: # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: grhino-0.16.1/po/quot.sed0000644000175000017500000000023111436423225015424 0ustar lerdsuwalerdsuwas/"\([^"]*\)"/“\1”/g s/`\([^`']*\)'/‘\1’/g s/ '\([^`']*\)' / ‘\1’ /g s/ '\([^`']*\)'$/ ‘\1’/g s/^'\([^`']*\)' /‘\1’ /g s/“”/""/g grhino-0.16.1/po/en@quot.header0000644000175000017500000000226311436423225016533 0ustar lerdsuwalerdsuwa# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # grhino-0.16.1/po/en_US.UTF-8.po0000644000175000017500000004071411436423225016124 0ustar lerdsuwalerdsuwa# Automatically generated by utf-quotes.pl # Automatically generated by copy-message.pl # GRhino PO Files # Copyright (C) YEAR Kriang Lerdsuwanakij # This file is distributed under the same license as the PACKAGE package. # Kriang Lerdsuwanakij , 2002 # msgid "" msgstr "" "Project-Id-Version: grhino 0.16.1\n" "Report-Msgid-Bugs-To: lerdsuwa@users.sourceforge.net\n" "POT-Creation-Date: 2010-08-29 16:18+0700\n" "PO-Revision-Date: 2010-08-29 16:21+0700\n" "Last-Translator: Kriang Lerdsuwanakij \n" "Language-Team: Kriang Lerdsuwanakij \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" #: binfile.cc:54 dump_pattern.cc:128 dump_pattern.cc:150 gen_book.cc:322 #: gen_pattern.cc:344 pattern.cc:223 msgid "cannot open file %$\n" msgstr "cannot open file %$\n" #: binfile.cc:88 binfile.cc:103 gen_pattern.cc:362 pattern.cc:233 msgid "cannot read file %$\n" msgstr "cannot read file %$\n" #: binfile.cc:179 gen_pattern.cc:119 gen_pattern.cc:389 gen_pattern.cc:428 msgid "cannot create file %$\n" msgstr "cannot create file %$\n" #: binfile.cc:208 gen_pattern.cc:145 gen_pattern.cc:402 gen_pattern.cc:523 msgid "cannot write file %$\n" msgstr "cannot write file %$\n" #: board.cc:114 msgid "invalid initial board" msgstr "invalid initial board" #: book.cc:174 msgid "invalid file format in %$\n" msgstr "invalid file format in %$\n" #: dump_pattern.cc:79 msgid "%$ %$ - Pattern dumper\n" msgstr "%$ %$ - Pattern dumper\n" #: dump_pattern.cc:80 msgid "" "(c) 2001, 2002, 2003 Kriang Lerdsuwanakij\n" "\n" msgstr "" "(c) 2001, 2002, 2003 Kriang Lerdsuwanakij\n" "\n" #: dump_pattern.cc:81 msgid "" "Usage: %$ PATTERN MOVE_INDEX\n" "\n" msgstr "" "Usage: %$ PATTERN MOVE_INDEX\n" "\n" #: dump_pattern.cc:85 gen_book.cc:514 gen_pattern.cc:619 msgid "bad arguments" msgstr "bad arguments" #: dump_pattern.cc:122 gen_pattern.cc:659 msgid "bad pattern name" msgstr "bad pattern name" #: dump_pattern.cc:181 gen_book.cc:551 gen_opening.cc:225 gen_pattern.cc:673 #: gen_table.cc:96 grhino.cc:1873 grhino.cc:2192 msgid "%$: %$\n" msgstr "%$: %$\n" #: dump_pattern.cc:185 gen_book.cc:555 gen_opening.cc:229 gen_pattern.cc:677 #: gen_table.cc:100 grhino.cc:2196 msgid "%$: exception %$\n" msgstr "%$: exception %$\n" #: dump_pattern.cc:189 gen_book.cc:559 gen_opening.cc:233 gen_pattern.cc:681 #: gen_table.cc:104 grhino.cc:2200 msgid "%$: unknown exception\n" msgstr "%$: unknown exception\n" #: game.cc:117 game.cc:139 opening-dat.h:4 msgid "None" msgstr "None" #: game.cc:117 grhino.cc:2006 msgid "Black" msgstr "Black" #: game.cc:117 grhino.cc:2011 msgid "White" msgstr "White" #: game.cc:118 msgid "Both" msgstr "Both" #: game.cc:118 msgid "Alternate" msgstr "Alternate" #: game.cc:118 msgid "Random" msgstr "Random" #: game.cc:134 msgid "1" msgstr "1" #: game.cc:134 msgid "2" msgstr "2" #: game.cc:134 msgid "3" msgstr "3" #: game.cc:134 msgid "4" msgstr "4" #: game.cc:134 msgid "5" msgstr "5" #: game.cc:134 msgid "Custom" msgstr "Custom" #: game.cc:139 msgid "Very low" msgstr "Very low" #: game.cc:139 msgid "Low" msgstr "Low" #: game.cc:139 msgid "Medium" msgstr "Medium" #: game.cc:139 msgid "High" msgstr "High" #: game.cc:139 msgid "Very high" msgstr "Very high" #: game.cc:155 msgid "Initial board" msgstr "Initial board" #: game.cc:155 msgid "Random board" msgstr "Random board" #: game.cc:350 msgid "error obtaining the user home directory" msgstr "error obtaining the user home directory" #: gen_book.cc:279 gen_pattern.cc:318 msgid "invalid game moves" msgstr "invalid game moves" #: gen_book.cc:508 msgid "%$ %$ - Open book generator\n" msgstr "%$ %$ - Open book generator\n" #: gen_book.cc:509 gen_pattern.cc:614 msgid "" "(c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij\n" "\n" msgstr "" "(c) 2001, 2002, 2003, 2004, 2005 Kriang Lerdsuwanakij\n" "\n" #: gen_book.cc:510 msgid "" "Usage: %$ init|gen|FILES\n" "\n" msgstr "" "Usage: %$ init|gen|FILES\n" "\n" #: gen_opening.cc:104 msgid "%$ %$ - Game opening generator\n" msgstr "%$ %$ - Game opening generator\n" #: gen_opening.cc:105 msgid "" "(c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij\n" "\n" msgstr "" "(c) 2001, 2002, 2003, 2004 Kriang Lerdsuwanakij\n" "\n" #: gen_opening.cc:106 msgid "" "Usage: %$ \n" "\n" msgstr "" "Usage: %$ \n" "\n" #: gen_opening.cc:116 msgid "cannot open file openings.txt" msgstr "cannot open file openings.txt" #: gen_pattern.cc:516 msgid "pattern symmetry error" msgstr "pattern symmetry error" #: gen_pattern.cc:613 msgid "%$ %$ - Pattern generator\n" msgstr "%$ %$ - Pattern generator\n" #: gen_pattern.cc:615 msgid "" "Usage: %$ PATTERN init|gen|FILES\n" "\n" msgstr "" "Usage: %$ PATTERN init|gen|FILES\n" "\n" #: gpref.cc:69 msgid "Small" msgstr "Small" #: gpref.cc:69 msgid "Large" msgstr "Large" #: gpref.cc:252 gpref.cc:295 gpref.cc:687 gpref.cc:717 msgid "DEFAULT" msgstr "DEFAULT" #: gpref.cc:280 msgid "Theme problem: %$. Revert to previous theme settings." msgstr "Theme problem: %$. Revert to previous theme settings." #: gpref.cc:405 msgid "Preferences" msgstr "Preferences" #: gpref.cc:413 grhino.cc:606 grhino.cc:609 grhino.cc:621 msgid "AI" msgstr "AI" #: gpref.cc:418 msgid "Computer player" msgstr "Computer player" #: gpref.cc:438 msgid "Computer level" msgstr "Computer level" #: gpref.cc:458 msgid "Mid game search depth" msgstr "Mid game search depth" #: gpref.cc:474 msgid "Winning move search empties" msgstr "Winning move search empties" #: gpref.cc:490 msgid "Perfect end game search empties" msgstr "Perfect end game search empties" #: gpref.cc:506 msgid "Randomness" msgstr "Randomness" #: gpref.cc:522 msgid "Open book variation" msgstr "Open book variation" #: gpref.cc:549 msgid "Board" msgstr "Board" #: gpref.cc:552 msgid "Log game moves" msgstr "Log game moves" #: gpref.cc:559 msgid "Redo also repeat same AI moves" msgstr "Redo also repeat same AI moves" #: gpref.cc:566 msgid "Animate opening" msgstr "Animate opening" #: gpref.cc:575 msgid "Animation delay" msgstr "Animation delay" #: gpref.cc:591 msgid "Start game from" msgstr "Start game from" #: gpref.cc:612 grhino.cc:621 msgid "Opening" msgstr "Opening" #: gpref.cc:633 msgid "Random game pieces" msgstr "Random game pieces" #: gpref.cc:656 msgid "Theme" msgstr "Theme" #: gpref.cc:659 msgid "Show possible moves" msgstr "Show possible moves" #: gpref.cc:666 msgid "Show last move" msgstr "Show last move" #: gpref.cc:673 msgid "Show board border" msgstr "Show board border" #: gpref.cc:682 msgid "Theme directory" msgstr "Theme directory" #: gpref.cc:727 msgid "Toolbar icon size" msgstr "Toolbar icon size" #: grhino.cc:207 msgid "_Edit board" msgstr "_Edit board" #: grhino.cc:207 msgid "Edit board and start game" msgstr "Edit board and start game" #: grhino.cc:223 msgid "_Begin of game" msgstr "_Begin of game" #: grhino.cc:223 grhino.cc:1982 msgid "Go to the game beginning" msgstr "Go to the game beginning" #: grhino.cc:224 msgid "_Previous move" msgstr "_Previous move" #: grhino.cc:224 grhino.cc:1986 msgid "Go to the previous move" msgstr "Go to the previous move" #: grhino.cc:225 msgid "_Next move" msgstr "_Next move" #: grhino.cc:225 grhino.cc:1990 msgid "Go to the next move" msgstr "Go to the next move" #: grhino.cc:226 msgid "_Last move" msgstr "_Last move" #: grhino.cc:226 grhino.cc:1994 msgid "Go to the last move" msgstr "Go to the last move" #: grhino.cc:232 msgid "_Toolbar" msgstr "_Toolbar" #: grhino.cc:232 msgid "Show/hide toolbar" msgstr "Show/hide toolbar" #: grhino.cc:234 msgid "_Pattern evaluation" msgstr "_Pattern evaluation" #: grhino.cc:234 msgid "Show/hide pattern evaluation score" msgstr "Show/hide pattern evaluation score" #: grhino.cc:235 msgid "Game _history" msgstr "Game _history" #: grhino.cc:235 msgid "Show/hide game move history" msgstr "Show/hide game move history" #: grhino.cc:241 msgid "Switch _computer color" msgstr "Switch _computer color" #: grhino.cc:243 msgid "_Save Settings" msgstr "_Save Settings" #: grhino.cc:257 msgid "_View" msgstr "_View" #: grhino.cc:603 msgid "random" msgstr "random" #: grhino.cc:606 grhino.cc:609 grhino.cc:620 msgid "human" msgstr "human" #: grhino.cc:612 grhino.cc:618 msgid "%$ (%$)" msgstr "%$ (%$)" #: grhino.cc:613 grhino.cc:619 msgid "Black's turn" msgstr "Black’s turn" #: grhino.cc:613 grhino.cc:619 msgid "White's turn" msgstr "White’s turn" #: grhino.cc:626 msgid " [%$]" msgstr " [%$]" #: grhino.cc:636 msgid "%$ (%$-%$)" msgstr "%$ (%$-%$)" #: grhino.cc:637 msgid "Draw" msgstr "Draw" #: grhino.cc:638 msgid "Black wins" msgstr "Black wins" #: grhino.cc:638 msgid "White wins" msgstr "White wins" #: grhino.cc:644 msgid "White wins - Black ran out of time" msgstr "White wins - Black ran out of time" #: grhino.cc:647 msgid "Black wins - White ran out of time" msgstr "Black wins - White ran out of time" #: grhino.cc:650 msgid "White wins - Black resigned" msgstr "White wins - Black resigned" #: grhino.cc:653 msgid "Black wins - White resigned" msgstr "Black wins - White resigned" #: grhino.cc:659 msgid " (%$ %$)" msgstr " (%$ %$)" #: grhino.cc:966 msgid "Select a file to open" msgstr "Select a file to open" #: grhino.cc:1092 msgid "There must be at least 4 pieces on the board." msgstr "There must be at least 4 pieces on the board." #: grhino.cc:1103 msgid "The center 4 pieces must be filled." msgstr "The center 4 pieces must be filled." #: grhino.cc:1489 grhino.cc:1492 msgid "Kriang Lerdsuwanakij" msgstr "Kriang Lerdsuwanakij" #: grhino.cc:1494 msgid "TRANSLATOR" msgstr "TRANSLATOR" #: grhino.cc:1499 msgid "(c) 2000-7, 2010 Kriang Lerdsuwanakij" msgstr "(c) 2000-7, 2010 Kriang Lerdsuwanakij" #: grhino.cc:1500 msgid "A reversi program" msgstr "A reversi program" #: grhino.cc:1519 msgid "size of theme pixmap %$ does not agree with others" msgstr "size of theme pixmap %$ does not agree with others" #: grhino.cc:1541 msgid "pixmap %$ missing" msgstr "pixmap %$ missing" #: grhino.cc:1550 msgid "pixmap %$ contains error" msgstr "pixmap %$ contains error" #: grhino.cc:1874 msgid "%$: reverting to default internal theme\n" msgstr "%$: reverting to default internal theme\n" #: grhino.cc:1949 msgid "New" msgstr "New" #: grhino.cc:1950 msgid "Start a new game" msgstr "Start a new game" #: grhino.cc:1953 msgid "Edit" msgstr "Edit" #: grhino.cc:1954 msgid "Edit board" msgstr "Edit board" #: grhino.cc:1957 msgid "Quit" msgstr "Quit" #: grhino.cc:1958 msgid "Quit GRhino" msgstr "Quit GRhino" #: grhino.cc:1967 msgid "Undo" msgstr "Undo" #: grhino.cc:1968 msgid "Undo move" msgstr "Undo move" #: grhino.cc:1971 msgid "Redo" msgstr "Redo" #: grhino.cc:1972 msgid "Redo move" msgstr "Redo move" #: grhino.cc:1981 msgid "Begin" msgstr "Begin" #: grhino.cc:1985 msgid "Prev" msgstr "Prev" #: grhino.cc:1989 msgid "Next" msgstr "Next" #: grhino.cc:1993 msgid "Last" msgstr "Last" #: grhino.cc:2000 msgid "Empty" msgstr "Empty" #: grhino.cc:2001 msgid "Fill with empty" msgstr "Fill with empty" #: grhino.cc:2007 msgid "Fill with black" msgstr "Fill with black" #: grhino.cc:2012 msgid "Fill with white" msgstr "Fill with white" #: grhino.cc:2020 msgid "To play" msgstr "To play" #: grhino.cc:2021 msgid "Player with first move" msgstr "Player with first move" #: grhino.cc:2024 msgid "Finish" msgstr "Finish" #: grhino.cc:2025 msgid "Start game with board" msgstr "Start game with board" #: grhino.cc:2096 msgid "cannot run on system with less than 32-bit int" msgstr "cannot run on system with less than 32-bit int" #: log_proc.h:632 msgid "Processing %$\n" msgstr "Processing %$\n" #: log_proc.h:637 msgid "cannot open file %$" msgstr "cannot open file %$" #: log_proc.h:660 msgid "" "\n" "%$: fail at line %$\n" msgstr "" "\n" "%$: fail at line %$\n" #: opening-dat.h:14 msgid "Diagonal Opening" msgstr "Diagonal Opening" #: opening-dat.h:24 msgid "X-square Opening" msgstr "X-square Opening" #: opening-dat.h:34 msgid "Snake, Peasant" msgstr "Snake, Peasant" #: opening-dat.h:44 msgid "Pyramid, Checkerboarding Peasant" msgstr "Pyramid, Checkerboarding Peasant" #: opening-dat.h:54 msgid "Heath, Tobidashi \"Jumping Out\"" msgstr "Heath, Tobidashi \"Jumping Out\"" #: opening-dat.h:64 msgid "Mimura variation II" msgstr "Mimura variation II" #: opening-dat.h:74 msgid "Heath-Bat" msgstr "Heath-Bat" #: opening-dat.h:84 msgid "Iwasaki variation" msgstr "Iwasaki variation" #: opening-dat.h:94 msgid "Heath-Chimney, \"Mass-Turning\"" msgstr "Heath-Chimney, \"Mass-Turning\"" #: opening-dat.h:104 msgid "Raccoon Dog" msgstr "Raccoon Dog" #: opening-dat.h:114 msgid "Hamilton" msgstr "Hamilton" #: opening-dat.h:124 msgid "Lollipop" msgstr "Lollipop" #: opening-dat.h:134 msgid "Cow" msgstr "Cow" #: opening-dat.h:144 msgid "Chimney" msgstr "Chimney" #: opening-dat.h:154 msgid "Cow Bat, Bat, Cambridge" msgstr "Cow Bat, Bat, Cambridge" #: opening-dat.h:164 msgid "Bat (Piau Continuation 2)" msgstr "Bat (Piau Continuation 2)" #: opening-dat.h:174 msgid "Melnikov, Bat (Piau Continuation 1)" msgstr "Melnikov, Bat (Piau Continuation 1)" #: opening-dat.h:184 msgid "Bat (Kling Continuation)" msgstr "Bat (Kling Continuation)" #: opening-dat.h:194 msgid "Bat (Kling Alternative)" msgstr "Bat (Kling Alternative)" #: opening-dat.h:204 msgid "Rose-v-Toth" msgstr "Rose-v-Toth" #: opening-dat.h:214 msgid "Tanida" msgstr "Tanida" #: opening-dat.h:224 msgid "Aircraft, Feldborg" msgstr "Aircraft, Feldborg" #: opening-dat.h:234 msgid "Sailboat" msgstr "Sailboat" #: opening-dat.h:244 msgid "Maruoka" msgstr "Maruoka" #: opening-dat.h:254 msgid "Landau" msgstr "Landau" #: opening-dat.h:264 msgid "Buffalo, Kenichi Variation" msgstr "Buffalo, Kenichi Variation" #: opening-dat.h:274 msgid "Maruoka Buffalo" msgstr "Maruoka Buffalo" #: opening-dat.h:284 msgid "Tanida Buffalo" msgstr "Tanida Buffalo" #: opening-dat.h:294 msgid "Hokuriku Buffalo" msgstr "Hokuriku Buffalo" #: opening-dat.h:304 msgid "Wing Variation" msgstr "Wing Variation" #: opening-dat.h:314 msgid "Semi-Wing Variation" msgstr "Semi-Wing Variation" #: opening-dat.h:324 msgid "Parallel Opening" msgstr "Parallel Opening" #: opening-dat.h:334 msgid "Perpendicular Opening" msgstr "Perpendicular Opening" #: opening-dat.h:344 msgid "Mimura" msgstr "Mimura" #: opening-dat.h:354 msgid "Shaman, Danish" msgstr "Shaman, Danish" #: opening-dat.h:364 msgid "Inoue" msgstr "Inoue" #: opening-dat.h:374 msgid "IAGO" msgstr "IAGO" #: opening-dat.h:384 msgid "Bhagat" msgstr "Bhagat" #: opening-dat.h:394 msgid "Rose" msgstr "Rose" #: opening-dat.h:404 msgid "Flat" msgstr "Flat" #: opening-dat.h:414 msgid "Rotating Flat" msgstr "Rotating Flat" #: opening-dat.h:424 msgid "Murakami Variation" msgstr "Murakami Variation" #: opening-dat.h:434 msgid "Rotating Flat (Kling Continuation)" msgstr "Rotating Flat (Kling Continuation)" #: opening-dat.h:444 msgid "Rose-Birth" msgstr "Rose-Birth" #: opening-dat.h:454 msgid "Brightstein" msgstr "Brightstein" #: opening-dat.h:464 msgid "Rose-birdie, Rose-Tamenori" msgstr "Rose-birdie, Rose-Tamenori" #: opening-dat.h:474 msgid "Rose-Tamenori-Kling" msgstr "Rose-Tamenori-Kling" #: opening-dat.h:484 msgid "Greenberg, Dawg" msgstr "Greenberg, Dawg" #: opening-dat.h:494 msgid "Ralle" msgstr "Ralle" #: opening-dat.h:504 msgid "Horse" msgstr "Horse" #: opening-dat.h:514 msgid "No-Cat" msgstr "No-Cat" #: opening-dat.h:524 msgid "Swallow" msgstr "Swallow" #: opening-dat.h:534 msgid "No-Cat (Continuation)" msgstr "No-Cat (Continuation)" #: opening-dat.h:544 msgid "Italian" msgstr "Italian" #: opening-dat.h:554 msgid "Cat" msgstr "Cat" #: opening-dat.h:564 msgid "Sakaguchi" msgstr "Sakaguchi" #: opening-dat.h:574 msgid "Berner" msgstr "Berner" #: opening-dat.h:584 msgid "Ganglion" msgstr "Ganglion" #: opening-dat.h:594 msgid "Tiger" msgstr "Tiger" #: opening-dat.h:604 msgid "Stephenson" msgstr "Stephenson" #: opening-dat.h:614 msgid "No-Kung" msgstr "No-Kung" #: opening-dat.h:624 msgid "No-Kung (Continuation)" msgstr "No-Kung (Continuation)" #: opening-dat.h:634 msgid "COMP'OTH" msgstr "COMP’OTH" #: opening-dat.h:644 msgid "Kung" msgstr "Kung" #: opening-dat.h:654 msgid "Leader's Tiger" msgstr "Leader’s Tiger" #: opening-dat.h:664 msgid "Brightwell" msgstr "Brightwell" #: opening-dat.h:674 msgid "Ishii" msgstr "Ishii" #: opening-dat.h:684 msgid "Mainline Tiger" msgstr "Mainline Tiger" #: opening-dat.h:694 msgid "Rose-BILL" msgstr "Rose-BILL" #: opening-dat.h:704 msgid "Tamenori" msgstr "Tamenori" #: opening-dat.h:714 msgid "Aubrey, Tanaka" msgstr "Aubrey, Tanaka" #: randboard.cc:91 msgid "invalid number of pieces %$ in random_board" msgstr "invalid number of pieces %$ in random_board" grhino-0.16.1/po/en@boldquot.header0000644000175000017500000000247111436423225017375 0ustar lerdsuwalerdsuwa# All this catalog "translates" are quotation characters. # The msgids must be ASCII and therefore cannot contain real quotation # characters, only substitutes like grave accent (0x60), apostrophe (0x27) # and double quote (0x22). These substitutes look strange; see # http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html # # This catalog translates grave accent (0x60) and apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019). # It also translates pairs of apostrophe (0x27) to # left single quotation mark (U+2018) and right single quotation mark (U+2019) # and pairs of quotation mark (0x22) to # left double quotation mark (U+201C) and right double quotation mark (U+201D). # # When output to an UTF-8 terminal, the quotation characters appear perfectly. # When output to an ISO-8859-1 terminal, the single quotation marks are # transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to # grave/acute accent (by libiconv), and the double quotation marks are # transliterated to 0x22. # When output to an ASCII terminal, the single quotation marks are # transliterated to apostrophes, and the double quotation marks are # transliterated to 0x22. # # This catalog furthermore displays the text between the quotation marks in # bold face, assuming the VT100/XTerm escape sequences. # grhino-0.16.1/po/POTFILES0000644000175000017500000000174211436423225015117 0ustar lerdsuwalerdsuwa ../alphabeta.cc \ ../alphabeta.h \ ../binfile.cc \ ../binfile.h \ ../bitboard.cc \ ../bitboard.h \ ../board.cc \ ../board.h \ ../boardio.cc \ ../boardio.h \ ../book.cc \ ../book.h \ ../config.h \ ../dump_pattern.cc \ ../game.cc \ ../game.h \ ../gameinfo.cc \ ../gameinfo.h \ ../gen_book.cc \ ../gen_opening.cc \ ../gen_pattern.cc \ ../gen_table.cc \ ../gpref.cc \ ../gpref.h \ ../grhino.cc \ ../gtstream.h \ ../gtstream.cc \ ../hash.cc \ ../hash.h \ ../iter.cc \ ../iter.h \ ../log_proc.h \ ../opening.cc \ ../opening-dat.h \ ../opening.h \ ../order.cc \ ../order.h \ ../parity.cc \ ../parity.h \ ../pattern.cc \ ../pattern.h \ ../proginfo.cc \ ../proginfo.h \ ../rand.cc \ ../rand.h \ ../randboard.cc \ ../randboard.h \ ../table-dat.h \ ../test.cc grhino-0.16.1/gtp-rhino.cc0000644000175000017500000004643711436423224015560 0ustar lerdsuwalerdsuwa/* gtp-rhino.cc GRhino GTP Frontend Copyright (c) 2005, 2006, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "board.h" #include "hash.h" #include "alphabeta.h" #include "opening.h" #include "pattern.h" #include "parity.h" #include "book.h" #include "game.h" #include "randboard.h" #include "load.h" #include "rand.h" #include "boardio.h" #include "gtp.h" #include "gtstream.h" // Grab version number in VERSION variable #undef VERSION const char * #include "scripts/version" ; #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x const char *prog_name = "gtp-rhino"; const char *prog_ver = VERSION; int randomness; double komi; bool game_logged; bool is_log; unsigned main_time = 0; unsigned byo_yomi_time = 1; unsigned byo_yomi_stones = 0; bool use_byo_yomi = false; unsigned time_left_black; unsigned stone_left_black; unsigned time_left_white; unsigned stone_left_white; // Implementation status (GTP version 2 draft 2) // 2.1 done 2.2 done 2.3 done 2.4 done // 2.5 done 2.6 done 2.7 done 2.8 done // 2.9 done 2.10 done 2.11 N/A 2.12 done // 2.13 done 2.14 done // 3.1 done 3.2 done 3.3 done 3.4 done // 3.5 done 3.6 done // 4.1 N/A 4.2 4.3 done // 5.1 5.2 done 5.3 done // 6.1 done 6.2 6.3 void gtp_new_game(const byte_board_info *b = 0, int color = BLACK) { eval_new_game(); if (!b) new_game(cur_game_info); else new_game(cur_game_info, *b, color); time_player = 0; game_logged = false; use_byo_yomi = false; time_left_black = main_time; time_left_white = main_time; } void gtp_maybe_log_game() { if (!cur_game_info.is_game_play() && !game_logged) { game_logged = true; log_history("grhino.log", "player", "player"); } } typedef void (*gtp_func)(const std::string &, size_t i, bool has_id, unsigned id); struct gtp_command { const char *command; gtp_func func; }; extern gtp_command gtp_commands[]; void gtpfunc_protocol_version(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { output_response("2", has_id, id); } void gtpfunc_name(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { output_response("GTP GRhino", has_id, id); } void gtpfunc_version(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { output_response(VERSION, has_id, id); } void gtpfunc_known_command(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); if (i == str.size()) output_response("false", has_id, id); else { size_t j = skip_non_space(str, i); int k; for (k = 0 ; gtp_commands[k].command; ++k) { if (!str.compare(i, j-i, gtp_commands[k].command)) break; } if (gtp_commands[k].command) output_response("true", has_id, id); else output_response("false", has_id, id); } } void gtpfunc_list_commands(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { std::string output; for (int k = 0 ; gtp_commands[k].command; ++k) { if (k != 0) output += '\n'; output += gtp_commands[k].command; } output_response(output, has_id, id); } void gtpfunc_quit(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { output_response("", has_id, id); throw command_quit(); } void gtpfunc_boardsize(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); unsigned num; i = read_unsigned(str, i, num); throw_if_extra_argument(str, i); gtp_new_game(); if (num != 8) output_error("unacceptable size", has_id, id); else output_response("", has_id, id); } void gtpfunc_clear_board(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { gtp_new_game(); output_response("", has_id, id); } void gtpfunc_komi(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); i = read_float(str, i, komi); throw_if_extra_argument(str, i); output_response("", has_id, id); } void gtpfunc_play(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); int color; i = read_color(str, i, color); i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); int row, col, pos; size_t j = skip_non_space(str, i); if (j-i != 2) throw syntax_error(); if (str[i] >= 'A' && str[i] <= 'H') col = str[i] - 'A'; else if (str[i] >= 'a' && str[i] <= 'h') col = str[i] - 'a'; else throw syntax_error(); if (str[i+1] >= '1' && str[i+1] <= '8') row = str[i+1] - '1'; else throw syntax_error(); throw_if_extra_argument(str, j); pos = xy_to_pos(col, row); if (color == cur_game_info.get_player() && cur_game_info.board_ptr->can_play(color, pos)) { // FIXME: Handle time cur_game_info.place_piece(pos, time_player); time_player = 0; gtp_maybe_log_game(); output_response("", has_id, id); } else output_error("illegal move", has_id, id); } void gtpfunc_genmove(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); int color; i = read_color(str, i, color); if (cur_game_info.is_game_play() && color == cur_game_info.get_player()) { int pos = get_computer_move (komi); // FIXME: Handle time cur_game_info.place_piece(pos, time_player); time_player = 0; gtp_maybe_log_game(); std::string output; output += pos_to_x(pos) + 'A'; output += pos_to_y(pos) + '1'; output_response(output, has_id, id); } else output_response("pass", has_id, id); } void gtpfunc_reg_genmove(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); int color; i = read_color(str, i, color); if (cur_game_info.is_game_play() && color == cur_game_info.get_player()) { random_off(); int pos = get_computer_move (komi); random_on(); std::string output; output += pos_to_x(pos) + 'A'; output += pos_to_y(pos) + '1'; output_response(output, has_id, id); } else output_response("pass", has_id, id); } void gtpfunc_auto_play(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { while (cur_game_info.is_game_play()) { int pos = get_computer_move (komi); // FIXME: Handle time cur_game_info.place_piece(pos, time_player); } gtp_maybe_log_game(); output_response("", has_id, id); } void gtpfunc_time_settings(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); unsigned m, b, s; i = read_unsigned(str, i, m); i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); i = read_unsigned(str, i, b); i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); i = read_unsigned(str, i, s); throw_if_extra_argument(str, i); main_time = m; byo_yomi_time = b; byo_yomi_stones = s; use_byo_yomi = false; time_left_black = main_time; time_left_white = main_time; time_player = 0; output_response("", has_id, id); } void gtpfunc_time_left(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); int color; i = read_color(str, i, color); i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); unsigned t, s; i = read_unsigned(str, i, t); i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); i = read_unsigned(str, i, s); throw_if_extra_argument(str, i); if (color == BLACK) { time_left_black = t; stone_left_black = s; } else { time_left_white = t; stone_left_white = s; } time_player = 0; output_response("", has_id, id); } void gtpfunc_final_score(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { if (cur_game_info.is_game_play()) output_error("cannot score", has_id, id); else { int black_score = cur_game_info.board_ptr->board_black_score(); int white_score = cur_game_info.board_ptr->board_white_score(); switch (cur_game_info.get_game_result()) { case game_info::game_result_end: adjust_score(black_score, white_score); break; case game_info::game_result_timeout_black: black_score = 0; white_score = 64; break; case game_info::game_result_timeout_white: black_score = 64; white_score = 0; break; case game_info::game_result_resign_black: black_score = 0; white_score = 64; break; case game_info::game_result_resign_white: black_score = 64; white_score = 0; break; } std::ostringstream os; double diff_score = black_score - white_score - komi; if (diff_score > 0) os << "B+" << diff_score; else if (diff_score < 0) os << "W+" << (-diff_score); else os << '0'; output_response(os.str(), has_id, id); } } void gtpfunc_showboard(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { std::ostringstream os; if (cur_game_info.is_game_play()) { os << "Next move: "; if (cur_game_info.get_player() == BLACK) os << "Black"; else os << "White"; } else { switch (cur_game_info.get_game_result()) { case game_info::game_result_end: os << "Game ended"; break; case game_info::game_result_timeout_black: os << "Black ran out of time"; break; case game_info::game_result_timeout_white: os << "White ran out of time"; break; case game_info::game_result_resign_black: os << "Black resigned"; break; case game_info::game_result_resign_white: os << "White resigned"; break; } } os << '\n'; print_board(os, cur_game_info.board_ptr, 2); output_response(os.str(), has_id, id); } void gtpfunc_undo(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { if (cur_game_info.is_undoable()) { cur_game_info.undo(); game_logged = false; output_response("", has_id, id); } else output_error("cannot undo", has_id, id); } void gtpfunc_set_game(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); size_t j = skip_non_space(str, i); if (!str.compare(i, j-i, "Othello")) output_response("", has_id, id); else output_error("unsupported game", has_id, id); } void gtpfunc_list_games(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { output_response("Othello", has_id, id); } void gtpfunc_setup_board(const std::string &str, size_t i, bool has_id, unsigned id) { i = skip_space(str, i); throw_syntax_error_if_end_of_line(str, i); size_t j = skip_non_space(str, i); if (j-i != 64) throw syntax_error(); j = skip_space(str, j); int color = BLACK; if (j != str.size()) { // Optional player with first move size_t jj = skip_non_space(str, j); throw_if_extra_argument(str, jj); if (jj-j == 1) { switch (str[j]) { case 'O': case 'o': case '0': case 'W': case 'w': color = WHITE; break; case '@': case '*': case 'X': case 'x': case 'B': case 'b': // Default is already black break; default: throw syntax_error(); } } else read_color(str, j, color); } byte_board_type t; int num_pieces = 0; for (int k = 0; k < 64; ++k) { piece_type p; switch (str[i+k]) { case '_': case '-': case '.': p = EMPTY; break; case 'O': case 'o': case '0': p = WHITE; num_pieces++; break; case '@': case '*': case 'X': case 'x': p = BLACK; num_pieces++; break; default: throw syntax_error(); } t[k] = p; } if (num_pieces < 4) throw syntax_error(); byte_board_info b(&t); gtp_new_game(&b, color); output_response("", has_id, id); } void gtpfunc_show_history(const std::string &/*str*/, size_t /*i*/, bool has_id, unsigned id) { std::string output; for (int i = 0; i < cur_game_info.num_history-1; ++i) { int pos = cur_game_info.move_history[i]; if (i != 0) { output += ' '; if (cur_game_info.player_history[i-1] == cur_game_info.player_history[i]) output += "pass "; } else { if (cur_game_info.first_play_is_pass) output += "pass "; } output += pos_to_x(pos) + 'A'; output += pos_to_y(pos) + '1'; } output_response(output, has_id, id); } gtp_command gtp_commands[] = { { "protocol_version", gtpfunc_protocol_version }, { "name", gtpfunc_name }, { "version", gtpfunc_version }, { "known_command", gtpfunc_known_command }, { "list_commands", gtpfunc_list_commands }, { "quit", gtpfunc_quit }, { "boardsize", gtpfunc_boardsize }, { "clear_board", gtpfunc_clear_board }, { "komi", gtpfunc_komi }, // Not supported: fixed_handicap, // place_free_handicap, // set_free_handicap { "play", gtpfunc_play }, { "genmove", gtpfunc_genmove }, { "undo", gtpfunc_undo }, // Not supported: // final_status_list, load_sgf { "time_settings", gtpfunc_time_settings }, { "time_left", gtpfunc_time_left }, { "final_score", gtpfunc_final_score }, { "showboard", gtpfunc_showboard }, { "reg_genmove", gtpfunc_reg_genmove }, // Othello extension { "set_game", gtpfunc_set_game }, { "list_games", gtpfunc_list_games }, // GTP-Rhino extension { "grhino-auto_play", gtpfunc_auto_play }, { "grhino-setup_board", gtpfunc_setup_board }, { "grhino-show_history", gtpfunc_show_history }, { 0, 0 } }; void gtp_process_loop() { std::string str; bool has_id; unsigned id; size_t i; for ( ; ; ) { try { input_line(str); i = parse_id(str, has_id, id); i = skip_space(str, i); throw_command_error_if_end_of_line(str, i); size_t j = skip_non_space(str, i); int k; for (k = 0; gtp_commands[k].command; ++k) { if (!str.compare(i, j-i, gtp_commands[k].command)) { gtp_commands[k].func(str, j, has_id, id); break; } } if (!gtp_commands[k].command) throw command_error(); } catch (id_error &) { output_error("unknown command", false, 0); } catch (command_error &) { output_error("unknown command", has_id, id); } catch (syntax_error &) { output_error("syntax error", has_id, id); } catch (command_quit &) { return; } catch (io_error &) { return; } } } void set_level(int level) { computer_level = level; current_level_info.midgame_depth = level_info[computer_level].midgame_depth; current_level_info.num_empty_winlossdraw = level_info[computer_level].num_empty_winlossdraw; current_level_info.num_empty_exact = level_info[computer_level].num_empty_exact; set_midgame_depth(current_level_info.midgame_depth); } void init() { trans_table_init(); set_max_hash_move(57); pattern_table_init(); book_init(); srand(time(NULL)); set_level(1); // Default level // Default parameters randomness = 0; set_eval_random(randomness); opening_var = 2; set_book_random(opening_var); log_move = false; redo_ai_move = true; start_game_mode = START_GAME_INITIAL; is_log = false; } int main_real(int argc, char *argv[]) { // Need to parse parameter if (argc > 1) { for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; unsigned u; if (arg == "-h" || arg == "--help") { std::cout << prog_name << ' ' << prog_ver << _(" - GTP Frontend for Rhino\n"); std::cout << _("(c) 2005, 2006, 2010 Kriang Lerdsuwanakij\n\n"); gtout(std::cout, _("Usage: %$ [options]\n")) << prog_name; std::cout << _("Available options:\n"); std::cout << _(" -b N, --book=N Use open book variation N. Allowed = 0..5 (means None..Very high).\n"); std::cout << _(" Default = 2 (means Low)\n"); std::cout << _(" -e N, --end=N Use perfect end game search depth N instead of default value for\n"); std::cout << _(" level. Allowed = 1..20.\n"); std::cout << _(" -h, --help Display this help\n"); std::cout << _(" -l N, --level=N Use AI level N. Allowed = 1..5. Default = 3\n"); std::cout << _(" --log Log game to ~/grhino.log\n"); std::cout << _(" -m N, --mid=N Use mid game search depth N instead of default value for level.\n"); std::cout << _(" Allowed = 1..20\n"); std::cout << _(" -r N, --rand=N Use randomness N in AI evaluator. Allowed = 0..10. Default = 0\n"); std::cout << _(" -v, --version Display version number\n"); std::cout << _(" -w N, --win=N Use winning move search depth N instead of default value for level.\n"); std::cout << _(" Allowed = 1..20\n\n"); return 0; } else if (arg == "-v" || arg == "--version") { std::cout << prog_name << ' ' << prog_ver << '\n'; return 0; } else if (process_unsigned_option(argc, argv, arg, i, "-l", "--level", 1, 5, u)) { set_level(u - 1); } else if (process_unsigned_option(argc, argv, arg, i, "-m", "--mid", 1, 20, u)) { current_level_info.midgame_depth = u; set_midgame_depth(current_level_info.midgame_depth); } else if (process_unsigned_option(argc, argv, arg, i, "-e", "--end", 1, 20, u)) { current_level_info.num_empty_exact = u; if (current_level_info.num_empty_winlossdraw < static_cast(u)) current_level_info.num_empty_winlossdraw = u; } else if (process_unsigned_option(argc, argv, arg, i, "-w", "--win", 1, 20, u)) { current_level_info.num_empty_winlossdraw = u; if (current_level_info.num_empty_exact > static_cast(u)) current_level_info.num_empty_exact = u; } else if (process_unsigned_option(argc, argv, arg, i, "-r", "--rand", 0, 10, u)) { randomness = u; set_eval_random(randomness); } else if (process_unsigned_option(argc, argv, arg, i, "-b", "--book", 0, 5, u)) { opening_var = u; set_book_random(opening_var); } else if (arg == "--log") is_log = true; else { gtstream bufstr; gtout(bufstr, _("unknown option `%$\'")) << arg; throw std::runtime_error(bufstr.str()); } } } try { gtp_new_game(); gtp_process_loop(); } catch (...) { } return 0; } int main(int argc, char *argv[]) { try { init(); return main_real(argc, argv); } catch (std::exception &e) { std::cout << std::flush; gtout(std::cerr, _("%$: %$\n")) << prog_name << e.what(); } catch (const char *s) { std::cout << std::flush; gtout(std::cerr, _("%$: exception %$\n")) << prog_name << s; } catch (...) { std::cout << std::flush; gtout(std::cerr, _("%$: unknown exception\n")) << prog_name; } return 1; } grhino-0.16.1/order.h0000644000175000017500000000223311436423225014611 0ustar lerdsuwalerdsuwa/* order.h Move Ordering Copyright (c) 2000, 2001 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef ORDER_H #define ORDER_H #include "board.h" enum { A1 = 0, B1, C1, D1, E1, F1, G1, H1, A2, B2, C2, D2, E2, F2, G2, H2, A3, B3, C3, D3, E3, F3, G3, H3, A4, B4, C4, D4, E4, F4, G4, H4, A5, B5, C5, D5, E5, F5, G5, H5, A6, B6, C6, D6, E6, F6, G6, H6, A7, B7, C7, D7, E7, F7, G7, H7, A8, B8, C8, D8, E8, F8, G8, H8 }; extern int endgame_order[NUM_MOVE]; #endif /* ORDER_H */ grhino-0.16.1/right.xcf0000644000175000017500000000455711436423225015157 0ustar lerdsuwalerdsuwagimp xcf file@BB/ gimp-commentCreated with The GIMP(@ New Layer     H@h@ l P(@ Background     @ K W c@   ' 3 ? P(grhino-0.16.1/ggamewin.cc0000644000175000017500000002243511436423224015437 0ustar lerdsuwalerdsuwa/* ggamewin.cc GRhino Gnome Frontend Game Library Window Copyright (c) 2005, 2010 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* #define GNOME_DISABLE_DEPRECATED #define GTK_DISABLE_DEPRECATED */ #include "config.h" #include #include #include #include #include "board.h" #include "game.h" #include "gutil.h" #include "ggamewin.h" #ifdef _ #undef _ #endif #ifdef N_ #undef N_ #endif #include #define _(x) gettext(x) #define N_(x) x /************************************************************************* File menu - Open *************************************************************************/ int gamelib_width, gamelib_height, gamelib_x, gamelib_y; int gamelib_win_count; std::map gamelib_map; struct gamelib_resource { std::string file; GtkWidget *win; GtkWidget *tree_view; GtkListStore *list_store; std::vector *vec; gamelib_resource(const char *f) : file(f), win(0), tree_view(0), list_store(0), vec(0) {} }; void game_library_fill(gamelib_resource *res) { char buf1[20], buf2[20], buf3[50]; char *buf2ptr, *buf3ptr; GtkTreeIter iter; for (size_t i = 0; i != res->vec->size(); ++i) { snprintf(buf1, 20, "%zd", i+1); if (res->vec->operator[](i).random) { snprintf(buf2, 20, _("Rand %d"), res->vec->operator[](i).board.get_num_move() + 4); buf2ptr = buf2; } else buf2ptr = _("Std"); if (res->vec->operator[](i).resign) { if (res->vec->operator[](i).black_score < res->vec->operator[](i).white_score) buf3ptr = _("Black resigned"); else buf3ptr = _("White resigned"); } else if (res->vec->operator[](i).timeout) { if (res->vec->operator[](i).black_score < res->vec->operator[](i).white_score) buf3ptr = _("Black timeout"); else buf3ptr = _("White timeout"); } else { if (res->vec->operator[](i).format == game_log::format_IOS) { if (res->vec->operator[](i).black_score < res->vec->operator[](i).white_score) snprintf(buf3, 50, _("White won %d-%d"), res->vec->operator[](i).white_score, res->vec->operator[](i).black_score); else snprintf(buf3, 50, _("Black won %d-%d"), res->vec->operator[](i).black_score, res->vec->operator[](i).white_score); buf3ptr = buf3; } else { if (res->vec->operator[](i).black_score < res->vec->operator[](i).white_score) snprintf(buf3, 50, _("White won by %d"), res->vec->operator[](i).white_score - res->vec->operator[](i).black_score); else snprintf(buf3, 50, _("Black won by %d"), res->vec->operator[](i).black_score - res->vec->operator[](i).white_score); buf3ptr = buf3; } } gtk_list_store_append(res->list_store, &iter); gtk_list_store_set(res->list_store, &iter, 0, i, 1, buf1, 2, res->vec->operator[](i).black_name.c_str(), 3, res->vec->operator[](i).white_name.c_str(), 4, buf2ptr, 5, buf3ptr, -1); } } void game_library_update(update_state_type /*u*/, void *d) { gamelib_resource *res = (gamelib_resource *)d; GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(res->tree_view)); gtk_tree_selection_unselect_all(selection); } gint game_library_configure_event(GtkWidget *widget, GdkEventConfigure *e, gpointer /*data*/) { // Only update size/position preference if // one window is opened if (gamelib_win_count == 1) { gtk_window_get_position(GTK_WINDOW(widget), &gamelib_x, &gamelib_y); gamelib_width = e->width; gamelib_height = e->height; } return FALSE; // Propagate signal to child so that it // can resize itself } void game_library_closed(GtkWidget *widget, gamelib_resource *res) { update_game_list.remove(game_library_update, res); gtk_widget_destroy(widget); gamelib_map.erase(res->file); delete res->vec; g_object_unref(res->list_store); delete res; gamelib_win_count--; } void game_library_selected(GtkTreeSelection *selection, gamelib_resource *res) { GtkTreeIter iter; GtkTreeModel *model; if (gtk_tree_selection_get_selected(selection, &model, &iter)) { int pos; gtk_tree_model_get(model, &iter, 0, &pos, -1); update_game_list.update_except(UPDATE_ALL, game_library_update, res); load_game(res->vec->operator[](pos)); } } bool game_library_opened(const char *f) { std::string ff = f; if (gamelib_map.find(ff) != gamelib_map.end()) return true; else return false; } void game_library(std::vector *v, const char *f) { std::string ff = f; // Popup window if file already opened // Note: v can be 0 in this case if (gamelib_map.find(ff) != gamelib_map.end()) { gtk_window_present(GTK_WINDOW(gamelib_map[ff])); delete v; return; } gamelib_win_count++; std::string title = _("Game List - "); title += f; GtkWidget *gamelib = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(gamelib), title.c_str()); gtk_container_set_border_width(GTK_CONTAINER(gamelib), 5); GtkListStore *list_store_gamelib = gtk_list_store_new( 6, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); GtkWidget *tree_view_gamelib = gtk_tree_view_new_with_model(GTK_TREE_MODEL(list_store_gamelib)); // Keep information for resource release // when window is closed gamelib_resource *res = new gamelib_resource(f); res->vec = v; res->win = gamelib; res->list_store = list_store_gamelib; res->tree_view = tree_view_gamelib; // Remember that this file is opened gamelib_map[ff] = gamelib; g_signal_connect(G_OBJECT(gamelib), "destroy", G_CALLBACK(game_library_closed), res); g_signal_connect(G_OBJECT(gamelib), "configure_event", G_CALLBACK(game_library_configure_event), NULL); GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); if (gamelib_x != -1 && gamelib_y != -1 && gamelib_win_count == 1) gtk_window_move(GTK_WINDOW(gamelib), gamelib_x, gamelib_y); gtk_window_set_default_size(GTK_WINDOW(gamelib), gamelib_width, gamelib_height); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_ETCHED_IN); gtk_container_add(GTK_CONTAINER(gamelib), scroll); GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL); // Right aligned GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes( _("No"), renderer, "text", 1, NULL); gtk_tree_view_column_set_sort_column_id(column, 0); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view_gamelib), column); column = gtk_tree_view_column_new_with_attributes( _("Black"), gtk_cell_renderer_text_new(), "text", 2, NULL); gtk_tree_view_column_set_sort_column_id(column, 2); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view_gamelib), column); column = gtk_tree_view_column_new_with_attributes( _("White"), gtk_cell_renderer_text_new(), "text", 3, NULL); gtk_tree_view_column_set_sort_column_id(column, 3); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view_gamelib), column); column = gtk_tree_view_column_new_with_attributes( _("Type"), gtk_cell_renderer_text_new(), "text", 4, NULL); gtk_tree_view_column_set_sort_column_id(column, 4); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view_gamelib), column); column = gtk_tree_view_column_new_with_attributes( _("Result"), gtk_cell_renderer_text_new(), "text", 5, NULL); gtk_tree_view_column_set_sort_column_id(column, 5); gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view_gamelib), column); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view_gamelib), TRUE); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree_view_gamelib), TRUE); GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view_gamelib)); gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(game_library_selected), res); gtk_container_add(GTK_CONTAINER(scroll), tree_view_gamelib); game_library_fill(res); gtk_widget_show_all(gamelib); GtkTreePath *path = gtk_tree_path_new(); gtk_tree_path_append_index(path, 0); gtk_tree_selection_select_path(selection, path); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree_view_gamelib), path, NULL, FALSE, 0, 0); gtk_tree_view_set_cursor(GTK_TREE_VIEW(tree_view_gamelib), path, NULL, FALSE); gtk_tree_path_free(path); update_game_list.update(UPDATE_ALL); update_game_list.add(game_library_update, res); } grhino-0.16.1/opening.h0000644000175000017500000000277711436423225015152 0ustar lerdsuwalerdsuwa/* opening.h Opening database Copyright (c) 2001, 2002 Kriang Lerdsuwanakij email: lerdsuwa@users.sourceforge.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef OPENING_H #define OPENING_H #include #include "config.h" #include "board.h" struct opening_info { const char * name; int next_player; byte_board_type board; size_t num_move_sequence; const char * move_sequence; }; int get_num_opening(); const char *get_opening_name(int id); int get_opening_id(const char *s); int get_opening_player(int id); int get_opening_player(const char *s); int get_opening_num_move(int id); int get_opening_num_move(const char *s); const byte_board_type *get_opening_board(int id); const byte_board_type *get_opening_board(const char *s); void get_opening_move_sequence(int id, std::deque &d); void get_opening_move_sequence(const char *s, std::deque &d); #endif /* OPENING_H */