From fc7acd419251c67bdecca22a6cc75fe88e3d1d13 Mon Sep 17 00:00:00 2001 From: evannmarrel Date: Thu, 11 May 2023 18:00:11 +0200 Subject: [PATCH 1/6] image treatment improvment, so fucking good with hexadokus --- grid_processing/.idea/workspace.xml | 82 +++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 grid_processing/.idea/workspace.xml diff --git a/grid_processing/.idea/workspace.xml b/grid_processing/.idea/workspace.xml new file mode 100644 index 000000000..1d873df03 --- /dev/null +++ b/grid_processing/.idea/workspace.xml @@ -0,0 +1,82 @@ + + + + + { + "useNewFormat": true +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + "keyToString": { + "RunOnceActivity.OpenProjectViewOnStart": "true", + "RunOnceActivity.ShowReadmeOnStart": "true", + "RunOnceActivity.cidr.known.project.marker": "true", + "WebServerToolWindowFactoryState": "false", + "cf.first.check.clang-format": "false", + "cidr.known.project.marker": "true", + "node.js.detected.package.eslint": "true", + "node.js.detected.package.tslint": "true", + "node.js.selected.package.eslint": "(autodetect)", + "node.js.selected.package.tslint": "(autodetect)", + "vue.rearranger.settings.migration": "true" + } +} + + + + + 1679751829686 + + + + + + \ No newline at end of file From 7bc1ea0dde19cdfe59eb030dd684a9bdeec9806d Mon Sep 17 00:00:00 2001 From: evannmarrel Date: Thu, 11 May 2023 18:06:52 +0200 Subject: [PATCH 2/6] I love mum --- .idea/.gitignore | 3 - game/.idea/.gitignore | 8 + game/.idea/misc.xml | 18 + game/Makefile | 18 + game/main | Bin 0 -> 27008 bytes game/main.c | 320 ++++++++ game/sudo.glade | 1693 +++++++++++++++++++++++++++++++++++++++++ game/sudo.glade~ | 1689 ++++++++++++++++++++++++++++++++++++++++ 8 files changed, 3746 insertions(+), 3 deletions(-) delete mode 100644 .idea/.gitignore create mode 100644 game/.idea/.gitignore create mode 100644 game/.idea/misc.xml create mode 100644 game/Makefile create mode 100755 game/main create mode 100644 game/main.c create mode 100644 game/sudo.glade create mode 100644 game/sudo.glade~ diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 26d33521a..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml diff --git a/game/.idea/.gitignore b/game/.idea/.gitignore new file mode 100644 index 000000000..13566b81b --- /dev/null +++ b/game/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/game/.idea/misc.xml b/game/.idea/misc.xml new file mode 100644 index 000000000..53624c9e1 --- /dev/null +++ b/game/.idea/misc.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/game/Makefile b/game/Makefile new file mode 100644 index 000000000..7caafa08f --- /dev/null +++ b/game/Makefile @@ -0,0 +1,18 @@ +# Makefile + +CC = gcc +CFLAGS = `pkg-config --cflags gtk+-3.0` -Wall -O3 +LDLIBS = `pkg-config --libs gtk+-3.0` + +EXE = main + +all: $(EXE) + +$(foreach f, $(EXE), $(eval $(f):)) + +.PHONY: clean + +clean: + ${RM} $(EXE) + +# END \ No newline at end of file diff --git a/game/main b/game/main new file mode 100755 index 0000000000000000000000000000000000000000..f9ea29ef31317cbf755360e09fed2600c756ef54 GIT binary patch literal 27008 zcmeHQeRNdSwZF*(4Tv*Ap^X}4&_O{ZCJ2-ekxWS7jvXKhL9F0pn3<3%LnhAL5wO-q zGg0S-QGBme+hr?l-|J&(`yQ>K|{dm$TN)K6{`2an3%UcTeugcN)D5ii?UAnQY4C3Sk51b4r~k==F;XK%FvMITha% zm2;GnfR`{DFR$YOr9AB|&WELfZUZE_a>^8d6`ZU{C~HWNGF~E~B5;x$MMX~f zLUOY2EDW8=aS4rb%wC<~H^Dll6h0BqC`Z0o;pK8GR_4R)qTPE0lyc-Ql4}!kZ9+~$ zr|_qQ(w|gE`pg#k%+QH4N>28zC}z18Le2~u1iyr2gVNG>wcy`luSv)`-CU0u-p|R3 zgwo!XkR!kRtx0sda+R=W)el=myCp0V1}=$&SI?SpNhCNe5^hgyn6_c|tZB1mRK}x~ z(-{ZVi)>K0FI?QLpj�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 InNa0_0TcKw5C8xG literal 0 HcmV?d00001 diff --git a/game/main.c b/game/main.c new file mode 100644 index 000000000..6d5a7cbac --- /dev/null +++ b/game/main.c @@ -0,0 +1,320 @@ +#include +#include +#include + +gulong timer_id; +gint64 start_time; + +int isValidSudoku(int sudoku[9][9]) { + int usedRow[9][9] = { }; + int usedColumn[9][9] = { }; + int usedBox[3][3][9] = { }; + + for (int row = 0; row < 9; row++) { + for (int col = 0; col < 9; col++) { + int digit = sudoku[row][col]; + if (digit != 0) { + if (usedRow[row][digit - 1] || usedColumn[col][digit - 1] || usedBox[row / 3][col / 3][digit - 1]) { + return 0; // Duplicate digit found + } + + usedRow[row][digit - 1] = 1; + usedColumn[col][digit - 1] = 1; + usedBox[row / 3][col / 3][digit - 1] = 1; + } + } + } + + return 1; // Grid is valid +} + +int isSafe(int sudoku[9][9], int row, int col, int num) { + // Check row + for (int i = 0; i < 9; i++) { + if (sudoku[row][i] == num) { + return 0; + } + } + + // Check column + for (int i = 0; i < 9; i++) { + if (sudoku[i][col] == num) { + return 0; + } + } + + // Check box + int startRow = (row / 3) * 3; + int startCol = (col / 3) * 3; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 3; j++) { + if (sudoku[startRow + i][startCol + j] == num) { + return 0; + } + } + } + + return 1; +} + +int solveSudoku(int sudoku[9][9]) { + for (int row = 0; row < 9; row++) { + for (int col = 0; col < 9; col++) { + if (sudoku[row][col] == 0) { + for (int num = 1; num <= 9; num++) { + if (isSafe(sudoku, row, col, num)) { + sudoku[row][col] = num; + + if (solveSudoku(sudoku)) { + return 1; + } + + sudoku[row][col] = 0; + } + } + return 0; + } + } + } + return 1; +} + +void generate_sudoku(int sudoku[9][9]) { + // Seed the random number generator + srand(time(NULL)); + + // Initialize the sudoku grid with zeros + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + sudoku[i][j] = 0; + } + } + + // Generate the complete sudoku grid + while(!solveSudoku(sudoku)); + + // Remove some digits to create a playable sudoku + for (int i = 0; i < 9; i++) { + for (int j = 0; j < 9; j++) { + // Randomly remove digits + if (rand() % 2 == 0 || rand() % 2 == 0) { + sudoku[i][j] = 0; + } + } + } +} + +// Function to update the label text with the elapsed time +gboolean updateElapsedTime(GtkLabel* label) { + gint64 current_time = g_get_monotonic_time(); + gint64 elapsed_time = current_time - start_time; + + // Convert the elapsed time to seconds + gint64 elapsed_seconds = elapsed_time / G_USEC_PER_SEC; + + // Calculate minutes and seconds + gint minutes = elapsed_seconds / 60; + gint seconds = elapsed_seconds % 60; + + gchar *elapsed_string = g_strdup_printf("%02d : %02d", minutes, seconds); + gtk_label_set_text(label, elapsed_string); + g_free(elapsed_string); + + // Continue updating the elapsed time + return G_SOURCE_CONTINUE; +} + +void clear_board(GtkBuilder* builder) +{ + for (int i = 0; i < 9; i++) + { + for (int j = 0; j < 9; j++) + { + gchar *buffer = g_strdup_printf("%i%i", i, j); + GtkEntry* entry = GTK_ENTRY(gtk_builder_get_object(builder, buffer)); + if (gtk_widget_get_sensitive(GTK_WIDGET(entry))) + gtk_entry_set_text(entry, ""); + } + } +} + +void on_play(GtkButton* button, gpointer user_data) +{ + // Gets the builder. + GtkBuilder* builder = (GtkBuilder*) user_data; + GtkLabel* label = (GtkLabel*) gtk_builder_get_object(builder, "time"); + GtkButton* play_button = (GtkButton*) gtk_builder_get_object(builder, "play_button"); + + if (timer_id == 0) + { + start_time = g_get_monotonic_time(); + updateElapsedTime(label); + + // Start the timer to update the elapsed time every second + timer_id = g_timeout_add_seconds(1, (GSourceFunc)updateElapsedTime, label); + + gtk_button_set_label(play_button, "Stop"); + } + else + { + g_source_remove(timer_id); + timer_id = 0; + + clear_board(builder); + gtk_label_set_text(label, "00 : 00"); + gtk_button_set_label(play_button, "Play"); + } +} + +void on_clear(GtkButton* button, gpointer user_data) +{ + GtkBuilder* builder = (GtkBuilder*) user_data; + clear_board(builder); +} + +void printAndDisappear(const gchar *text, const gchar *color, GtkLabel* label) +{ + gtk_label_set_text(GTK_LABEL(label), text); + + gtk_widget_show(GTK_WIDGET(label)); + g_timeout_add_seconds(5, (GSourceFunc)gtk_widget_hide, label); +} + +void on_validate(GtkButton* button, gpointer user_data) +{ + GtkBuilder* builder = (GtkBuilder*) user_data; + + int sudoku[9][9] = {}; + + for (int i = 0; i < 9; i++) + { + for (int j = 0; j < 9; j++) + { + // Gets entry. + gchar *buffer = g_strdup_printf("%i%i", i, j); + GtkEntry *entry = GTK_ENTRY(gtk_builder_get_object(builder, buffer)); + const gchar *text = gtk_entry_get_text(entry); + char charValue = *text; + int intValue = charValue - '0'; + sudoku[i][j] = intValue; + } + } + + GtkLabel* result_label = (GtkLabel*) gtk_builder_get_object(builder, "result_label"); + + if (isValidSudoku(sudoku)) + { + printAndDisappear("Success!", "#32A852", result_label); + } + else + { + printAndDisappear("You failed!", "#A84432", result_label); + } +} + +void on_new(GtkButton* button, gpointer user_data) +{ + GtkBuilder* builder = (GtkBuilder*) user_data; + + if (timer_id != 0) + { + g_source_remove(timer_id); + timer_id = 0; + + clear_board(builder); + GtkButton* play_button = (GtkButton*) gtk_builder_get_object(builder, "play_button"); + GtkLabel* label = (GtkLabel*) gtk_builder_get_object(builder, "time"); + gtk_label_set_text(label, "00 : 00"); + gtk_button_set_label(play_button, "Play"); + } + + int sudoku[9][9] = {}; + generate_sudoku(sudoku); + + // Set not editable cases. + for (int i = 0; i < 9; i++) + { + for (int j = 0; j < 9; j++) + { + // Gets entry. + gchar *buffer = g_strdup_printf("%i%i", i, j); + GtkEntry* entry = GTK_ENTRY(gtk_builder_get_object(builder, buffer)); + + // Avoid empty cells. + if (sudoku[i][j] != 0) + { + gchar *value = g_strdup_printf("%i", sudoku[i][j]); + gtk_widget_set_sensitive(GTK_WIDGET(entry), FALSE); + gtk_entry_set_text(entry, value); + + // Apply CSS style to make the text bold and set label color + const char *css = "* { font-weight: bold; color: red; }"; + GtkCssProvider *provider = gtk_css_provider_new(); + gtk_css_provider_load_from_data(provider, css, -1, NULL); + GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(entry)); + gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER); + } + else + { + gtk_widget_set_sensitive(GTK_WIDGET(entry), TRUE); + gtk_entry_set_text(entry, ""); + + const char *css = "* { font-weight: bold; color: inherit; }"; + GtkCssProvider *provider = gtk_css_provider_new(); + gtk_css_provider_load_from_data(provider, css, -1, NULL); + GtkStyleContext *context = gtk_widget_get_style_context(GTK_WIDGET(entry)); + gtk_style_context_add_provider(context, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER); + + } + + gtk_entry_set_alignment(entry, 0.5); + gtk_entry_set_max_length(entry, 1); + + } + } +} + +// Main function. +int main (int argc, char *argv[]) +{ + // Initializes GTK. + gtk_init(NULL, NULL); + + // Loads the UI description and build the UI. Exits if an error occurs. + GtkBuilder* builder = gtk_builder_new(); + GError* error = NULL; + if (gtk_builder_add_from_file(builder, "sudo.glade", &error) == 0) + { + g_printerr("Error loading file: %s\n", error->message); + g_clear_error(&error); + return 1; + } + + // Widgets. + GtkWindow* window = GTK_WINDOW(gtk_builder_get_object(builder, "main_window")); + GtkButton* play_button = GTK_BUTTON(gtk_builder_get_object(builder, "play_button")); + GtkButton* clear_button = GTK_BUTTON(gtk_builder_get_object(builder, "clear_button")); + GtkButton* new_button = GTK_BUTTON(gtk_builder_get_object(builder, "new_button")); + GtkButton* validate_button = GTK_BUTTON(gtk_builder_get_object(builder, "validate_button")); + + // Connects signal. + g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); + g_signal_connect(play_button, "clicked", G_CALLBACK(on_play), builder); + g_signal_connect(clear_button, "clicked", G_CALLBACK(on_clear), builder); + g_signal_connect(new_button, "clicked", G_CALLBACK(on_new), builder); + g_signal_connect(validate_button, "clicked", G_CALLBACK(on_validate), builder); + + // Generates a new grid. + on_new(new_button, builder); + + // Runs the main loop. + gtk_main(); + + // Clean up resources + g_source_remove(timer_id); + + // Exits. + return 0; + +} diff --git a/game/sudo.glade b/game/sudo.glade new file mode 100644 index 000000000..1cef7bbf6 --- /dev/null +++ b/game/sudo.glade @@ -0,0 +1,1693 @@ + + + + + + True + False + center + 960 + 718 + center + + + + True + False + + + True + False + end + 50 + 20 + vertical + bottom + + + True + False + 20 + 20 + 20 + 20 + + + False + True + 0 + + + + + True + False + 5 + 5 + Time elapsed + + + False + True + 1 + + + + + True + False + 10 + 10 + 00 : 00 + + + False + True + 2 + + + + + True + False + + + False + True + 3 + + + + + Play + True + True + True + 20 + 20 + 20 + 5 + + + False + True + 4 + + + + + Validate + True + True + True + 20 + 20 + 5 + 5 + + + False + True + 5 + + + + + Clear Board + True + True + True + 20 + 20 + 5 + 5 + + + False + True + 6 + + + + + New Puzzle + True + True + True + 20 + 20 + 5 + 20 + + + False + True + 7 + + + + + 1 + 0 + + + + + + True + False + center + center + 50 + 50 + 20 + 20 + 5 + 5 + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + number + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + number + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 2 + + + + + 0 + 0 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 2 + + + + + 1 + 0 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 2 + 0 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 0 + 1 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 1 + 1 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 2 + 1 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 0 + 2 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 1 + 2 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 2 + 2 + + + + + 0 + 0 + + + + + + diff --git a/game/sudo.glade~ b/game/sudo.glade~ new file mode 100644 index 000000000..12bff98b9 --- /dev/null +++ b/game/sudo.glade~ @@ -0,0 +1,1689 @@ + + + + + + True + False + center + 960 + 718 + center + + + + True + False + + + True + False + end + 50 + 20 + vertical + bottom + + + True + False + + + False + True + 0 + + + + + True + False + 5 + 5 + Time elapsed + + + False + True + 1 + + + + + True + False + 10 + 10 + 00 : 00 + + + False + True + 2 + + + + + True + False + + + False + True + 3 + + + + + Play + True + True + True + 20 + 20 + 20 + 5 + + + False + True + 4 + + + + + Validate + True + True + True + 20 + 20 + 5 + 5 + + + False + True + 5 + + + + + Clear Board + True + True + True + 20 + 20 + 5 + 5 + + + False + True + 6 + + + + + New Puzzle + True + True + True + 20 + 20 + 5 + 20 + + + False + True + 7 + + + + + 1 + 0 + + + + + + True + False + center + center + 50 + 50 + 20 + 20 + 5 + 5 + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + number + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + number + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 2 + + + + + 0 + 0 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 2 + + + + + 1 + 0 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 2 + 0 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 0 + 1 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 1 + 1 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 2 + 1 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 0 + 2 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 1 + 2 + + + + + + True + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 2 + 2 + + + + + 0 + 0 + + + + + + From 55516bf28579d4bb34d383bfc32bacd46b9c125f Mon Sep 17 00:00:00 2001 From: evannmarrel Date: Fri, 12 May 2023 07:32:16 +0200 Subject: [PATCH 3/6] I love dad --- grid_processing/.idea/.gitignore | 8 ++ grid_processing/.idea/grid_processing.iml | 8 ++ grid_processing/.idea/modules.xml | 8 ++ grid_processing/.idea/vcs.xml | 6 + grid_processing/.idea/workspace.xml | 15 ++- grid_processing/contour_manager.c | 130 ++++++++++++++++++++-- grid_processing/contour_manager.h | 14 +++ grid_processing/grid.png | Bin 17822 -> 0 bytes grid_processing/grid_detection.c | 75 +++++++++---- grid_processing/grid_detection.h | 9 +- grid_processing/hex.jpg | Bin 0 -> 59854 bytes grid_processing/hough_transform.c | 3 +- grid_processing/img/black_grid.png | Bin 42486 -> 0 bytes grid_processing/img/grid_test1.png | Bin 14747 -> 0 bytes grid_processing/img_upgrade.c | 15 ++- grid_processing/img_upgrade.h | 2 +- grid_processing/main.c | 13 +-- grid_processing/sudoku_grid.png | Bin 51693 -> 0 bytes 18 files changed, 249 insertions(+), 57 deletions(-) create mode 100644 grid_processing/.idea/.gitignore create mode 100644 grid_processing/.idea/grid_processing.iml create mode 100644 grid_processing/.idea/modules.xml create mode 100644 grid_processing/.idea/vcs.xml delete mode 100644 grid_processing/grid.png create mode 100644 grid_processing/hex.jpg delete mode 100644 grid_processing/img/black_grid.png delete mode 100644 grid_processing/img/grid_test1.png delete mode 100644 grid_processing/sudoku_grid.png diff --git a/grid_processing/.idea/.gitignore b/grid_processing/.idea/.gitignore new file mode 100644 index 000000000..13566b81b --- /dev/null +++ b/grid_processing/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/grid_processing/.idea/grid_processing.iml b/grid_processing/.idea/grid_processing.iml new file mode 100644 index 000000000..bc2cd8740 --- /dev/null +++ b/grid_processing/.idea/grid_processing.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/grid_processing/.idea/modules.xml b/grid_processing/.idea/modules.xml new file mode 100644 index 000000000..c6a5942e0 --- /dev/null +++ b/grid_processing/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/grid_processing/.idea/vcs.xml b/grid_processing/.idea/vcs.xml new file mode 100644 index 000000000..6c0b86358 --- /dev/null +++ b/grid_processing/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/grid_processing/.idea/workspace.xml b/grid_processing/.idea/workspace.xml index 1d873df03..7ae98682d 100644 --- a/grid_processing/.idea/workspace.xml +++ b/grid_processing/.idea/workspace.xml @@ -15,7 +15,17 @@ - + + + + + + + + + + + diff --git a/grid_processing/contour_manager.c b/grid_processing/contour_manager.c index 84dea3918..327b5b979 100644 --- a/grid_processing/contour_manager.c +++ b/grid_processing/contour_manager.c @@ -1,5 +1,4 @@ #include "contour_manager.h" -#include /// @brief Gets the polygon area from a set of points. /// @@ -233,7 +232,7 @@ void get_points_max_shape(int width, int height, int *pixels, struct list** save /// @param dest_x Destination set of the x coordinates of the points. /// @param dest_y Destination set of the x coordinates of the points. /// @param size Size of arrays -void find_corners_of_rectangle(double* arr_x, double* arr_y, double *dest_x, double *dest_y, double size) +void find_corners_of_rectangle2(double* arr_x, double* arr_y, double *dest_x, double *dest_y, double size) { // Inits the corners. double top_left_x = 0; @@ -327,6 +326,67 @@ void find_corners_of_rectangle(double* arr_x, double* arr_y, double *dest_x, dou dest_y[3] = bottom_left_y; } +void find_corners_of_rectangle(double* arr_x, double* arr_y, double* dest_x, double* dest_y, double size) { + + // Find the index of the closest point to the top-left corner of the image + int top_left_index = 0; + double min_distance = arr_x[0] + arr_y[0]; + + for (int i = 1; i < size; i++) { + double distance = arr_x[i] + arr_y[i]; + if (distance < min_distance) { + min_distance = distance; + top_left_index = i; + } + } + + // Find the index of the closest point to the top-right corner of the image + int top_right_index = 0; + min_distance = -arr_x[0] + arr_y[0]; + + for (int i = 1; i < size; i++) { + double distance = -arr_x[i] + arr_y[i]; + if (distance < min_distance) { + min_distance = distance; + top_right_index = i; + } + } + + // Find the index of the closest point to the bottom-right corner of the image + int bottom_right_index = 0; + min_distance = -arr_x[0] - arr_y[0]; + + for (int i = 1; i < size; i++) { + double distance = -arr_x[i] - arr_y[i]; + if (distance < min_distance) { + min_distance = distance; + bottom_right_index = i; + } + } + + // Find the index of the closest point to the bottom-left corner of the image + int bottom_left_index = 0; + min_distance = arr_x[0] - arr_y[0]; + + for (int i = 1; i < size; i++) { + double distance = arr_x[i] - arr_y[i]; + if (distance < min_distance) { + min_distance = distance; + bottom_left_index = i; + } + } + + // Assign the corner coordinates to the dest_x and dest_y arrays + dest_x[0] = arr_x[top_left_index]; + dest_y[0] = arr_y[top_left_index]; + dest_x[1] = arr_x[top_right_index]; + dest_y[1] = arr_y[top_right_index]; + dest_x[2] = arr_x[bottom_right_index]; + dest_y[2] = arr_y[bottom_right_index]; + dest_x[3] = arr_x[bottom_left_index]; + dest_y[3] = arr_y[bottom_left_index]; +} + // tmp @@ -402,11 +462,63 @@ void TMP_extremes_lines_and_cell_extraction(SDL_Surface* surf, double corners_x[ list_destroy(coordinates_x); } +double calculate_area(Point p1, Point p2, Point p3, Point p4) { + double area = 0.5 * fabs(p1.x * p2.y - p2.x * p1.y + + p2.x * p3.y - p3.x * p2.y + + p3.x * p4.y - p4.x * p3.y + + p4.x * p1.y - p1.x * p4.y); + return area; +} + +void find_largest_shape(Point arr[], int size, Point* largest_points) { + double max_area = 0.0; + + for (int i = 0; i < size - 3; i++) { + for (int j = i + 1; j < size - 2; j++) { + for (int k = j + 1; k < size - 1; k++) { + for (int l = k + 1; l < size; l++) { + + double curr_area = calculate_area(arr[i], arr[j], arr[k], arr[l]); + + if (curr_area > max_area) { + max_area = curr_area; + largest_points[0] = arr[i]; + largest_points[1] = arr[j]; + largest_points[2] = arr[k]; + largest_points[3] = arr[l]; + } + } + } + } + } +} + +void four_points(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size) { + // Create an array of Points from the input coordinates + Point arr[size]; + for (int i = 0; i < size; i++) + { + arr[i].x = arr_x[i]; + arr[i].y = arr_y[i]; + } + + // Find the four points forming the largest shape + Point largest_points[4]; // = {{1, 2}, {1, 2}, {1, 2}, {1, 2}}; + find_largest_shape(arr, size, largest_points); + + // Copy the largest points' coordinates to the destination arrays + for (int i = 0; i < 4; i++) + { + dest_x[i] = largest_points[i].x; + dest_y[i] = largest_points[i].y; + } +} + // // // // -void four_points(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size) +void four_points2(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size) { // Compute the convex hull using the Graham scan algorithm // and store the result in the arr_x and arr_y arrays @@ -492,7 +604,8 @@ void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y // Gets parameters of surface. int width = surf->w; int height = surf->h; - int arr_pixels[width * height]; + int *arr_pixels = calloc(width * height, sizeof(int)); + get_array_of_pixels(surf, arr_pixels); // double diag = sqrt(width * width + height * height); @@ -522,10 +635,10 @@ void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y /* for (int i = 0; i < 4; i++) { - printf("%f,%f\n", dest_x[i], dest_y[i]); + printf("%f,%f\n", corners_x[i], corners_y[i]); } - */ - /* + + struct list* point_x = list_new(); struct list* point_y = list_new(); point_x = list_insert_head(point_x, dest_x[0]); @@ -539,7 +652,7 @@ void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y draw_points_on_window(point_x, point_y, surf); */ // TMP - Cell extraction - TMP_extremes_lines_and_cell_extraction(surf, corners_x, corners_y); + // TMP_extremes_lines_and_cell_extraction(surf, corners_x, corners_y); // DEBUG /* @@ -557,6 +670,7 @@ void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y */ // Frees memory. + free(arr_pixels); list_destroy(shape_point_x); list_destroy(shape_point_y); } \ No newline at end of file diff --git a/grid_processing/contour_manager.h b/grid_processing/contour_manager.h index 323d42da5..6195f0098 100644 --- a/grid_processing/contour_manager.h +++ b/grid_processing/contour_manager.h @@ -21,15 +21,29 @@ #define ANSI_COLOR_RESET "\x1b[0m" // ======================== +#include +#include + +typedef struct { + double x; + double y; +} Point; + void convex_hull(struct list* point_x, struct list* point_y, struct list** dest_x, struct list** dest_y); double get_polygon_area(struct list* point_x, struct list* point_y); void get_points_max_shape(int width, int height, int *pixels, struct list** save_point_x, struct list** save_point_y); + +void find_corners_of_rectangle2(double* arr_x, double* arr_y, double *dest_x, double *dest_y, double size); void find_corners_of_rectangle(double* arr_x, double* arr_y, double *dest_x, double *dest_y, double size); // tmp void TMP_extremes_lines_and_cell_extraction(SDL_Surface* surf, double corners_x[], double corners_y[]); +double calculate_area(Point p1, Point p2, Point p3, Point p4); +void find_largest_shape(Point arr[], int size, Point* largest_points); void four_points(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size); + +void four_points2(double arr_x[], double arr_y[], double dest_x[], double dest_y[], int size); void get_max_points_rect(SDL_Surface* surf, double *corners_x, double *corners_y); diff --git a/grid_processing/grid.png b/grid_processing/grid.png deleted file mode 100644 index db9f01b189ce41269c40ec05ff435afb99a459da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17822 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 diff --git a/grid_processing/grid_detection.c b/grid_processing/grid_detection.c index b7c1c1da4..be131e7e8 100644 --- a/grid_processing/grid_detection.c +++ b/grid_processing/grid_detection.c @@ -291,22 +291,22 @@ void get_intersections(double w, double h, double diag, struct list* list_rho, /// @param width Width of surface. /// @param height Height of surface. /// @return nothing. -void get_good_points(struct list* point_x, struct list* point_y, struct list** dest_x, struct list** dest_y, double width, double height) +void get_good_points(struct list* point_x, struct list* point_y, struct list** dest_x, struct list** dest_y, double width, double height, int NB_CELLS) { - double hypo_width_cell = width / 9; - double hypo_height_cell = height / 9; + double hypo_width_cell = width / NB_CELLS; + double hypo_height_cell = height / NB_CELLS; double threshold = hypo_width_cell / 3; - double hypo_grid_x[9]; - double hypo_grid_y[9]; + double hypo_grid_x[NB_CELLS]; + double hypo_grid_y[NB_CELLS]; - for (int j = 0; j < 9; j++) + for (int j = 0; j < NB_CELLS; j++) { hypo_grid_x[j] = j * hypo_width_cell; } - for (int i = 0; i < 9; i++) + for (int i = 0; i < NB_CELLS; i++) { hypo_grid_y[i] = i * hypo_height_cell; } @@ -316,9 +316,9 @@ void get_good_points(struct list* point_x, struct list* point_y, struct list** d double *real_grid_x = list_to_array(point_x); double *real_grid_y = list_to_array(point_y); - for (int y = 0; y < 9; y++) + for (int y = 0; y < NB_CELLS; y++) { - for (int x = 0; x < 9; x++) + for (int x = 0; x < NB_CELLS; x++) { double hypo_x = hypo_grid_x[x]; double hypo_y = hypo_grid_y[y]; @@ -347,38 +347,65 @@ void get_good_points(struct list* point_x, struct list* point_y, struct list** d } } +/// @brief Convert small squared surface to a 24x24 pixels surface +/// +/// \param surf The surface to convert. +/// \param dst_width The width of the destination image. +/// \param dst_height The height of the destination image. +/// \return The resized surface. +SDL_Surface *convert_surface(SDL_Surface* surf, int dst_width, int dst_height) +{ + // Removes the contours on the image. + //SDL_Surface* surf_contour = SDL_CreateRGBSurfaceWithFormat(0, surf->w, surf->h, 32, SDL_PIXELFORMAT_RGBA32); + //upgrade_exploitation(surf, &surf_contour); + + // Resizes image to a new surface. + SDL_Surface* resized_surf = SDL_CreateRGBSurfaceWithFormat(0, dst_width, dst_height, 32, SDL_PIXELFORMAT_RGBA32); + SDL_BlitScaled(surf, NULL, resized_surf, NULL); + //SDL_FreeSurface(surf_contour); + + // Returns a new created surface. + return resized_surf; +} + /// @brief Extracts cells and put them in files. /// /// @param list_x List of x coordinates (81 x coordinates). /// @param list_y List of y coordinates (81 y coordinates). /// @param surf Initial surface. /// @return nothing. -void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf) +void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf, int NB_CELLS) { - double width = surf->w / 9; - double height = surf->h / 9; + double width = surf->w / NB_CELLS; + double height = surf->h / NB_CELLS; double *arr_x = list_to_array(list_x); double *arr_y = list_to_array(list_y); - for (int y = 0; y < 9; y++) + for (int y = 0; y < NB_CELLS; y++) { - for (int x = 0; x < 9; x++) + for (int x = 0; x < NB_CELLS; x++) { SDL_Rect rect; rect.h = height; rect.w = width; - rect.x = arr_x[x + 9 * y]; - rect.y = arr_y[x + 9 * y]; + rect.x = arr_x[x + NB_CELLS * y]; + rect.y = arr_y[x + NB_CELLS * y]; + + SDL_Surface* square = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_RGBA32); + SDL_BlitSurface(surf, &rect, square, NULL); - SDL_Surface* new_surf = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_RGBA32); - SDL_BlitSurface(surf, &rect, new_surf, NULL); + // RESIZE IMAGES TO 24X24 AND REMOVES CONTOURS + // ========================================== + SDL_Surface* resized_square = convert_surface(square, 24, 24); + // =========================================== char filepath[100]; - snprintf(filepath, sizeof(filepath), "img/%i_%i.png", 8 - y, 8 - x); - // IMG_SavePNG(new_surf, filepath); + snprintf(filepath, sizeof(filepath), "img/%i_%i.png", (NB_CELLS - 1) - y, (NB_CELLS - 1) - x); + IMG_SavePNG(resized_square, filepath); - SDL_FreeSurface(new_surf); + SDL_FreeSurface(square); + SDL_FreeSurface(resized_square); } } } @@ -389,7 +416,7 @@ void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf /// @param list_theta Initial list of thetas. /// @param surf_sudoku Surface from the image /// @return nothing. -void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku) +void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku, int NB_CELLS) { // Parameters. double width = surf_sudoku->w; @@ -416,13 +443,13 @@ void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* // ========================================== struct list* final_grid_x = list_new(); struct list* final_grid_y = list_new(); - get_good_points(list_point_x, list_point_y, &final_grid_x, &final_grid_y, width, height); + get_good_points(list_point_x, list_point_y, &final_grid_x, &final_grid_y, width, height, NB_CELLS); // ========================================== // EXTRACTS CELLS - THE END // ========================================== - cell_extraction(final_grid_x, final_grid_y, surf_sudoku); + cell_extraction(final_grid_x, final_grid_y, surf_sudoku, NB_CELLS); // ========================================== diff --git a/grid_processing/grid_detection.h b/grid_processing/grid_detection.h index 643eaf3ca..8613fc3b6 100644 --- a/grid_processing/grid_detection.h +++ b/grid_processing/grid_detection.h @@ -3,6 +3,7 @@ // Files. // ===== +#include "img_upgrade.h" #include "doubles_lists.h" #include "basic_utilities.h" #include "SDL_utilities.h" @@ -20,9 +21,9 @@ void point_intersection(double surf_diag, double rho1,double theta1, double rho2, double theta2, double* x, double* y); void get_intersections(double w, double h, double diag, struct list* list_rho, struct list* list_theta, struct list** list_point_x, struct list** list_point_y); -void get_good_points(struct list* point_x, struct list* point_y, - struct list** dest_x, struct list** dest_y, double width, double height); -void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf); -void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku); +void get_good_points(struct list* point_x, struct list* point_y, struct list** dest_x, struct list** dest_y, double width, double height, int NB_CELLS); +SDL_Surface *convert_surface(SDL_Surface* surf, int dst_width, int dst_height); +void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf, int NB_CELLS); +void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku, int NB_CELLS); #endif \ No newline at end of file diff --git a/grid_processing/hex.jpg b/grid_processing/hex.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9bf75eb67f0dbc32c2d08b9ccab4d089153a69a GIT binary patch literal 59854 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 A+yDRo literal 0 HcmV?d00001 diff --git a/grid_processing/hough_transform.c b/grid_processing/hough_transform.c index ec634b2e3..4f76d054e 100644 --- a/grid_processing/hough_transform.c +++ b/grid_processing/hough_transform.c @@ -17,7 +17,7 @@ void hough_transform(SDL_Surface* surf, struct list** list_theta, struct list** // Initializes a new matrix of bits (0 or 1). // And gets array of 0 and 1 from a surface. - int pixel_array[width * height]; + int *pixel_array = calloc(width * height, sizeof(int)); // Gets the array of pixels from the surface. get_array_of_pixels(surf, pixel_array); @@ -115,4 +115,5 @@ void hough_transform(SDL_Surface* surf, struct list** list_theta, struct list** // Frees memory. free(accumulator); + free(pixel_array); } \ No newline at end of file diff --git a/grid_processing/img/black_grid.png b/grid_processing/img/black_grid.png deleted file mode 100644 index 089757875a07cd455a9d1aefdb96c5af22c22dbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42486 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 V+`Nn%pJxL;X2zCAMTUr|{{u`+O>_VN diff --git a/grid_processing/img/grid_test1.png b/grid_processing/img/grid_test1.png deleted file mode 100644 index b3e9e719586d553be3403c7517e91ecab7ed51e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14747 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 diff --git a/grid_processing/img_upgrade.c b/grid_processing/img_upgrade.c index cf6346e80..89d745e2b 100644 --- a/grid_processing/img_upgrade.c +++ b/grid_processing/img_upgrade.c @@ -154,7 +154,7 @@ int fill_top(int width, int height, int* pixels) // // // -int fill_bottom(int width, int height, int* pixels) +void fill_bottom(int width, int height, int* pixels) { // Inits constants. int min_zone = width / 3; @@ -164,8 +164,6 @@ int fill_bottom(int width, int height, int* pixels) // Saves the last line that has been detected. int last_line = height - 1; - int cpt = 0; - // For only the third part. for (int i = height - 1; i > 2 * height / 3; i--) { @@ -187,8 +185,8 @@ int fill_bottom(int width, int height, int* pixels) { for (int j_tmp = 0; j_tmp < width; j_tmp++) { + // printf("%i, %i, %i\n", j_tmp + width * i_tmp, width, height * width); pixels[j_tmp + width * i_tmp] = 0; - cpt++; } } @@ -196,11 +194,8 @@ int fill_bottom(int width, int height, int* pixels) last_line = i; } } - - return cpt; } - // Main function to upgrade image. // // surf: initial surface. @@ -211,7 +206,9 @@ void upgrade_exploitation(SDL_Surface* surf, SDL_Surface** dest) // Init. int width = surf->w; int height = surf->h; - int pixels[width * height]; + int* pixels = malloc(width * height * sizeof(int)); + if (pixels == NULL) + return; // Converts surface into array. get_array_of_pixels(surf, pixels); @@ -233,4 +230,6 @@ void upgrade_exploitation(SDL_Surface* surf, SDL_Surface** dest) // Saves surface. *dest = array_to_surface(width, height, pixels); + + free(pixels); } \ No newline at end of file diff --git a/grid_processing/img_upgrade.h b/grid_processing/img_upgrade.h index 32b34a9af..a953871cd 100644 --- a/grid_processing/img_upgrade.h +++ b/grid_processing/img_upgrade.h @@ -23,7 +23,7 @@ int fill_left(int width, int height, int* pixels); int fill_right(int width, int height, int* pixels); int fill_top(int width, int height, int* pixels); -int fill_bottom(int width, int height, int* pixels); +void fill_bottom(int width, int height, int* pixels); void upgrade_exploitation(SDL_Surface* surf, SDL_Surface** dest); #endif \ No newline at end of file diff --git a/grid_processing/main.c b/grid_processing/main.c index 2a2e931c5..40de9a421 100644 --- a/grid_processing/main.c +++ b/grid_processing/main.c @@ -11,11 +11,11 @@ int main(int argc, char** argv) if (argc != 2) errx(EXIT_FAILURE, "Usage: image-path"); - // INIT - GET IMAGE // ==================================================== // Creates a new surface from the image in parameter. SDL_Surface* surf_img = load_image(argv[1]); + // Checks if there is any error with the image. if (surf_img == NULL) errx(EXIT_FAILURE, "%s", SDL_GetError()); @@ -25,7 +25,6 @@ int main(int argc, char** argv) SDL_FreeSurface(surf_img); // ==================================================== - // UPGRADE IMAGE - REMOVE PARASITES // ==================================================== SDL_Surface* surf = SDL_CreateRGBSurfaceWithFormat(0, surf_wait->w, surf_wait->h, 32, SDL_PIXELFORMAT_RGBA32); @@ -46,11 +45,9 @@ int main(int argc, char** argv) double corners_x[4]; double corners_y[4]; // Gets the coordinates of the four corners of sudoku. - get_max_points_rect(surf_wait, corners_x, corners_y); - // ==================================================== + get_max_points_rect(surf, corners_x, corners_y); - // tmp - return 0; + // ==================================================== // ROTATION AND NEW SQUARED SURFACE WITH ONLY SUDOKU // ONLY FOR ORIENTED SUDOKU @@ -60,7 +57,6 @@ int main(int argc, char** argv) // .. // ==================================================== - // HOUGH TRANSFORM - LINES DETECTION // ==================================================== struct list* list_rho = list_new(); @@ -69,10 +65,9 @@ int main(int argc, char** argv) hough_transform(surf, &list_theta, &list_rho, 2.1); // ==================================================== - // MAXIMUM DETECTION - MATRIX PERSPECTIVE TRANSFORM - CELLS EXTRACTION // ==================================================== - grid_detection(list_rho, list_theta, surf); + grid_detection(list_rho, list_theta, surf, 16); // ==================================================== diff --git a/grid_processing/sudoku_grid.png b/grid_processing/sudoku_grid.png deleted file mode 100644 index 1304449b3f7d3d8a0f011537dfe7ebadf2c6361c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51693 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 Date: Fri, 12 May 2023 08:24:57 +0200 Subject: [PATCH 4/6] mine gross filou --- grid_processing/.idea/workspace.xml | 8 ++------ grid_processing/grid_detection.c | 17 +++++++++-------- grid_processing/grid_detection.h | 4 ++-- grid_processing/main.c | 13 +++++++++++-- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/grid_processing/.idea/workspace.xml b/grid_processing/.idea/workspace.xml index 7ae98682d..fcdb70123 100644 --- a/grid_processing/.idea/workspace.xml +++ b/grid_processing/.idea/workspace.xml @@ -16,14 +16,9 @@ - - + - - - - diff --git a/grid_processing/grid_detection.c b/grid_processing/grid_detection.c index be131e7e8..a79508272 100644 --- a/grid_processing/grid_detection.c +++ b/grid_processing/grid_detection.c @@ -374,7 +374,7 @@ SDL_Surface *convert_surface(SDL_Surface* surf, int dst_width, int dst_height) /// @param list_y List of y coordinates (81 y coordinates). /// @param surf Initial surface. /// @return nothing. -void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf, int NB_CELLS) +void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf, int NB_CELLS, SDL_Surface** ocr_eleven) { double width = surf->w / NB_CELLS; double height = surf->h / NB_CELLS; @@ -400,11 +400,13 @@ void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf SDL_Surface* resized_square = convert_surface(square, 24, 24); // =========================================== - char filepath[100]; - snprintf(filepath, sizeof(filepath), "img/%i_%i.png", (NB_CELLS - 1) - y, (NB_CELLS - 1) - x); - IMG_SavePNG(resized_square, filepath); + // char filepath[100]; + // snprintf(filepath, sizeof(filepath), "img/%i_%i.png", (NB_CELLS - 1) - y, (NB_CELLS - 1) - x); + // IMG_SavePNG(resized_square, filepath); - SDL_FreeSurface(square); + ocr_eleven[NB_CELLS * ((NB_CELLS - 1) - y) + ((NB_CELLS - 1) - x)] = resized_square; + + // SDL_FreeSurface(square); SDL_FreeSurface(resized_square); } } @@ -416,7 +418,7 @@ void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf /// @param list_theta Initial list of thetas. /// @param surf_sudoku Surface from the image /// @return nothing. -void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku, int NB_CELLS) +void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku, int NB_CELLS, SDL_Surface** ocr_eleven) { // Parameters. double width = surf_sudoku->w; @@ -449,10 +451,9 @@ void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* // EXTRACTS CELLS - THE END // ========================================== - cell_extraction(final_grid_x, final_grid_y, surf_sudoku, NB_CELLS); + cell_extraction(final_grid_x, final_grid_y, surf_sudoku, NB_CELLS, ocr_eleven); // ========================================== - // Frees memory. list_destroy(list_rho_av); list_destroy(list_theta_av); diff --git a/grid_processing/grid_detection.h b/grid_processing/grid_detection.h index 8613fc3b6..069e8dc4e 100644 --- a/grid_processing/grid_detection.h +++ b/grid_processing/grid_detection.h @@ -23,7 +23,7 @@ void get_intersections(double w, double h, double diag, struct list* list_rho, struct list* list_theta, struct list** list_point_x, struct list** list_point_y); void get_good_points(struct list* point_x, struct list* point_y, struct list** dest_x, struct list** dest_y, double width, double height, int NB_CELLS); SDL_Surface *convert_surface(SDL_Surface* surf, int dst_width, int dst_height); -void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf, int NB_CELLS); -void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku, int NB_CELLS); +void cell_extraction(struct list* list_x, struct list* list_y, SDL_Surface* surf, int NB_CELLS, SDL_Surface** ocr_eleven); +void grid_detection(struct list* list_rho, struct list* list_theta, SDL_Surface* surf_sudoku, int NB_CELLS, SDL_Surface** ocr_eleven); #endif \ No newline at end of file diff --git a/grid_processing/main.c b/grid_processing/main.c index 40de9a421..794e95ec7 100644 --- a/grid_processing/main.c +++ b/grid_processing/main.c @@ -67,15 +67,24 @@ int main(int argc, char** argv) // MAXIMUM DETECTION - MATRIX PERSPECTIVE TRANSFORM - CELLS EXTRACTION // ==================================================== - grid_detection(list_rho, list_theta, surf, 16); + int NB_CELLS = 9; + SDL_Surface** ocr_eleven = calloc(NB_CELLS * NB_CELLS, sizeof(SDL_Surface*)); + grid_detection(list_rho, list_theta, surf, NB_CELLS, ocr_eleven); // ==================================================== - // Frees memory. SDL_FreeSurface(surf); list_destroy(list_rho); list_destroy(list_theta); + for (int i = 0; i < NB_CELLS * NB_CELLS; i++) + { + // printf("%p\n", ocr_eleven[i]); + SDL_FreeSurface(ocr_eleven[i]); + } + + free(ocr_eleven); + // End. return EXIT_SUCCESS; } \ No newline at end of file From ed98bf089022356a1a3e61936dbf02bb75f8a770 Mon Sep 17 00:00:00 2001 From: evannmarrel Date: Fri, 12 May 2023 09:32:08 +0200 Subject: [PATCH 5/6] EVANNN --- {grid_processing => game}/.idea/vcs.xml | 0 grid_processing/.idea/.gitignore | 8 -- grid_processing/.idea/grid_processing.iml | 8 -- grid_processing/.idea/modules.xml | 8 -- grid_processing/.idea/workspace.xml | 89 ----------------------- 5 files changed, 113 deletions(-) rename {grid_processing => game}/.idea/vcs.xml (100%) delete mode 100644 grid_processing/.idea/.gitignore delete mode 100644 grid_processing/.idea/grid_processing.iml delete mode 100644 grid_processing/.idea/modules.xml delete mode 100644 grid_processing/.idea/workspace.xml diff --git a/grid_processing/.idea/vcs.xml b/game/.idea/vcs.xml similarity index 100% rename from grid_processing/.idea/vcs.xml rename to game/.idea/vcs.xml diff --git a/grid_processing/.idea/.gitignore b/grid_processing/.idea/.gitignore deleted file mode 100644 index 13566b81b..000000000 --- a/grid_processing/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/grid_processing/.idea/grid_processing.iml b/grid_processing/.idea/grid_processing.iml deleted file mode 100644 index bc2cd8740..000000000 --- a/grid_processing/.idea/grid_processing.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/grid_processing/.idea/modules.xml b/grid_processing/.idea/modules.xml deleted file mode 100644 index c6a5942e0..000000000 --- a/grid_processing/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/grid_processing/.idea/workspace.xml b/grid_processing/.idea/workspace.xml deleted file mode 100644 index fcdb70123..000000000 --- a/grid_processing/.idea/workspace.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - { - "useNewFormat": true -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { - "keyToString": { - "RunOnceActivity.OpenProjectViewOnStart": "true", - "RunOnceActivity.ShowReadmeOnStart": "true", - "RunOnceActivity.cidr.known.project.marker": "true", - "WebServerToolWindowFactoryState": "false", - "cf.first.check.clang-format": "false", - "cidr.known.project.marker": "true", - "node.js.detected.package.eslint": "true", - "node.js.detected.package.tslint": "true", - "node.js.selected.package.eslint": "(autodetect)", - "node.js.selected.package.tslint": "(autodetect)", - "vue.rearranger.settings.migration": "true" - } -} - - - - - 1679751829686 - - - - - - \ No newline at end of file From 5da0b89dd633b509cb63126473874266b8d8a15d Mon Sep 17 00:00:00 2001 From: evannmarrel Date: Fri, 12 May 2023 16:43:32 +0200 Subject: [PATCH 6/6] lol --- game/main.c | 11 +- game/sudo.glade | 7263 ++++++++++++++++++++++++++++++++++++--------- game/sudo.glade~ | 7267 +++++++++++++++++++++++++++++++++++++--------- 3 files changed, 11883 insertions(+), 2658 deletions(-) diff --git a/game/main.c b/game/main.c index 6d5a7cbac..2b9f75438 100644 --- a/game/main.c +++ b/game/main.c @@ -231,7 +231,11 @@ void on_new(GtkButton* button, gpointer user_data) int sudoku[9][9] = {}; generate_sudoku(sudoku); + upload_grid(sudoku, builder); +} +void upload_grid(int sudoku[9][9], GtkBuilder* builder) +{ // Set not editable cases. for (int i = 0; i < 9; i++) { @@ -272,7 +276,6 @@ void on_new(GtkButton* button, gpointer user_data) gtk_entry_set_max_length(entry, 1); } - } } // Main function. @@ -305,9 +308,13 @@ int main (int argc, char *argv[]) g_signal_connect(new_button, "clicked", G_CALLBACK(on_new), builder); g_signal_connect(validate_button, "clicked", G_CALLBACK(on_validate), builder); - // Generates a new grid. + // -- Generates a new grid. -- // on_new(new_button, builder); + // --- OR use an existing grid. --- // + // int sudoku[9][9]; + // upload_grid(sudoku, builder); + // Runs the main loop. gtk_main(); diff --git a/game/sudo.glade b/game/sudo.glade index 1cef7bbf6..97c884678 100644 --- a/game/sudo.glade +++ b/game/sudo.glade @@ -94,6 +94,23 @@ 4 + + + Hexadoku + True + True + True + 20 + 20 + 5 + 5 + + + False + True + 5 + + Validate @@ -108,7 +125,7 @@ False True - 5 + 6 @@ -125,7 +142,7 @@ False True - 6 + 8 @@ -142,7 +159,7 @@ False True - 7 + 9 @@ -152,37 +169,191 @@ - - + True False - center - center - 50 - 50 - 20 - 20 - 5 - 5 - + True False - 1 - 1 + center + center + 50 + 50 + 20 + 20 + 5 + 5 - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - number + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + number + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + number + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 2 + + 0 @@ -190,17 +361,174 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 2 + + 1 @@ -208,17 +536,170 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - number + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + 2 @@ -226,17 +707,165 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + 0 @@ -244,17 +873,165 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + 1 @@ -262,17 +1039,165 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + 2 @@ -280,258 +1205,801 @@ - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + 0 2 - - - 0 - 0 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 0 - 1 - - - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 0 2 - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + 2 2 - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 1 - 2 - - - 1 - 0 + page0 + page0 - - + + True False - 1 - 1 + center + center + 50 + 50 + 20 + 20 + 5 + 5 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 0 @@ -539,17 +2007,284 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 1 @@ -557,17 +2292,284 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 2 @@ -575,53 +2577,569 @@ - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 1 - 1 + 3 + 0 - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 0 @@ -629,165 +3147,1424 @@ - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 2 - 0 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 + 1 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 1 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 2 + 3 1 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 2 + 0 2 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 1 @@ -795,890 +4572,1720 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 0 + 2 2 - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 0 - 1 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 1 - 0 + 3 + 2 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 2 - 0 + 3 + 3 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 + 3 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 + 3 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 0 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 + 3 - 1 - 1 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 2 - 1 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 0 - 2 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 1 - 2 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 2 - 2 + page1 + page1 + 1 diff --git a/game/sudo.glade~ b/game/sudo.glade~ index 12bff98b9..97c884678 100644 --- a/game/sudo.glade~ +++ b/game/sudo.glade~ @@ -27,6 +27,10 @@ True False + 20 + 20 + 20 + 20 False @@ -90,6 +94,23 @@ 4 + + + Hexadoku + True + True + True + 20 + 20 + 5 + 5 + + + False + True + 5 + + Validate @@ -104,7 +125,7 @@ False True - 5 + 6 @@ -121,7 +142,7 @@ False True - 6 + 8 @@ -138,7 +159,7 @@ False True - 7 + 9 @@ -148,37 +169,191 @@ - - + True False - center - center - 50 - 50 - 20 - 20 - 5 - 5 - + True False - 1 - 1 + center + center + 50 + 50 + 20 + 20 + 5 + 5 - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - number + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + number + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + number + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 2 + + 0 @@ -186,17 +361,174 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 2 + + 1 @@ -204,17 +536,170 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - number + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + 2 @@ -222,17 +707,165 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + 0 @@ -240,17 +873,165 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + 1 @@ -258,17 +1039,165 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + 2 @@ -276,258 +1205,801 @@ - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + 0 2 - - - 0 - 0 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 0 - 1 - - - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 0 2 - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + 2 2 - - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 1 - 2 - - - 1 - 0 + page0 + page0 - - + + True False - 1 - 1 + center + center + 50 + 50 + 20 + 20 + 5 + 5 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 0 @@ -535,17 +2007,284 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 1 @@ -553,17 +2292,284 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 2 @@ -571,53 +2577,569 @@ - - 40 - 40 - True - True - center - center - 1 - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 1 - 1 + 3 + 0 - - 40 - 40 + + True - True - center - center - 1 - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 0 @@ -625,165 +3147,1424 @@ - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 2 - 0 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 + 1 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 1 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 2 + 3 1 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 2 + 0 2 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 1 @@ -791,890 +4572,1720 @@ - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 0 + 2 2 - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 0 - 1 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 1 - 0 + 3 + 2 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + - 2 - 0 + 3 + 3 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 + 3 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 + 3 - - 40 - 40 + + True - True - center - center - 1 - 1 - digits + False + 1 + 1 + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 0 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 1 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 2 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 0 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 1 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 2 + 3 + + + + + 40 + 40 + True + True + center + center + 1 + 1 + digits + + + 3 + 3 + + 0 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 + 3 - 1 - 1 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 2 - 1 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 0 - 2 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 1 - 2 - - - - - - True - False - 1 - 1 - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 2 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 2 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 1 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 0 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 1 - - - - - 40 - 40 - True - True - center - center - 1 - 1 - digits - - - 0 - 2 - - - - - 2 - 2 + page1 + page1 + 1