commit f9495cc42727e38f9d3ef0abd3d797fce0d7c3e4 Author: Alex Yatskov Date: Thu Oct 23 16:57:27 2014 +0900 Initial commit diff --git a/AppMeganekko.cpp b/AppMeganekko.cpp new file mode 100644 index 0000000..207abff --- /dev/null +++ b/AppMeganekko.cpp @@ -0,0 +1,37 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "AppMeganekko.h" +#include "FrameMeganekko.h" + +bool AppMeganekko::OnInit() +{ + srand(time(NULL)); + + wxInitAllImageHandlers(); + wxFileSystem::AddHandler(new wxInternetFSHandler()); + wxXmlResource::Get()->InitAllHandlers(); + void InitXmlResource(); + InitXmlResource(); + + const wxString filename = argc > 1 ? argv[1] : wxEmptyString; + FrameMeganekko* frame = new FrameMeganekko(filename); + frame->Show(true); + + return true; +} diff --git a/AppMeganekko.h b/AppMeganekko.h new file mode 100644 index 0000000..7169bec --- /dev/null +++ b/AppMeganekko.h @@ -0,0 +1,26 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +class AppMeganekko : public wxApp +{ +public: + virtual bool OnInit(); +}; + +IMPLEMENT_APP(AppMeganekko); diff --git a/Common.cpp b/Common.cpp new file mode 100644 index 0000000..a6394a3 --- /dev/null +++ b/Common.cpp @@ -0,0 +1,106 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "Common.h" + +std::string DeckTypeToString(DeckType type) +{ + switch (type) + { + case DECK_TYPE_EXPIRED: + return "expired"; + case DECK_TYPE_FAILED: + return "failed"; + case DECK_TYPE_PENDING: + return "pending"; + default: + return "untested"; + } +} + +DeckType StringToDeckType(const std::string& string) +{ + if (string == "expired") + { + return DECK_TYPE_EXPIRED; + } + else if (string == "failed") + { + return DECK_TYPE_FAILED; + } + else if (string == "pending") + { + return DECK_TYPE_PENDING; + } + return DECK_TYPE_UNTESTED; +} + +std::wstring TimeToString(time_t time) +{ + char* const string = ctime(&time); + + for (char* iter = string; *iter != 0; ++iter) + { + switch (*iter) + { + case 0x0d: + case 0x0a: + *iter = 0; + } + } + + return utf8toWStr(string); +} + +std::wstring TimeToStringRel(time_t timeValue, time_t timeNow) +{ + if (timeNow == 0) + { + timeNow = time(NULL); + } + + static const char* s_suffixes[] = { "ago", "from now" }; + + const time_t timeDelta = std::max(timeValue, timeNow) - std::min(timeValue, timeNow); + const char* suffix = s_suffixes[timeValue > timeNow]; + char buffer[256] = {0}; + + const int days = timeDelta / 86400; + const int hours = (timeDelta % 86400) / 3600; + const int minutes = (timeDelta % 3600) / 60; + const int seconds = timeDelta % 60; + + if (days > 0) + { + sprintf(buffer, "%d day(s) %s", days, suffix); + } + else if (hours > 0) + { + sprintf(buffer, "%d hour(s) %s", hours, suffix); + } + else if (minutes > 0) + { + sprintf(buffer, "%d minute(s) %s", minutes, suffix); + } + else + { + sprintf(buffer, "%d second(s) %s", seconds, suffix); + } + + return utf8toWStr(buffer); +} diff --git a/Common.h b/Common.h new file mode 100644 index 0000000..f0aa564 --- /dev/null +++ b/Common.h @@ -0,0 +1,63 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#define ASSERT assert +#define IS_TRUE(x) ((x) ? true : false) +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) +#define BIT(x) (1 << (x)) +#define SECONDS_TO_DAYS(seconds) (seconds / 86400) +#define DAYS_TO_SECONDS(days) (days * 86400) + +enum DeckType +{ + DECK_TYPE_EXPIRED, + DECK_TYPE_FAILED, + DECK_TYPE_UNTESTED, + DECK_TYPE_PENDING, + DECK_TYPES +}; + +enum DeckSortType +{ + DECK_SORT_TYPE_TIME_ADDED, + DECK_SORT_TYPE_TIME_REVIEW_PREVIOUS, + DECK_SORT_TYPE_TIME_REVIEW_NEXT, + DECK_SORT_TYPE_DECK, + DECK_SORT_TYPE_ENABLED, + DECK_SORT_TYPE_QUESTION, + DECK_SORT_TYPE_ANSWER, + DECK_SORT_TYPE_COUNT_REMEMBERED, + DECK_SORT_TYPE_COUNT_FORGOTTEN, + DECK_SORT_TYPE_COUNT_BUNGLED, + DECK_SORT_TYPE_SHUFFLE +}; + +enum GradeType +{ + GRADE_TYPE_REMEMBER, + GRADE_TYPE_BUNGLE, + GRADE_TYPE_FORGET, + GRADE_TYPE_LEARN, + GRADE_TYPE_UNLEARN, +}; + +std::string DeckTypeToString(DeckType type); +DeckType StringToDeckType(const std::string& string); +std::wstring TimeToStringRel(time_t timeValue, time_t timeNow = 0); +std::wstring TimeToString(time_t time); diff --git a/DialogAbout.cpp b/DialogAbout.cpp new file mode 100644 index 0000000..5ca92cd --- /dev/null +++ b/DialogAbout.cpp @@ -0,0 +1,25 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "DialogAbout.h" + +DialogAbout::DialogAbout(wxWindow* parent) +{ + wxXmlResource::Get()->LoadDialog(this, parent, wxT("DialogAbout")); + Fit(); +} diff --git a/DialogAbout.h b/DialogAbout.h new file mode 100644 index 0000000..34a3b2c --- /dev/null +++ b/DialogAbout.h @@ -0,0 +1,24 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +class DialogAbout : public wxDialog +{ +public: + DialogAbout(wxWindow* parent); +}; diff --git a/DialogCard.cpp b/DialogCard.cpp new file mode 100644 index 0000000..77865c6 --- /dev/null +++ b/DialogCard.cpp @@ -0,0 +1,236 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "DialogCard.h" +#include "DialogCardEditor.h" +#include "FlashCardManager.h" + +BEGIN_EVENT_TABLE(DialogCard, wxDialog) + EVT_BUTTON(XRCID("buttonShow"), DialogCard::OnButtonShow) + EVT_BUTTON(XRCID("buttonYes"), DialogCard::OnButtonYes) + EVT_BUTTON(XRCID("buttonPartially"), DialogCard::OnButtonPartially) + EVT_BUTTON(XRCID("buttonNo"), DialogCard::OnButtonNo) + EVT_BUTTON(XRCID("buttonNext"), DialogCard::OnButtonNext) + EVT_BUTTON(XRCID("buttonPrevious"), DialogCard::OnButtonPrevious) + EVT_CHECKBOX(XRCID("checkboxLearned"), DialogCard::OnCheckboxLearned) + EVT_CHECKBOX(XRCID("checkboxEnabled"), DialogCard::OnCheckboxEnabled) +END_EVENT_TABLE() + +DialogCard::DialogCard(wxWindow* parent, unsigned controls, const CardDeck& cards, const FlashCardOptions& options) : + m_cards(cards), + m_cardIndex(0), + m_panelConceal(NULL), + m_panelAnswer(NULL), + m_htmlQuestion(NULL), + m_htmlAnswer(NULL), + m_buttonYes(NULL), + m_buttonPartially(NULL), + m_buttonNo(NULL), + m_buttonNext(NULL), + m_buttonPrevious(NULL), + m_checkboxLearned(NULL), + m_checkboxEnabled(NULL), + m_staticRemember(NULL) +{ + wxXmlResource::Get()->LoadDialog(this, parent, wxT("DialogCard")); + + m_panelConceal = XRCCTRL(*this, "panelConceal", wxPanel); + m_panelAnswer = XRCCTRL(*this, "panelAnswer", wxPanel); + m_htmlQuestion = XRCCTRL(*this, "htmlQuestion", wxHtmlWindow); + m_htmlAnswer = XRCCTRL(*this, "htmlAnswer", wxHtmlWindow); + m_buttonYes = XRCCTRL(*this, "buttonYes", wxButton); + m_buttonPartially = XRCCTRL(*this, "buttonPartially", wxButton); + m_buttonNo = XRCCTRL(*this, "buttonNo", wxButton); + m_buttonNext = XRCCTRL(*this, "buttonNext", wxButton); + m_buttonPrevious = XRCCTRL(*this, "buttonPrevious", wxButton); + m_checkboxLearned = XRCCTRL(*this, "checkboxLearned", wxCheckBox); + m_checkboxEnabled = XRCCTRL(*this, "checkboxEnabled", wxCheckBox); + m_staticRemember = XRCCTRL(*this, "staticRemember", wxStaticText); + + m_htmlQuestion->SetFonts(options.fontNameNormal, options.fontNameFixed, options.fontSizes); + m_htmlQuestion->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(DialogCard::OnHtmlQuestionDblClick), NULL, this); + m_htmlAnswer->SetFonts(options.fontNameNormal, options.fontNameFixed, options.fontSizes); + m_htmlAnswer->Connect(wxEVT_LEFT_DCLICK, wxMouseEventHandler(DialogCard::OnHtmlAnswerDblClick), NULL, this); + + if (IS_TRUE(controls & BIT(CARD_CTRL_LEARNED))) + { + m_checkboxLearned->Show(); + } + if (IS_TRUE(controls & BIT(CARD_CTRL_ENABLED))) + { + m_checkboxEnabled->Show(); + } + if (IS_TRUE(controls & BIT(CARD_CTRL_NAVIGATE))) + { + m_buttonPrevious->Show(); + m_buttonNext->Show(); + } + if (IS_TRUE(controls & BIT(CARD_CTRL_QUIZ))) + { + m_staticRemember->Show(); + m_buttonYes->Show(); + m_buttonPartially->Show(); + m_buttonNo->Show(); + HideAnswer(); + } + + UpdateCard(); + SetSize(640, 480); +} + +void DialogCard::OnButtonShow(wxCommandEvent& event) +{ + ShowAnswer(); +} + +void DialogCard::OnButtonYes(wxCommandEvent& event) +{ + GetActiveCard()->ScheduleReview(GRADE_TYPE_REMEMBER); + HideAnswer(); + if (!AdvanceCard()) + { + EndModal(0); + } +} + +void DialogCard::OnButtonPartially(wxCommandEvent& event) +{ + GetActiveCard()->ScheduleReview(GRADE_TYPE_BUNGLE); + HideAnswer(); + if (!AdvanceCard()) + { + EndModal(0); + } +} + +void DialogCard::OnButtonNo(wxCommandEvent& event) +{ + GetActiveCard()->ScheduleReview(GRADE_TYPE_FORGET); + HideAnswer(); + if (!AdvanceCard()) + { + EndModal(0); + } +} + +void DialogCard::OnButtonNext(wxCommandEvent& event) +{ + AdvanceCard(); +} + +void DialogCard::OnButtonPrevious(wxCommandEvent& event) +{ + RewindCard(); +} + +void DialogCard::OnCheckboxLearned(wxCommandEvent& event) +{ + GetActiveCard()->ScheduleReview(event.IsChecked() ? GRADE_TYPE_LEARN : GRADE_TYPE_UNLEARN); +} + +void DialogCard::OnCheckboxEnabled(wxCommandEvent& event) +{ + GetActiveCard()->Enable(event.IsChecked()); +} + +void DialogCard::OnHtmlQuestionDblClick(wxMouseEvent& event) +{ + FlashCard* const card = GetActiveCard(); + wxString question = card->GetQuestion(); + + DialogCardEditor* const dialog = new DialogCardEditor(this, &question); + if (dialog->ShowModal() == wxID_OK) + { + card->SetQuestion(question.c_str()); + UpdateCard(); + } +} + +void DialogCard::OnHtmlAnswerDblClick(wxMouseEvent& event) +{ + FlashCard* const card = GetActiveCard(); + wxString answer = card->GetAnswer(); + + DialogCardEditor* const dialog = new DialogCardEditor(this, &answer); + if (dialog->ShowModal() == wxID_OK) + { + card->SetAnswer(answer.c_str()); + UpdateCard(); + } +} + +void DialogCard::UpdateCard() +{ + m_htmlQuestion->SetPage(GetActiveCard()->GetQuestion()); + m_htmlAnswer->SetPage(GetActiveCard()->GetAnswer()); + + m_buttonYes->SetToolTip(wxString::Format(wxT("Expire about %s"), TimeToStringRel(GetActiveCard()->ComputeReview(GRADE_TYPE_REMEMBER, false)).c_str())); + m_buttonPartially->SetToolTip(wxString::Format(wxT("Expire about %s"), TimeToStringRel(GetActiveCard()->ComputeReview(GRADE_TYPE_BUNGLE, false)).c_str())); + m_buttonNo->SetToolTip(wxT("Move to failed deck")); + + m_buttonNext->Enable(m_cardIndex < m_cards.size() - 1); + m_buttonPrevious->Enable(m_cardIndex > 0); + m_checkboxLearned->SetValue(GetActiveCard()->IsLearned()); + m_checkboxEnabled->SetValue(GetActiveCard()->GetEnabled()); + + SetTitle(wxString::Format(wxT("Flash card %d of %d"), m_cardIndex + 1, m_cards.size())); +} + +bool DialogCard::AdvanceCard() +{ + if (m_cardIndex + 1 < m_cards.size()) + { + ++m_cardIndex; + UpdateCard(); + return true; + } + + return false; +} + +bool DialogCard::RewindCard() +{ + if (m_cardIndex > 0) + { + --m_cardIndex; + UpdateCard(); + return true; + } + + return false; +} + +void DialogCard::ShowAnswer(bool show) +{ + m_panelConceal->Show(!show); + m_htmlAnswer->Show(show); + m_buttonYes->Enable(show); + m_buttonPartially->Enable(show); + m_buttonNo->Enable(show); + m_panelAnswer->Layout(); +} + +void DialogCard::HideAnswer() +{ + ShowAnswer(false); +} + +FlashCard* DialogCard::GetActiveCard() +{ + return m_cards[m_cardIndex]; +} diff --git a/DialogCard.h b/DialogCard.h new file mode 100644 index 0000000..9c57448 --- /dev/null +++ b/DialogCard.h @@ -0,0 +1,74 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +struct FlashCardOptions; +class FlashCard; + +class DialogCard : public wxDialog +{ +public: + enum + { + CARD_CTRL_LEARNED, + CARD_CTRL_ENABLED, + CARD_CTRL_NAVIGATE, + CARD_CTRL_QUIZ + }; + + typedef std::vector CardDeck; + + DialogCard(wxWindow* parent, unsigned controls, const CardDeck& cards, const FlashCardOptions& options); + + void OnButtonShow(wxCommandEvent& event); + void OnButtonYes(wxCommandEvent& event); + void OnButtonPartially(wxCommandEvent& event); + void OnButtonNo(wxCommandEvent& event); + void OnButtonNext(wxCommandEvent& event); + void OnButtonPrevious(wxCommandEvent& event); + void OnCheckboxLearned(wxCommandEvent& event); + void OnCheckboxEnabled(wxCommandEvent& event); + void OnHtmlQuestionDblClick(wxMouseEvent& event); + void OnHtmlAnswerDblClick(wxMouseEvent& event); + +private: + bool AdvanceCard(); + bool RewindCard(); + void UpdateCard(); + void ShowAnswer(bool show = true); + void HideAnswer(); + FlashCard* GetActiveCard(); + + DECLARE_EVENT_TABLE() + + const CardDeck& m_cards; + size_t m_cardIndex; + + wxPanel* m_panelConceal; + wxPanel* m_panelAnswer; + wxHtmlWindow* m_htmlQuestion; + wxHtmlWindow* m_htmlAnswer; + wxButton* m_buttonYes; + wxButton* m_buttonPartially; + wxButton* m_buttonNo; + wxButton* m_buttonNext; + wxButton* m_buttonPrevious; + wxCheckBox* m_checkboxLearned; + wxCheckBox* m_checkboxEnabled; + wxStaticText* m_staticRemember; +}; diff --git a/DialogCardEditor.cpp b/DialogCardEditor.cpp new file mode 100644 index 0000000..c371d31 --- /dev/null +++ b/DialogCardEditor.cpp @@ -0,0 +1,40 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "DialogCardEditor.h" + +BEGIN_EVENT_TABLE(DialogCardEditor, wxDialog) + EVT_BUTTON(wxID_OK, DialogCardEditor::OnButtonOk) +END_EVENT_TABLE() + +DialogCardEditor::DialogCardEditor(wxWindow* parent, wxString* value) : + m_textEdit(NULL), + m_value(value) +{ + wxXmlResource::Get()->LoadDialog(this, parent, wxT("DialogCardEditor")); + m_textEdit = XRCCTRL(*this, "textEdit", wxTextCtrl); + m_textEdit->ChangeValue(*value); + m_textEdit->SetFocus(); + SetSize(500, 300); +} + +void DialogCardEditor::OnButtonOk(wxCommandEvent& event) +{ + *m_value = m_textEdit->GetValue(); + event.Skip(); +} diff --git a/DialogCardEditor.h b/DialogCardEditor.h new file mode 100644 index 0000000..571d056 --- /dev/null +++ b/DialogCardEditor.h @@ -0,0 +1,33 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +class DialogCardEditor : public wxDialog +{ +public: + DialogCardEditor(wxWindow* parent, wxString* value); + + void OnButtonOk(wxCommandEvent& event); + +private: + DECLARE_EVENT_TABLE() + + wxTextCtrl* m_textEdit; + wxString* m_value; +}; + diff --git a/DialogCardManager.cpp b/DialogCardManager.cpp new file mode 100644 index 0000000..ecc999f --- /dev/null +++ b/DialogCardManager.cpp @@ -0,0 +1,346 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "DialogCardManager.h" +#include "FlashCardManager.h" + +BEGIN_EVENT_TABLE(DialogCardManager, wxDialog) + EVT_MENU(ID_MENU_CARD_ADD, DialogCardManager::OnMenuCardAdd) + EVT_MENU(ID_MENU_CARD_REMOVE, DialogCardManager::OnMenuCardRemove) + EVT_MENU(ID_MENU_CARD_ENABLE, DialogCardManager::OnMenuCardEnable) + EVT_BUTTON(XRCID("buttonAdd"), DialogCardManager::OnMenuCardAdd) + EVT_BUTTON(XRCID("buttonRemove"), DialogCardManager::OnMenuCardRemove) + EVT_LISTBOX(XRCID("checkListCards"), DialogCardManager::OnCheckListCardsIndexChanged) + EVT_CHECKLISTBOX(XRCID("checkListCards"), DialogCardManager::OnCheckListCardsChecked) + EVT_TEXT_ENTER(XRCID("textFilter"), DialogCardManager::OnCardSummaryChanged) + EVT_TEXT(XRCID("textQuestion"), DialogCardManager::OnCardTextChanged) + EVT_TEXT(XRCID("textAnswer"), DialogCardManager::OnCardTextChanged) + EVT_CHOICE(XRCID("choiceSearch"), DialogCardManager::OnCardSummaryChanged) + EVT_CHOICE(XRCID("choiceSort"), DialogCardManager::OnCardSummaryChanged) + EVT_NOTEBOOK_PAGE_CHANGING(XRCID("notebookCard"), DialogCardManager::OnNotebookCardPageChanged) +END_EVENT_TABLE() + +DialogCardManager::DialogCardManager(wxWindow* parent, FlashCardManager* manager) : + m_manager(manager), + m_textQuestion(NULL), + m_htmlQuestion(NULL), + m_textAnswer(NULL), + m_htmlAnswer(NULL), + m_textFilter(NULL), + m_choiceSearch(NULL), + m_choiceSort(NULL), + m_listCards(NULL), + m_notebookCard(NULL), + m_staticDeck(NULL), + m_staticRemembered(NULL), + m_staticForgotten(NULL), + m_staticBungled(NULL), + m_staticAdded(NULL), + m_staticReviewPrevious(NULL), + m_staticReviewNext(NULL) +{ + wxXmlResource::Get()->LoadDialog(this, parent, wxT("DialogCardManager")); + const FlashCardOptions& options = m_manager->GetOptions(); + + m_textQuestion = XRCCTRL(*this, "textQuestion", wxTextCtrl); + m_htmlQuestion = XRCCTRL(*this, "htmlQuestion", wxHtmlWindow); + m_textAnswer = XRCCTRL(*this, "textAnswer", wxTextCtrl); + m_htmlAnswer = XRCCTRL(*this, "htmlAnswer", wxHtmlWindow); + m_textFilter = XRCCTRL(*this, "textFilter", wxTextCtrl); + m_choiceSearch = XRCCTRL(*this, "choiceSearch", wxChoice); + m_choiceSort = XRCCTRL(*this, "choiceSort", wxChoice); + m_listCards = XRCCTRL(*this, "checkListCards", wxCheckListBox); + m_notebookCard = XRCCTRL(*this, "notebookCard", wxNotebook); + m_staticDeck = XRCCTRL(*this, "staticDeck", wxStaticText); + m_staticRemembered = XRCCTRL(*this, "staticCountRemembered", wxStaticText); + m_staticForgotten = XRCCTRL(*this, "staticCountForgotten", wxStaticText); + m_staticBungled = XRCCTRL(*this, "staticCountBungled", wxStaticText); + m_staticAdded = XRCCTRL(*this, "staticTimeAdded", wxStaticText); + m_staticReviewPrevious = XRCCTRL(*this, "staticTimeReviewPrevious", wxStaticText); + m_staticReviewNext = XRCCTRL(*this, "staticTimeReviewNext", wxStaticText); + + m_htmlQuestion->SetFonts(options.fontNameNormal, options.fontNameFixed, options.fontSizes); + m_htmlAnswer->SetFonts(options.fontNameNormal, options.fontNameFixed, options.fontSizes); + m_listCards->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(DialogCardManager::OnCheckListCardsKeyDown), NULL, this); + m_listCards->Connect(wxEVT_CONTEXT_MENU, wxContextMenuEventHandler(DialogCardManager::OnCheckListCardsContextMenu), NULL, this); + m_textFilter->SetFocus(); + + SetSize(800, 600); + UpdateCards(); +} + +void DialogCardManager::OnMenuCardAdd(wxCommandEvent& event) +{ + AddCard(); +} + +void DialogCardManager::OnMenuCardRemove(wxCommandEvent& event) +{ + RemoveCard(); +} + +void DialogCardManager::OnMenuCardEnable(wxCommandEvent& event) +{ + wxArrayInt selections; + m_listCards->GetSelections(selections); + + const bool checked = IsSelectionChecked(); + for (unsigned i = 0; i < selections.Count(); ++i) + { + m_listCards->Check(selections[i], !checked); + } +} + +void DialogCardManager::OnNotebookCardPageChanged(wxNotebookEvent& event) +{ + if (m_htmlQuestion != NULL && m_htmlAnswer != NULL) + { + m_htmlQuestion->SetPage(m_textQuestion->GetValue()); + m_htmlAnswer->SetPage(m_textAnswer->GetValue()); + } +} + +void DialogCardManager::OnCheckListCardsIndexChanged(wxCommandEvent& event) +{ + UpdateCard(); +} + +void DialogCardManager::OnCheckListCardsChecked(wxCommandEvent& event) +{ + const int selection = event.GetSelection(); + FlashCard* const card = m_cardMap.find(selection)->second; + card->Enable(m_listCards->IsChecked(selection)); +} + +void DialogCardManager::OnCheckListCardsContextMenu(wxContextMenuEvent& event) +{ + wxArrayInt selections; + const int selectedCount = m_listCards->GetSelections(selections); + + wxMenu* const menu = new wxMenu(); + menu->Append(ID_MENU_CARD_ADD, wxT("&Add new card")); + if (selectedCount > 0) + { + menu->Append(ID_MENU_CARD_REMOVE, wxT("&Remove card(s)")); + menu->AppendSeparator(); + menu->AppendCheckItem(ID_MENU_CARD_ENABLE, wxT("&Enable card(s)"))->Check(IsSelectionChecked()); + } + + PopupMenu(menu); + delete menu; +} + +void DialogCardManager::OnCheckListCardsKeyDown(wxKeyEvent& event) +{ + switch (event.GetKeyCode()) + { + case WXK_DELETE: + RemoveCard(); + break; + case WXK_INSERT: + AddCard(); + break; + default: + event.Skip(); + break; + } +} + +void DialogCardManager::OnCardSummaryChanged(wxCommandEvent& event) +{ + UpdateCards(); +} + +void DialogCardManager::UpdateCards() +{ + const wxString filterText = m_textFilter->GetValue().Strip().Lower(); + const FilterMode filterMode = static_cast(m_choiceSearch->GetSelection()); + const DeckSortType sortType = static_cast(m_choiceSort->GetSelection()); + + std::vector cards; + m_manager->EnumerateCards(&cards, static_cast(-1), true, true, sortType); + + m_cardMap.clear(); + + std::vector states; + wxArrayString questions; + int index = 0; + + for (std::vector::const_iterator iter = cards.begin(); iter != cards.end(); ++iter) + { + FlashCard* const card = *iter; + const wxString question = card->GetQuestion(); + const wxString answer = card->GetAnswer(); + + if (!filterText.IsEmpty()) + { + const wxString questionTemp = question.Strip().Lower(); + const wxString answerTemp = answer.Strip().Lower(); + const bool filtered = + (filterMode == FILTER_MODE_QUESTION && questionTemp.Find(filterText) == wxNOT_FOUND) || + (filterMode == FILTER_MODE_ANSWER && answerTemp.Find(filterText) == wxNOT_FOUND); + + if (filtered) + { + continue; + } + } + + states.push_back(card->GetEnabled()); + questions.Add(question); + + m_cardMap.insert(std::make_pair(index++, card)); + } + + m_listCards->SetSelection(wxNOT_FOUND); + m_listCards->Set(questions); + for (size_t i = 0; i < states.size(); ++i) + { + m_listCards->Check(i, states[i]); + } + + if (m_listCards->GetCount() > 0) + { + m_listCards->Select(0); + } + + UpdateCard(); +} + +void DialogCardManager::UpdateCard() +{ + wxArrayInt selections; + const bool canDisplaySelection = m_listCards->GetSelections(selections) == 1; + m_notebookCard->Enable(canDisplaySelection); + + const wxString unspecified = wxT("-"); + wxString question = wxEmptyString; + wxString answer = wxEmptyString; + wxString deck = unspecified; + wxString countRemembered = unspecified; + wxString countForgotten = unspecified; + wxString countBungled = unspecified; + wxString timeAdded = unspecified; + wxString timeReviewPrevious = unspecified; + wxString timeReviewNext = unspecified; + + if (canDisplaySelection) + { + const FlashCard* const card = m_cardMap.find(selections[0])->second; + + question = card->GetQuestion(); + answer = card->GetAnswer(); + deck = wxString::FromAscii(DeckTypeToString(card->GetDeck()).c_str()); + countRemembered = wxString::Format(wxT("%d"), card->GetCountRemembered()); + countForgotten = wxString::Format(wxT("%d"), card->GetCountForgotten()); + countBungled = wxString::Format(wxT("%d"), card->GetCountBungled()); + timeAdded = TimeToStringRel(card->GetTimeAdded()); + + if (card->GetDeck() != DECK_TYPE_UNTESTED) + { + timeReviewPrevious = TimeToStringRel(card->GetTimeReviewPrevious()); + } + if (card->GetDeck() == DECK_TYPE_EXPIRED || card->GetDeck() == DECK_TYPE_PENDING) + { + timeReviewNext = TimeToStringRel(card->GetTimeReviewNext()); + } + } + + m_textQuestion->ChangeValue(question); + m_htmlQuestion->SetPage(question); + m_textAnswer->ChangeValue(answer); + m_htmlAnswer->SetPage(answer); + m_staticDeck->SetLabel(deck); + m_staticRemembered->SetLabel(countRemembered); + m_staticForgotten->SetLabel(countForgotten); + m_staticBungled->SetLabel(countBungled); + m_staticAdded->SetLabel(timeAdded); + m_staticReviewPrevious->SetLabel(timeReviewPrevious); + m_staticReviewNext->SetLabel(timeReviewNext); +} + +void DialogCardManager::AddCard() +{ + FlashCard* const card = m_manager->AddCard(wxEmptyString, wxEmptyString, true); + + m_listCards->Append(card->GetQuestion()); + const int selectionIndex = m_listCards->GetCount() - 1; + m_listCards->Check(selectionIndex, card->GetEnabled()); + m_listCards->SetSelection(wxNOT_FOUND); + m_listCards->SetSelection(selectionIndex); + + m_cardMap.insert(std::make_pair(selectionIndex, card)); + + m_notebookCard->SetSelection(1); + m_textQuestion->SetFocus(); + + UpdateCard(); +} + +void DialogCardManager::RemoveCard() +{ + wxArrayInt selections; + m_listCards->GetSelections(selections); + + const bool remove = + selections.Count() > 0 && + wxMessageBox(wxT("Are you sure you want to remove the selected card(s)?"), wxT("Meganekko"), wxYES_NO) == wxYES; + + if (remove) + { + for (unsigned i = 0; i < selections.Count(); ++i) + { + m_manager->RemoveCard(m_cardMap.find(selections[i])->second); + } + + UpdateCards(); + } +} + +void DialogCardManager::OnCardTextChanged(wxCommandEvent& event) +{ + wxArrayInt selections; + if (m_listCards->GetSelections(selections) == 1) + { + const int selection = selections[0]; + + FlashCard* const card = m_cardMap.find(selection)->second; + card->SetQuestion(m_textQuestion->GetValue().c_str()); + card->SetAnswer(m_textAnswer->GetValue().c_str()); + + m_listCards->SetString(selection, card->GetQuestion()); + m_listCards->Check(selection, card->GetEnabled()); + } +} + +bool DialogCardManager::IsSelectionChecked() const +{ + wxArrayInt selections; + m_listCards->GetSelections(selections); + + unsigned checked = 0; + for (unsigned i = 0; i < selections.GetCount(); ++i) + { + if (m_listCards->IsChecked(selections[i])) + { + ++checked; + } + } + + return checked == selections.GetCount() || checked > selections.GetCount() / 2; +} diff --git a/DialogCardManager.h b/DialogCardManager.h new file mode 100644 index 0000000..eb18b74 --- /dev/null +++ b/DialogCardManager.h @@ -0,0 +1,83 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +class FlashCardManager; +class FlashCard; + +class DialogCardManager : public wxDialog +{ +public: + DialogCardManager(wxWindow* parent, FlashCardManager* manager); + + void OnMenuCardAdd(wxCommandEvent& event); + void OnMenuCardRemove(wxCommandEvent& event); + void OnMenuCardEnable(wxCommandEvent& event); + void OnCheckListCardsIndexChanged(wxCommandEvent& event); + void OnCheckListCardsChecked(wxCommandEvent& event); + void OnCheckListCardsKeyDown(wxKeyEvent& event); + void OnCheckListCardsContextMenu(wxContextMenuEvent& event); + void OnNotebookCardPageChanged(wxNotebookEvent& event); + void OnCardSummaryChanged(wxCommandEvent& event); + void OnCardTextChanged(wxCommandEvent& event); + +private: + void AddCard(); + void RemoveCard(); + void UpdateCards(); + void UpdateCard(); + + bool IsSelectionChecked() const; + + enum FilterMode + { + FILTER_MODE_QUESTION, + FILTER_MODE_ANSWER + }; + + enum + { + ID_MENU_CARD_ADD, + ID_MENU_CARD_REMOVE, + ID_MENU_CARD_ENABLE + }; + + typedef std::map CardMap; + + DECLARE_EVENT_TABLE() + + FlashCardManager* m_manager; + CardMap m_cardMap; + + wxTextCtrl* m_textQuestion; + wxHtmlWindow* m_htmlQuestion; + wxTextCtrl* m_textAnswer; + wxHtmlWindow* m_htmlAnswer; + wxTextCtrl* m_textFilter; + wxChoice* m_choiceSearch; + wxChoice* m_choiceSort; + wxCheckListBox* m_listCards; + wxNotebook* m_notebookCard; + wxStaticText* m_staticDeck; + wxStaticText* m_staticRemembered; + wxStaticText* m_staticForgotten; + wxStaticText* m_staticBungled; + wxStaticText* m_staticAdded; + wxStaticText* m_staticReviewPrevious; + wxStaticText* m_staticReviewNext; +}; diff --git a/DialogOptions.cpp b/DialogOptions.cpp new file mode 100644 index 0000000..1bd1d19 --- /dev/null +++ b/DialogOptions.cpp @@ -0,0 +1,95 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "DialogOptions.h" +#include "FlashCardManager.h" + +BEGIN_EVENT_TABLE(DialogOptions, wxDialog) + EVT_BUTTON(wxID_OK, DialogOptions::OnButtonOk) +END_EVENT_TABLE() + +DialogOptions::DialogOptions(wxWindow* parent, FlashCardManager* manager) : + m_manager(manager), + m_spinTimeReviewMin(NULL), + m_spinTimeReviewMax(NULL), + m_sliderTimeReviewEntropy(NULL), + m_checkAutoSave(NULL), + m_textFontNameNormal(NULL), + m_textFontNameFixed(NULL) +{ + wxXmlResource::Get()->LoadDialog(this, parent, wxT("DialogOptions")); + + m_spinTimeReviewMin = XRCCTRL(*this, "spinTimeReviewMin", wxSpinCtrl); + m_spinTimeReviewMax = XRCCTRL(*this, "spinTimeReviewMax", wxSpinCtrl); + m_sliderTimeReviewEntropy = XRCCTRL(*this, "sliderTimeReviewEntropy", wxSlider); + m_checkAutoSave = XRCCTRL(*this, "checkAutoSave", wxCheckBox); + m_textFontNameNormal = XRCCTRL(*this, "textFontNameNormal", wxTextCtrl); + m_textFontNameFixed = XRCCTRL(*this, "textFontNameFixed", wxTextCtrl); + m_spinFontSizes[0] = XRCCTRL(*this, "spinFontSize0", wxSpinCtrl); + m_spinFontSizes[1] = XRCCTRL(*this, "spinFontSize1", wxSpinCtrl); + m_spinFontSizes[2] = XRCCTRL(*this, "spinFontSize2", wxSpinCtrl); + m_spinFontSizes[3] = XRCCTRL(*this, "spinFontSize3", wxSpinCtrl); + m_spinFontSizes[4] = XRCCTRL(*this, "spinFontSize4", wxSpinCtrl); + m_spinFontSizes[5] = XRCCTRL(*this, "spinFontSize5", wxSpinCtrl); + m_spinFontSizes[6] = XRCCTRL(*this, "spinFontSize6", wxSpinCtrl); + + MoveOptionsToUi(); + Fit(); +} + +void DialogOptions::OnButtonOk(wxCommandEvent& event) +{ + MoveUiToOptions(); + event.Skip(); +} + +void DialogOptions::MoveOptionsToUi() +{ + const FlashCardOptions& options = m_manager->GetOptions(); + m_spinTimeReviewMin->SetValue(SECONDS_TO_DAYS(options.timeReviewMin)); + m_spinTimeReviewMax->SetValue(SECONDS_TO_DAYS(options.timeReviewMax)); + m_sliderTimeReviewEntropy->SetValue(options.timeReviewEntropy); + m_checkAutoSave->SetValue(options.autoSave); + m_textFontNameNormal->SetValue(options.fontNameNormal); + m_textFontNameFixed->SetValue(options.fontNameFixed); + for (size_t i = 0; i < 7; ++i) + { + m_spinFontSizes[i]->SetValue(options.fontSizes[i]); + } +} + +void DialogOptions::MoveUiToOptions() +{ + int fontSizes[7] = {0}; + for (int i = 0; i < 7; ++i) + { + fontSizes[i] = m_spinFontSizes[i]->GetValue(); + } + + const FlashCardOptions options( + DAYS_TO_SECONDS(m_spinTimeReviewMin->GetValue()), + DAYS_TO_SECONDS(m_spinTimeReviewMax->GetValue()), + m_sliderTimeReviewEntropy->GetValue(), + m_checkAutoSave->GetValue(), + m_textFontNameNormal->GetValue().c_str(), + m_textFontNameFixed->GetValue().c_str(), + fontSizes + ); + + m_manager->SetOptions(options); +} diff --git a/DialogOptions.h b/DialogOptions.h new file mode 100644 index 0000000..502e007 --- /dev/null +++ b/DialogOptions.h @@ -0,0 +1,44 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +class FlashCardManager; + +class DialogOptions : public wxDialog +{ +public: + DialogOptions(wxWindow* parent, FlashCardManager* manager); + + void OnButtonOk(wxCommandEvent& event); + +private: + void MoveOptionsToUi(); + void MoveUiToOptions(); + + DECLARE_EVENT_TABLE() + + FlashCardManager* m_manager; + + wxSpinCtrl* m_spinTimeReviewMin; + wxSpinCtrl* m_spinTimeReviewMax; + wxSlider* m_sliderTimeReviewEntropy; + wxCheckBox* m_checkAutoSave; + wxTextCtrl* m_textFontNameNormal; + wxTextCtrl* m_textFontNameFixed; + wxSpinCtrl* m_spinFontSizes[7]; +}; diff --git a/FlashCard.cpp b/FlashCard.cpp new file mode 100644 index 0000000..04168f4 --- /dev/null +++ b/FlashCard.cpp @@ -0,0 +1,283 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "FlashCard.h" +#include "FlashCardManager.h" + +FlashCard::FlashCard( + FlashCardManager* manager, + DeckType deck, + const std::wstring& question, + const std::wstring& answer, + bool enabled, + int countRemembered, + int countForgotten, + int countBungled, + time_t timeReviewPrevious, + time_t timeReviewNext, + time_t timeAdded +) : + m_manager(manager), + m_deck(deck), + m_question(question), + m_answer(answer), + m_enabled(enabled), + m_countRemembered(countRemembered), + m_countForgotten(countForgotten), + m_countBungled(countBungled), + m_timeReviewPrevious(timeReviewPrevious), + m_timeReviewNext(timeReviewNext), + m_timeAdded(timeAdded) +{ + ASSERT(m_timeAdded > 0); + ASSERT(m_timeReviewPrevious > 0 && m_timeReviewPrevious >= m_timeAdded); + ASSERT(m_timeReviewNext > 0 && m_timeReviewNext >= m_timeReviewPrevious); +} + +void FlashCard::SetDeck(DeckType deck) +{ + if (m_deck != deck) + { + m_deck = deck; + m_manager->FlagModified(); + } +} + +DeckType FlashCard::GetDeck() const +{ + return m_deck; +} + +void FlashCard::SetQuestion(const std::wstring& question) +{ + if (m_question != question) + { + m_question = question; + m_manager->FlagModified(); + } +} + +const std::wstring& FlashCard::GetQuestion() const +{ + return m_question; +} + +void FlashCard::SetAnswer(const std::wstring& answer) +{ + if (m_answer != answer) + { + m_manager->FlagModified(); + m_answer = answer; + } +} + +const std::wstring& FlashCard::GetAnswer() const +{ + return m_answer; +} + +bool FlashCard::GetEnabled() const +{ + return m_enabled; +} + +bool FlashCard::IsLearned() const +{ + return m_deck != DECK_TYPE_FAILED; +} + +void FlashCard::Enable(bool enable) +{ + if (m_enabled != enable) + { + m_enabled = enable; + m_manager->FlagModified(); + } +} + +void FlashCard::Disable() +{ + Enable(false); +} + +bool FlashCard::Expire() +{ + if (m_deck == DECK_TYPE_PENDING && m_timeReviewNext <= GetTimeCurrent()) + { + SetDeck(DECK_TYPE_EXPIRED); + return true; + } + + return false; +} + +time_t FlashCard::GetTimeReviewPrevious() const +{ + return m_timeReviewPrevious; +} + +time_t FlashCard::GetTimeReviewNext() const +{ + return m_timeReviewNext; +} + +time_t FlashCard::GetTimeAdded() const +{ + return m_timeAdded; +} + +int FlashCard::GetCountRemembered() const +{ + return m_countRemembered; +} + +int FlashCard::GetCountForgotten() const +{ + return m_countForgotten; +} + +int FlashCard::GetCountBungled() const +{ + return m_countBungled; +} + +void FlashCard::SetCountRemembered(int count) +{ + if (count != m_countRemembered) + { + m_countRemembered = count; + m_manager->FlagModified(); + } +} + +void FlashCard::SetCountForgotten(int count) +{ + if (count != m_countForgotten) + { + m_countForgotten = count; + m_manager->FlagModified(); + } +} + +void FlashCard::SetCountBungled(int count) +{ + if (count != m_countBungled) + { + m_countBungled = count; + m_manager->FlagModified(); + } +} + +void FlashCard::SetTimeReviewPrevious(time_t time) +{ + if (time != m_timeReviewPrevious) + { + m_timeReviewPrevious = time; + m_manager->FlagModified(); + } +} + +void FlashCard::SetTimeReviewNext(time_t time) +{ + if (time != m_timeReviewNext) + { + m_timeReviewNext = time; + m_manager->FlagModified(); + } +} + +void FlashCard::ScheduleReview(GradeType grade) +{ + SetTimeReviewNext(ComputeReview(grade, true)); + SetTimeReviewPrevious(GetTimeCurrent()); + + switch (grade) + { + case GRADE_TYPE_REMEMBER: + SetDeck(DECK_TYPE_PENDING); + SetCountRemembered(m_countRemembered + 1); + break; + case GRADE_TYPE_BUNGLE: + SetDeck(DECK_TYPE_PENDING); + SetCountBungled(m_countBungled + 1); + break; + case GRADE_TYPE_FORGET: + SetDeck(DECK_TYPE_FAILED); + SetCountForgotten(m_countForgotten + 1); + break; + case GRADE_TYPE_LEARN: + SetDeck(DECK_TYPE_PENDING); + break; + case GRADE_TYPE_UNLEARN: + SetDeck(DECK_TYPE_FAILED); + break; + } +} + +time_t FlashCard::ComputeReview(GradeType grade, bool scatter) const +{ + const FlashCardOptions& options = m_manager->GetOptions(); + const int timeReviewEntropy = scatter ? options.timeReviewEntropy : 0; + const time_t timeNow = GetTimeCurrent(); + + time_t timeNext = 0; + if (grade == GRADE_TYPE_REMEMBER) + { + const time_t timeDelta = (std::min(m_timeReviewNext, timeNow) - m_timeReviewPrevious) * 2; + timeNext = std::max(m_timeReviewNext, timeNow) + ScatterTime(timeDelta, timeReviewEntropy); + } + else if (grade == GRADE_TYPE_BUNGLE) + { + const time_t timeDelta = (std::min(m_timeReviewNext, timeNow) - m_timeReviewPrevious) / 2; + timeNext = std::max(m_timeReviewNext, timeNow) + ScatterTime(timeDelta, timeReviewEntropy); + } + else + { + timeNext = timeNow + ScatterTime(options.timeReviewMin, timeReviewEntropy); + } + + const time_t timeDeltaNext = timeNext - timeNow; + if (timeDeltaNext < options.timeReviewMin) + { + timeNext = timeNow + options.timeReviewMin; + } + else if (timeDeltaNext > options.timeReviewMax) + { + timeNext = timeNow + options.timeReviewMax; + } + + return timeNext; +} + +time_t FlashCard::GetTimeCurrent() +{ + return time(NULL); +} + +time_t FlashCard::ScatterTime(time_t time, int percent) +{ + if (percent == 0) + { + return time; + } + + const double multiplier = 1.0 + static_cast(percent / 2 - rand() % percent) / 100.0; + const time_t result = static_cast(multiplier * static_cast(time)); + + return result; +} diff --git a/FlashCard.h b/FlashCard.h new file mode 100644 index 0000000..72a2f19 --- /dev/null +++ b/FlashCard.h @@ -0,0 +1,82 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +class FlashCardManager; + +class FlashCard +{ +public: + FlashCard( + FlashCardManager* manager, + DeckType deck, + const std::wstring& question, + const std::wstring& answer, + bool enabled, + int countRemembered, + int countForgotten, + int countBungled, + time_t timeReviewPrevious, + time_t timeReviewNext, + time_t timeAdded + ); + + void SetDeck(DeckType deck); + DeckType GetDeck() const; + void SetQuestion(const std::wstring& question); + const std::wstring& GetQuestion() const; + void SetAnswer(const std::wstring& answer); + const std::wstring& GetAnswer() const; + bool GetEnabled() const; + bool IsLearned() const; + void Enable(bool enable = true); + void Disable(); + bool Expire(); + + time_t GetTimeReviewPrevious() const; + time_t GetTimeReviewNext() const; + time_t GetTimeAdded() const; + int GetCountRemembered() const; + int GetCountForgotten() const; + int GetCountBungled() const; + + void ScheduleReview(GradeType grade); + time_t ComputeReview(GradeType grade, bool scatter) const; + +private: + void SetCountRemembered(int count); + void SetCountForgotten(int count); + void SetCountBungled(int count); + void SetTimeReviewPrevious(time_t time); + void SetTimeReviewNext(time_t time); + + static time_t GetTimeCurrent(); + static time_t ScatterTime(time_t time, int percent); + + FlashCardManager* m_manager; + DeckType m_deck; + std::wstring m_question; + std::wstring m_answer; + bool m_enabled; + int m_countRemembered; + int m_countForgotten; + int m_countBungled; + time_t m_timeReviewPrevious; + time_t m_timeReviewNext; + time_t m_timeAdded; +}; diff --git a/FlashCardManager.cpp b/FlashCardManager.cpp new file mode 100644 index 0000000..0b0a8dc --- /dev/null +++ b/FlashCardManager.cpp @@ -0,0 +1,190 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "FlashCardManager.h" + +const FlashCardOptions FlashCardOptions::DEFAULT; + +FlashCardManager::FlashCardManager() : + m_modified(false) +{ +} + +bool FlashCardManager::Open(const std::wstring& filename) +{ + TiXmlDocument document; + if (document.LoadFile(wstrToUtf8(filename).c_str())) + { + Close(); + XmlImportRoot(&document); + ExpireCards(); + return true; + } + return false; +} + +bool FlashCardManager::Save(const std::wstring& filename) const +{ + TiXmlDocument document; + XmlExportRoot(&document); + if (document.SaveFile(wstrToUtf8(filename).c_str())) + { + m_modified = false; + return true; + } + return false; +} + +void FlashCardManager::Close() +{ + m_cards.clear(); + m_options = FlashCardOptions::DEFAULT; + m_modified = false; +} + +bool FlashCardManager::IsModified() const +{ + return m_modified; +} + +void FlashCardManager::FlagModified() +{ + m_modified = true; +} + +const FlashCardOptions& FlashCardManager::GetOptions() const +{ + return m_options; +} + +void FlashCardManager::SetOptions(const FlashCardOptions& options) +{ + m_modified |= ( + m_options.timeReviewMin != options.timeReviewMin || + m_options.timeReviewMax != options.timeReviewMax || + m_options.timeReviewEntropy != options.timeReviewEntropy || + m_options.autoSave != options.autoSave || + m_options.fontNameNormal != options.fontNameNormal || + m_options.fontNameFixed != options.fontNameFixed || + memcmp(m_options.fontSizes, options.fontSizes, sizeof(m_options.fontSizes)) != 0 + ); + m_options = options; +} + +FlashCard* FlashCardManager::AddCard(const std::wstring& question, const std::wstring& answer, bool enabled) +{ + const time_t timeNow = time(NULL); + const FlashCard card( + this, + DECK_TYPE_UNTESTED, + question, + answer, + enabled, + 0, + 0, + 0, + timeNow, + timeNow, + timeNow + ); + m_cards.push_front(card); + FlagModified(); + return &*m_cards.begin(); +} + +void FlashCardManager::EnumerateCards(std::vector* cards, unsigned decks, bool allowEnabled, bool allowDisabled, DeckSortType sort) +{ + for (CardList::iterator iter = m_cards.begin(); iter != m_cards.end(); ++iter) + { + if ((allowEnabled || !iter->GetEnabled()) && (allowDisabled || iter->GetEnabled()) && IS_TRUE(decks & BIT(iter->GetDeck()))) + { + cards->push_back(&*iter); + } + } + + if (cards->size() == 0) + { + return; + } + + if (sort == DECK_SORT_TYPE_SHUFFLE) + { + for (size_t i = 0; i < cards->size(); ++i) + { + std::swap(cards->at(i), cards->at(rand() % cards->size())); + } + } + else + { + static int (*const s_compareFuncs[])(const void*, const void*) = + { + CompareByTimeAdded, + CompareByTimeReviewPrevious, + CompareByTimeReviewNext, + CompareByDeck, + CompareByEnabled, + CompareByQuestion, + CompareByAnswer, + CompareByCountRemembered, + CompareByCountForgotten, + CompareByCountBungled + }; + + qsort(&cards->at(0), cards->size(), sizeof(FlashCard*), s_compareFuncs[sort]); + } +} + +int FlashCardManager::GetDeckSize(DeckType deck, bool allowDisabled) const +{ + int count = 0; + for (CardList::const_iterator iter = m_cards.begin(); iter != m_cards.end(); ++iter) + { + if (iter->GetDeck() == deck && (allowDisabled || iter->GetEnabled())) + { + ++count; + } + } + return count; +} + +bool FlashCardManager::RemoveCard(FlashCard* card) +{ + for (CardList::iterator iter = m_cards.begin(); iter != m_cards.end(); ++iter) + { + if (&*iter == card) + { + m_cards.erase(iter); + FlagModified(); + return true; + } + } + return false; +} + +int FlashCardManager::ExpireCards() +{ + int count = 0; + for (CardList::iterator iter = m_cards.begin(); iter != m_cards.end(); ++iter) + { + if (iter->Expire()) + { + ++count; + } + } + return count; +} diff --git a/FlashCardManager.h b/FlashCardManager.h new file mode 100644 index 0000000..7666c8c --- /dev/null +++ b/FlashCardManager.h @@ -0,0 +1,134 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once +#include "FlashCard.h" + +#define COMPARE_FUNC(name) \ + static int CompareBy##name(const void* data1, const void* data2) \ + { \ + const FlashCard* const card1 = *static_cast(data1); \ + const FlashCard* const card2 = *static_cast(data2); \ + if (card1->Get##name() > card2->Get##name()) \ + { \ + return 1; \ + } \ + if (card1->Get##name() < card2->Get##name()) \ + { \ + return -1; \ + } \ + return 0;\ + } + +struct FlashCardOptions +{ + FlashCardOptions( + time_t timeReviewMin, + time_t timeReviewMax, + int timeReviewEntropy, + bool autoSave, + const std::wstring& fontNameNormal, + const std::wstring fontNameFixed, + const int fontSizes[] + ) : + timeReviewMin(timeReviewMin), + timeReviewMax(timeReviewMax), + timeReviewEntropy(timeReviewEntropy), + autoSave(autoSave), + fontNameNormal(fontNameNormal), + fontNameFixed(fontNameFixed) + { + memcpy(this->fontSizes, fontSizes, sizeof(this->fontSizes)); + } + + FlashCardOptions() : + timeReviewMin(DAYS_TO_SECONDS(1)), + timeReviewMax(DAYS_TO_SECONDS(365)), + timeReviewEntropy(25), + autoSave(false) + { + fontSizes[0] = 9; + fontSizes[1] = 12; + fontSizes[2] = 14; + fontSizes[3] = 18; + fontSizes[4] = 24; + fontSizes[5] = 30; + fontSizes[6] = 36; + } + + static const FlashCardOptions DEFAULT; + + time_t timeReviewMin; + time_t timeReviewMax; + int timeReviewEntropy; + bool autoSave; + std::wstring fontNameNormal; + std::wstring fontNameFixed; + int fontSizes[7]; +}; + +class FlashCardManager +{ +public: + FlashCardManager(); + + bool Open(const std::wstring& filename); + bool Save(const std::wstring& filename) const; + void Close(); + void FlagModified(); + bool IsModified() const; + + const FlashCardOptions& GetOptions() const; + void SetOptions(const FlashCardOptions& options); + + FlashCard* AddCard(const std::wstring& question, const std::wstring& answer, bool enabled); + void EnumerateCards(std::vector* cards, unsigned decks, bool allowEnabled, bool allowDisabled, DeckSortType sort); + int GetDeckSize(DeckType deck, bool allowDisabled) const; + bool RemoveCard(FlashCard* card); + int ExpireCards(); + +private: + typedef std::list CardList; + + void XmlExportRoot(TiXmlDocument* parent) const; + void XmlExportOptions(TiXmlElement* parent) const; + void XmlExportDecks(TiXmlElement* parent) const; + void XmlExportDeck(TiXmlElement* parent, DeckType deck) const; + void XmlExportCard(TiXmlElement* parent, const FlashCard& card) const; + void XmlImportRoot(const TiXmlDocument* parent); + void XmlImportOptions(const TiXmlElement* parent); + void XmlImportDecks(const TiXmlElement* parent); + void XmlImportDeck(const TiXmlElement* parent, DeckType deck); + void XmlImportCard(const TiXmlElement* parent, DeckType deck); + + COMPARE_FUNC(Question); + COMPARE_FUNC(Answer); + COMPARE_FUNC(Enabled); + COMPARE_FUNC(Deck); + COMPARE_FUNC(CountRemembered); + COMPARE_FUNC(CountForgotten); + COMPARE_FUNC(CountBungled); + COMPARE_FUNC(TimeReviewPrevious); + COMPARE_FUNC(TimeReviewNext); + COMPARE_FUNC(TimeAdded); + + CardList m_cards; + FlashCardOptions m_options; + mutable bool m_modified; +}; + +#undef COMPARE_FUNC diff --git a/FlashCardManagerXml.cpp b/FlashCardManagerXml.cpp new file mode 100644 index 0000000..1d64719 --- /dev/null +++ b/FlashCardManagerXml.cpp @@ -0,0 +1,249 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "FlashCardManager.h" + +void FlashCardManager::XmlExportRoot(TiXmlDocument* parent) const +{ + TiXmlElement* const rootElement = new TiXmlElement("Meganekko"); + XmlExportOptions(rootElement); + XmlExportDecks(rootElement); + parent->LinkEndChild(rootElement); +} + +void FlashCardManager::XmlExportOptions(TiXmlElement* parent) const +{ + TiXmlElement* const optionsElement = new TiXmlElement("Options"); + + optionsElement->SetAttribute("timeReviewMin", m_options.timeReviewMin); + optionsElement->SetAttribute("timeReviewMax", m_options.timeReviewMax); + optionsElement->SetAttribute("timeReviewEntropy", m_options.timeReviewEntropy); + optionsElement->SetAttribute("autoSave", m_options.autoSave); + optionsElement->SetAttribute("fontNameNormal", wstrToUtf8(m_options.fontNameNormal).c_str()); + optionsElement->SetAttribute("fontNameFixed", wstrToUtf8(m_options.fontNameFixed).c_str()); + for (size_t i = 0; i < ARRAY_SIZE(m_options.fontSizes); ++i) + { + char attribute[16] = {0}; + sprintf(attribute, "fontSize%d", static_cast(i)); + optionsElement->SetAttribute(attribute, m_options.fontSizes[i]); + } + + parent->LinkEndChild(optionsElement); +} + +void FlashCardManager::XmlExportDecks(TiXmlElement* parent) const +{ + TiXmlElement* const decksElement = new TiXmlElement("Decks"); + + for (size_t i = 0; i < DECK_TYPES; ++i) + { + XmlExportDeck(decksElement, static_cast(i)); + } + + parent->LinkEndChild(decksElement); +} + +void FlashCardManager::XmlExportDeck(TiXmlElement* parent, DeckType deck) const +{ + TiXmlElement* const deckElement = new TiXmlElement("Deck"); + deckElement->SetAttribute("type", DeckTypeToString(deck).c_str()); + + for (CardList::const_iterator iter = m_cards.begin(); iter != m_cards.end(); ++iter) + { + if (iter->GetDeck() == deck) + { + XmlExportCard(deckElement, *iter); + } + } + + parent->LinkEndChild(deckElement); +} + +void FlashCardManager::XmlExportCard(TiXmlElement* parent, const FlashCard& card) const +{ + TiXmlElement* const cardElement = new TiXmlElement("Card"); + + TiXmlElement* const questionElement = new TiXmlElement("Question"); + TiXmlText* const questionText = new TiXmlText(wstrToUtf8(card.GetQuestion()).c_str()); + questionText->SetCDATA(true); + questionElement->LinkEndChild(questionText); + cardElement->LinkEndChild(questionElement); + + TiXmlElement* const answerElement = new TiXmlElement("Answer"); + TiXmlText* const answerText = new TiXmlText(wstrToUtf8(card.GetAnswer()).c_str()); + answerText->SetCDATA(true); + answerElement->LinkEndChild(answerText); + cardElement->LinkEndChild(answerElement); + + cardElement->SetAttribute("enabled", card.GetEnabled()); + cardElement->SetAttribute("countRemembered", card.GetCountRemembered()); + cardElement->SetAttribute("countForgotten", card.GetCountForgotten()); + cardElement->SetAttribute("countBungled", card.GetCountBungled()); + cardElement->SetAttribute("timeReviewNext", card.GetTimeReviewNext()); + cardElement->SetAttribute("timeReviewPrevious", card.GetTimeReviewPrevious()); + cardElement->SetAttribute("timeAdded", card.GetTimeAdded()); + + parent->LinkEndChild(cardElement); +} + +void FlashCardManager::XmlImportRoot(const TiXmlDocument* parent) +{ + const TiXmlElement* const rootElement = parent->RootElement(); + if (rootElement == NULL || strcmp(rootElement->Value(), "Meganekko") != 0) + { + return; + } + + for (const TiXmlElement* baseElement = rootElement->FirstChildElement(); baseElement != NULL; baseElement = baseElement->NextSiblingElement()) + { + const char* const value = baseElement->Value(); + if (strcmp(value, "Options") == 0) + { + XmlImportOptions(baseElement); + } + else if (strcmp(value, "Decks") == 0) + { + XmlImportDecks(baseElement); + } + } +} + +void FlashCardManager::XmlImportOptions(const TiXmlElement* parent) +{ + int timeReviewMin = FlashCardOptions::DEFAULT.timeReviewMin; + parent->Attribute("timeReviewMin", &timeReviewMin); + + int timeReviewMax = FlashCardOptions::DEFAULT.timeReviewMax; + parent->Attribute("timeReviewMax", &timeReviewMax); + + int timeReviewEntropy = FlashCardOptions::DEFAULT.timeReviewEntropy;; + parent->Attribute("timeReviewEntropy", &timeReviewEntropy); + + int autoSave = FlashCardOptions::DEFAULT.autoSave;; + parent->Attribute("autoSave", &autoSave); + + const char* const fontNameNormal = parent->Attribute("fontNameNormal"); + const char* const fontNameFixed = parent->Attribute("fontNameFixed"); + + for (size_t i = 0; i < ARRAY_SIZE(m_options.fontSizes); ++i) + { + char attribute[16] = {0}; + sprintf(attribute, "fontSize%d", static_cast(i)); + m_options.fontSizes[i] = FlashCardOptions::DEFAULT.fontSizes[i]; + parent->Attribute(attribute, m_options.fontSizes + i); + } + + m_options.timeReviewMin = timeReviewMin; + m_options.timeReviewMax = timeReviewMax; + m_options.timeReviewEntropy = timeReviewEntropy; + m_options.autoSave = IS_TRUE(autoSave); + m_options.fontNameNormal = fontNameNormal == NULL ? FlashCardOptions::DEFAULT.fontNameNormal : utf8toWStr(fontNameNormal); + m_options.fontNameFixed = fontNameFixed == NULL ? FlashCardOptions::DEFAULT.fontNameFixed : utf8toWStr(fontNameFixed); +} + +void FlashCardManager::XmlImportDecks(const TiXmlElement* parent) +{ + for (const TiXmlElement* decksElement = parent->FirstChildElement(); decksElement != NULL; decksElement = decksElement->NextSiblingElement()) + { + const char* const value = decksElement->Value(); + if (strcmp(value, "Deck") == 0) + { + const char* const deckString = decksElement->Attribute("type"); + const DeckType deck = deckString == NULL ? DECK_TYPE_UNTESTED : StringToDeckType(deckString); + XmlImportDeck(decksElement, deck); + } + } +} + +void FlashCardManager::XmlImportDeck(const TiXmlElement* parent, DeckType deck) +{ + for (const TiXmlElement* deckElement = parent->FirstChildElement(); deckElement != NULL; deckElement = deckElement->NextSiblingElement()) + { + const char* const value = deckElement->Value(); + if (strcmp(value, "Card") == 0) + { + XmlImportCard(deckElement, deck); + } + } +} + +void FlashCardManager::XmlImportCard(const TiXmlElement* parent, DeckType deck) +{ + std::wstring question; + std::wstring answer; + + for (const TiXmlElement* cardElement = parent->FirstChildElement(); cardElement != NULL; cardElement = cardElement->NextSiblingElement()) + { + const char* const value = cardElement->Value(); + if (strcmp(value, "Question") == 0) + { + question = utf8toWStr(cardElement->GetText()); + } + else if (strcmp(value, "Answer") == 0) + { + answer = utf8toWStr(cardElement->GetText()); + } + } + + int enabled = 0; + parent->Attribute("enabled", &enabled); + + int countRemembered = 0; + parent->Attribute("countRemembered", &countRemembered); + + int countForgotten = 0; + parent->Attribute("countForgotten", &countForgotten); + + int countBungled = 0; + parent->Attribute("countBungled", &countBungled); + + int timeReviewNext = 0; + parent->Attribute("timeReviewNext", &timeReviewNext); + + int timeReviewPrevious = 0; + parent->Attribute("timeReviewPrevious", &timeReviewPrevious); + + int timeAdded = 0; + parent->Attribute("timeAdded", &timeAdded); + + const bool valid = + timeAdded > 0 && + timeAdded <= timeReviewPrevious && + timeReviewPrevious <= timeReviewNext; + + if (!valid) + { + timeAdded = timeReviewPrevious = timeReviewNext = time(NULL); + } + + const FlashCard card( + this, + deck, + question, + answer, + IS_TRUE(enabled), + countRemembered, + countForgotten, + countBungled, + timeReviewPrevious, + timeReviewNext, + timeAdded + ); + + m_cards.push_front(card); +} diff --git a/FrameMeganekko.cpp b/FrameMeganekko.cpp new file mode 100644 index 0000000..4b58fdb --- /dev/null +++ b/FrameMeganekko.cpp @@ -0,0 +1,394 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "Pch.h" +#include "FrameMeganekko.h" +#include "DialogCardManager.h" +#include "DialogCard.h" +#include "DialogAbout.h" +#include "DialogOptions.h" + +BEGIN_EVENT_TABLE(FrameMeganekko, wxFrame) + EVT_MENU(XRCID("menuFileNew"), FrameMeganekko::OnMenuFileNew) + EVT_MENU(XRCID("menuFileOpen"), FrameMeganekko::OnMenuFileOpen) + EVT_MENU(XRCID("menuFileSave"), FrameMeganekko::OnMenuFileSave) + EVT_MENU(XRCID("menuFileSaveAs"), FrameMeganekko::OnMenuFileSaveAs) + EVT_MENU(XRCID("menuFileExit"), FrameMeganekko::OnMenuFileExit) + EVT_MENU(XRCID("menuToolsCardsManage"), FrameMeganekko::OnMenuToolsCardsManage) + EVT_MENU(XRCID("menuToolsCardsExpire"), FrameMeganekko::OnMenuToolsCardsExpire) + EVT_MENU(XRCID("menuToolsOptions"), FrameMeganekko::OnMenuToolsOptions) + EVT_MENU(XRCID("menuToolsReviewSequential"), FrameMeganekko::OnMenuToolsReviewSequential) + EVT_MENU(XRCID("menuToolsReviewStudy"), FrameMeganekko::OnMenuToolsReviewStudy) + EVT_MENU(XRCID("menuHelpHomepage"), FrameMeganekko::OnMenuHelpHomepage) + EVT_MENU(XRCID("menuHelpAbout"), FrameMeganekko::OnMenuHelpAbout) + EVT_BUTTON(XRCID("buttonExpired"), FrameMeganekko::OnButtonExpired) + EVT_BUTTON(XRCID("buttonFailed"), FrameMeganekko::OnButtonFailed) + EVT_BUTTON(XRCID("buttonUntested"), FrameMeganekko::OnButtonUntested) + EVT_BUTTON(XRCID("buttonPending"), FrameMeganekko::OnButtonPending) + EVT_CLOSE(FrameMeganekko::OnClose) +END_EVENT_TABLE() + +FrameMeganekko::FrameMeganekko(const wxString& filename) : + m_gaugeExpired(NULL), + m_gaugeFailed(NULL), + m_gaugeUntested(NULL), + m_gaugePending(NULL), + m_buttonExpired(NULL), + m_buttonFailed(NULL), + m_buttonUntested(NULL), + m_buttonPending(NULL) +{ + wxXmlResource::Get()->LoadFrame(this, NULL, wxT("FrameMeganekko")); + SetSize(wxSize(640, 480)); + + m_gaugeExpired = XRCCTRL(*this, "gaugeExpired", wxGauge); + m_gaugeFailed = XRCCTRL(*this, "gaugeFailed", wxGauge); + m_gaugeUntested = XRCCTRL(*this, "gaugeUntested", wxGauge); + m_gaugePending = XRCCTRL(*this, "gaugePending", wxGauge); + m_buttonExpired = XRCCTRL(*this, "buttonExpired", wxButton); + m_buttonFailed = XRCCTRL(*this, "buttonFailed", wxButton); + m_buttonUntested = XRCCTRL(*this, "buttonUntested", wxButton); + m_buttonPending = XRCCTRL(*this, "buttonPending", wxButton); + + if (!filename.IsEmpty()) + { + OpenDecks(filename); + } + + UpdateDecks(); +} + +void FrameMeganekko::OnMenuFileNew(wxCommandEvent& event) +{ + if (!SavePromptBail()) + { + NewDecks(); + } +} + +void FrameMeganekko::OnMenuFileOpen(wxCommandEvent& event) +{ + if (SavePromptBail()) + { + return; + } + + wxString filename = wxFileSelector( + wxT("Choose a deck file to open"), + wxEmptyString, + wxEmptyString, + wxT("mnko"), + wxT("Meganekko files|*.mnko"), + wxOPEN, + this + ); + + if (filename.IsEmpty()) + { + return; + } + +#ifdef wxGTK + // is this a bug in gtk wx? the default_extension doesn't appear to do anything + // so for now just explicitly provide an extension if one isn't specified + wxFileName temp(filename); + if (temp.GetExt().IsEmpty()) + { + temp.SetExt(wxT("mnko")); + filename = temp.GetFullPath(); + } +#endif + + OpenDecks(filename); +} + +void FrameMeganekko::OnMenuFileSave(wxCommandEvent& event) +{ + SaveDecks(); +} + +void FrameMeganekko::OnMenuFileSaveAs(wxCommandEvent& event) +{ + SaveDecksAs(); +} + +void FrameMeganekko::OnMenuFileExit(wxCommandEvent&) +{ + Close(true); +} + +void FrameMeganekko::OnMenuToolsCardsManage(wxCommandEvent& event) +{ + DialogCardManager* const dialog = new DialogCardManager(this, &m_manager); + dialog->ShowModal(); + UpdateDecks(); +} + +void FrameMeganekko::OnMenuToolsCardsExpire(wxCommandEvent& event) +{ + const int count = m_manager.ExpireCards(); + if (count == 0) + { + wxMessageBox(wxT("There are no newly expired cards"), wxT("Meganekko"), wxOK | wxICON_INFORMATION, this); + } + else + { + wxMessageBox(wxString::Format(wxT("There are %d newly expired cards"), count), wxT("Meganekko"), wxOK | wxICON_INFORMATION, this); + UpdateDecks(); + } +} + +void FrameMeganekko::OnMenuToolsOptions(wxCommandEvent& event) +{ + DialogOptions* const dialog = new DialogOptions(this, &m_manager); + dialog->ShowModal(); + UpdateDecks(); +} + +void FrameMeganekko::OnMenuToolsReviewSequential(wxCommandEvent& event) +{ + std::vector cards; + m_manager.EnumerateCards(&cards, static_cast(-1) & ~BIT(DECK_TYPE_FAILED), true, false, DECK_SORT_TYPE_TIME_REVIEW_PREVIOUS); + + if (cards.size() > 0) + { + DialogCard* const dialog = new DialogCard(this, BIT(DialogCard::CARD_CTRL_QUIZ), cards, m_manager.GetOptions()); + dialog->ShowModal(); + UpdateDecks(); + } +} + +void FrameMeganekko::OnMenuToolsReviewStudy(wxCommandEvent& event) +{ + std::vector cards; + m_manager.EnumerateCards(&cards, static_cast(-1), false, true, DECK_SORT_TYPE_TIME_ADDED); + + if (cards.size() > 0) + { + const unsigned controls = BIT(DialogCard::CARD_CTRL_ENABLED) | BIT(DialogCard::CARD_CTRL_NAVIGATE); + DialogCard* const dialog = new DialogCard(this, controls, cards, m_manager.GetOptions()); + dialog->ShowModal(); + UpdateDecks(); + } +} + +void FrameMeganekko::OnMenuHelpHomepage(wxCommandEvent& event) +{ + wxLaunchDefaultBrowser(wxT("http://foosoft.net/meganekko")); +} + +void FrameMeganekko::OnMenuHelpAbout(wxCommandEvent& event) +{ + DialogAbout* const dialog = new DialogAbout(this); + dialog->ShowModal(); +} + +void FrameMeganekko::OnButtonExpired(wxCommandEvent& event) +{ + UseDeck(DECK_TYPE_EXPIRED); +} + +void FrameMeganekko::OnButtonFailed(wxCommandEvent& event) +{ + UseDeck(DECK_TYPE_FAILED); +} + +void FrameMeganekko::OnButtonUntested(wxCommandEvent& event) +{ + UseDeck(DECK_TYPE_UNTESTED); +} + +void FrameMeganekko::OnButtonPending(wxCommandEvent& event) +{ + UseDeck(DECK_TYPE_PENDING); +} + +void FrameMeganekko::OnClose(wxCloseEvent& event) +{ + if (event.CanVeto() && SavePromptBail()) + { + event.Veto(); + } + else + { + Destroy(); + } +} + +bool FrameMeganekko::UseDeck(DeckType type) +{ + unsigned controls = BIT(DialogCard::CARD_CTRL_QUIZ); + if (type == DECK_TYPE_FAILED) + { + controls = BIT(DialogCard::CARD_CTRL_LEARNED) | BIT(DialogCard::CARD_CTRL_NAVIGATE); + } + + std::vector cards; + m_manager.EnumerateCards(&cards, BIT(type), true, false, DECK_SORT_TYPE_SHUFFLE); + + if (cards.size() > 0) + { + DialogCard* const dialog = new DialogCard(this, controls, cards, m_manager.GetOptions()); + dialog->ShowModal(); + UpdateDecks(); + } + + return cards.size() > 0; +} + +bool FrameMeganekko::SaveDecksAs() +{ + wxString filename = wxFileSelector( + wxT("Choose a deck file to save"), + wxEmptyString, + wxEmptyString, + wxT("mnko"), + wxT("Meganekko files|*.mnko"), + wxSAVE, + this + ); + + if (filename.IsEmpty()) + { + return false; + } + + m_filename = filename; + +#ifdef wxGTK + // is this a bug in gtk wx? the default_extension doesn't appear to do anything + // so for now just explicitly provide an extension if one isn't specified + wxFileName temp(m_filename); + if (temp.GetExt().IsEmpty()) + { + temp.SetExt(wxT("mnko")); + m_filename = temp.GetFullPath(); + } +#endif + + return SaveDecks(m_filename); +} + +bool FrameMeganekko::SaveDecks() +{ + return m_filename.IsEmpty() ? SaveDecksAs() : SaveDecks(m_filename); +} + +bool FrameMeganekko::SaveDecks(const wxString& filename) +{ + if (!m_manager.Save(filename.c_str())) + { + wxMessageBox(wxString::Format(wxT("Cannot save deck %s"), filename.c_str()), wxT("Meganekko"), wxOK | wxICON_ERROR, this); + return false; + } + + m_filename = filename; + UpdateDecks(); + return true; +} + +bool FrameMeganekko::OpenDecks(const wxString& filename) +{ + if (!m_manager.Open(filename.c_str())) + { + wxMessageBox(wxString::Format(wxT("Cannot open deck %s"), filename.c_str()), wxT("Meganekko"), wxOK | wxICON_ERROR, this); + return false; + } + + m_filename = filename; + UpdateDecks(); + return true; +} + +bool FrameMeganekko::NewDecks() +{ + m_manager.Close(); + m_filename.Clear(); + UpdateDecks(); + return true; +} + +void FrameMeganekko::UpdateDecks() +{ + const wxString title = wxString::Format( + wxT("Meganekko - %s %c"), + m_filename.IsEmpty() ? wxT("Untitled") : m_filename.c_str(), + m_manager.IsModified() ? '*' : ' ' + ); + SetTitle(title); + + const int expired = m_manager.GetDeckSize(DECK_TYPE_EXPIRED, false); + const int failed = m_manager.GetDeckSize(DECK_TYPE_FAILED, false); + const int untested = m_manager.GetDeckSize(DECK_TYPE_UNTESTED, false); + const int pending = m_manager.GetDeckSize(DECK_TYPE_PENDING, false); + const int total = expired + failed + untested + pending; + + float percentExpired = 0; + float percentFailed = 0; + float percentUntested = 0; + float percentPending = 0; + + if (total > 0) + { + percentExpired = 100.0f * static_cast(expired) / static_cast(total); + percentFailed = 100.0f * static_cast(failed) / static_cast(total); + percentUntested = 100.0f * static_cast(untested) / static_cast(total); + percentPending = 100.0f * static_cast(pending) / static_cast(total); + } + + m_gaugeExpired->SetValue(static_cast(percentExpired)); + m_gaugeExpired->SetToolTip(wxString::Format(wxT("%.2f%%"), percentExpired)); + m_buttonExpired->SetLabel(wxString::Format(wxT("&Expired (%d)"), expired)); + m_buttonExpired->Enable(expired > 0); + + m_gaugeFailed->SetValue(static_cast(percentFailed)); + m_gaugeFailed->SetToolTip(wxString::Format(wxT("%.2f%%"), percentFailed)); + m_buttonFailed->SetLabel(wxString::Format(wxT("F&ailed (%d)"), failed)); + m_buttonFailed->Enable(failed > 0); + + m_gaugeUntested->SetValue(static_cast(percentUntested)); + m_gaugeUntested->SetToolTip(wxString::Format(wxT("%.2f%%"), percentUntested)); + m_buttonUntested->SetLabel(wxString::Format(wxT("&Untested (%d)"), untested)); + m_buttonUntested->Enable(untested > 0); + + m_gaugePending->SetValue(static_cast(percentPending)); + m_gaugePending->SetToolTip(wxString::Format(wxT("%.2f%%"), percentPending)); + m_buttonPending->SetLabel(wxString::Format(wxT("&Pending (%d)"), pending)); + m_buttonPending->Enable(pending > 0); +} + +bool FrameMeganekko::SavePromptBail() +{ + if (!m_manager.IsModified()) + { + return false; + } + + const int result = m_manager.GetOptions().autoSave ? wxYES : wxMessageBox( + wxT("The flash card database has been modified, do you want to save?"), + wxT("Meganekko"), + wxYES_NO | wxCANCEL | wxICON_QUESTION, + this + ); + + if (result == wxNO || (result == wxYES && SaveDecks())) + { + return false; + } + + return true; +} diff --git a/FrameMeganekko.h b/FrameMeganekko.h new file mode 100644 index 0000000..6f7134c --- /dev/null +++ b/FrameMeganekko.h @@ -0,0 +1,67 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once +#include "FlashCardManager.h" + +class FrameMeganekko : public wxFrame +{ +public: + FrameMeganekko(const wxString& filename); + + void OnMenuFileNew(wxCommandEvent& event); + void OnMenuFileOpen(wxCommandEvent& event); + void OnMenuFileSave(wxCommandEvent& event); + void OnMenuFileSaveAs(wxCommandEvent& event); + void OnMenuFileExit(wxCommandEvent& event); + void OnMenuToolsCardsManage(wxCommandEvent& event); + void OnMenuToolsCardsExpire(wxCommandEvent& event); + void OnMenuToolsOptions(wxCommandEvent& event); + void OnMenuToolsReviewSequential(wxCommandEvent& event); + void OnMenuToolsReviewStudy(wxCommandEvent& event); + void OnMenuHelpHomepage(wxCommandEvent& event); + void OnMenuHelpAbout(wxCommandEvent& event); + void OnButtonExpired(wxCommandEvent& event); + void OnButtonFailed(wxCommandEvent& event); + void OnButtonUntested(wxCommandEvent& event); + void OnButtonPending(wxCommandEvent& event); + void OnClose(wxCloseEvent& event); + +private: + bool UseDeck(DeckType type); + bool SaveDecksAs(); + bool SaveDecks(); + bool SaveDecks(const wxString& filename); + bool OpenDecks(const wxString& filename); + bool NewDecks(); + void UpdateDecks(); + bool SavePromptBail(); + + DECLARE_EVENT_TABLE() + + FlashCardManager m_manager; + wxString m_filename; + + wxGauge* m_gaugeExpired; + wxGauge* m_gaugeFailed; + wxGauge* m_gaugeUntested; + wxGauge* m_gaugePending; + wxButton* m_buttonExpired; + wxButton* m_buttonFailed; + wxButton* m_buttonUntested; + wxButton* m_buttonPending; +}; diff --git a/Graphics/KuroKona.png b/Graphics/KuroKona.png new file mode 100644 index 0000000..f06c559 Binary files /dev/null and b/Graphics/KuroKona.png differ diff --git a/Graphics/file-new.png b/Graphics/file-new.png new file mode 100644 index 0000000..b54dedf Binary files /dev/null and b/Graphics/file-new.png differ diff --git a/Graphics/file-open.png b/Graphics/file-open.png new file mode 100644 index 0000000..5d0603d Binary files /dev/null and b/Graphics/file-open.png differ diff --git a/Graphics/file-save.png b/Graphics/file-save.png new file mode 100644 index 0000000..6b24a52 Binary files /dev/null and b/Graphics/file-save.png differ diff --git a/Graphics/tools-cards-expire.png b/Graphics/tools-cards-expire.png new file mode 100644 index 0000000..3d8ec34 Binary files /dev/null and b/Graphics/tools-cards-expire.png differ diff --git a/Graphics/tools-cards-manage.png b/Graphics/tools-cards-manage.png new file mode 100644 index 0000000..e31dd16 Binary files /dev/null and b/Graphics/tools-cards-manage.png differ diff --git a/Graphics/tools-cards-options.png b/Graphics/tools-cards-options.png new file mode 100644 index 0000000..beb07f1 Binary files /dev/null and b/Graphics/tools-cards-options.png differ diff --git a/License.txt b/License.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/License.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Meganekko.cbp b/Meganekko.cbp new file mode 100644 index 0000000..8b618e1 --- /dev/null +++ b/Meganekko.cbp @@ -0,0 +1,141 @@ + + + + + + diff --git a/Meganekko.fbp b/Meganekko.fbp new file mode 100644 index 0000000..9454657 --- /dev/null +++ b/Meganekko.fbp @@ -0,0 +1,6617 @@ + + + + + + XRC + 1 + UTF-8 + connect + Meganekko + 1000 + none + 0 + Meganekko + + . + + 1 + 0 + 0 + + + + + 1 + + + + 0 + wxID_ANY + + + DialogCardManager + + 640,480 + wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER + + Flash card manager + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer1 + wxHORIZONTAL + none + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + 32 + + m_splitter1 + protected + + 0.0 + 300 + -1 + + wxSPLIT_VERTICAL + + + + + + wxNO_BORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 0 + wxID_ANY + + + m_panel6 + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + wxID_ANY + Summary + + sbSizer5 + wxVERTICAL + none + + + 5 + wxEXPAND + 0 + + 2 + wxBOTH + 1 + + 0 + + fgSizer3 + wxFLEX_GROWMODE_SPECIFIED + none + 2 + 0 + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Filter text + + + m_staticText8 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + 0 + + textFilter + protected + + + wxTE_PROCESS_ENTER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Search in + + + m_staticText9 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "Question" "Answer" + + 1 + + + 0 + wxID_ANY + + + choiceSearch + protected + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Sort by + + + m_staticText26 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + "Added time" "Reviewed time" "Expiration time" "Current deck" "Enabled state" "Question text" "Answer text" "Remembered count" "Forgotten count" "Bungled count" + + 1 + + + 0 + wxID_ANY + + + choiceSort + protected + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + + 1 + + + 0 + wxID_ANY + + + checkListCards + protected + + + wxLB_EXTENDED + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER + 0 + + + bSizer17 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + + + 0 + 1 + + + 0 + wxID_ANY + &Add + + + buttonAdd + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 0 + 1 + + + 0 + wxID_ANY + &Remove + + + buttonRemove + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 0 + wxID_ANY + + + m_panel7 + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + wxID_ANY + Card + + sbSizer4 + wxVERTICAL + none + + + 5 + wxALL|wxEXPAND + 1 + + + + + 0 + + + 0 + wxID_ANY + + + notebookCard + protected + + + wxNB_BOTTOM + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + View + 1 + + + + 1 + + + 0 + wxID_ANY + + + panelHtml + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer14 + wxVERTICAL + none + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Question + + + m_staticText61 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + + htmlQuestion + protected + + + wxHW_SCROLLBAR_AUTO + + + + + wxSUNKEN_BORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Answer + + + m_staticText71 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + + htmlAnswer + protected + + + wxHW_SCROLLBAR_AUTO + + + + + wxSUNKEN_BORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Edit + 0 + + + + 1 + + + 0 + wxID_ANY + + + panelText + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer13 + wxVERTICAL + none + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Question + + + m_staticText6 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + 0 + + textQuestion + protected + + + wxTE_MULTILINE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Answer + + + m_staticText7 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + 0 + + textAnswer + protected + + + wxTE_MULTILINE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stats + 0 + + + + 1 + + + 0 + wxID_ANY + + + panelStats + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + 2 + wxBOTH + + + 0 + + fgSizer4 + wxFLEX_GROWMODE_SPECIFIED + none + 2 + 0 + + 5 + wxALIGN_RIGHT|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Current deck: + + + m_staticText43 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + - + + + staticDeck + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Remembered count: + + + m_staticText10 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + - + + + staticCountRemembered + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Forgotten count: + + + m_staticText12 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + - + + + staticCountForgotten + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Bungled count: + + + m_staticText22 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + - + + + staticCountBungled + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Added time: + + + m_staticText45 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + - + + + staticTimeAdded + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Reviewed time: + + + m_staticText16 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + - + + + staticTimeReviewPrevious + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_RIGHT|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Expiration time: + + + m_staticText18 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + - + + + staticTimeReviewNext + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + 0 + wxID_ANY + + + DialogCard + + 640,480 + wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER + + Flash card + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer9 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + 32 + + m_splitter2 + protected + + 0.5 + 0 + -1 + + wxSPLIT_VERTICAL + + + + + + wxNO_BORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 0 + wxID_ANY + + + panelQuestion + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer13 + wxVERTICAL + none + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Question + + + m_staticText42 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + + htmlQuestion + protected + + + wxHW_SCROLLBAR_AUTO + + + + + wxSUNKEN_BORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 0 + wxID_ANY + + + panelAnswer + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer14 + wxVERTICAL + none + + 5 + wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Answer + + + m_staticText43 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + wxSYS_COLOUR_GRAYTEXT + + 1 + + + 1 + wxID_ANY + + + panelConceal + protected + + + + + + + wxSUNKEN_BORDER|wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer16 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALIGN_CENTER_HORIZONTAL|wxALL + 0 + + + + 1 + 1 + + + 0 + wxID_ANY + &Show + + + buttonShow + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + + htmlAnswer + protected + + + wxHW_SCROLLBAR_AUTO + + + + + wxSUNKEN_BORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 0 + + + bSizer10 + wxVERTICAL + none + + 5 + wxEXPAND | wxALL + 1 + + + + 1 + + + 0 + wxID_ANY + + + m_panel15 + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer21 + wxHORIZONTAL + none + + 5 + wxALL + 0 + + + 0 + + 1 + + + 1 + wxID_ANY + Learned + + + checkboxLearned + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + 0 + + 1 + + + 1 + wxID_ANY + Enabled + + + checkboxEnabled + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 1 + wxID_ANY + Did you remember? + + + staticRemember + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxALL + 0 + + + + 0 + 1 + + + 1 + wxID_ANY + &Previous + + + buttonPrevious + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 0 + 1 + + + 1 + wxID_ANY + &Next + + + buttonNext + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 0 + 0 + + + 1 + wxID_ANY + &Yes + + + buttonYes + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 0 + 0 + + + 1 + wxID_ANY + &Partially + + + buttonPartially + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + + + 0 + 0 + + + 1 + wxID_ANY + &No + + + buttonNo + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + + 0 + wxID_ANY + + -1,-1 + FrameMeganekko + + 640,480 + wxDEFAULT_FRAME_STYLE + + Meganekko + + + + wxTAB_TRAVERSAL + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -1,-1 + bSizer5 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + -1,-1 + m_panel2 + protected + + -1,-1 + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer6 + wxVERTICAL + none + + 5 + wxEXPAND + 1 + + 4 + wxBOTH + 0,1,2,3 + 0 + 0 + + fgSizer6 + wxFLEX_GROWMODE_SPECIFIED + none + 2 + 0 + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + + gaugeUntested + protected + + 100 + + wxGA_SMOOTH|wxGA_VERTICAL + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + + gaugeExpired + protected + + 100 + -1,-1 + wxGA_SMOOTH|wxGA_VERTICAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + + gaugeFailed + protected + + 100 + + wxGA_SMOOTH|wxGA_VERTICAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + + gaugePending + protected + + 100 + + wxGA_SMOOTH|wxGA_VERTICAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 0 + 0 + + + 0 + wxID_ANY + &Untested + + + buttonUntested + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 0 + 0 + + + 0 + wxID_ANY + &Expired + + + buttonExpired + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 0 + 0 + + + 0 + wxID_ANY + F&ailed + + + buttonFailed + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 0 + 0 + + + 0 + wxID_ANY + &Pending + + + buttonPending + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + + + 0 + wxID_ANY + MyMenuBar + + + menubar + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + &File + menuFile + protected + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + &New + menuFileNew + none + CTRL+N + + + + + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + &Open... + menuFileOpen + none + CTRL+O + + + + + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + &Save + menuFileSave + none + CTRL+S + + + + + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + Save &as... + menuFileSaveAs + none + CTRL+SHIFT+S + + + + + + none + + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + E&xit + menuFileExit + none + CTRL+Q + + + + + + + &Tools + menuTools + protected + + &Cards + menuToolsCards + protected + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + &Manage... + menuToolsCardsManage + none + CTRL+M + + + + + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + &Expire + menuToolsCardsExpire + none + CTRL+E + + + + + + + &Review + menuToolsReview + protected + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + Seq&uential... + menuToolsReviewSequential + none + CTRL+U + + + + + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + S&tudy... + menuToolsReviewStudy + none + CTRL+T + + + + + + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + &Options... + menuToolsOptions + none + + + + + + + + &Help + menuHelp + protected + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + &Homepage... + menuHelpHomepage + none + + + + + + + + 0 + 1 + + wxID_ANY + wxITEM_NORMAL + &About... + menuHelpAbout + none + F1 + + + + + + + + + + + 1 + + + 0 + wxID_ANY + + + + m_toolBar1 + 1 + protected + + 5 + + wxTB_HORIZONTAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Graphics/file-new.png; Load From File + wxID_ANY + wxITEM_NORMAL + tool + menuFileNew + + New file + + + + + + + + Graphics/file-open.png; Load From File + wxID_ANY + wxITEM_NORMAL + tool + menuFileOpen + + Open file + + + + + + + + Graphics/file-save.png; Load From File + wxID_ANY + wxITEM_NORMAL + tool + menuFileSave + + Save file + + + + + + + + + Graphics/tools-cards-manage.png; Load From File + wxID_ANY + wxITEM_NORMAL + tool + menuToolsCardsManage + + Manage cards + + + + + + + + Graphics/tools-cards-expire.png; Load From File + wxID_ANY + wxITEM_NORMAL + tool + menuToolsCardsExpire + + Expire cards + + + + + + + + + Graphics/tools-cards-options.png; Load From File + wxID_ANY + wxITEM_NORMAL + tool + menuToolsOptions + + Options + + + + + + + + + + 255,255,255 + + + 1 + + 0,0,0 + + 0 + wxID_ANY + + + DialogAbout + + + wxDEFAULT_DIALOG_STYLE + + About + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer14 + wxHORIZONTAL + none + + 5 + + 0 + + + Graphics/KuroKona.png; Load From File + + 1 + + + 0 + wxID_ANY + + + m_bitmap1 + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 1 + + + bSizer15 + wxVERTICAL + none + + 5 + wxALL + 0 + + + + 1 + + ,90,90,16,70,0 + 0 + wxID_ANY + Meganekko + + + m_staticText23 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND|wxLEFT|wxRIGHT + 0 + + + + 1 + + + 0 + wxID_ANY + + + m_staticline2 + protected + + + wxLI_HORIZONTAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxLEFT|wxRIGHT|wxTOP + 0 + + + + 1 + + + 0 + wxID_ANY + Flash card manager for Japanese and other things + + + m_staticText24 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxLEFT|wxRIGHT + 0 + + + + 1 + + + 0 + wxID_ANY + Version 1.0 by Alex Yatskov <alex@foosoft.net> + + + m_staticText25 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxBOTTOM|wxLEFT|wxRIGHT + 0 + + + + 1 + + + 0 + wxID_ANY + Please see License.txt for license information + + + m_staticText27 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL + 0 + + 255,255,255 + + 1 + + + 0 + + wxID_ANY + http://foosoft.net/meganekko + + + m_hyperlink1 + + protected + + + wxHL_DEFAULT_STYLE + + + http://foosoft.net/meganekko + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + 0 + protected + 0 + + + + 5 + wxEXPAND + 0 + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + + m_sdbSizer1 + protected + + + + + + + + + + + + + + + + + + + 1 + + + + 0 + wxID_ANY + + + DialogOptions + + 500,350 + wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER + + Options + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer16 + wxVERTICAL + none + + 5 + wxEXPAND | wxALL + 1 + + + + + 1 + + + 0 + wxID_ANY + + + m_notebook2 + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Review + 1 + + + + 1 + + + 0 + wxID_ANY + + + m_panel12 + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer18 + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + 3 + wxBOTH + 1 + + 0 + + fgSizer6 + wxFLEX_GROWMODE_SPECIFIED + none + 3 + 0 + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Minimum review interval + + + m_staticText46 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + 365 + + 1 + + spinTimeReviewMin + protected + + + wxSP_ARROW_KEYS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + days + + + m_staticText50 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Maximum review interval + + + m_staticText48 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + 365 + + 1 + + spinTimeReviewMax + protected + + + wxSP_ARROW_KEYS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + days + + + m_staticText51 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Review interval entropy + + + m_staticText49 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 100 + + 0 + + sliderTimeReviewEntropy + protected + + + wxSL_HORIZONTAL|wxSL_LABELS + + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + % + + + m_staticText52 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HTML + 0 + + + + 1 + + + 0 + wxID_ANY + + + m_panel13 + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer20 + wxVERTICAL + none + + 5 + wxEXPAND + 0 + + 2 + wxBOTH + 1 + + 0 + + fgSizer4 + wxFLEX_GROWMODE_SPECIFIED + none + 2 + 0 + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Normal font name + + + m_staticText28 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + textFontNameNormal + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Fixed font name + + + m_staticText29 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + + 0 + + textFontNameFixed + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND | wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + + + m_staticline3 + protected + + + wxLI_HORIZONTAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + Font point sizes for HTML sizes -2 to +4 + + + m_staticText37 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxEXPAND + 1 + + 6 + wxBOTH + 1,3,5 + + 0 + + fgSizer5 + wxFLEX_GROWMODE_SPECIFIED + none + 4 + 0 + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + -2 + + + m_staticText39 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + 128 + + 0 + + spinFontSize0 + protected + + + wxSP_ARROW_KEYS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + -1 + + + m_staticText40 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + 128 + + 0 + + spinFontSize1 + protected + + + wxSP_ARROW_KEYS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + + + m_staticText41 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + 128 + + 0 + + spinFontSize2 + protected + + + wxSP_ARROW_KEYS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + 1 + + + m_staticText42 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + 128 + + 0 + + spinFontSize3 + protected + + + wxSP_ARROW_KEYS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + 2 + + + m_staticText43 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + 128 + + 0 + + spinFontSize4 + protected + + + wxSP_ARROW_KEYS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + 3 + + + m_staticText44 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + 128 + + 0 + + spinFontSize5 + protected + + + wxSP_ARROW_KEYS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALIGN_CENTER_VERTICAL|wxALL + 0 + + + + 1 + + + 0 + wxID_ANY + 4 + + + m_staticText45 + protected + + + + + + + + + -1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + + + 1 + + + 0 + wxID_ANY + 0 + 128 + + 0 + + spinFontSize6 + protected + + + wxSP_ARROW_KEYS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Misc + 0 + + + + 1 + + + 0 + wxID_ANY + + + m_panel14 + protected + + + + + + + wxTAB_TRAVERSAL + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer201 + wxVERTICAL + none + + 5 + wxALL + 0 + + + 0 + + 1 + + + 0 + wxID_ANY + Auto save decks on close + + + checkAutoSave + protected + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + + m_sdbSizer2 + protected + + + + + + + + + + + + + + + + + 1 + + + + 0 + wxID_ANY + + + DialogCardEditor + + 500,300 + wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER + + Card editor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bSizer21 + wxVERTICAL + none + + 5 + wxALL|wxEXPAND + 1 + + + + 1 + + + 0 + wxID_ANY + + 0 + + textEdit + protected + + + wxTE_MULTILINE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + wxALL|wxEXPAND + 0 + + 0 + 1 + 0 + 0 + 0 + 1 + 0 + 0 + + m_sdbSizer3 + protected + + + + + + + + + + + + + + diff --git a/Meganekko.layout b/Meganekko.layout new file mode 100644 index 0000000..1053280 --- /dev/null +++ b/Meganekko.layout @@ -0,0 +1,4 @@ + + + + diff --git a/Meganekko.sln b/Meganekko.sln new file mode 100644 index 0000000..69fed2b --- /dev/null +++ b/Meganekko.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Meganekko", "Meganekko.vcproj", "{0FF0EEAD-98A7-4EE0-B5A3-C3911A222F91}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0FF0EEAD-98A7-4EE0-B5A3-C3911A222F91}.Debug|Win32.ActiveCfg = Debug|Win32 + {0FF0EEAD-98A7-4EE0-B5A3-C3911A222F91}.Debug|Win32.Build.0 = Debug|Win32 + {0FF0EEAD-98A7-4EE0-B5A3-C3911A222F91}.Release|Win32.ActiveCfg = Release|Win32 + {0FF0EEAD-98A7-4EE0-B5A3-C3911A222F91}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Meganekko.vcproj b/Meganekko.vcproj new file mode 100644 index 0000000..93c9018 --- /dev/null +++ b/Meganekko.vcproj @@ -0,0 +1,625 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Meganekko.xrc b/Meganekko.xrc new file mode 100644 index 0000000..a6442b2 --- /dev/null +++ b/Meganekko.xrc @@ -0,0 +1,1316 @@ + + + + + 640,480 + Flash card manager + + wxHORIZONTAL + + + wxALL|wxEXPAND + 5 + + + 300 + 0 + 32 + vertical + + + + wxVERTICAL + + + + wxEXPAND + 5 + + 2 + 2 + 0 + 0 + 1 + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + 0 + + Question + Answer + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + 0 + + Added time + Reviewed time + Expiration time + Current deck + Enabled state + Question text + Answer text + Remembered count + Forgotten count + Bungled count + + + + + + + + wxALL|wxEXPAND + 5 + + + + + + + + wxALIGN_CENTER + 5 + + wxHORIZONTAL + + + wxALL + 5 + + + 0 + + + + + wxALL + 5 + + + 0 + + + + + + + + + + wxVERTICAL + + + + wxALL|wxEXPAND + 5 + + + 0 + + + 1 + + + + wxVERTICAL + + + wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + + + + + wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + + + + + + + + 0 + + + + wxVERTICAL + + + wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + + 0 + + + + + wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + + 0 + + + + + + + + 0 + + + + 2 + 2 + 0 + 0 + + + + + wxALIGN_RIGHT|wxALL + 5 + + + + + + + wxALL + 5 + + + + + + + wxALIGN_RIGHT|wxALL + 5 + + + + + + + wxALL + 5 + + + + + + + wxALIGN_RIGHT|wxALL + 5 + + + + + + + wxALL + 5 + + + + + + + wxALIGN_RIGHT|wxALL + 5 + + + + + + + wxALL + 5 + + + + + + + wxALIGN_RIGHT|wxALL + 5 + + + + + + + wxALL + 5 + + + + + + + wxALIGN_RIGHT|wxALL + 5 + + + + + + + wxALL + 5 + + + + + + + wxALIGN_RIGHT|wxALL + 5 + + + + + + + wxALL + 5 + + + + + + + + + + + + + + + + + + 640,480 + Flash card + + wxVERTICAL + + + wxEXPAND + 5 + + + 0 + 0.5 + 32 + vertical + + + + wxVERTICAL + + + wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + + + + + + + + wxVERTICAL + + + wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + #92918e + 1 + + wxVERTICAL + + + wxEXPAND + 5 + 0,0 + + + + wxALIGN_CENTER_HORIZONTAL|wxALL + 5 + + + 1 + + + + + wxEXPAND + 5 + 0,0 + + + + + + + wxALL|wxEXPAND + 5 + + + + + + + + + + + wxEXPAND + 5 + + wxVERTICAL + + + wxEXPAND | wxALL + 5 + + + + wxHORIZONTAL + + + wxALL + 5 + + 1 + + 0 + + + + + wxALL + 5 + + 1 + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + 1 + + + + + + wxEXPAND + 5 + 0,0 + + + + wxALL + 5 + + 1 + + 0 + + + + + wxALL + 5 + + 1 + + 0 + + + + + wxALL + 5 + + 0 + 1 + + 0 + + + + + wxALL + 5 + + 0 + 1 + + 0 + + + + + wxALL + 5 + + 0 + 1 + + 0 + + + + + + + + + + + + 640,480 + Meganekko + + + + wxVERTICAL + + + wxEXPAND + 5 + + 2 + 4 + 0 + 0 + 0,1,2,3 + 0 + + + wxALL|wxEXPAND + 5 + + + 100 + 0 + + + + + wxALL|wxEXPAND + 5 + + + 100 + 0 + + + + + wxALL|wxEXPAND + 5 + + + 100 + 0 + + + + + wxALL|wxEXPAND + 5 + + + 100 + 0 + + + + + wxALL|wxEXPAND + 5 + + 0 + + 0 + + + + + wxALL|wxEXPAND + 5 + + 0 + + 0 + + + + + wxALL|wxEXPAND + 5 + + 0 + + 0 + + + + + wxALL|wxEXPAND + 5 + + 0 + + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 5 + + + New file + + Graphics/file-new.png + + + + Open file + + Graphics/file-open.png + + + + Save file + + Graphics/file-save.png + + + + + Manage cards + + Graphics/tools-cards-manage.png + + + + Expire cards + + Graphics/tools-cards-expire.png + + + + + Options + + Graphics/tools-cards-options.png + + + + + + #ffffff + #000000 + About + + wxHORIZONTAL + + + + 5 + + Graphics/KuroKona.png + + + + + wxALL|wxEXPAND + 5 + + wxVERTICAL + + + wxALL + 5 + + + 16 + default + + normal + 0 + + + + + + + wxEXPAND|wxLEFT|wxRIGHT + 5 + + + + + + + wxLEFT|wxRIGHT|wxTOP + 5 + + + + + + + wxLEFT|wxRIGHT + 5 + + + + + + + wxBOTTOM|wxLEFT|wxRIGHT + 5 + + + + + + + wxALL + 5 + + + http://foosoft.net/meganekko + + #ffffff + + + + + wxEXPAND + 5 + 0,0 + + + + wxEXPAND + 5 + + + wxALIGN_CENTER_HORIZONTAL|wxALL + 5 + + + + + + + + + + + + + 500,350 + Options + + wxVERTICAL + + + wxEXPAND | wxALL + 5 + + + + 1 + + + + wxVERTICAL + + + wxEXPAND + 5 + + 3 + 3 + 0 + 0 + 1 + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 1 + 365 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 1 + 365 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 0 + 100 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + + + + + + 0 + + + + wxVERTICAL + + + wxEXPAND + 5 + + 2 + 2 + 0 + 0 + 1 + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + + + + + + + wxEXPAND | wxALL + 5 + + + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxEXPAND + 5 + + 4 + 6 + 0 + 0 + 1,3,5 + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 0 + 128 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 0 + 128 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 0 + 128 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 0 + 128 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 0 + 128 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 0 + 128 + + + + + wxALIGN_CENTER_VERTICAL|wxALL + 5 + + + + + + + wxALL|wxEXPAND + 5 + + + 0 + 0 + 128 + + + + + + + + + + 0 + + + + wxVERTICAL + + + wxALL + 5 + + + 0 + + + + + + + + + + wxALL|wxEXPAND + 5 + + + wxALIGN_CENTER_HORIZONTAL|wxALL + 5 + + + + + + wxALIGN_CENTER_HORIZONTAL|wxALL + 5 + + + + + + + + + + + 500,300 + Card editor + + wxVERTICAL + + + wxALL|wxEXPAND + 5 + + + + 0 + + + + + wxALL|wxEXPAND + 5 + + + wxALIGN_CENTER_HORIZONTAL|wxALL + 5 + + + + + + wxALIGN_CENTER_HORIZONTAL|wxALL + 5 + + + + + + + + + diff --git a/Pch.h b/Pch.h new file mode 100644 index 0000000..2d882f5 --- /dev/null +++ b/Pch.h @@ -0,0 +1,46 @@ +/* + Meganekko Copyright (C) 2008 Alex Yatskov + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef PCH_H +#define PCH_H + +// wx +#include +#include +#include +#include +#include +#include +#include + +// stl +#include +#include +#include +#include +#include + +// crt +#include +#include + +// project +#include "Common.h" +#include "Util.h" +#include "tinyxml.h" + +#endif diff --git a/Pch.h.gch b/Pch.h.gch new file mode 100644 index 0000000..a815507 Binary files /dev/null and b/Pch.h.gch differ diff --git a/Resource.cpp b/Resource.cpp new file mode 100644 index 0000000..de60bd1 --- /dev/null +++ b/Resource.cpp @@ -0,0 +1,4748 @@ +// +// This file was automatically generated by wxrc, do not edit by hand. +// + +#include + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#include +#include +#include +#include + +#if wxCHECK_VERSION(2,8,5) && wxABI_VERSION >= 20805 + #define XRC_ADD_FILE(name, data, size, mime) \ + wxMemoryFSHandler::AddFileWithMimeType(name, data, size, mime) +#else + #define XRC_ADD_FILE(name, data, size, mime) \ + wxMemoryFSHandler::AddFile(name, data, size) +#endif + +static size_t xml_res_size_0 = 999; +static unsigned char xml_res_file_0[] = { +137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,24,0,0,0,24,16,6,0, +0,0,176,231,225,187,0,0,0,6,98,75,71,68,0,252,0,233,0,79,52,215,177,13, +0,0,0,9,112,72,89,115,0,0,13,215,0,0,13,215,1,66,40,155,120,0,0,0,9,118, +112,65,103,0,0,0,24,0,0,0,24,0,120,76,165,166,0,0,3,114,73,68,65,84,88, +195,213,87,207,79,19,65,20,254,222,76,183,132,18,149,80,104,109,76,60,121, +48,196,147,137,17,72,248,7,184,112,224,196,205,120,229,76,72,140,92,140, +26,127,252,19,30,184,24,15,134,187,193,144,144,0,37,92,32,192,9,122,129, +166,208,132,16,82,107,219,197,121,30,158,227,238,78,187,216,74,213,248, +146,237,236,252,216,153,239,123,239,123,111,187,192,127,110,244,175,1,88, +187,184,56,62,158,156,164,31,120,60,79,90,223,79,36,178,217,197,69,230, +142,9,188,122,245,230,205,139,23,207,158,73,111,126,254,79,1,87,138,200, +24,32,157,238,239,175,213,128,92,110,104,168,82,1,180,86,138,25,168,215, +27,13,165,222,189,155,152,24,31,47,20,102,102,132,80,181,106,159,79,92, +190,253,252,252,220,220,236,236,147,39,221,7,206,204,236,251,226,229,221, +93,192,152,106,117,105,9,240,125,230,116,26,96,6,82,41,224,244,244,228, +100,111,239,209,35,102,64,235,207,159,37,82,239,223,11,145,122,61,209,238, +129,133,66,161,80,40,0,90,107,173,181,0,96,6,136,136,136,130,214,90,220, +184,128,7,60,143,168,88,4,82,41,165,62,125,2,180,246,188,222,94,128,57, +153,156,154,2,136,180,30,24,0,174,95,31,28,92,94,6,152,141,249,240,97,122, +154,136,249,236,108,115,83,118,218,217,81,237,18,112,1,185,192,44,33,185, +11,250,204,198,216,190,93,251,237,155,72,167,82,145,125,234,117,128,153, +104,112,80,68,53,48,96,229,37,109,79,143,125,46,149,146,187,27,55,126,74, +176,91,4,0,219,115,215,41,69,4,40,37,112,136,136,180,6,140,33,186,118,13, +48,6,24,26,2,136,46,46,14,14,68,82,43,43,0,96,204,241,49,208,104,212,106, +249,60,64,196,252,229,203,246,182,156,113,122,122,101,2,74,9,164,160,31, +204,135,199,3,162,50,174,148,37,0,220,188,9,212,106,192,232,40,208,104, +48,223,185,3,0,141,198,198,6,144,72,248,254,199,143,192,193,193,254,254, +225,161,184,199,152,133,5,65,83,44,90,92,109,231,128,11,188,57,7,108,12, +236,111,115,164,164,149,136,16,1,201,164,72,231,214,45,192,247,129,116, +90,228,53,60,12,244,246,246,245,121,30,144,207,111,111,159,159,3,247,239, +223,189,91,44,110,109,201,78,95,191,118,28,129,141,141,205,205,124,62,62, +34,86,58,110,100,154,91,123,5,145,146,162,160,84,95,31,192,172,245,237, +219,0,81,50,121,239,30,80,169,84,171,158,7,216,242,233,190,23,218,38,240, +240,225,131,7,35,35,64,46,151,203,229,114,151,107,220,182,81,34,214,243, +97,186,81,9,202,250,32,155,220,236,106,101,29,75,168,84,42,149,74,165,240, +193,204,22,186,253,117,165,18,126,62,72,242,96,60,10,244,50,184,93,32,224, +182,204,68,54,23,92,64,173,165,22,71,200,58,164,19,248,29,16,104,62,88, +204,86,159,176,247,163,82,145,72,4,243,238,250,168,223,195,235,219,177, +182,249,174,173,173,175,175,174,254,218,131,193,120,107,224,113,57,64,228, +102,81,151,9,140,142,142,140,140,141,1,153,76,38,147,201,180,170,255,86, +243,54,169,229,10,39,175,141,142,204,185,227,209,249,118,173,227,28,40, +151,203,229,114,57,190,140,186,17,137,238,209,76,40,46,162,93,39,112,25, +53,91,46,221,227,163,128,195,80,91,173,11,191,2,255,32,129,102,207,5,0, +93,96,209,184,52,3,13,239,71,196,28,157,255,75,17,104,174,34,238,95,11, +183,218,68,129,135,35,21,221,177,203,4,178,217,108,54,155,189,42,221,238, +91,44,1,99,140,49,230,249,243,215,175,223,190,125,249,242,233,211,127,5, +240,232,232,240,176,88,124,252,56,110,254,55,63,234,59,123,221,95,221,226, +63,234,255,123,251,14,48,13,44,71,192,5,37,109,0,0,0,0,73,69,78,68,174, +66,96,130}; + +static size_t xml_res_size_1 = 1596; +static unsigned char xml_res_file_1[] = { +137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,24,0,0,0,24,16,6,0, +0,0,176,231,225,187,0,0,0,6,98,75,71,68,0,255,0,255,0,255,160,189,167,147, +0,0,0,9,112,72,89,115,0,0,13,215,0,0,13,215,1,66,40,155,120,0,0,0,9,118, +112,65,103,0,0,0,24,0,0,0,24,0,120,76,165,166,0,0,5,199,73,68,65,84,88, +195,237,86,77,76,19,91,20,254,102,90,232,116,166,165,148,194,0,165,160, +8,81,148,191,24,52,40,154,152,152,184,53,49,15,53,46,72,76,140,107,53,26, +119,106,162,110,149,157,11,93,144,160,160,132,159,196,68,22,36,186,112, +97,100,33,127,21,42,127,90,8,164,45,80,106,153,182,64,59,127,111,113,51, +78,91,64,20,245,189,188,228,125,73,123,103,238,220,51,115,190,115,190,123, +207,1,254,227,160,118,106,216,218,250,236,89,75,203,185,115,0,69,1,29,29, +178,44,73,178,12,168,42,249,237,216,33,138,252,180,247,168,170,170,2,247, +239,95,186,116,241,226,229,203,183,110,253,54,230,157,157,61,61,207,159, +171,127,12,130,32,8,130,160,170,173,173,109,109,45,45,91,135,196,168,93, +52,53,53,53,53,53,213,213,41,10,32,203,189,189,20,69,81,52,157,28,23,242, +207,178,44,107,54,211,180,36,137,162,44,235,47,146,101,89,150,164,228,213, +63,7,69,81,20,69,209,239,37,73,146,68,17,200,204,204,204,204,204,220,218, +238,27,1,65,16,132,112,248,241,227,43,87,174,94,189,118,45,63,127,43,131, +133,133,197,69,191,31,112,58,157,206,162,34,125,126,104,104,104,104,104, +8,240,249,252,126,191,31,160,105,138,210,105,3,155,9,43,249,137,162,16, +177,216,237,118,123,118,54,80,85,85,89,89,85,181,145,216,150,4,20,5,80, +85,73,138,70,163,209,104,20,24,28,28,24,24,24,208,23,178,44,199,177,44, +224,114,149,148,56,157,64,67,195,145,35,199,142,1,225,112,56,28,10,1,229, +229,229,229,229,229,64,69,69,69,197,190,125,0,77,211,180,193,144,236,160, +162,104,154,214,168,36,207,107,247,70,163,209,104,52,146,64,4,2,36,19,90, +102,183,33,32,203,138,178,178,98,50,49,140,205,6,56,28,14,71,110,174,190, +208,225,224,249,236,108,160,161,161,190,254,248,113,32,22,139,197,98,49, +96,118,118,118,118,118,22,248,240,129,16,102,24,179,217,108,222,60,202, +154,52,146,29,50,153,136,68,118,237,42,41,41,41,1,42,43,73,228,23,23,151, +150,2,1,192,98,177,88,44,150,31,32,64,211,6,3,69,113,92,34,177,190,46,8, +162,200,48,12,195,48,25,25,218,139,178,178,236,118,142,3,204,102,226,160, +215,235,245,78,79,3,162,72,28,170,174,174,169,169,170,2,40,74,85,147,247, +0,69,209,52,57,85,72,164,181,157,69,81,68,98,138,34,203,170,10,240,124, +126,126,65,1,48,62,62,49,49,49,65,198,241,113,18,200,156,156,7,15,182,37, +64,28,118,187,253,254,64,192,231,59,124,152,101,205,102,142,3,56,142,68, +224,228,201,19,39,78,157,2,130,193,96,112,105,9,248,242,197,235,157,153, +1,34,145,104,52,18,209,99,172,31,163,68,187,90,228,117,82,132,144,209,104, +52,26,12,128,217,204,48,102,51,192,243,60,207,243,192,199,143,99,99,35, +35,64,78,78,78,142,221,254,240,225,153,51,167,79,55,54,222,184,177,21,129, +111,175,61,123,246,252,249,191,254,186,121,179,182,182,166,166,182,246, +206,29,151,203,229,42,46,102,89,134,97,217,140,12,32,59,219,110,47,44,4, +218,219,251,250,220,110,192,227,9,135,243,242,176,99,48,140,193,144,124, +138,173,175,203,178,182,103,190,135,189,123,45,150,133,133,254,254,246, +246,230,230,235,215,143,30,53,166,62,158,153,9,133,66,161,175,95,69,177, +180,180,172,108,247,110,224,224,193,154,154,67,135,128,238,238,151,47,123, +123,129,166,166,11,23,72,249,210,78,25,93,44,218,61,41,70,228,94,27,147, +55,111,178,132,126,22,205,205,79,158,116,117,237,223,191,65,66,4,161,80, +60,30,143,39,18,162,40,203,178,44,203,128,213,106,181,90,173,64,127,255, +220,28,195,0,213,213,137,132,162,0,30,143,207,23,139,237,60,3,63,11,167, +211,110,103,24,32,26,141,199,85,85,63,6,232,212,101,99,99,193,96,48,184, +184,40,138,178,76,54,167,207,23,8,248,124,64,102,166,193,160,105,250,87, +90,133,157,66,16,66,161,229,101,85,93,95,151,36,131,97,126,126,3,129,206, +206,142,142,238,110,191,159,97,24,198,108,86,85,171,213,106,181,217,128, +104,52,18,17,4,160,174,238,192,129,162,34,173,55,249,231,96,179,145,61, +24,139,173,173,197,227,138,226,114,197,98,111,222,232,155,154,78,55,16, +132,149,149,149,149,120,92,81,72,162,94,188,120,245,234,221,59,160,176, +144,231,29,14,32,28,94,91,35,77,155,118,214,144,43,173,94,106,133,41,121, +76,158,255,158,93,250,168,170,0,203,154,76,6,3,48,55,231,247,7,131,162, +72,188,28,27,211,252,53,166,19,224,56,139,133,227,6,6,62,127,158,154,242, +122,75,75,11,11,93,174,178,50,192,98,201,203,43,41,1,124,190,112,56,145, +0,214,215,37,41,181,196,167,86,88,114,230,235,157,165,54,175,207,233,37, +110,179,156,230,228,88,44,25,25,128,36,145,58,225,118,123,60,211,211,115, +115,111,223,18,165,108,73,128,124,102,104,136,180,20,141,141,5,5,123,246, +20,23,3,161,80,52,42,73,128,223,31,10,197,227,155,37,155,162,180,74,144, +220,14,83,84,234,124,242,186,84,59,253,251,20,5,36,18,196,241,193,193,193, +65,183,91,20,121,126,117,245,253,251,123,247,210,191,154,70,192,100,154, +159,159,159,247,249,220,110,171,53,43,203,106,85,148,250,122,167,147,231, +105,122,108,108,113,81,146,54,139,124,42,245,244,235,244,163,50,61,43,233, +118,60,111,179,153,76,128,40,202,178,162,0,227,227,30,143,219,189,180,244, +250,117,71,71,119,247,211,167,219,16,200,205,29,29,29,29,29,29,229,184, +130,130,194,194,130,2,154,238,235,251,244,105,117,21,63,0,34,5,77,38,201, +146,73,149,207,198,136,39,219,73,146,36,145,231,145,72,32,32,203,192,234, +234,194,66,87,23,89,171,53,248,122,8,211,8,68,34,193,96,48,24,12,78,78, +142,140,12,15,15,15,223,189,203,113,22,139,199,115,251,246,143,80,248,157, +144,164,229,229,201,201,169,169,225,225,158,158,71,143,218,218,200,172, +214,214,9,194,183,140,110,110,206,48,100,100,217,84,67,109,164,105,252, +81,104,57,74,36,200,168,105,32,20,34,227,218,218,54,4,182,130,230,248,78, +154,128,95,129,38,153,127,163,132,254,143,239,227,111,199,114,166,90,247, +143,176,204,0,0,0,0,73,69,78,68,174,66,96,130}; + +static size_t xml_res_size_2 = 1755; +static unsigned char xml_res_file_2[] = { +137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,24,0,0,0,24,16,6,0, +0,0,176,231,225,187,0,0,0,6,98,75,71,68,0,255,0,255,0,255,160,189,167,147, +0,0,0,9,112,72,89,115,0,0,13,215,0,0,13,215,1,66,40,155,120,0,0,0,9,118, +112,65,103,0,0,0,24,0,0,0,24,0,120,76,165,166,0,0,6,102,73,68,65,84,88, +195,213,86,73,76,19,111,20,127,51,165,27,29,74,167,101,134,182,88,74,1, +107,17,100,51,160,184,99,226,1,35,70,47,122,208,139,65,15,162,81,113,9, +198,229,160,70,3,26,209,16,225,224,146,184,129,146,200,197,3,26,67,140, +196,24,21,18,220,17,67,193,218,20,139,148,182,148,78,247,101,254,135,201, +56,216,218,224,250,79,252,37,147,47,239,125,219,251,189,237,27,128,127, +28,200,76,11,118,238,60,121,178,190,254,202,149,79,159,40,74,173,94,183, +206,102,115,56,130,65,185,60,209,122,177,152,207,167,105,143,135,36,49, +204,237,30,24,72,79,151,72,222,191,175,171,107,110,62,122,244,206,157,39, +79,254,55,2,45,45,215,174,213,213,21,23,119,118,190,120,161,211,245,246, +102,101,233,245,121,121,129,128,86,155,158,78,146,40,234,118,135,66,40, +42,18,101,100,72,165,34,17,138,126,254,236,118,7,131,0,14,135,207,23,8, +0,76,78,126,248,208,221,61,50,226,245,122,60,126,191,80,168,211,225,248, +224,96,125,125,107,235,177,99,237,237,109,109,127,138,0,47,145,225,221, +221,131,131,42,85,103,103,102,102,97,225,138,21,50,153,201,100,52,14,14, +10,4,195,195,38,147,201,196,231,155,205,31,63,14,15,163,168,217,60,49,97, +183,3,240,249,41,41,114,57,0,142,139,68,2,1,128,72,68,16,185,185,56,62, +57,233,243,69,163,82,233,232,168,205,38,18,85,85,85,87,175,89,163,80,244, +247,247,246,62,122,244,238,157,209,248,187,4,208,88,197,243,231,67,67,34, +81,99,227,172,89,105,105,73,73,38,19,69,25,141,15,30,124,248,80,94,78,16, +207,158,109,222,220,211,211,212,84,91,139,162,75,151,106,181,125,125,85, +85,161,144,203,53,58,58,53,101,177,12,15,191,125,75,211,227,227,83,83,110, +55,128,219,237,241,80,20,0,142,147,164,74,5,32,145,144,164,70,35,20,190, +121,99,179,21,21,221,190,189,127,255,137,19,213,213,18,201,31,39,224,116, +122,189,98,113,110,46,143,23,137,80,148,203,181,108,217,236,217,22,203, +170,85,167,78,237,219,119,249,242,173,91,236,186,134,134,3,7,110,222,188, +127,191,172,76,163,177,88,142,31,167,40,167,211,233,68,16,143,103,106,202, +225,0,8,6,253,126,175,151,59,151,36,53,154,217,179,81,148,32,36,146,96, +208,108,158,152,8,6,117,186,214,214,223,37,16,87,3,155,54,29,58,180,119, +239,221,187,58,157,80,24,10,189,126,61,53,229,116,70,163,135,15,39,58,64, +40,20,139,17,4,224,241,99,135,67,171,5,200,202,202,207,47,45,77,124,161, +76,230,243,13,12,0,76,76,124,249,50,54,6,160,86,71,163,147,147,51,153,89, +95,223,220,124,254,124,75,203,233,211,177,51,73,177,10,141,70,42,117,187, +239,221,243,122,237,118,129,160,181,181,161,225,212,169,51,103,102,246, +196,202,149,117,117,45,45,51,175,243,251,21,138,5,11,0,44,150,145,145,158, +30,128,235,215,207,157,75,236,30,128,131,7,15,29,58,112,160,177,145,145, +226,9,196,165,144,215,59,54,38,16,12,13,225,184,76,70,16,0,94,175,215,59, +61,21,60,30,143,199,227,137,31,227,13,245,249,190,167,231,241,248,124,129, +32,241,121,102,179,197,98,54,115,50,65,16,4,65,0,236,218,181,103,207,142, +29,197,197,51,70,128,65,78,142,82,169,84,170,84,156,134,162,152,162,196, +48,137,4,195,126,220,227,177,160,233,104,52,26,229,228,245,235,143,31,111, +111,7,8,135,131,193,96,16,160,163,227,240,225,13,27,184,121,28,199,113, +28,7,176,217,108,54,155,77,175,103,180,47,95,38,140,0,131,181,107,75,74, +138,138,74,75,1,124,62,159,207,231,3,64,16,230,139,245,184,193,80,86,182, +124,57,55,166,166,226,56,65,112,243,129,64,32,224,247,79,151,125,62,183, +27,32,55,183,184,120,225,66,128,236,236,130,130,178,50,110,62,57,89,44, +78,78,230,228,197,139,43,42,150,44,97,165,121,243,98,45,77,64,96,245,106, +181,90,173,206,200,72,236,201,139,23,119,239,174,172,4,48,26,95,189,122, +250,148,211,91,173,22,203,200,8,227,107,154,6,136,68,194,225,80,136,75, +41,183,219,229,114,58,185,245,35,35,111,223,246,245,1,92,184,80,91,187, +104,81,252,61,26,141,70,163,213,178,210,145,35,9,9,176,57,38,22,51,30,16, +8,4,2,129,0,64,161,80,40,20,138,248,131,85,42,130,208,106,1,154,154,106, +106,230,207,7,24,28,236,235,235,233,1,144,203,9,66,173,6,136,70,25,2,211, +147,135,166,1,164,82,153,76,161,0,48,26,95,190,124,246,140,219,175,213, +170,213,108,130,0,0,72,36,18,201,244,87,2,199,113,92,161,136,175,133,152, +8,232,245,233,233,36,169,84,114,26,167,211,233,116,58,185,3,217,17,69,81, +20,69,1,116,186,140,140,57,115,0,154,155,183,111,175,168,136,39,130,162, +8,130,32,0,24,150,154,42,151,115,134,179,235,217,253,177,231,179,247,178, +72,77,149,74,83,83,57,59,19,16,152,55,111,238,220,188,188,252,124,128,80, +40,20,10,133,104,58,41,41,41,137,199,3,112,185,92,46,151,139,59,88,44,22, +139,197,98,238,194,130,2,189,190,180,20,224,210,165,186,186,202,74,142, +136,76,150,150,166,82,1,152,76,3,3,253,253,220,60,187,62,214,96,118,140, +68,34,145,112,24,128,162,40,138,162,104,58,39,39,59,59,39,135,181,179,162, +34,142,64,32,16,8,4,2,133,133,74,165,82,169,84,2,96,24,134,97,24,130,132, +195,225,112,36,2,16,141,126,219,61,98,47,100,71,185,60,37,69,165,2,104, +106,218,182,173,172,140,35,114,246,236,150,45,165,165,220,124,236,62,22, +172,225,76,203,96,187,16,130,104,52,26,77,102,38,128,223,239,247,7,2,41, +41,236,250,175,109,84,40,20,10,133,194,181,107,245,122,189,126,122,46,178, +109,236,103,129,227,56,94,94,14,240,240,225,185,115,229,229,63,191,63,22, +6,131,193,96,48,0,136,68,34,145,80,88,83,195,104,183,110,141,123,7,152, +126,11,96,183,219,237,118,251,207,95,68,211,177,197,251,103,246,177,15, +90,44,146,18,109,8,6,153,135,133,237,66,93,93,93,93,93,93,108,164,0,36, +18,12,75,78,6,72,73,193,48,169,148,43,106,182,54,16,132,41,94,86,102,82, +146,75,25,146,36,73,146,4,24,31,31,31,31,31,159,89,78,68,0,133,25,16,14, +135,195,225,48,0,143,199,227,241,120,156,167,80,20,65,120,60,182,118,56, +194,236,60,159,207,231,243,249,191,30,145,31,69,194,8,176,30,100,95,226, +146,146,146,146,226,98,134,80,36,194,17,98,9,198,130,125,71,254,54,226, +8,48,33,163,105,166,27,33,223,252,110,127,239,65,251,89,200,100,50,153, +76,198,201,58,157,78,167,211,205,44,91,173,86,171,213,202,198,146,179,235, +43,1,171,213,106,29,27,219,184,241,198,141,182,182,171,87,59,58,254,190, +239,126,5,8,194,216,249,189,159,142,127,20,255,1,133,21,69,246,62,22,231, +226,0,0,0,0,73,69,78,68,174,66,96,130}; + +static size_t xml_res_size_3 = 903; +static unsigned char xml_res_file_3[] = { +137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,24,0,0,0,24,16,6,0, +0,0,176,231,225,187,0,0,0,6,98,75,71,68,0,255,0,255,0,255,160,189,167,147, +0,0,0,9,112,72,89,115,0,0,13,215,0,0,13,215,1,66,40,155,120,0,0,0,9,118, +112,65,103,0,0,0,24,0,0,0,24,0,120,76,165,166,0,0,3,18,73,68,65,84,88,195, +237,87,59,107,42,65,24,61,186,90,69,45,68,124,96,101,231,11,124,94,118, +215,82,16,107,127,67,122,219,16,112,83,228,69,30,189,141,149,173,191,193, +70,80,54,15,22,68,240,129,141,144,164,16,31,4,162,33,69,80,111,177,204, +29,238,38,131,43,81,228,194,61,205,97,230,115,118,190,243,61,102,70,224, +63,246,11,3,203,112,117,117,115,115,113,113,122,170,142,36,105,95,14,174, +86,171,213,106,117,118,118,124,124,116,84,40,156,156,232,94,168,10,88,237, +29,196,15,150,159,38,189,130,6,131,193,96,48,0,56,142,227,56,142,68,6,48, +24,12,6,131,129,242,159,212,50,230,181,246,239,35,14,120,189,94,175,215, +187,222,47,221,2,88,14,181,219,237,118,187,189,222,177,117,136,70,163,209, +104,148,10,208,139,31,11,8,135,195,225,112,24,48,153,76,38,211,55,95,91, +44,22,139,197,130,109,103,237,179,115,1,132,91,173,86,171,213,218,40,216, +223,34,22,139,197,98,49,192,104,52,26,141,198,29,10,32,27,144,84,71,34, +145,72,36,66,127,103,54,155,205,102,243,207,5,109,93,192,227,163,162,60, +60,0,162,200,243,169,20,21,212,108,54,155,205,38,123,93,169,84,42,149,74, +95,231,115,185,92,46,151,3,28,14,135,195,225,0,68,81,20,69,145,150,156, +94,232,78,22,207,255,250,37,8,128,199,227,241,120,60,84,64,60,30,143,199, +227,108,150,36,73,146,36,192,233,116,58,157,78,192,237,118,187,221,110, +64,150,101,89,150,1,158,231,121,158,167,251,108,218,3,186,5,144,15,15,135, +195,225,112,72,199,253,126,191,223,239,83,206,231,243,249,124,30,168,215, +235,245,122,29,152,207,231,243,249,28,200,100,50,153,76,6,152,78,167,211, +233,148,178,246,20,219,180,7,54,22,160,101,191,223,239,247,251,41,219,237, +118,187,221,14,84,171,213,106,181,10,216,108,54,155,205,70,199,164,100, +180,76,28,223,89,6,88,41,214,54,183,150,73,15,144,11,80,107,47,22,139,197, +98,145,102,118,103,25,184,187,187,191,151,229,175,142,119,187,221,110,183, +11,116,58,157,78,167,3,164,211,233,116,58,13,76,38,147,201,100,2,140,199, +227,241,120,76,121,52,26,141,70,35,202,179,217,108,54,155,1,149,74,165, +82,169,208,117,122,161,251,20,18,69,65,72,165,104,51,146,141,72,233,16, +4,131,193,96,48,72,133,104,51,70,34,93,46,151,203,229,50,96,181,90,173, +86,43,45,181,90,173,86,171,213,0,159,207,231,243,249,182,40,128,56,66,34, +73,198,189,94,175,215,235,233,143,24,129,32,8,130,32,0,141,70,163,209,104, +208,183,15,17,180,245,12,176,16,8,4,2,129,192,250,11,76,219,252,164,214, +147,201,100,50,153,4,20,69,81,20,5,176,88,44,22,139,101,135,2,180,37,65, +122,96,83,36,18,137,68,34,65,79,173,108,54,155,205,102,119,248,152,99,33, +20,10,133,66,33,246,105,164,157,103,141,137,227,59,19,224,114,185,92,46, +215,79,229,110,31,76,1,203,229,114,185,92,158,159,95,95,223,222,94,94,22, +10,251,114,240,249,249,233,233,229,229,240,144,101,223,240,175,7,121,209, +147,54,35,231,5,97,50,127,112,160,50,185,146,56,78,101,82,28,159,159,42, +127,124,168,252,250,170,242,219,155,202,239,239,127,219,201,243,110,147, +226,250,71,240,27,244,161,235,130,220,36,174,195,0,0,0,0,73,69,78,68,174, +66,96,130}; + +static size_t xml_res_size_4 = 2345; +static unsigned char xml_res_file_4[] = { +137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,24,0,0,0,24,16,6,0, +0,0,176,231,225,187,0,0,0,6,98,75,71,68,255,255,255,255,255,255,9,88,247, +220,0,0,0,9,112,72,89,115,0,0,0,72,0,0,0,72,0,70,201,107,62,0,0,0,9,118, +112,65,103,0,0,0,24,0,0,0,24,0,120,76,165,166,0,0,8,134,73,68,65,84,88, +195,237,87,107,76,20,103,23,62,239,92,118,102,103,118,113,113,185,45,5, +1,53,22,9,106,17,193,74,109,163,88,211,164,33,38,189,104,108,192,166,166, +21,169,253,213,75,154,152,52,237,159,166,73,163,137,73,181,37,32,182,197, +114,105,180,73,91,12,173,77,140,1,241,18,93,228,82,20,129,80,47,92,22,89, +196,221,101,118,102,119,110,239,251,253,152,78,80,252,208,146,124,191,154, +239,253,115,102,119,50,231,125,158,115,206,251,156,243,2,252,127,253,203, +214,246,237,219,183,159,56,65,211,255,43,127,207,62,91,85,213,220,156,157, +189,97,195,219,111,159,56,177,120,241,220,247,104,161,14,139,139,247,236, +169,175,95,177,130,101,89,150,227,62,254,24,0,33,128,210,82,195,48,12,211, +244,249,48,38,4,128,101,105,154,162,16,138,70,41,138,162,16,10,6,77,19, +99,66,206,158,197,152,16,140,79,158,196,152,16,89,62,119,238,234,213,218, +218,189,123,117,125,238,62,235,215,191,243,78,83,83,106,42,198,20,69,200, +197,139,134,97,154,0,165,165,221,221,199,142,149,151,223,185,179,32,2,132, +32,84,82,178,111,223,143,63,214,213,1,0,32,180,115,231,243,207,63,243,76, +102,166,195,177,114,101,78,78,74,10,195,184,92,162,200,113,0,22,96,0,77, +211,52,93,7,144,229,88,76,215,1,238,220,185,123,55,18,49,205,238,238,193, +193,64,64,150,39,39,167,167,101,153,166,17,66,8,224,203,47,163,81,138,98, +217,67,135,92,46,154,214,52,138,2,208,52,138,242,251,77,19,99,140,87,172, +32,4,33,140,179,178,174,94,173,173,125,243,205,145,145,127,76,160,164,100, +223,190,230,230,239,190,203,206,246,249,60,158,29,59,118,237,122,249,229, +213,171,5,65,85,117,221,52,1,194,225,104,52,30,7,112,187,5,129,227,0,4, +129,227,88,22,128,166,41,202,34,107,17,2,32,228,239,45,17,66,0,209,168, +162,168,42,64,91,91,87,215,237,219,241,248,229,203,215,174,141,143,107, +26,33,24,3,4,2,27,55,22,20,100,101,45,93,218,215,55,60,60,57,169,235,145, +72,56,172,40,185,185,151,47,215,213,85,84,140,141,217,248,152,249,128,23, +22,86,86,30,63,190,126,189,40,242,60,203,190,254,250,214,173,197,197,75, +151,10,194,215,95,159,60,233,247,99,60,53,21,10,41,10,69,81,148,5,20,99, +211,36,132,16,66,16,2,48,140,180,52,175,215,229,138,197,214,175,207,207, +207,200,16,197,130,130,167,159,78,75,163,105,66,44,34,177,152,174,19,2, +80,90,90,84,180,108,25,207,175,91,151,151,151,145,193,243,195,195,163,163, +247,239,187,221,47,190,184,110,93,86,22,66,61,61,131,131,19,19,134,161, +105,24,211,52,198,115,113,82,243,17,224,121,134,97,217,170,170,132,4,151, +139,227,68,177,174,238,215,95,187,186,8,153,153,145,101,93,71,200,233,228, +121,150,141,199,173,20,159,56,113,249,114,109,109,121,57,69,197,98,20,5, +144,154,26,8,76,78,70,163,91,183,182,182,118,116,12,13,253,244,211,231, +159,127,251,109,71,135,162,92,185,50,48,48,49,65,136,40,114,28,77,3,140, +143,79,79,199,98,0,247,239,203,178,97,0,20,21,229,229,165,167,35,196,178, +12,67,81,0,166,105,154,24,3,48,12,207,199,227,11,32,96,29,206,151,94,26, +25,153,152,136,68,16,242,122,61,30,183,59,20,90,190,60,59,59,45,173,187, +91,211,52,205,48,66,33,43,250,7,14,216,95,245,245,85,87,151,151,135,66, +157,157,199,142,149,151,95,185,114,241,98,117,245,27,111,236,220,169,235, +154,102,154,207,61,247,199,31,23,46,12,13,249,253,71,143,254,252,115,103, +167,162,36,38,58,157,20,5,176,100,73,114,178,32,0,180,181,245,245,5,131, +182,12,0,88,1,66,72,85,23,152,1,171,22,57,78,16,156,78,142,27,31,95,178, +36,35,35,37,165,166,102,209,34,65,224,249,134,6,171,186,135,134,76,147, +16,135,195,34,242,184,229,247,31,61,90,94,222,211,163,105,186,110,24,251, +247,207,204,200,178,166,209,180,219,237,116,178,236,108,38,108,136,60,207, +178,118,6,8,65,136,101,49,102,152,71,9,204,123,6,44,230,138,146,148,228, +114,57,157,95,125,229,118,59,157,60,127,234,148,166,105,26,199,221,187, +71,136,170,34,84,95,239,118,103,102,166,164,204,204,60,137,64,97,97,101, +101,67,195,170,85,12,67,81,8,181,180,84,85,189,246,218,186,117,28,151,156, +156,152,40,8,0,62,95,82,146,40,2,108,218,148,159,159,146,2,192,113,44,75, +211,0,134,129,49,33,8,57,28,166,185,32,2,78,167,207,151,158,158,147,211, +210,2,208,222,142,113,75,203,238,221,101,101,143,58,248,39,192,127,248, +193,231,67,136,16,132,78,159,182,34,42,8,71,142,156,60,233,247,171,42,33, +86,231,176,15,183,245,60,251,27,99,140,9,113,56,52,205,52,101,249,209,253, +231,149,209,162,162,202,202,198,198,169,41,75,2,93,174,127,10,216,218,88, +146,16,162,40,140,183,110,189,127,223,225,240,122,7,6,92,46,73,154,156, +116,58,23,26,0,150,37,4,128,227,252,254,250,250,183,222,10,6,1,0,16,178, +37,249,49,25,176,150,199,211,208,240,217,103,101,101,12,227,112,88,170, +96,57,176,213,28,32,30,215,52,195,0,248,228,147,218,218,142,14,85,189,125, +123,114,50,18,249,224,131,43,87,106,106,118,237,234,237,125,216,159,170, +62,152,153,154,26,150,5,0,72,76,20,132,146,146,252,252,130,130,120,220, +235,117,187,53,45,49,177,183,247,175,191,70,71,75,74,198,198,130,193,123, +247,106,107,173,125,147,146,230,34,124,12,1,75,211,121,222,225,96,24,128, +179,103,251,250,38,39,45,240,132,0,148,148,228,230,38,39,3,52,53,157,57, +115,227,134,170,142,140,4,131,146,116,228,136,223,95,83,83,81,209,208,240, +164,200,50,12,198,162,152,154,74,211,28,135,113,117,53,199,57,157,146,244, +203,47,145,72,60,142,113,114,114,56,28,141,70,163,123,247,58,28,12,195, +48,166,57,159,159,199,202,232,131,145,214,117,195,192,24,32,35,195,58,108, +232,239,226,235,237,29,30,158,154,34,132,162,16,66,104,213,170,162,162, +221,187,155,155,51,51,159,92,28,52,13,144,144,96,233,252,134,13,145,136, +36,41,74,69,69,127,255,173,91,99,99,31,125,36,73,178,28,143,103,103,35, +68,81,0,55,111,206,27,136,249,227,111,205,64,54,208,53,107,114,114,60,30, +128,177,177,233,105,69,1,24,31,15,133,40,10,224,224,193,247,222,219,188, +153,231,155,154,206,156,25,24,216,178,165,181,245,194,133,225,225,129,129, +226,226,189,123,27,27,15,31,182,58,116,103,167,229,109,100,132,162,88,214, +210,19,140,17,58,120,208,233,228,56,150,245,120,6,6,110,222,28,31,223,180, +201,225,96,89,154,38,196,235,93,180,72,16,116,61,20,10,135,99,49,107,6, +91,16,129,7,243,128,16,128,162,196,98,154,6,144,151,247,212,83,139,22,1, +168,170,53,31,118,117,221,186,21,10,1,188,240,66,65,193,146,37,52,93,92, +156,151,151,158,46,8,157,157,55,110,76,76,124,248,97,32,112,239,158,36, +197,227,129,192,212,148,36,33,52,61,29,14,43,138,40,210,180,195,129,16, +64,106,170,215,43,8,0,185,185,57,57,41,41,0,73,73,30,143,40,34,212,216, +248,219,111,61,61,241,184,32,24,134,166,53,54,46,152,128,85,18,8,221,190, +125,247,238,204,12,192,254,253,223,124,211,214,22,14,91,163,25,69,149,149, +109,220,184,124,185,195,177,121,115,97,97,86,22,207,135,66,214,40,96,154, +150,66,20,20,228,230,250,124,12,147,159,111,154,105,105,46,151,157,75,91, +8,116,221,146,79,195,176,74,51,28,142,70,85,21,160,177,241,247,223,187, +187,163,81,211,212,117,93,127,255,253,182,182,239,191,223,189,59,30,159, +183,16,231,171,207,244,244,194,194,87,95,253,244,211,75,151,174,93,27,27, +147,229,145,145,235,215,219,219,183,109,27,28,60,125,250,240,225,67,135, +70,71,101,57,33,33,16,56,127,190,191,63,20,90,182,44,18,145,164,120,92, +20,89,150,97,104,154,162,18,18,68,209,225,64,200,229,178,58,173,173,235, +86,131,4,144,36,69,209,52,128,206,206,254,254,177,49,140,79,157,58,119, +110,96,64,85,37,105,122,250,238,221,3,7,186,186,142,31,175,170,178,35,111, +95,144,108,249,156,61,212,243,244,1,158,47,44,220,179,167,161,33,20,138, +70,3,129,254,254,29,59,6,7,91,91,191,248,226,250,117,235,189,173,231,182, +229,249,244,244,181,107,183,109,91,179,38,53,117,229,202,45,91,118,238, +100,89,65,72,76,92,187,214,202,37,199,137,34,199,177,172,174,43,138,170, +26,198,236,84,138,177,170,74,210,249,243,193,224,208,80,71,71,117,245,200, +200,165,75,77,77,182,252,198,98,15,91,69,121,216,206,75,0,161,213,171,43, +42,170,171,95,121,229,207,63,27,26,222,125,183,189,221,6,106,89,142,251, +239,214,210,245,89,75,211,52,45,138,94,47,203,46,94,156,145,145,159,191, +120,177,162,132,66,19,19,161,144,44,7,131,67,67,246,12,165,105,150,181, +251,132,109,109,224,146,244,240,255,179,141,108,129,87,74,59,149,115,129, +206,181,12,243,248,212,219,214,190,74,218,214,38,98,24,115,75,229,95,187, +254,3,244,196,108,61,55,2,79,88,0,0,0,34,122,84,88,116,83,111,102,116,119, +97,114,101,0,0,120,218,43,47,47,215,203,204,203,46,78,78,44,72,213,203, +47,74,7,0,54,216,6,88,16,83,202,92,0,0,0,0,73,69,78,68,174,66,96,130}; + +static size_t xml_res_size_5 = 1801; +static unsigned char xml_res_file_5[] = { +137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,24,0,0,0,24,16,6,0, +0,0,176,231,225,187,0,0,0,6,98,75,71,68,0,255,0,255,0,255,160,189,167,147, +0,0,0,9,112,72,89,115,0,0,11,17,0,0,11,17,1,127,100,95,145,0,0,0,9,118, +112,65,103,0,0,0,24,0,0,0,24,0,120,76,165,166,0,0,6,148,73,68,65,84,88, +195,213,87,109,72,83,95,24,255,109,46,183,74,109,154,189,108,102,211,34, +122,215,110,134,129,110,100,45,37,90,169,68,239,69,168,21,189,209,135,24, +145,137,241,111,101,206,250,98,160,38,86,68,68,68,171,160,23,42,208,130, +94,168,65,154,90,152,53,45,147,97,205,181,110,203,108,154,219,213,123,255, +31,110,167,251,247,174,49,243,203,159,158,47,135,231,62,207,57,231,247, +123,94,206,57,23,248,203,69,50,84,199,127,126,10,175,29,62,60,216,122,224, +0,63,54,52,152,76,38,147,201,116,255,254,255,77,44,0,1,142,115,185,62,125, +114,58,57,206,235,245,122,251,250,56,206,102,179,217,222,188,225,56,98, +55,26,141,70,163,209,96,248,25,159,33,7,232,247,66,230,75,165,129,60,164, +67,93,138,23,181,186,162,226,212,169,202,74,128,227,88,150,101,129,152, +24,181,90,173,6,54,108,216,176,97,253,122,32,44,44,44,44,44,236,246,109, +222,159,227,254,148,200,130,5,219,183,95,188,168,82,29,57,82,89,121,235, +22,203,242,250,133,11,127,72,64,34,225,35,58,111,30,249,194,151,70,103, +39,33,98,54,151,148,28,63,14,120,189,125,125,63,126,0,241,241,241,241,241, +241,193,34,25,12,56,217,207,225,56,116,104,231,206,149,43,1,181,122,204, +24,96,226,68,222,238,95,154,82,241,70,133,133,133,133,133,133,38,19,175, +55,54,242,68,142,30,21,19,209,106,181,90,173,22,144,72,36,18,105,208,60, +178,236,208,226,223,216,88,87,119,250,244,166,77,64,125,125,125,125,125, +61,144,155,155,154,58,122,180,94,79,81,26,141,66,161,215,139,103,200,6, +171,35,70,132,132,132,132,132,132,28,58,180,107,215,206,157,219,183,3,82, +105,72,72,104,232,254,253,188,189,176,48,33,33,33,33,33,1,152,49,99,198, +140,233,211,1,142,227,56,150,229,137,72,36,128,207,231,245,246,244,60,123, +70,50,200,19,126,241,98,104,145,7,218,218,218,218,218,218,128,142,142,142, +142,142,14,224,216,177,187,119,123,122,136,85,173,246,203,173,248,67,85, +85,85,85,85,85,83,83,86,86,102,230,202,149,115,230,140,26,53,106,212,200, +145,0,195,248,124,62,31,15,152,227,132,81,44,17,17,74,101,100,36,80,92, +92,92,108,54,11,27,15,46,65,49,240,198,70,171,181,162,98,237,90,32,37,101, +207,158,43,87,196,171,82,212,243,231,103,206,108,222,236,31,8,63,2,124, +228,84,42,133,66,161,80,40,94,191,94,182,44,35,67,175,87,42,103,206,156, +61,123,238,92,33,210,192,224,22,237,238,238,234,250,250,245,191,68,198, +140,81,42,129,226,98,179,185,164,68,32,114,231,142,195,49,109,218,132,9, +4,120,109,109,85,213,198,141,253,253,201,201,59,118,92,186,36,251,89,17, +233,233,60,224,224,199,113,192,230,34,37,160,209,104,52,26,205,217,179, +118,187,221,110,183,39,37,137,253,146,147,147,147,147,147,25,102,233,210, +165,75,245,250,17,35,190,127,255,246,173,171,75,200,208,232,209,225,225, +17,17,128,197,98,177,88,44,64,69,133,213,26,26,10,60,121,82,86,182,122, +53,160,213,238,221,123,237,90,240,72,139,96,255,10,225,176,207,105,146, +41,94,211,233,248,209,98,41,40,40,40,56,120,16,112,187,191,124,161,105, +224,213,171,183,111,63,124,0,78,156,184,113,195,110,7,174,95,63,122,212, +96,0,210,210,246,237,187,113,99,248,192,131,102,96,120,132,132,154,158, +60,153,162,12,6,160,178,242,206,157,214,86,224,234,213,130,130,212,84,160, +160,224,220,185,231,207,129,204,204,89,179,24,6,176,217,108,182,150,22, +138,250,125,179,251,3,246,163,52,92,192,228,194,161,233,143,31,59,58,28, +14,177,61,58,58,38,38,54,22,120,248,176,180,52,59,27,200,201,41,41,169, +169,1,178,179,41,74,161,0,214,173,203,204,76,79,7,138,138,138,138,138,138, +200,44,210,236,46,23,175,15,12,4,195,241,199,4,196,192,215,172,201,200, +152,62,29,72,76,156,53,107,202,20,128,166,105,218,237,6,78,158,188,120, +241,217,51,129,136,209,184,98,133,74,5,168,213,74,165,76,6,76,153,18,31, +31,23,7,196,196,76,154,20,27,75,238,23,178,75,160,140,248,203,144,159,18, +129,128,111,217,146,149,165,213,2,44,235,241,208,52,16,30,174,84,42,149, +128,94,79,81,17,17,0,239,15,216,108,13,13,143,31,3,58,157,78,167,211,1, +10,133,92,30,26,10,124,249,242,249,243,167,79,164,4,201,110,228,2,21,238, +135,97,19,16,3,223,182,109,213,170,196,68,32,47,111,213,170,69,139,128, +154,154,234,234,123,247,128,71,143,234,235,91,90,0,64,42,149,201,128,129, +129,254,254,254,126,241,106,36,178,192,216,177,227,198,77,152,32,28,203, +195,37,18,144,128,24,248,193,131,91,183,106,181,192,166,77,6,67,74,10,112, +229,202,205,155,247,239,3,117,117,205,205,237,237,64,74,10,31,89,155,205, +102,123,247,142,191,248,250,250,132,245,186,187,187,187,187,187,105,218, +231,243,249,124,190,164,36,66,36,42,42,58,122,252,120,193,79,76,68,46,151, +203,229,242,192,68,164,191,7,62,111,30,1,110,50,237,222,189,120,49,176, +102,77,70,70,82,18,112,225,194,181,107,213,213,64,123,59,223,186,233,233, +6,67,102,166,0,220,225,176,219,223,190,5,158,62,109,105,97,89,64,38,235, +239,119,185,166,77,43,45,45,45,45,45,253,250,213,108,54,155,205,230,214, +86,167,211,233,116,58,181,90,113,70,188,94,254,198,207,205,205,205,205, +201,1,242,243,243,243,243,243,133,140,4,37,192,3,111,108,220,183,111,243, +230,133,11,129,172,172,180,180,196,68,192,98,185,117,235,225,67,1,184,78, +183,100,137,94,31,24,56,195,184,92,13,13,20,213,219,75,211,118,123,68,4, +191,122,84,20,63,142,29,219,212,212,212,212,212,196,48,252,104,48,16,34, +106,53,223,244,229,229,229,229,229,229,36,115,126,176,127,225,150,33,128, +104,52,113,113,177,177,192,192,0,203,114,28,224,114,125,252,216,222,30, +28,184,199,243,254,125,77,77,90,26,77,219,108,15,30,48,204,224,13,35,35, +137,110,181,90,173,86,43,233,146,206,78,143,199,227,241,120,214,175,47, +43,43,43,43,43,187,124,217,237,118,187,221,110,128,101,89,150,101,107,107, +25,134,97,24,134,188,174,132,231,185,223,49,26,23,183,124,185,217,204,113, +43,86,164,166,170,213,0,69,37,37,81,20,48,117,170,74,165,84,2,47,95,54, +55,191,123,7,212,214,214,213,213,213,9,192,123,123,237,246,7,15,82,83,93, +174,230,230,154,26,154,14,20,49,94,200,243,90,252,159,64,206,125,175,151, +31,201,59,148,116,19,33,76,252,6,6,252,50,16,21,53,113,162,74,53,127,254, +237,219,79,159,58,28,13,13,226,234,251,241,163,183,215,227,17,128,203,229, +82,105,79,79,90,26,203,70,70,198,196,116,117,145,66,28,188,42,1,42,6,44, +254,99,35,196,8,64,2,88,12,124,8,79,137,249,243,243,242,206,159,167,40, +183,219,233,236,236,20,136,16,9,11,11,15,15,13,157,60,249,213,43,139,197, +104,116,58,197,11,255,158,64,48,93,60,159,16,34,35,177,7,126,90,252,117, +242,47,232,173,193,194,194,123,39,102,0,0,0,0,73,69,78,68,174,66,96,130}; + +static size_t xml_res_size_6 = 36064; +static unsigned char xml_res_file_6[] = { +137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,0,125,0,0,0,215,8,2,0, +0,0,184,101,201,250,0,0,0,1,115,82,71,66,0,174,206,28,233,0,0,32,0,73,68, +65,84,120,218,236,125,119,120,84,213,246,246,218,251,180,233,51,201,100, +210,19,210,233,189,41,34,96,87,44,87,185,98,195,238,181,247,46,138,138, +93,84,236,189,160,88,16,236,40,162,82,20,145,166,16,144,78,128,244,94,166, +247,83,246,254,254,216,147,195,16,32,4,244,234,239,123,188,243,60,98,202, +228,156,51,107,175,189,202,187,222,181,54,162,148,66,15,94,148,82,132,16, +252,225,215,159,117,157,255,223,95,168,135,114,103,34,75,254,14,33,0,192, +236,155,96,208,231,247,7,53,141,152,76,70,187,221,38,138,134,164,247,83, +253,70,8,161,255,9,157,189,248,67,85,85,74,129,34,141,67,60,0,172,93,187, +226,151,229,43,87,172,92,221,222,209,33,203,178,42,171,188,40,72,146,152, +149,153,121,209,5,231,78,60,253,95,24,11,10,5,12,128,233,255,68,125,184, +250,78,8,97,111,230,48,55,119,238,7,119,223,51,53,22,147,83,82,156,54,155, +141,227,184,78,61,166,0,72,150,101,119,71,71,92,81,206,59,247,156,233,211, +238,181,165,164,146,132,174,163,255,217,153,158,202,157,82,66,1,16,32,64, +40,30,141,254,182,118,237,180,251,239,219,188,105,75,239,222,189,121,129, +167,132,18,162,177,55,32,64,20,40,0,32,0,204,113,148,146,246,246,118,127, +32,52,243,153,167,38,77,154,100,52,26,19,215,97,55,254,103,75,255,224,114, +87,52,141,82,42,242,124,229,238,29,211,31,156,190,114,245,175,22,139,213, +102,179,17,66,0,40,66,152,18,26,147,101,162,169,154,166,1,32,81,18,37,81, +192,152,35,148,34,0,141,144,142,246,182,209,163,71,63,248,192,189,101,189, +7,16,141,80,160,24,227,255,201,157,118,175,237,26,80,14,193,146,31,151, +92,125,213,53,54,171,93,146,36,221,98,248,3,62,143,59,144,154,230,232,93, +210,75,20,76,70,163,33,30,143,214,214,213,87,236,172,140,197,98,233,233, +233,105,105,105,146,193,160,169,170,162,40,225,72,104,222,156,57,131,134, +12,211,52,13,33,132,49,254,159,220,247,35,111,160,137,64,132,104,244,203, +175,230,221,118,219,61,185,185,217,137,247,34,32,4,82,82,51,254,125,206, +228,211,79,59,57,51,205,185,239,223,215,215,87,126,241,197,23,159,205,251, +162,166,174,209,153,150,42,73,6,142,195,30,175,119,238,156,57,3,7,13,74, +22,250,63,83,241,247,47,119,74,41,165,42,161,192,115,232,141,87,223,120, +98,198,83,153,89,89,8,35,69,86,12,38,211,200,35,70,79,154,52,249,232,35, +70,117,190,25,186,17,93,93,93,221,71,31,124,240,203,202,95,118,239,174, +22,68,62,35,205,57,107,214,59,185,249,5,24,115,76,232,255,80,131,67,247, +247,34,132,200,154,76,41,125,247,253,119,243,243,114,71,141,26,53,102,204, +145,253,250,247,191,236,234,171,215,252,186,130,80,89,163,49,141,40,26, +209,232,1,94,132,16,77,211,52,45,241,134,118,119,203,151,95,125,121,236, +49,71,167,164,58,79,58,233,20,149,82,69,81,84,85,101,49,210,63,240,117, +0,185,83,74,41,93,248,221,194,194,194,226,35,199,28,57,122,244,232,129, +131,135,127,254,205,199,154,166,104,42,145,213,48,209,136,170,106,26,137, +117,115,105,66,8,147,172,170,198,85,45,170,42,178,207,235,189,247,158,59, +108,54,235,109,119,220,73,41,213,52,77,85,213,255,201,157,18,66,52,69,81, +101,85,85,213,29,219,54,143,24,49,98,204,152,49,195,71,12,63,237,244,179, +118,85,85,81,74,247,213,206,3,41,236,126,127,206,126,248,202,43,175,56, +28,142,229,203,151,51,209,255,79,238,9,227,160,40,209,152,28,153,124,206, +57,131,6,13,26,52,104,208,228,115,39,215,214,213,83,170,17,242,71,117,83, +85,85,89,150,41,165,95,127,253,245,25,103,156,17,12,6,255,177,118,166,75, +48,135,128,2,207,27,222,124,227,221,245,235,203,41,133,210,178,178,183, +222,120,61,55,55,91,86,52,212,9,181,252,145,23,198,152,16,50,113,226,196, +211,78,59,109,241,226,197,255,216,56,18,119,9,30,41,135,26,234,235,30,125, +244,161,212,148,148,130,194,162,143,62,124,199,102,75,197,8,139,130,64, +17,135,40,253,35,14,156,227,56,142,227,48,198,28,199,29,119,220,113,219, +182,109,99,234,255,79,151,59,66,136,3,116,219,29,183,245,202,47,72,117, +166,61,247,220,51,28,54,83,32,157,123,1,224,15,196,124,93,226,197,162,162, +162,88,44,22,8,4,254,153,113,36,78,86,55,4,176,96,225,194,218,234,186,88, +60,254,208,253,83,139,138,138,40,168,8,254,100,125,76,56,22,128,163,143, +62,122,229,202,149,255,80,59,131,16,162,148,80,77,85,9,9,134,131,223,126, +251,77,91,135,119,218,180,155,71,143,25,7,20,120,94,68,8,255,185,150,64, +87,240,99,142,57,230,195,15,63,76,70,58,255,89,118,134,0,85,17,70,84,109, +168,171,89,249,203,202,163,39,140,62,103,242,101,234,158,50,197,159,111, +9,88,236,36,8,2,33,36,18,137,252,3,97,50,12,20,16,2,164,81,14,240,242,213, +229,161,72,248,145,135,30,86,228,248,95,131,90,141,31,63,254,135,31,126, +248,71,250,85,4,136,34,14,19,130,249,207,62,157,127,209,148,75,178,51,243, +49,207,33,68,225,191,182,245,117,88,166,111,223,190,213,213,213,250,38, +248,135,197,51,8,1,194,209,88,120,87,197,166,243,167,92,192,243,60,2,86, +56,250,175,203,189,176,176,176,161,161,1,254,121,245,110,204,148,26,97, +238,135,133,139,39,158,114,124,159,178,18,74,53,132,56,132,240,95,160,128, +69,69,69,237,237,237,255,64,125,231,1,37,84,251,235,175,191,121,250,233, +39,0,8,198,152,2,0,253,43,144,113,142,227,34,145,200,63,16,136,223,195, +39,200,204,114,185,210,211,245,64,158,34,138,224,175,16,132,197,98,249, +135,230,171,8,161,104,52,58,122,244,232,189,145,154,191,72,251,204,102, +115,15,237,204,1,29,253,126,43,55,7,252,213,255,37,125,239,232,232,232, +223,191,255,223,226,223,4,65,232,222,206,232,235,193,138,186,137,5,160, +9,59,72,89,92,64,17,0,69,157,162,70,128,88,154,77,209,95,167,64,135,35, +119,69,81,172,86,171,254,217,254,74,209,219,108,182,131,174,119,66,220, +148,2,16,132,49,33,26,2,194,1,2,138,17,214,0,8,0,16,202,1,112,0,64,65,163, +136,32,224,129,98,140,240,255,105,125,231,56,142,231,249,191,222,191,181, +182,182,58,28,142,131,222,20,33,68,8,65,8,33,140,16,96,140,113,88,5,183, +47,30,8,250,20,149,26,37,131,197,106,181,25,193,110,0,4,64,8,210,168,44, +0,96,252,95,14,135,255,20,185,255,149,226,102,250,139,16,218,180,105,83, +126,126,254,94,38,28,81,150,66,51,235,194,34,253,112,40,212,209,209,209, +216,216,248,237,194,133,223,127,191,168,178,170,50,18,141,170,138,74,9, +32,132,40,150,12,102,171,195,102,113,185,92,5,69,197,71,31,125,212,152, +145,35,178,115,93,41,118,139,195,158,202,110,199,196,143,16,98,183,248, +219,141,79,194,98,6,2,1,143,199,83,80,80,240,151,9,157,16,194,113,220,245, +215,95,255,228,147,79,154,205,102,61,147,34,132,80,10,24,3,66,24,0,54,110, +44,95,254,211,138,159,151,47,219,177,163,162,190,177,209,104,52,218,108, +54,163,209,40,138,34,207,115,28,199,177,224,75,101,47,69,141,70,163,254, +128,95,81,72,110,78,126,94,175,156,161,195,7,79,158,124,246,160,254,131, +1,136,166,17,132,49,66,232,255,128,216,1,233,149,167,234,234,234,226,226, +226,191,82,223,99,177,216,21,87,92,49,103,206,28,77,211,116,104,140,82, +38,119,252,235,175,107,167,222,125,87,77,93,141,40,136,130,36,26,36,3,198, +28,198,123,209,252,216,147,239,195,188,164,148,130,170,170,154,166,6,131, +33,132,80,255,190,125,238,189,247,254,145,163,71,178,235,163,255,3,70,31, +179,199,197,24,107,154,246,135,197,9,180,51,250,80,85,53,30,143,199,98, +177,88,44,38,203,50,33,154,30,223,233,70,102,213,170,85,227,199,143,7,0, +70,99,210,99,149,218,218,218,51,207,156,52,118,236,152,198,230,166,236, +236,156,148,84,167,217,108,225,121,158,73,85,223,25,137,66,37,102,80,246, +30,211,196,40,87,28,199,9,162,228,114,185,210,210,210,118,87,85,143,155, +48,126,200,240,33,139,190,255,150,170,157,53,229,206,210,242,223,146,42, +35,93,101,42,42,42,202,202,202,254,160,95,213,0,98,161,240,138,159,151, +45,249,249,199,13,229,235,91,219,218,45,102,115,110,126,238,240,225,195, +135,12,25,86,82,82,84,92,88,130,48,6,32,0,248,205,55,223,56,241,164,147, +11,122,245,34,68,3,76,49,208,181,107,203,63,254,120,222,59,111,191,227, +116,58,51,179,179,16,36,220,105,151,189,146,172,221,157,95,48,3,78,41,192, +190,102,4,33,192,28,23,240,7,58,58,218,143,153,112,236,13,215,95,51,116, +212,112,137,55,50,220,255,111,65,161,247,200,157,225,36,46,151,235,15,198, +145,179,222,121,103,250,244,233,6,163,209,100,54,243,28,71,8,81,20,57,18, +137,33,14,92,174,244,94,189,114,39,140,27,59,241,148,211,114,115,10,62, +249,116,222,164,179,207,162,192,73,130,224,241,120,238,184,253,246,95,126, +249,89,37,52,35,35,29,99,158,18,242,103,5,181,84,231,23,2,13,133,66,146, +100,56,250,232,163,46,191,244,242,129,131,7,17,66,244,13,247,247,200,93, +211,180,141,27,55,14,27,54,44,89,173,14,227,138,215,94,123,229,138,21,107, +172,86,43,165,4,33,68,161,83,11,41,80,74,8,33,129,64,32,16,12,106,26,25, +58,116,216,135,115,231,56,29,142,37,139,127,188,238,218,171,1,104,90,90, +26,218,99,192,209,159,149,199,177,68,151,82,132,40,1,132,40,165,138,34, +83,10,87,94,121,229,213,87,95,189,71,238,127,97,168,131,117,41,115,28,103, +48,24,2,129,0,163,113,29,206,167,165,0,0,126,159,143,231,25,247,17,83,138, +16,176,168,27,97,140,56,142,19,4,33,45,45,173,184,168,168,168,176,96,199, +246,173,217,105,206,1,125,74,206,56,237,20,171,213,146,145,145,129,18,33, +58,214,83,211,63,69,232,140,155,143,129,178,120,6,99,44,73,6,142,227,158, +158,241,228,101,83,46,170,168,218,161,106,49,66,84,13,180,191,44,208,217, +179,191,8,33,217,217,217,205,205,205,44,186,56,172,205,3,0,32,73,34,251, +138,82,186,95,161,81,74,53,77,197,24,231,229,229,141,28,53,10,176,84,92, +92,108,52,26,187,152,242,63,203,230,238,17,101,210,5,41,165,130,32,100, +100,229,172,94,191,246,140,211,78,127,229,197,215,52,85,193,128,254,50, +60,7,235,66,215,52,205,106,181,154,205,230,63,232,220,77,38,99,247,170, +154,136,58,58,105,123,14,135,221,102,183,195,95,142,11,81,74,1,104,154, +51,205,110,73,121,233,213,87,39,157,51,89,86,98,176,15,57,235,191,20,234, +36,226,72,102,1,56,142,203,205,205,149,36,9,227,195,42,122,80,0,0,163,217, +170,71,141,7,72,250,169,110,73,88,40,157,112,3,127,199,139,82,202,11,124, +186,203,85,181,171,186,172,164,164,188,188,92,67,170,70,8,35,110,238,27, +77,253,105,114,63,208,117,15,231,126,8,0,128,231,56,69,81,117,3,125,192, +247,237,125,139,191,88,217,81,242,11,16,165,212,225,112,164,103,100,159, +117,230,153,95,127,246,21,134,238,159,255,79,181,239,127,56,74,75,188,34, +225,24,83,150,255,246,163,247,240,145,14,244,12,44,148,96,214,6,0,52,162, +241,130,144,145,145,113,223,3,247,63,255,194,107,255,237,200,18,255,41, +186,67,137,170,170,138,70,97,247,238,29,63,252,240,67,36,18,249,123,91, +38,247,32,245,7,22,58,0,240,60,111,50,153,18,61,205,128,40,165,188,32,216, +108,246,151,94,126,225,214,91,110,197,128,1,84,230,252,254,116,102,213, +159,177,170,20,40,230,56,158,107,107,169,191,242,202,107,188,62,191,44, +203,127,99,177,84,151,184,199,227,137,197,98,250,15,247,21,28,165,212,100, +50,217,237,246,132,226,83,96,174,46,51,35,115,238,220,185,15,60,112,175, +162,118,226,207,127,246,199,193,127,194,94,70,128,1,213,215,213,94,114, +201,21,85,213,213,217,217,89,172,99,239,239,149,59,198,56,53,53,53,30,143, +187,221,238,88,44,150,44,187,46,72,131,40,138,86,171,85,199,136,8,33,26, +213,242,242,243,102,189,247,254,103,159,204,99,196,241,63,221,96,226,63, +178,151,137,38,19,162,105,64,107,107,43,207,58,107,82,109,109,109,110,78, +174,40,138,209,104,244,239,132,88,147,252,138,195,225,176,90,173,30,143, +39,20,10,37,231,98,250,218,232,162,103,101,47,246,45,162,136,227,184,212, +212,212,123,239,155,186,110,237,58,142,227,8,168,255,151,236,59,198,170, +66,67,254,142,235,175,191,46,28,142,164,165,185,8,33,130,32,178,108,224, +111,81,249,100,188,140,201,81,20,197,172,172,44,183,219,237,245,122,89, +124,172,67,199,28,183,167,167,80,20,197,148,148,20,6,215,176,43,88,173, +86,163,209,124,201,101,23,187,91,27,120,36,254,253,114,79,178,48,136,231, +209,243,207,189,248,219,218,13,41,41,169,44,108,199,24,27,12,6,157,21,243, +215,43,123,50,86,204,228,8,0,69,69,69,161,80,168,181,181,85,95,152,100, +48,153,253,80,16,4,147,201,164,199,236,148,82,103,154,51,26,137,221,118, +231,84,89,142,39,153,41,248,227,60,5,124,152,22,134,33,168,192,205,122, +247,157,23,95,122,181,176,176,104,15,20,172,105,118,187,221,239,247,255, +141,113,100,178,238,51,121,41,138,146,151,151,39,8,66,75,75,139,14,220, +51,119,170,191,7,99,108,50,153,84,149,53,252,3,165,148,104,36,51,51,115, +213,154,213,31,206,121,79,163,148,80,74,136,202,208,254,191,211,190,175, +95,191,238,246,59,238,44,46,46,198,122,10,2,64,41,213,229,254,247,82,192, +216,194,235,146,37,132,216,237,118,179,217,92,95,95,143,49,150,36,137,231, +121,86,88,214,43,86,24,227,172,172,172,246,246,118,221,76,17,66,172,22, +219,115,207,188,88,179,123,59,104,140,64,66,209,95,102,103,186,104,46,66, +40,24,12,94,113,197,149,249,121,249,140,136,144,252,6,163,209,168,40,138, +162,40,61,71,57,146,195,237,158,132,222,135,148,151,234,162,199,24,59,28, +14,187,221,222,212,212,196,138,186,251,94,144,227,184,254,253,251,215,213, +213,17,77,99,191,48,24,12,49,57,126,211,173,119,98,208,40,193,58,234,247, +87,200,93,215,29,214,85,172,42,202,211,79,205,104,109,109,181,217,108,12, +103,79,142,204,24,164,204,162,26,93,227,14,106,16,186,132,119,201,198,55, +185,205,245,48,246,80,242,195,107,154,150,157,157,237,114,185,106,107,107, +187,92,77,223,160,8,161,1,3,6,180,181,183,171,138,204,226,75,151,43,189, +124,221,250,25,51,31,231,121,142,16,154,236,3,254,235,118,38,169,26,9,155, +183,172,123,243,205,183,178,179,179,25,182,149,28,159,177,7,178,219,237, +161,80,104,191,217,202,129,228,162,27,86,216,167,220,193,170,181,135,103, +181,146,193,81,74,169,40,138,146,36,101,102,102,74,146,196,40,224,176,55, +37,141,189,140,70,99,81,81,81,83,83,51,243,204,148,210,194,194,130,89,239, +124,176,100,241,119,28,198,208,217,27,116,216,134,244,144,231,139,105,26, +225,121,174,79,191,222,8,184,20,135,99,223,123,19,66,48,198,225,112,184, +163,163,35,55,55,151,233,203,65,159,143,37,44,30,143,39,35,35,131,73,31, +33,20,139,197,48,198,162,40,34,132,154,154,154,210,211,211,117,79,120,24, +162,103,157,61,44,59,101,194,221,189,123,183,209,104,204,205,205,213,52, +141,16,34,203,50,116,82,137,152,241,140,199,227,107,214,172,233,221,187, +55,199,113,20,168,170,168,28,198,243,62,249,36,47,47,143,189,243,176,69, +127,40,250,14,12,211,224,110,190,229,70,175,219,231,76,77,221,247,174,204, +53,49,200,73,150,101,61,201,238,126,117,19,227,179,56,78,150,101,93,232, +204,176,86,87,87,51,35,147,149,149,85,95,95,207,210,130,30,146,0,186,160, +99,6,131,33,37,37,133,231,121,246,132,154,166,149,148,148,52,55,55,87,87, +87,123,60,30,143,199,19,8,4,130,193,160,207,231,115,187,221,30,143,39,30, +143,139,162,56,122,244,232,170,170,170,72,52,138,0,4,65,104,108,106,122, +237,181,215,152,233,103,6,246,191,108,103,24,203,19,161,95,86,252,244,197, +231,95,148,149,149,237,151,247,161,155,26,81,20,9,33,209,104,180,39,70, +89,143,55,88,224,143,146,106,172,102,179,121,251,246,237,204,69,103,101, +101,181,180,180,232,162,239,137,207,208,83,124,70,120,98,155,79,211,180, +88,44,230,247,251,219,218,218,242,243,243,219,219,219,61,30,79,178,125, +231,56,78,85,85,191,223,239,243,249,40,165,3,6,12,104,105,110,14,4,130, +28,199,101,103,103,191,250,202,171,43,86,254,196,115,220,31,41,10,246,88, +238,8,40,208,80,200,63,243,185,23,50,51,179,245,124,228,64,153,11,199,113, +54,155,205,237,118,119,242,91,122,100,205,68,81,212,145,44,38,187,140,140, +140,96,48,184,107,215,46,77,211,68,81,180,88,44,173,173,173,61,209,178, +228,48,198,98,177,48,4,6,33,164,170,106,32,16,8,133,66,250,40,144,156,156, +28,159,207,23,141,70,245,63,81,20,69,223,178,236,157,165,165,165,13,13, +13,237,237,237,146,36,21,20,22,92,116,225,37,177,112,24,208,225,143,14, +192,61,119,167,64,97,249,178,159,183,110,218,194,246,105,247,180,19,22, +197,251,124,190,110,86,104,95,215,199,243,188,162,40,201,195,34,4,65,176, +217,108,126,191,127,203,150,45,132,16,135,195,65,41,109,106,106,210,97, +172,253,162,140,201,182,203,225,112,24,141,70,38,211,88,44,230,243,249, +152,1,212,33,1,142,227,178,178,178,106,106,106,116,165,225,121,62,24,12, +202,114,34,152,97,14,127,208,160,65,205,205,205,245,13,13,118,187,157,2, +119,213,117,87,39,57,200,67,142,107,122,32,119,66,169,170,17,77,141,69, +194,79,63,59,211,108,182,48,137,235,193,217,129,68,105,50,153,48,198,44, +129,234,33,146,101,48,24,226,241,184,110,28,216,191,25,25,25,54,171,117, +248,224,1,229,229,229,225,80,56,63,63,95,81,148,250,134,134,46,86,94,255, +86,175,207,25,141,70,102,208,153,83,141,70,163,129,64,128,253,10,99,156, +188,17,13,6,67,110,110,238,174,93,187,244,37,183,217,108,225,112,88,85, +85,125,49,84,85,237,223,191,127,36,28,174,171,171,207,201,201,89,188,120, +201,207,63,47,5,160,0,164,147,173,118,8,212,51,220,163,144,7,33,204,241, +143,62,249,100,109,77,189,201,100,162,148,242,60,159,236,0,15,36,205,204, +204,204,134,134,134,30,38,174,157,12,11,41,24,12,178,45,197,254,202,98, +177,68,99,177,155,254,115,238,204,71,239,241,116,180,182,183,119,20,20, +20,96,132,154,155,155,147,175,204,172,57,251,66,146,36,187,221,110,177, +88,244,109,17,10,133,194,225,240,190,66,209,97,28,155,205,230,114,185,106, +106,106,146,239,219,209,209,209,37,84,47,44,44,164,148,84,86,86,10,188, +248,222,187,31,134,195,81,132,184,46,150,237,240,227,200,228,191,39,68, +197,152,255,252,139,175,111,191,253,230,156,236,108,141,104,2,207,99,204, +177,168,235,160,205,2,229,229,229,253,251,247,55,26,141,7,53,53,140,163, +169,105,218,206,157,59,135,12,25,18,143,199,245,98,91,77,109,173,217,128, +119,109,90,81,190,250,215,243,174,190,71,144,140,14,135,173,182,182,206, +104,52,166,119,246,100,233,165,59,179,217,44,73,146,46,11,69,81,130,193, +32,99,4,237,151,232,192,20,156,249,82,143,199,67,41,117,185,92,236,205, +132,144,221,187,119,151,150,150,118,193,238,125,62,223,238,202,74,0,168, +216,190,179,176,168,128,69,28,112,40,44,43,220,125,130,71,8,1,196,109,221, +190,237,222,169,119,230,176,44,9,144,36,25,88,37,225,160,225,4,199,113, +46,151,139,49,0,187,217,128,122,236,193,176,76,142,227,26,26,26,24,72,155, +48,53,233,174,221,85,13,159,206,251,122,248,200,62,229,75,222,77,177,27, +219,218,218,122,245,42,240,251,253,250,197,89,240,227,116,58,13,6,131,46, +133,80,40,228,241,120,146,133,126,160,125,198,120,225,169,169,169,129,64, +64,7,83,49,198,133,133,133,108,19,36,231,134,41,41,41,3,250,247,167,132, +60,242,200,116,89,150,1,33,166,49,61,183,239,220,244,233,211,187,143,124, +67,225,240,141,215,93,27,10,133,5,65,160,148,50,236,101,175,41,30,221,46, +128,36,73,173,173,173,169,169,169,112,96,26,162,158,157,179,203,74,146, +180,115,231,78,167,211,41,8,2,251,149,36,73,170,170,253,178,114,213,245, +23,159,107,20,164,43,46,156,220,212,212,88,190,105,91,126,175,2,159,207, +23,137,68,92,46,151,213,106,53,24,12,122,10,22,139,197,130,193,160,223, +239,87,20,133,231,249,46,22,169,155,248,199,98,177,212,213,213,89,173,86, +158,231,117,139,26,10,133,88,31,18,251,20,204,225,167,167,167,175,88,185, +178,177,161,102,200,208,97,14,187,131,173,92,15,85,30,31,116,239,191,244, +210,139,27,126,223,100,50,26,9,165,60,207,11,130,160,3,94,7,53,220,148, +82,73,146,76,38,147,110,178,123,130,48,219,108,54,179,217,92,83,83,163, +195,50,132,104,249,249,121,141,173,29,179,63,153,15,130,64,229,200,249, +147,78,118,58,204,219,182,109,45,45,45,99,75,203,250,211,40,165,145,72, +196,237,118,183,182,182,182,181,181,49,239,154,204,243,62,168,185,147,36, +41,63,63,191,178,178,82,81,20,182,15,156,78,103,56,28,174,171,171,99,169, +172,158,27,242,2,223,175,111,223,165,63,45,63,253,180,211,190,252,242,75, +182,78,251,10,100,191,247,237,102,126,164,134,49,191,122,245,154,19,78, +56,110,208,160,193,122,158,45,8,66,114,136,221,147,87,48,24,108,109,109, +45,42,42,74,246,150,221,188,8,33,126,191,127,199,142,29,121,121,121,57, +57,57,250,146,180,183,119,100,165,167,124,251,225,243,22,137,167,132,248, +67,225,15,190,248,225,222,199,95,178,219,28,126,127,192,106,183,219,109, +214,104,52,26,143,199,57,142,51,153,76,8,161,148,148,20,253,166,61,207, +45,41,165,129,64,160,185,185,185,180,180,148,133,61,241,120,124,203,150, +45,146,212,149,82,152,0,247,85,101,199,246,29,103,252,107,226,155,111,188, +105,48,152,16,32,10,123,128,194,253,238,114,124,224,18,30,95,181,123,219, +121,231,157,219,187,119,31,246,147,104,52,42,73,18,75,55,14,9,27,177,88, +44,132,144,96,48,216,147,36,147,109,100,171,213,42,73,82,125,125,61,171, +139,178,197,112,58,83,183,85,236,254,249,183,13,0,128,16,164,56,28,55,93, +119,73,203,214,37,131,7,20,229,228,230,104,154,26,12,6,51,51,51,139,138, +138,10,10,10,210,211,211,49,198,237,237,237,135,74,247,100,15,201,30,160, +166,166,134,69,150,6,131,129,233,77,125,125,125,117,117,117,32,16,136,197, +98,186,65,231,121,126,200,144,33,203,126,90,81,86,214,111,238,220,207,218, +220,29,28,119,144,65,188,251,183,239,8,161,118,119,251,149,87,94,19,141, +198,204,102,51,139,207,124,62,95,70,70,70,44,22,59,36,48,136,41,154,217, +108,174,172,172,100,140,223,253,34,142,93,2,121,198,11,15,4,2,62,159,47, +37,37,69,16,4,158,231,45,22,11,230,248,141,91,118,92,52,249,84,160,4,40, +5,57,46,241,120,210,196,227,21,141,172,223,188,51,30,143,71,34,17,6,172, +83,74,205,102,115,32,16,104,108,108,76,142,112,186,185,123,151,103,176, +217,108,77,77,77,161,80,200,225,112,32,132,76,38,147,44,203,54,155,205, +110,183,71,34,145,96,48,232,245,122,189,94,175,162,40,170,162,16,66,50, +210,51,68,73,156,63,255,171,159,151,45,211,84,58,100,232,144,110,82,203, +189,228,78,41,165,160,82,132,20,85,155,249,244,83,63,254,184,204,233,116, +50,243,210,216,216,200,192,69,22,62,30,42,28,40,138,34,198,184,161,161, +33,45,45,173,39,4,107,150,215,248,124,62,69,81,194,225,112,110,94,174,205, +106,19,4,222,102,181,174,90,179,110,96,223,254,125,202,50,64,67,8,16,161, +84,228,185,35,135,245,63,109,226,184,229,171,127,223,190,99,103,56,18,114, +165,185,48,66,132,82,38,163,170,234,42,131,209,104,50,26,245,157,122,80, +139,199,130,49,155,205,86,91,91,27,139,197,236,118,59,19,125,71,71,135, +221,110,119,56,28,102,179,217,106,181,218,108,182,157,59,119,74,146,209, +230,176,149,151,151,187,221,110,73,146,100,89,89,181,122,229,187,179,103, +115,60,25,60,112,136,174,248,123,134,71,118,177,239,148,18,141,104,60,22, +126,251,237,215,99,143,59,174,95,191,126,236,243,107,154,214,208,208,48, +100,200,16,134,87,192,33,210,25,245,0,121,251,246,237,153,153,153,142,253, +161,199,93,212,144,237,176,138,138,157,62,159,23,33,84,84,84,212,167,79, +31,140,176,74,212,182,214,182,230,166,250,198,13,223,130,214,73,107,161, +8,1,213,128,98,65,122,230,205,57,207,190,252,158,63,20,238,215,183,159, +238,232,118,238,220,233,245,122,51,51,179,242,242,114,245,52,245,160,198, +135,189,167,163,163,163,169,169,201,102,179,229,229,229,33,132,188,94,111, +60,30,79,79,79,231,121,158,5,48,219,182,109,27,62,98,196,119,223,47,224, +177,184,114,229,202,223,214,172,44,95,187,126,235,206,202,128,223,31,8, +120,41,129,97,195,135,14,30,60,120,228,200,145,227,198,141,203,200,200, +72,64,44,201,148,87,70,209,239,112,183,141,29,59,193,40,137,38,179,137, +16,10,0,13,13,13,25,25,25,233,233,233,177,88,140,225,133,135,228,163,244, +175,163,209,104,99,99,99,97,97,33,91,206,125,235,18,144,212,45,102,48,24, +124,126,255,134,245,235,51,92,46,158,231,109,142,148,156,156,108,22,89, +87,85,85,159,123,198,113,207,63,126,23,141,69,18,75,213,121,52,0,88,12, +117,213,109,51,95,125,119,193,146,95,4,209,156,154,154,66,41,141,199,99, +219,183,87,196,98,209,244,116,151,36,25,50,51,51,217,136,173,253,22,185, +246,21,125,93,93,93,44,22,19,4,33,47,47,143,231,249,202,202,74,167,211, +233,112,56,152,114,120,189,94,171,205,250,237,130,111,211,210,210,14,180, +150,236,207,57,142,211,165,157,152,235,166,106,178,170,104,136,34,77,213, +46,190,228,114,140,129,9,157,227,112,83,115,51,0,98,135,73,28,52,93,58, +144,125,103,95,24,12,6,171,213,218,222,222,206,182,185,94,178,97,225,163, +78,67,20,69,145,101,249,189,242,243,237,118,187,221,110,125,126,198,189, +94,79,251,238,221,187,41,165,26,209,10,10,122,125,190,112,233,226,159,86, +32,78,96,143,195,42,205,4,40,13,69,242,211,237,47,60,118,219,188,183,158, +202,203,78,107,104,108,228,121,222,96,52,230,228,230,0,192,216,35,70,12, +232,83,180,113,227,166,96,48,200,112,155,131,38,247,154,166,49,183,100, +177,88,42,43,43,85,85,45,44,44,172,175,175,215,237,173,213,106,213,100, +53,18,142,106,72,166,42,97,195,124,73,162,93,48,65,246,103,201,96,242,38, +99,255,67,68,163,136,163,42,141,62,244,208,244,250,186,58,135,221,65,9, +69,8,237,216,81,113,233,101,23,57,28,41,6,131,145,21,101,96,111,66,214, +161,26,250,140,140,12,191,223,239,247,251,117,112,141,93,86,7,2,29,14,7, +115,164,128,128,80,210,187,119,239,154,186,58,10,225,242,31,103,71,34,65, +143,199,131,17,166,148,58,157,233,79,189,252,129,199,231,211,129,88,10, +128,40,80,10,132,16,42,171,67,251,20,127,243,193,11,99,134,245,173,168, +168,0,128,116,151,203,229,114,253,186,110,253,147,211,111,191,243,166,43, +55,111,222,92,85,85,213,121,100,67,119,169,44,67,167,83,82,82,2,129,64, +70,70,198,238,221,187,89,193,164,178,178,82,127,102,209,32,134,35,97,141, +2,194,24,177,255,88,127,17,218,171,227,101,175,10,187,94,68,167,160,205, +153,251,205,251,31,206,177,152,205,0,16,141,197,218,219,219,190,153,255, +213,241,39,156,20,9,7,5,129,215,1,153,67,138,103,58,171,131,90,32,16,96, +181,158,140,140,140,138,138,10,125,235,224,206,158,35,171,213,154,154,154, +202,2,15,132,144,166,106,1,127,128,231,57,158,151,190,95,188,222,101,115, +110,249,233,83,145,215,88,253,193,96,48,108,174,168,125,105,246,103,136, +23,128,2,162,123,72,245,0,20,81,138,169,38,146,216,220,217,207,223,122, +221,121,13,245,13,241,120,188,172,172,204,237,246,63,252,196,11,143,78, +187,225,231,239,230,81,170,110,221,186,45,28,142,238,253,113,246,179,4, +12,177,97,109,95,41,41,41,205,205,205,146,36,49,250,95,167,97,36,209,104, +0,129,0,168,11,165,9,237,119,33,129,245,123,16,66,56,142,159,55,239,171, +251,166,222,147,238,114,98,140,235,234,27,178,115,178,63,251,252,179,35, +143,26,251,243,79,63,217,236,118,86,237,60,108,254,144,32,8,108,52,42,33, +196,106,181,106,154,86,89,89,169,40,50,195,100,204,102,179,193,96,96,153, +14,43,77,176,122,91,36,18,33,132,230,228,228,124,179,112,113,171,187,221, +149,98,254,98,214,12,135,133,247,122,125,60,207,23,22,228,207,124,229,163, +121,95,255,140,172,22,138,40,5,202,38,237,66,231,81,0,8,99,18,240,78,189, +246,178,215,159,154,74,181,184,219,227,25,48,112,192,252,239,151,191,55, +235,163,35,7,148,254,244,205,156,161,131,7,108,218,180,177,177,177,145, +225,189,148,146,125,53,74,223,148,197,197,197,173,173,173,44,174,223,189, +123,119,106,106,170,223,239,103,201,129,215,231,117,183,183,34,96,207,208, +51,92,140,57,229,217,243,62,189,127,218,180,188,220,140,88,44,182,113,227, +134,59,239,188,121,206,71,31,13,26,56,24,0,190,255,238,7,214,212,218,197, +17,29,26,204,143,49,3,5,217,182,229,120,206,239,247,215,214,212,154,205, +230,148,148,20,179,217,220,212,212,196,110,17,10,133,252,126,127,52,26, +101,75,130,16,114,56,236,190,96,100,201,47,107,1,209,146,188,188,207,223, +126,18,104,180,165,173,149,227,184,190,125,251,220,56,237,241,181,235,119, +97,201,8,148,141,157,97,211,104,104,231,18,32,170,196,39,30,51,116,249, +55,175,148,20,228,86,85,85,103,103,103,223,48,237,233,170,198,170,222,37, +246,239,62,123,243,230,107,111,172,175,175,223,182,109,107,56,28,193,28, +166,148,36,39,134,201,94,151,97,100,141,141,141,105,105,105,25,25,25,85, +85,85,70,163,209,237,118,3,0,209,232,238,221,213,136,178,30,204,30,227, +239,191,172,92,49,227,225,71,211,93,206,134,186,122,87,70,234,246,109,219, +111,190,254,70,171,213,138,16,138,68,34,235,55,172,103,144,208,254,38,1, +244,148,87,196,254,164,165,165,133,231,121,158,231,109,54,27,66,168,189, +163,163,170,170,74,16,4,183,219,45,8,130,44,203,94,175,87,95,30,189,140, +192,243,124,94,110,206,140,231,223,3,131,145,104,90,70,74,202,250,239,222, +183,136,2,43,248,229,247,42,184,239,145,231,162,10,70,128,216,145,71,148, +80,160,152,157,166,3,128,34,10,89,245,123,237,181,183,61,51,162,127,230, +221,119,92,97,182,152,138,138,75,39,156,126,237,218,53,85,159,204,157,119, +254,185,19,214,252,242,125,86,186,107,199,142,237,141,141,141,201,42,213, +133,213,195,52,198,96,48,120,189,94,171,213,154,159,159,31,137,68,188,94, +175,166,105,130,40,109,220,242,59,209,128,130,210,67,125,231,206,59,239, +188,139,47,186,36,22,139,164,164,164,78,157,122,239,211,79,207,180,217, +29,4,48,162,128,48,154,63,127,254,242,229,203,115,114,114,216,96,211,131, +166,60,251,62,171,30,141,5,131,193,142,142,142,188,188,60,131,193,32,8, +2,81,149,243,38,157,190,102,237,58,89,86,194,225,48,203,6,153,142,235,212, +15,253,70,22,139,101,211,214,237,101,249,197,131,6,23,82,133,8,28,119,209, +191,79,250,125,83,69,69,85,157,213,106,109,119,251,12,146,48,98,228,96, +170,42,76,223,17,2,44,240,254,80,244,251,159,215,189,55,119,254,150,29, +21,79,76,189,225,148,51,142,239,93,144,21,141,202,63,175,46,231,37,227, +75,111,189,95,215,232,94,186,108,101,67,67,253,240,161,195,252,190,192, +224,65,253,107,106,26,99,177,152,201,100,220,175,39,99,101,153,150,150, +22,135,195,97,48,24,40,165,138,162,120,60,158,244,140,12,143,183,99,202, +148,11,120,65,232,225,208,9,52,118,236,216,65,131,6,77,250,247,228,145, +35,134,219,108,86,253,144,20,118,203,187,239,190,123,209,162,69,5,5,5,172, +78,230,243,249,244,56,228,224,245,216,78,124,145,165,248,149,149,149,149, +149,149,67,135,14,205,207,207,143,70,163,191,151,255,186,232,171,183,27, +91,188,231,94,124,179,193,108,41,41,45,6,64,116,111,188,105,207,42,98,20, +10,134,194,33,119,229,175,223,64,92,165,64,16,198,177,120,124,198,27,115, +102,190,62,167,164,184,68,142,199,223,127,253,137,97,3,74,72,48,72,144, +198,27,76,171,215,109,153,245,225,39,163,134,244,63,97,194,145,5,125,123, +47,93,188,252,227,47,23,86,108,171,174,172,173,119,123,60,192,75,86,139, +213,239,243,158,121,206,217,89,25,105,191,174,222,96,226,229,37,95,190, +181,182,124,235,125,79,188,177,125,215,174,94,189,122,237,27,221,51,5,106, +107,107,11,6,131,37,37,37,132,144,112,56,92,83,83,147,147,147,211,218,214, +182,123,199,70,91,90,14,215,51,19,143,218,219,219,173,86,171,40,8,148,2, +5,138,49,199,52,149,217,253,209,163,71,179,186,48,139,32,35,145,8,203,92, +14,148,110,36,63,162,46,113,81,20,5,65,216,182,109,91,69,69,69,102,102, +230,176,161,195,8,144,213,43,87,206,125,115,70,113,175,236,235,238,126, +188,205,227,13,132,213,204,204,76,56,64,61,8,16,96,132,27,234,235,31,190, +231,202,75,38,159,70,227,50,101,73,42,160,181,191,111,154,116,229,125,142, +212,116,10,116,217,215,179,93,22,14,73,244,197,55,190,248,245,215,242,167, +30,190,43,39,59,245,183,242,77,183,76,125,102,227,246,10,37,174,169,170, +6,0,28,207,89,76,102,89,85,9,209,68,73,122,243,205,55,211,51,51,39,79,250, +215,238,213,223,56,44,226,230,138,234,49,167,93,70,129,43,45,45,49,155, +205,201,68,126,221,210,110,223,190,61,43,43,203,110,183,51,149,111,110, +110,14,132,66,63,124,243,245,152,113,227,123,234,240,82,83,83,5,65,0,68, +1,40,78,154,147,202,54,123,101,101,37,155,119,199,182,191,217,108,182,217, +108,44,28,220,175,193,193,123,26,209,37,167,211,153,150,150,198,224,111, +22,18,0,64,107,107,107,135,41,83,246,227,0,0,32,0,73,68,65,84,187,195,239, +243,25,77,150,245,27,55,223,255,228,43,239,62,251,192,178,79,223,40,200, +114,118,180,183,35,132,0,117,229,27,33,132,216,100,131,140,204,204,215, +103,127,222,220,234,6,68,17,80,160,128,8,29,61,124,240,218,133,31,103,165, +90,4,14,159,127,213,125,49,100,120,235,205,207,176,34,127,244,193,204,80, +200,119,214,5,183,142,62,225,226,213,235,54,197,162,10,161,212,100,54,165, +103,184,114,114,114,28,169,41,78,103,10,209,180,52,167,243,171,111,22,168, +68,57,246,216,99,63,255,110,9,240,220,192,161,3,251,150,229,114,28,110, +106,106,210,137,193,201,197,38,66,72,105,105,41,139,130,24,107,222,145, +154,194,99,92,254,251,138,67,168,55,61,244,208,67,137,169,0,184,235,96, +128,173,91,183,126,252,241,199,121,121,121,201,112,51,207,243,70,163,81, +146,36,134,17,50,68,158,231,121,73,146,12,6,3,11,7,77,38,147,209,104,100, +133,58,93,247,235,235,235,131,193,32,0,200,178,236,76,75,67,8,126,43,255, +253,193,91,175,26,50,164,143,209,32,158,127,198,113,187,107,26,214,148, +111,177,219,173,201,124,32,189,189,152,41,90,115,171,155,195,218,81,163, +135,65,34,131,3,208,136,205,110,184,120,242,196,148,84,115,75,91,251,252, +239,215,94,116,238,25,39,29,55,242,201,153,111,252,231,150,71,55,108,222, +193,88,237,44,57,176,88,44,44,111,164,148,98,204,25,141,198,198,198,198, +233,15,63,208,175,180,143,217,104,125,246,185,231,174,189,114,10,168,113, +17,11,243,190,94,50,96,192,0,134,56,50,74,101,178,54,176,124,59,28,14,51, +165,148,68,73,150,101,179,213,126,198,25,103,254,33,126,36,211,178,133, +11,23,222,114,203,45,3,6,12,232,194,129,73,110,113,99,183,199,24,235,28, +149,228,119,170,170,26,141,70,89,225,102,203,150,45,129,128,111,200,128, +190,219,42,170,74,202,74,61,110,111,70,170,101,249,252,89,70,1,179,25,2, +138,162,62,254,202,251,47,127,240,77,89,81,65,114,21,127,47,130,170,166, +214,84,87,173,250,246,221,162,172,116,4,236,192,198,68,219,55,194,98,40, +24,170,105,111,94,180,106,203,7,31,126,182,105,203,78,74,193,110,183,155, +76,102,140,81,50,107,35,241,144,8,48,194,161,80,104,192,192,1,111,189,245, +54,34,116,220,184,177,187,87,125,110,50,240,129,136,226,236,51,110,192, +192,33,70,163,49,28,14,183,180,180,88,173,214,204,204,204,228,10,170,170, +170,245,245,245,249,249,249,108,8,70,60,46,115,60,254,237,215,181,127,136, +63,195,62,106,75,75,11,27,102,218,101,227,119,1,54,131,193,160,94,0,75, +98,33,16,134,80,71,163,81,86,243,85,85,85,83,233,249,103,159,50,124,112, +217,142,237,219,49,70,213,13,45,193,152,55,65,1,164,148,227,184,251,110, +188,108,202,153,227,107,106,170,147,41,118,123,120,200,64,121,142,119,185, +50,206,190,244,46,108,182,176,52,37,209,123,65,128,208,24,18,168,193,228, +120,123,214,7,59,43,106,172,102,107,90,90,154,205,102,99,99,200,244,11, +38,30,18,177,28,139,90,173,214,93,59,119,238,218,181,11,99,124,218,233, +167,250,67,49,32,212,230,76,25,54,168,95,56,28,97,32,62,59,18,131,1,3,201, +49,165,209,104,244,122,189,108,196,139,36,73,21,21,59,255,40,111,137,93, +186,190,190,94,20,197,110,106,208,137,97,119,225,176,40,138,58,187,60,30, +143,251,124,190,246,246,118,22,119,178,247,39,72,141,64,155,234,219,143, +57,122,116,186,203,105,48,154,120,193,240,245,194,85,72,16,128,2,1,138, +128,242,24,61,255,196,189,55,92,113,78,115,115,35,155,199,191,239,148,134, +212,212,212,22,143,255,254,199,159,67,6,65,223,9,8,0,52,180,179,186,229, +177,103,94,246,249,163,47,188,254,234,51,207,204,212,105,1,9,98,68,50,72, +7,72,16,4,73,146,52,77,211,84,109,203,166,45,50,196,38,159,123,97,123,91, +19,32,4,114,248,248,163,70,5,66,33,29,166,47,42,42,178,88,44,219,182,109, +11,4,130,140,157,71,9,117,165,167,179,122,22,3,90,162,177,104,207,179,201, +238,130,205,230,230,102,131,193,112,160,217,8,250,202,51,59,163,170,106, +56,28,246,249,124,129,64,128,113,213,247,154,26,70,41,171,134,111,216,186, +125,220,200,33,95,190,255,172,18,246,103,102,164,63,254,226,44,144,44,108, +26,113,226,48,227,80,120,234,45,151,189,51,115,170,201,32,180,180,180,114, +137,81,54,123,38,165,170,170,90,84,88,48,231,243,165,95,255,176,2,113,184, +115,120,42,69,24,253,248,203,154,171,47,250,247,19,15,222,62,96,232,176, +94,185,5,46,103,90,114,68,187,47,208,152,153,153,201,78,133,221,180,101, +83,134,51,125,204,145,163,10,242,114,129,16,74,180,35,70,12,98,203,166, +183,71,165,103,164,23,23,151,156,53,113,92,109,93,3,115,136,2,207,103,100, +100,212,212,212,36,136,221,20,181,181,183,253,9,114,247,249,124,140,25, +113,192,162,56,66,148,82,89,150,3,129,0,51,41,140,226,161,75,92,215,175, +182,182,54,6,171,13,236,55,120,194,81,35,135,245,46,190,237,198,139,3,129, +160,47,24,93,240,221,18,36,8,136,13,61,101,115,223,162,209,99,143,24,250, +213,91,79,150,21,228,84,86,86,233,254,57,113,180,46,165,0,96,79,73,125, +236,185,119,91,91,189,128,116,201,66,117,125,115,122,170,237,152,225,253, +154,170,182,103,230,102,244,233,219,59,30,143,195,222,109,243,186,213,210, +52,77,150,229,194,194,66,132,160,177,177,73,137,105,70,94,176,154,140,148, +130,162,105,189,139,178,5,110,15,1,141,217,37,77,83,174,186,232,140,217, +47,223,87,85,189,43,24,10,1,64,90,90,26,33,36,20,14,49,96,178,181,165,181, +27,113,245,212,190,71,34,145,228,33,170,93,78,54,35,132,40,138,210,209, +209,17,139,197,216,199,131,164,78,220,100,199,203,40,212,236,219,184,42, +107,132,34,128,115,78,25,223,43,219,145,151,147,251,236,11,179,128,235, +52,184,250,104,77,66,51,93,182,239,230,189,120,205,101,103,239,170,172, +141,198,162,208,57,46,143,5,36,146,36,118,248,99,119,205,152,169,81,192, +172,230,65,21,171,65,90,187,110,91,126,182,115,108,81,170,67,36,39,157, +52,49,46,203,12,55,102,97,24,139,219,116,221,103,28,227,62,3,250,62,249, +210,147,169,46,167,10,65,141,34,132,40,135,192,108,119,102,164,167,107, +106,2,163,102,235,45,10,194,202,85,191,158,112,244,200,202,181,95,246,202, +203,242,120,60,154,166,229,228,228,180,183,181,51,188,175,173,173,77,143, +59,14,83,223,153,101,56,16,4,166,170,106,40,20,242,249,124,122,6,219,61, +45,91,127,20,175,47,160,40,26,0,73,207,204,188,245,154,11,253,1,95,67,135, +119,205,154,223,17,199,65,231,200,101,36,8,72,16,100,89,37,209,200,131, +183,95,182,112,206,115,133,57,105,141,141,141,138,34,235,36,72,160,144, +145,158,246,253,143,219,30,126,105,22,136,2,0,165,136,235,87,90,184,163, +170,150,18,72,79,179,165,72,225,51,78,60,166,127,239,62,145,104,132,173, +86,65,65,1,66,72,213,84,165,115,124,2,203,245,131,190,192,121,147,206,169, +170,170,225,21,153,163,172,131,146,147,48,164,165,90,181,206,206,2,204, +97,66,8,5,180,126,75,13,40,200,204,243,179,95,186,215,153,98,172,172,172, +226,121,142,149,157,45,22,75,71,231,25,2,7,85,121,220,13,137,101,223,48, +142,125,173,131,180,172,130,213,243,113,21,38,179,201,239,15,42,178,10, +8,64,86,254,117,202,132,123,174,187,96,119,117,221,23,223,253,164,170,42, +5,138,5,30,153,164,53,191,149,127,181,224,187,54,143,7,97,74,34,209,225, +125,243,223,123,113,218,195,119,92,210,212,212,84,223,208,152,136,8,129, +82,74,138,139,243,63,93,176,234,153,183,62,1,73,0,130,7,244,46,172,173, +111,9,134,66,148,104,102,142,230,218,148,89,179,94,247,199,130,8,64,150, +101,86,168,43,237,91,252,159,27,175,140,69,163,38,147,201,98,177,168,170, +74,52,26,246,134,101,89,35,81,47,66,20,16,16,194,33,160,9,96,152,21,135, +49,199,38,205,237,174,107,244,197,99,107,126,221,24,11,133,57,204,89,44, +150,138,138,93,0,52,26,141,90,44,150,182,214,214,131,242,21,14,174,239, +201,65,116,226,80,86,89,102,99,22,116,35,206,14,122,59,104,197,149,117, +206,219,108,182,166,22,119,76,214,128,0,1,160,49,229,218,203,207,188,233, +250,75,62,252,124,73,77,83,19,72,248,199,242,221,55,220,249,152,201,97, +59,253,180,147,51,51,82,41,98,51,72,52,170,104,83,254,117,226,142,229,115, +207,60,241,168,173,91,183,250,124,62,132,16,0,166,20,28,14,219,7,159,254, +176,96,217,58,77,163,189,114,179,8,64,85,93,35,227,137,242,16,41,75,231, +94,153,241,66,179,187,89,211,52,159,207,239,112,56,12,188,233,183,21,107, +115,114,115,75,74,138,37,73,138,68,34,8,131,209,104,18,20,47,138,121,41, +32,160,32,226,88,85,99,115,197,238,90,157,112,154,24,55,135,185,45,219, +171,47,187,246,222,129,131,251,87,214,52,85,214,52,102,100,164,151,148, +20,183,181,181,135,195,97,139,197,82,85,83,213,19,238,34,36,159,119,176, +95,125,79,182,51,178,44,179,19,36,147,187,108,89,71,82,15,41,112,102,179, +57,16,10,201,138,10,32,177,104,142,132,201,211,119,92,237,247,184,63,255, +97,77,208,31,86,34,129,231,31,186,147,23,80,40,18,141,68,227,29,238,96, +69,85,77,249,134,77,71,31,57,236,216,35,134,89,13,240,210,140,59,238,185, +254,188,39,94,156,253,254,231,63,228,231,229,81,224,36,73,144,68,195,157, +143,188,225,190,229,124,18,12,213,214,55,207,153,191,116,72,159,50,96,3, +60,35,190,139,79,29,186,120,197,25,139,190,251,177,184,119,241,132,227, +198,47,95,186,188,173,165,45,47,47,47,28,9,83,10,22,139,165,177,169,33, +221,149,110,22,9,166,84,209,72,92,37,6,9,191,253,209,124,69,81,216,144, +121,74,41,199,37,112,17,183,199,123,226,53,23,136,130,250,218,187,159,26, +76,22,86,127,239,63,160,127,123,91,187,40,138,117,117,117,61,140,103,248, +3,183,27,236,101,103,130,193,32,235,71,237,2,193,51,125,63,168,39,209,15, +202,114,187,221,209,120,4,192,220,137,83,96,65,160,103,157,60,225,198,123, +103,62,249,192,173,231,159,115,34,196,229,165,43,127,255,236,155,165,85, +53,181,27,126,223,34,72,134,145,35,71,100,102,55,77,24,61,24,128,39,225, +104,78,166,243,153,7,110,174,111,234,200,201,78,115,185,50,87,111,220,185, +109,107,5,165,228,154,155,158,136,69,252,146,200,109,220,177,107,226,184, +209,19,38,140,166,113,25,33,16,144,252,248,29,55,88,173,169,207,62,247, +188,213,96,50,137,134,87,95,122,221,110,183,83,66,227,241,120,71,123,71, +52,30,191,254,223,39,167,91,56,0,178,189,170,97,222,252,197,101,37,121, +155,183,239,26,62,168,79,171,39,210,73,97,227,16,2,132,176,221,110,251, +122,225,143,158,246,214,133,63,149,247,237,83,162,83,42,89,27,162,199,237, +233,2,166,30,154,220,41,128,76,8,116,14,190,11,133,66,250,104,147,61,215, +162,140,93,174,34,4,154,166,233,145,79,119,76,32,204,69,163,97,143,79,133, +124,32,160,97,138,48,47,44,254,249,183,239,150,174,92,49,255,237,47,231, +127,235,105,243,223,243,216,75,11,23,45,119,187,189,177,88,20,0,142,24, +61,250,193,7,31,255,242,139,57,141,158,112,47,151,157,3,160,10,72,28,55, +237,166,139,30,121,113,246,109,87,156,95,177,107,119,99,99,253,248,163, +143,58,245,228,19,67,129,64,138,133,51,73,248,214,71,94,252,44,231,177, +226,226,124,170,168,20,72,97,154,248,252,180,235,36,132,131,114,120,221, +214,223,153,40,35,145,112,67,99,179,51,203,54,231,233,233,71,244,238,45, +32,5,8,237,83,152,61,100,80,241,83,47,125,244,194,35,183,205,120,101,14, +133,72,210,208,20,46,20,10,89,173,150,159,87,173,219,188,163,178,79,239, +226,61,144,53,5,86,207,137,70,163,177,88,76,146,36,86,72,56,100,125,71, +137,3,134,18,83,171,89,102,212,213,193,38,128,75,138,49,175,170,106,247, +114,215,119,43,207,115,173,110,31,130,44,68,49,226,241,218,77,21,79,189, +242,238,130,57,175,241,56,62,254,216,99,74,70,158,234,15,4,217,86,51,155, +205,6,163,97,243,150,45,55,221,112,213,172,183,223,91,180,224,179,107,46, +60,1,20,133,129,102,35,6,245,61,101,194,17,167,95,113,231,142,157,53,103, +159,122,204,171,51,110,79,77,179,114,24,131,138,0,243,102,73,184,242,238, +25,111,61,121,119,81,175,108,86,135,50,105,1,234,175,94,183,163,117,246, +43,179,12,6,35,227,24,95,56,121,226,140,219,47,7,85,5,69,3,68,8,208,202, +170,250,55,102,125,241,200,237,255,233,215,167,192,237,245,233,81,63,219, +172,126,191,159,17,202,115,115,243,186,76,91,209,99,182,64,32,192,136,52, +221,235,251,1,215,132,49,41,24,217,232,64,61,121,148,82,65,20,250,247,237, +23,139,247,168,228,141,16,18,4,190,174,185,1,48,194,28,218,184,163,242, +185,55,63,248,102,206,203,18,7,75,126,217,124,252,191,175,242,121,253,148, +18,131,193,144,158,158,238,114,185,44,22,139,203,229,218,93,93,51,237,209, +233,99,79,57,211,29,144,1,3,11,52,16,194,19,143,57,34,22,141,29,49,124, +192,156,23,31,117,217,93,40,134,105,4,64,5,34,43,83,38,157,50,229,172,19, +239,122,226,149,165,43,202,9,161,136,227,16,230,112,204,221,203,40,31,51, +238,104,204,161,177,195,251,127,254,198,227,51,166,94,3,241,24,149,99,0, +138,26,141,126,189,232,151,251,158,126,251,138,201,167,156,48,118,88,84, +86,26,155,91,81,82,165,129,105,52,51,179,201,69,136,228,62,47,131,193,192, +40,42,7,53,188,7,180,51,162,32,10,130,208,157,207,68,64,41,53,136,198,209, +99,71,45,248,234,91,176,31,164,241,131,33,7,6,131,161,177,166,85,65,52, +30,141,111,217,182,237,249,71,238,148,48,204,251,106,209,173,211,159,247, +122,60,8,35,70,61,100,228,64,22,47,10,188,176,248,251,31,228,152,252,252, +51,79,56,184,16,38,17,64,64,9,233,85,144,123,215,53,83,190,255,121,141, +96,194,160,40,201,115,172,128,146,203,38,79,44,200,205,124,101,246,231, +31,127,189,228,230,43,38,15,26,80,6,20,21,101,91,159,186,231,242,142,142, +127,13,238,93,200,243,8,66,1,32,26,82,227,107,126,175,120,253,243,69,209, +72,228,238,75,207,26,61,180,63,5,26,241,7,235,27,90,6,164,38,26,110,52, +77,99,40,183,162,40,6,131,129,181,33,116,105,205,101,253,183,126,191,191, +39,60,151,3,25,7,10,128,12,6,83,48,24,232,134,201,70,41,145,36,243,136, +81,71,124,242,241,167,221,91,152,78,51,133,12,6,67,77,93,179,32,113,65, +175,124,252,49,227,156,118,219,178,223,54,220,254,240,243,109,29,110,142, +227,24,121,186,11,119,1,33,100,179,218,150,46,94,252,206,172,62,15,223, +123,35,117,87,177,210,53,82,181,139,38,157,244,222,103,11,119,239,174,43, +41,204,3,162,81,138,128,176,93,143,48,66,199,30,53,108,244,144,254,31,207, +95,114,245,61,79,229,100,185,206,63,253,248,193,125,139,50,211,157,57,41, +121,60,85,195,158,112,67,115,123,249,230,29,239,127,189,52,20,142,94,55, +233,248,211,198,141,176,88,173,64,52,208,160,174,161,133,0,69,157,243,153, +88,137,67,20,69,86,10,214,33,169,125,11,156,157,49,238,97,249,213,78,6, +154,197,227,113,119,199,218,160,16,147,149,210,210,190,148,104,251,142, +134,232,146,109,49,209,75,162,216,220,225,5,74,109,22,11,47,74,219,43,118, +95,123,247,227,45,237,94,73,146,24,91,164,203,70,97,187,132,227,56,167, +211,249,202,107,175,93,120,193,228,146,20,35,82,162,44,169,177,164,56,134, +244,43,93,181,110,75,73,113,47,96,67,90,153,33,2,66,1,1,69,102,147,225, +202,11,255,117,222,25,199,46,88,186,234,139,239,126,126,241,221,79,17,32, +73,226,129,208,120,44,78,8,201,77,115,92,117,218,248,147,71,13,52,89,140, +148,0,162,20,128,34,142,255,105,85,57,139,214,36,81,100,0,17,171,184,41, +138,98,54,155,125,62,223,190,188,57,182,45,252,126,127,79,242,38,254,192, +234,14,105,105,174,157,59,119,118,207,138,9,5,219,211,28,206,180,212,52, +77,211,246,219,221,163,247,239,114,28,167,170,138,209,104,108,105,107,1, +202,99,78,169,107,108,185,234,206,71,42,42,106,56,158,75,117,166,118,193, +14,147,145,172,52,167,211,231,243,197,101,195,163,79,61,243,246,83,247, +9,74,36,225,214,9,57,122,212,144,141,219,119,193,158,10,101,226,56,150, +4,48,79,1,52,205,106,54,158,127,214,137,231,255,235,132,144,47,224,11,6, +194,145,168,160,18,163,200,217,36,193,108,148,64,83,168,162,17,85,67,28, +71,17,2,140,145,89,156,191,232,151,254,125,139,199,143,25,185,104,217,26, +135,195,202,44,59,11,81,140,70,35,163,247,236,119,100,22,147,251,31,194, +35,211,51,51,227,241,88,55,171,199,142,34,78,79,203,200,201,205,237,126, +78,9,43,16,170,154,102,52,26,235,91,106,163,81,138,121,254,153,87,103,175, +248,109,243,160,65,131,76,70,19,209,200,190,16,191,174,68,190,128,63,191, +87,47,129,23,86,174,252,117,243,174,106,0,74,81,226,124,131,76,87,138,207, +23,4,89,233,156,124,205,80,75,86,168,237,20,135,70,136,44,131,28,55,27, +133,44,87,74,89,94,86,81,94,70,86,154,195,100,144,64,81,137,74,40,194,128, +121,224,4,224,121,36,138,141,205,158,230,54,223,215,31,60,63,243,190,203, +158,125,108,106,101,85,181,238,90,153,175,98,88,230,126,53,172,11,2,122, +136,114,71,8,0,242,243,242,131,193,144,14,195,238,99,220,1,16,69,8,91,109, +98,255,1,253,15,122,66,57,199,113,68,35,28,199,105,26,169,174,175,91,250, +75,249,178,213,229,211,238,187,239,230,91,111,46,44,44,100,6,180,11,222, +144,56,254,7,65,56,20,6,128,162,162,162,148,116,39,65,6,138,56,220,121, +56,153,193,96,136,201,178,70,72,39,113,134,49,131,105,226,203,206,53,4, +74,40,37,64,40,104,26,97,244,38,0,138,17,17,120,36,8,72,20,144,40,80,81, +160,162,8,22,235,235,31,124,62,245,166,139,139,10,178,68,14,78,26,145,203, +186,36,245,144,156,213,178,117,8,22,246,238,204,79,110,186,59,116,185,83, +10,0,67,135,13,97,112,227,126,209,53,212,137,218,42,50,156,114,202,201, +221,239,47,70,145,100,220,100,135,195,177,240,199,101,223,47,93,113,202, +73,39,159,125,206,121,163,70,143,122,224,222,123,25,68,197,170,125,169, +169,169,73,229,33,202,78,249,144,101,217,110,183,157,125,214,153,102,107, +58,5,142,2,97,43,31,139,70,141,146,196,233,179,182,216,188,95,4,137,70, +156,4,109,146,34,138,19,45,10,140,203,135,49,112,60,18,68,196,11,84,146, +64,50,128,193,8,146,17,11,82,52,18,91,178,108,197,109,215,78,33,161,8,209, +56,170,114,58,234,167,111,65,214,76,186,223,214,189,30,246,195,116,135, +71,150,149,148,176,105,1,251,157,33,195,32,36,158,231,3,126,247,241,39, +156,104,54,27,217,128,198,46,139,164,231,20,146,36,201,178,12,8,210,156, +206,15,230,46,184,226,162,51,39,142,27,244,240,244,251,37,78,234,55,108, +200,67,143,61,230,247,251,152,124,89,239,47,161,68,81,20,69,78,236,3,158, +231,9,161,243,63,159,127,211,237,183,171,216,202,100,11,8,213,54,181,58, +83,237,144,32,179,83,10,148,80,198,215,67,76,244,58,79,18,1,166,8,33,204, +33,196,83,204,1,207,131,40,82,81,66,162,132,36,9,137,6,16,5,48,153,222, +250,104,254,127,46,59,31,52,13,0,97,76,163,113,53,26,211,88,235,136,222, +202,108,52,26,117,125,239,66,25,234,97,247,240,129,241,72,4,0,80,82,82, +196,200,23,251,51,241,20,16,112,28,215,220,218,4,0,167,158,118,106,77,109, +77,55,236,73,81,20,21,89,70,128,76,70,67,77,125,91,113,65,175,241,99,135, +141,30,152,119,217,229,151,128,166,14,29,60,228,195,215,103,179,33,131, +110,183,187,172,172,12,35,60,252,200,225,199,158,113,156,28,143,51,230, +83,36,18,137,199,227,181,213,53,170,170,36,152,215,28,94,182,102,195,224, +126,101,176,135,163,70,17,69,254,88,204,31,142,176,89,13,52,193,140,103, +61,22,24,16,0,70,128,49,112,28,226,120,196,243,32,72,192,139,192,241,128, +112,40,20,251,225,151,223,38,78,24,75,84,13,40,197,0,209,120,226,16,36, +189,109,85,85,213,100,125,239,98,24,147,201,157,135,94,111,130,196,163, +158,112,236,49,29,110,119,119,113,40,207,119,184,91,1,224,202,11,175,141, +70,162,44,91,219,119,12,56,107,69,100,85,64,129,23,228,152,186,124,229, +58,80,180,187,110,188,116,210,73,99,30,125,232,225,128,223,83,52,180,223, +91,47,190,29,141,69,219,218,218,84,77,29,52,120,80,56,28,105,168,170,55, +24,141,185,185,185,172,3,56,30,151,251,244,41,197,156,6,128,0,97,95,187, +123,243,142,170,163,70,12,4,141,34,86,42,164,8,139,252,206,157,85,155,182, +237,0,158,103,14,14,161,206,98,29,66,128,57,192,24,56,30,48,71,49,6,158, +3,14,81,14,83,14,35,132,54,108,219,25,137,169,22,147,68,52,10,24,105,148, +136,6,73,63,160,65,151,131,36,73,204,142,119,181,1,148,30,116,92,70,183, +124,2,0,76,49,0,28,53,254,216,4,141,107,127,163,12,137,70,36,81,106,111, +109,5,160,195,143,26,58,120,224,192,150,150,22,214,40,178,175,181,17,69, +81,150,21,0,224,5,94,16,133,207,190,93,10,60,79,162,209,219,254,115,206, +228,147,71,111,92,187,154,6,125,231,93,113,238,29,119,222,21,8,4,206,191, +228,130,103,159,125,122,212,240,145,6,44,246,239,223,223,108,49,199,98, +177,214,150,150,72,44,116,219,21,103,73,90,4,16,2,94,248,232,203,197,253, +202,10,243,242,179,129,18,72,0,74,148,42,242,168,97,3,143,62,114,36,81, +84,118,128,37,35,195,211,164,127,153,203,77,236,0,22,249,80,170,33,244, +233,55,63,202,241,8,162,50,143,0,83,182,51,56,160,4,193,94,52,91,150,201, +39,135,143,251,114,67,15,191,206,7,0,19,198,143,143,197,98,108,109,247, +103,226,169,40,137,29,110,47,219,33,15,77,127,168,163,163,35,150,20,122, +118,121,86,6,26,51,32,126,209,178,213,187,171,234,16,66,84,83,207,60,225, +168,243,79,24,210,203,133,4,57,112,227,13,215,191,53,107,246,133,231,95, +82,90,210,103,252,184,241,28,47,196,227,113,77,211,60,30,79,83,75,243,83, +247,223,48,97,104,111,198,52,111,107,106,253,108,225,178,187,174,158,2, +123,170,93,157,44,13,85,3,85,69,128,48,35,28,38,84,30,0,3,59,46,135,133, +155,8,58,27,210,16,69,24,58,252,161,151,223,153,107,50,153,59,143,87,161, +0,152,35,10,207,3,77,106,199,97,204,209,125,17,20,29,17,249,67,188,37,118, +27,139,197,50,122,244,104,61,247,221,119,251,72,146,212,238,118,3,128,70, +149,49,19,198,21,20,20,121,189,222,125,199,2,50,251,174,171,131,205,110, +171,170,105,248,240,243,5,154,70,16,161,160,169,86,179,100,229,85,228,173, +50,248,183,157,61,97,48,167,104,0,240,193,183,115,235,234,235,189,94,111, +93,109,93,99,91,211,219,47,61,48,249,248,163,89,103,135,166,170,239,204, +91,48,118,228,192,33,125,75,168,170,81,38,42,140,40,96,246,69,34,170,4, +189,200,14,8,113,157,161,38,98,231,44,179,17,234,64,17,5,0,179,233,230, +251,103,82,74,35,161,48,234,92,68,160,96,54,138,38,163,160,51,230,244,118, +195,228,9,206,201,196,213,63,36,247,228,210,221,228,115,206,117,187,221, +58,96,178,119,109,132,10,130,208,84,87,9,0,136,114,41,54,251,37,151,92, +212,216,216,160,247,177,37,231,156,108,28,143,170,170,132,16,70,67,123, +246,213,121,21,141,237,32,240,148,34,160,8,35,132,65,229,212,56,23,105, +34,158,173,160,248,142,27,116,100,52,28,110,106,110,150,108,120,206,219, +211,79,30,57,136,200,81,208,8,66,100,217,170,242,95,127,223,122,245,5,103, +16,208,16,165,56,209,101,64,1,117,182,85,38,78,254,164,40,97,69,16,5,77, +183,162,208,121,156,23,5,12,8,144,40,46,255,121,237,39,95,45,17,68,49,28, +150,85,224,8,165,26,165,132,202,136,23,157,246,12,125,146,202,126,59,94, +146,77,127,151,121,208,135,195,227,96,175,19,78,62,129,18,122,160,202,181, +36,73,187,171,27,245,204,232,194,41,23,166,187,50,58,220,29,60,135,247, +173,137,179,89,30,204,181,242,60,175,81,237,63,55,222,95,213,208,130,76, +134,206,12,31,37,206,73,141,5,104,203,246,243,143,25,60,247,149,71,158, +185,247,186,57,143,79,61,190,79,127,26,9,99,85,1,76,23,253,184,250,201, +215,62,186,245,210,179,115,51,210,128,16,10,132,38,184,158,73,129,1,74, +34,128,178,152,151,93,159,162,206,246,167,196,25,208,8,97,143,219,119,243, +253,207,150,150,149,154,140,166,166,182,118,170,170,128,17,0,197,136,3, +12,25,46,187,44,43,250,209,145,250,48,243,253,118,185,232,179,205,15,31, +39,96,186,145,153,149,53,112,224,192,64,32,208,53,64,164,64,1,120,142,139, +68,227,145,88,132,113,106,74,74,75,174,186,250,154,250,186,58,64,93,15, +122,35,132,136,162,152,8,179,128,242,188,112,198,137,71,5,162,241,137,83, +110,90,177,98,45,22,121,118,142,36,96,160,152,157,230,166,153,120,117,68, +159,252,243,79,25,211,47,63,139,70,195,40,30,165,209,216,203,111,206,125, +240,133,247,30,190,225,194,241,35,6,80,85,67,180,147,88,211,169,225,73, +193,1,77,0,10,28,214,146,21,16,117,210,160,0,128,82,13,105,51,94,251,200, +23,146,83,83,83,49,70,129,72,180,163,195,215,73,17,228,16,81,202,74,179, +89,79,157,174,124,7,154,53,161,151,251,15,58,197,246,96,114,71,224,74,177, +31,127,242,41,108,150,203,94,44,209,206,38,42,77,142,123,58,220,28,199, +115,28,7,64,166,222,55,205,153,234,172,171,171,235,178,37,59,3,193,56,251, +200,70,147,49,195,153,179,224,131,25,101,5,249,231,93,59,109,193,15,43, +100,69,101,173,15,136,98,172,159,28,72,84,144,101,18,11,203,161,224,206, +93,85,215,61,250,242,146,213,27,230,61,118,243,145,253,75,168,170,32,68, +41,107,41,7,10,132,38,80,2,154,200,97,128,0,2,240,248,131,143,190,60,107, +219,238,154,78,139,176,71,240,4,64,227,240,23,11,126,126,227,131,175,210, +211,211,25,33,197,98,182,175,173,216,222,121,168,148,162,96,190,119,81, +94,56,18,209,99,196,228,178,70,87,93,68,137,190,129,120,60,214,125,233, +163,39,205,56,220,5,23,156,99,182,152,147,143,106,232,172,175,2,165,16, +139,199,117,94,32,161,72,224,224,210,75,47,172,175,175,103,58,146,156,206, +177,144,134,197,17,22,179,229,247,173,91,29,86,251,220,55,30,155,118,251, +53,119,60,246,234,101,119,62,241,233,183,63,149,111,218,222,218,238,9,4, +195,145,72,52,16,12,181,180,182,173,223,180,99,222,183,63,79,123,101,206, +212,151,62,42,205,116,126,56,237,170,124,151,131,40,113,32,132,18,138,48, +115,142,137,9,151,20,18,96,110,98,5,56,244,235,239,27,47,56,237,248,129, +253,202,244,8,94,207,80,176,40,188,247,233,247,231,92,251,128,213,230,96, +211,34,1,32,53,213,177,108,249,58,144,36,4,24,81,4,68,27,51,98,8,135,18, +227,139,245,179,106,247,75,93,65,0,146,100,96,45,37,135,133,3,39,243,55, +41,41,234,85,120,201,133,151,60,251,252,179,195,134,13,75,230,19,116,30, +113,171,181,183,37,120,82,236,56,224,210,210,129,28,135,219,219,219,115, +114,114,186,200,93,175,21,152,76,198,176,170,54,54,180,15,232,211,235,132, +163,71,52,212,213,125,181,104,117,249,166,138,163,143,24,236,113,251,88, +228,199,104,67,86,147,169,36,43,117,194,160,146,91,206,60,38,39,205,1,8, +81,141,0,214,125,55,2,32,64,16,69,157,232,63,0,165,42,0,70,148,130,6,199, +29,57,90,148,4,170,40,8,39,30,24,179,232,81,228,30,127,97,246,125,79,190, +62,98,244,177,222,246,26,140,113,60,22,19,4,33,37,197,254,227,178,181,192, +11,148,98,160,26,199,195,240,1,189,143,26,61,160,182,57,168,71,138,201, +117,252,189,29,44,24,12,146,94,108,232,6,133,63,184,220,49,69,20,232,163, +143,63,250,198,219,111,182,181,181,185,92,174,189,119,16,141,199,99,181, +181,213,140,188,199,198,50,246,235,83,38,73,6,86,225,101,3,107,245,161, +193,9,95,143,128,231,121,191,39,152,95,148,69,100,165,32,55,237,254,59, +175,185,239,158,27,31,122,230,245,126,69,5,167,142,27,17,12,6,163,177,168, +128,113,138,36,88,48,112,154,140,9,69,172,186,130,112,103,194,137,1,99, +192,9,20,15,1,69,9,234,9,101,33,58,197,136,0,21,120,54,141,1,128,0,198, +236,93,42,225,184,233,79,189,249,216,115,239,205,156,113,191,219,235,253, +228,243,6,0,136,70,99,38,147,73,18,197,154,22,111,71,125,71,74,170,0,26, +193,20,27,5,254,241,59,46,63,225,130,59,211,51,115,56,142,227,121,126,223, +233,124,137,120,15,192,96,48,2,0,70,152,113,111,254,136,157,161,154,166, +81,66,231,126,250,69,67,125,131,146,80,28,154,232,252,163,192,243,66,229, +174,74,85,85,48,78,200,32,51,211,133,17,118,58,157,236,100,1,189,184,206, +170,172,108,147,10,130,80,85,87,119,213,221,207,110,105,238,104,105,119, +7,61,29,129,246,150,51,79,57,250,171,37,75,53,30,21,228,101,246,45,45,42, +233,149,147,154,98,17,68,1,115,2,112,152,114,60,229,121,42,8,32,8,72,224, +65,16,16,194,148,113,185,152,71,77,8,2,16,213,173,9,70,9,58,47,162,24,1, +230,195,170,178,106,107,205,200,83,175,125,253,253,249,243,222,123,234, +182,43,207,92,183,114,13,209,84,132,144,223,31,96,253,52,46,151,243,211, +239,191,227,36,30,40,143,40,16,66,10,139,11,95,120,252,198,150,150,22,10, +192,243,188,206,216,237,18,176,105,170,202,38,54,18,66,187,143,104,14,174, +239,128,40,32,66,1,141,59,250,168,115,47,184,112,241,247,223,230,231,39, +122,12,1,33,10,68,20,197,173,219,183,71,34,81,171,213,202,60,174,197,108, +82,52,149,13,205,233,232,232,96,46,75,143,177,52,77,227,4,142,227,176,221, +102,93,187,110,203,121,87,60,152,151,233,176,152,69,196,27,171,235,154, +91,58,220,207,188,253,213,83,211,174,38,126,63,162,8,0,35,158,167,148,2, +193,12,192,5,158,167,188,0,130,136,48,79,49,70,72,235,156,162,155,208,3, +186,231,196,79,253,64,8,138,120,12,70,203,138,85,229,175,188,251,233,130, +133,43,206,251,247,9,31,189,242,64,191,226,92,80,149,45,117,62,158,207, +140,69,35,209,104,132,53,240,101,101,102,126,246,237,207,215,254,231,92, +64,10,22,4,16,121,160,232,212,83,199,75,156,229,170,187,159,148,101,37, +20,10,165,164,164,236,235,87,9,165,102,179,229,15,241,244,146,124,5,199, +97,14,0,48,208,219,111,189,249,151,101,63,198,228,184,36,10,8,97,74,40, +198,88,16,197,157,59,119,201,50,27,110,72,128,2,18,121,162,105,140,30,94, +95,95,111,181,90,245,190,17,158,231,101,89,150,36,137,231,5,77,211,156, +78,39,207,243,222,176,236,13,197,41,13,42,138,146,158,154,242,254,199,243, +51,109,252,109,183,92,78,60,1,44,136,4,113,136,227,128,104,20,48,112,24, +113,28,226,121,192,28,99,27,232,238,29,177,32,148,197,234,172,247,18,97, +32,26,18,68,36,10,191,173,223,252,200,179,239,45,253,101,221,184,49,67, +151,124,249,218,192,146,76,201,100,128,152,218,26,241,69,45,67,134,142, +185,108,211,119,119,49,10,9,0,136,162,212,216,218,190,171,162,178,180,184, +108,233,202,213,139,150,174,14,199,161,87,142,227,204,83,143,253,248,157, +135,167,92,249,64,40,20,178,217,108,251,73,151,52,205,110,183,254,209,58, +223,94,185,62,32,2,202,128,1,253,239,186,243,246,166,198,70,140,57,189, +93,72,20,132,250,250,186,246,182,118,140,49,35,205,70,227,136,210,132,77, +47,42,42,98,115,47,217,213,88,167,22,107,109,101,133,74,74,41,207,113,60, +207,51,66,115,52,22,45,46,42,124,236,165,143,102,62,251,134,138,8,225,57, +196,35,224,69,16,141,200,96,68,162,4,130,8,152,75,132,43,136,73,29,18,176, +12,80,86,39,1,4,4,52,69,211,66,10,126,245,131,175,75,71,159,117,196,201, +151,115,64,86,125,243,234,247,31,191,48,188,127,177,196,75,32,171,32,64, +93,71,52,63,183,52,236,111,41,238,115,26,199,113,24,115,12,69,183,90,237, +15,61,55,231,168,137,151,124,242,201,146,99,199,142,185,236,156,83,251, +20,149,189,246,214,188,157,91,119,110,88,50,247,236,51,79,86,85,77,143, +117,147,93,43,219,7,135,207,143,220,143,218,83,32,26,185,234,154,107,86, +255,186,250,251,239,22,21,151,20,107,90,194,193,26,141,166,85,171,214,244, +237,215,135,2,0,240,30,111,148,195,28,107,125,42,43,43,243,120,60,29,29, +29,46,151,139,177,192,90,90,90,216,1,21,108,238,154,205,102,211,177,14, +158,231,229,160,172,168,106,113,113,233,163,47,205,251,189,162,249,178, +127,159,210,187,52,221,101,181,137,162,4,24,39,186,59,116,16,44,17,154, +96,32,68,141,199,131,225,152,47,16,108,105,247,212,183,184,119,212,212, +255,190,121,199,178,21,235,125,129,224,41,199,30,53,251,229,199,198,28, +57,16,34,1,53,236,7,196,81,14,113,88,216,94,211,254,230,251,159,100,200, +237,67,156,85,212,73,156,48,194,29,8,249,3,178,205,110,137,198,98,191,173, +93,255,217,172,25,131,134,150,65,36,2,64,134,15,204,57,253,212,35,228,112, +136,144,240,167,111,78,159,124,229,131,27,183,85,167,165,57,147,193,40, +54,32,190,251,25,78,135,40,119,0,4,60,107,215,125,237,173,183,255,117,250, +169,21,219,119,233,247,72,117,166,46,92,56,255,138,255,92,10,84,5,196,109, +217,185,75,146,68,198,48,161,148,230,230,230,86,86,86,90,44,22,131,193, +192,144,107,54,195,212,102,179,85,87,87,39,131,74,60,207,199,227,113,74, +8,207,243,101,101,101,139,151,175,253,230,187,101,165,133,153,174,52,103, +126,110,118,175,236,204,204,116,123,122,170,205,119,75,126,161,0,0,32,0, +73,68,65,84,32,138,113,69,11,134,99,225,104,60,24,142,120,188,129,14,95, +192,231,15,135,34,209,72,76,110,106,237,216,182,125,7,187,102,159,222,197, +179,94,156,126,226,216,33,102,147,68,252,126,138,49,229,56,164,0,111,144, +158,126,237,195,119,63,250,246,225,105,87,159,53,253,40,78,18,1,33,18,87, +118,84,85,45,92,90,254,225,252,31,137,18,255,241,243,215,114,51,83,52,95, +0,176,64,8,135,56,76,226,113,140,68,12,68,139,196,95,124,248,198,179,175, +156,22,8,134,172,86,139,62,95,137,77,168,167,52,81,30,248,19,244,157,82, +138,16,199,68,36,112,252,235,175,190,121,226,137,199,51,14,38,165,52,53, +37,117,241,146,37,0,160,17,202,97,216,188,101,139,36,73,122,135,46,207, +243,37,37,37,219,183,111,239,211,167,143,32,8,169,169,169,110,183,155,245, +116,233,117,68,61,20,83,18,126,2,48,198,133,5,189,216,217,4,219,42,155, +182,236,106,144,21,149,168,138,222,138,35,240,162,100,48,72,6,201,32,138, +130,40,50,51,3,64,16,198,78,167,211,237,118,79,57,123,226,211,211,175,79, +53,25,121,132,73,92,165,8,81,160,28,1,108,149,46,189,254,241,217,159,126, +61,245,230,75,39,142,31,133,65,133,8,97,28,133,62,189,242,250,221,62,236, +187,229,107,238,184,246,234,220,76,155,166,202,128,121,202,113,130,196, +135,34,81,1,81,94,50,106,170,70,85,37,195,105,127,230,161,155,206,188,248, +46,163,177,144,231,217,57,174,192,246,52,5,194,160,209,110,230,20,244,84, +238,123,7,76,180,48,63,127,198,147,143,223,122,219,93,172,113,73,148,68, +89,86,126,251,109,253,168,81,195,0,160,190,41,34,25,68,150,79,179,220,90, +16,132,17,35,70,108,216,176,161,164,164,196,229,114,237,218,181,43,43,43, +139,17,10,35,145,136,201,100,74,238,141,10,135,195,108,100,35,5,202,38, +28,88,109,86,4,123,62,72,50,252,176,103,217,40,241,249,252,109,94,149,55, +166,120,125,193,83,79,24,59,107,230,157,2,176,97,50,148,80,138,57,78,163, +164,166,177,245,130,219,95,108,142,230,12,58,234,130,49,195,251,26,64,2, +136,38,46,76,9,32,84,181,125,87,52,232,62,229,228,177,196,227,70,2,215, +225,141,248,195,145,55,102,127,82,219,212,102,181,88,28,86,195,121,255, +58,105,112,159,82,172,210,35,71,244,123,232,158,203,166,62,242,86,223,190, +125,49,70,154,166,245,238,221,47,33,213,131,29,105,118,8,118,38,185,246, +170,97,101,210,191,207,109,106,110,126,228,145,39,10,11,11,41,161,217,89, +89,239,188,243,46,147,251,239,191,45,179,90,108,76,148,138,162,176,234, +140,193,96,40,45,45,173,173,173,205,207,207,199,24,51,138,161,205,102,243, +122,189,108,52,168,46,74,183,219,205,40,5,8,161,4,73,64,219,79,161,156, +17,5,25,142,18,151,99,238,142,118,67,246,9,253,71,157,26,118,87,41,161, +134,23,159,184,89,228,5,77,198,20,17,192,20,8,135,69,233,227,47,22,189, +244,241,86,156,245,159,222,89,189,235,183,45,112,7,162,160,80,173,115,240, +10,16,14,139,194,183,139,127,185,100,202,191,33,20,198,130,249,171,197, +63,150,255,190,109,212,208,126,211,239,184,198,194,2,21,85,221,178,101, +7,43,238,146,144,124,205,229,83,26,155,252,239,206,91,152,159,151,167,40, +74,113,113,159,4,96,177,135,47,125,248,121,211,62,144,27,194,28,146,0,224, +134,27,110,121,238,185,153,155,55,109,84,85,213,149,238,90,184,240,107, +37,174,182,107,80,191,107,149,197,106,99,201,17,59,11,136,17,75,82,82,82, +178,178,178,170,170,170,82,83,83,59,58,58,88,19,176,126,76,164,126,139, +100,74,8,203,250,208,222,231,208,37,19,167,56,142,139,70,67,110,159,154, +117,196,93,113,33,173,233,215,25,155,191,191,239,174,107,207,46,202,203, +82,149,4,127,24,105,148,183,152,175,189,251,145,103,230,181,153,138,47, +54,59,123,41,114,196,145,61,236,157,249,59,163,28,229,5,132,40,0,161,64, +85,224,200,214,45,59,143,28,54,144,168,202,167,11,150,46,90,189,225,154, +43,166,156,126,226,120,19,135,104,48,68,130,33,26,139,13,40,45,18,88,162, +6,132,4,195,119,223,112,233,9,227,70,185,221,158,120,92,206,47,42,233,76, +121,14,162,239,135,44,247,228,190,3,13,200,57,103,79,122,231,205,183,171, +107,107,56,142,39,132,124,243,221,210,95,87,252,18,151,21,81,20,40,77,156, +147,194,68,22,143,199,217,129,143,101,101,101,45,45,45,225,112,56,26,141, +26,141,70,85,85,187,112,81,216,17,31,251,69,183,19,232,80,231,152,192,80, +40,84,85,85,221,22,77,47,62,233,249,250,154,173,167,247,111,58,255,228, +210,83,79,25,119,247,117,83,212,80,28,1,2,85,165,8,171,188,56,249,242,105, +191,182,140,206,24,48,25,113,54,2,42,226,65,52,59,196,252,107,206,184,249, +227,69,235,54,180,133,35,10,167,18,129,7,192,241,120,212,102,148,58,130, +209,197,43,203,239,186,250,226,76,135,81,142,203,148,117,123,64,162,187, +158,101,8,20,97,160,196,200,105,143,220,126,145,221,34,40,26,29,57,98,176, +46,214,238,235,172,135,101,103,116,204,147,18,194,75,147,167,76,241,250, +60,79,62,253,140,213,102,249,102,193,231,125,135,79,48,25,141,44,154,54, +26,141,250,220,60,134,136,177,210,199,192,129,3,171,254,31,111,223,29,37, +85,145,253,127,111,213,123,175,115,79,206,129,9,12,121,24,96,0,201,32,138, +160,34,70,68,80,215,188,98,86,48,103,214,117,119,93,115,194,156,0,179,24, +144,32,24,136,74,142,146,36,204,12,51,48,57,119,126,239,85,221,223,31,175, +123,24,20,3,174,223,95,255,193,225,204,57,211,103,186,186,222,173,91,159, +251,9,101,101,129,64,192,110,183,187,221,238,96,48,232,116,57,99,204,70, +244,122,189,63,99,91,118,254,86,194,161,64,40,108,132,13,22,210,85,87,122, +177,167,91,78,102,207,51,247,111,120,235,164,172,202,210,62,227,114,82, +60,15,204,232,46,34,1,70,140,0,24,67,221,48,238,252,247,135,187,253,165, +73,61,70,235,122,24,145,128,27,66,104,140,32,160,129,45,113,220,248,73, +231,58,92,30,183,219,213,167,123,215,147,71,12,168,245,69,234,219,219,246, +111,47,239,86,152,153,151,230,17,186,169,40,138,148,81,31,28,138,142,87, +88,180,144,144,68,162,236,140,212,103,102,221,58,229,250,7,56,8,0,144,82, +48,198,126,251,198,250,231,163,58,127,214,159,190,55,239,221,235,111,188, +193,229,137,75,72,72,9,7,90,82,211,210,44,67,49,159,207,215,173,91,55,11, +218,182,22,52,16,8,88,191,98,105,224,26,27,27,133,16,105,233,105,64,96, +154,102,67,67,131,97,24,150,214,52,122,19,5,48,77,211,52,77,191,175,181, +173,61,224,72,40,113,164,246,113,36,228,187,83,122,129,226,16,16,140,52, +236,119,54,124,112,247,141,147,123,230,103,119,201,76,17,145,16,50,46,37, +41,154,13,20,118,229,173,79,124,95,211,39,189,251,72,144,130,162,181,23, +77,148,0,140,164,51,88,254,121,227,238,183,11,186,118,183,92,182,34,186, +209,210,210,122,211,101,227,43,42,154,239,188,229,210,156,196,120,166,112, +176,219,128,17,232,134,105,152,64,192,99,118,30,16,85,157,129,0,84,220, +234,167,139,215,126,184,120,221,59,239,188,165,42,170,149,220,242,127,178, +238,63,27,75,9,97,108,217,178,241,236,115,206,175,169,169,29,48,96,128, +21,238,22,8,4,202,203,203,75,74,74,172,74,162,105,154,211,233,236,32,49, +119,36,202,213,215,215,231,229,117,65,100,245,117,181,173,109,205,193,128, +17,31,239,14,135,195,134,41,20,142,36,100,88,143,24,186,200,234,53,62,123, +192,84,180,39,50,197,43,145,16,194,76,18,35,222,190,239,181,127,94,93,50, +118,216,48,206,56,35,2,36,9,130,107,238,31,214,111,121,248,169,87,202,205, +147,50,251,78,69,18,209,189,138,196,208,17,49,124,0,198,169,3,82,95,124, +232,220,158,69,133,146,142,17,47,54,212,215,157,53,97,248,211,179,174,7, +102,171,59,210,244,218,59,31,182,7,195,39,245,239,121,254,164,9,34,18,98, +82,32,162,164,40,253,146,0,164,229,32,199,181,15,23,47,63,80,19,185,251, +158,123,21,149,33,252,214,128,251,248,62,228,39,250,50,65,72,146,185,25, +121,3,6,15,89,240,197,23,137,137,9,22,4,166,170,234,225,195,135,51,51,51, +59,110,164,14,135,163,179,228,181,195,89,194,48,140,3,101,149,241,217,131, +122,13,184,224,222,123,175,221,221,210,115,248,184,73,183,222,124,91,133, +217,63,62,127,28,218,82,250,142,153,153,220,243,92,224,170,74,118,133,136, +201,16,19,170,4,27,250,14,119,119,238,186,253,186,139,153,105,50,64,96, +76,18,4,35,242,193,255,188,244,244,155,159,250,157,167,101,244,189,2,33, +96,173,147,4,144,8,78,144,67,122,37,222,123,253,160,77,95,205,110,170,175, +227,71,237,163,192,225,112,8,33,220,94,207,254,178,74,46,249,51,47,191, +187,111,223,193,210,210,146,161,195,6,55,52,181,204,95,176,100,96,113,15, +155,166,69,125,38,173,85,71,146,12,153,32,34,179,107,97,214,23,159,47,115, +39,166,228,118,201,177,216,57,255,7,245,189,211,102,231,200,80,33,41,117, +195,212,61,30,79,85,85,85,97,97,161,5,184,91,51,38,139,95,40,165,52,77, +211,82,235,118,204,104,57,231,66,152,149,85,213,195,38,63,37,227,74,167, +159,159,37,4,217,50,226,166,93,216,231,135,13,21,204,93,236,198,176,39, +165,183,144,166,169,251,17,184,96,66,16,32,106,4,166,106,227,7,215,204, +153,51,247,38,38,132,193,52,149,4,73,201,57,214,215,213,231,119,203,81, +246,167,196,23,77,146,162,25,0,25,49,41,64,209,228,208,146,212,243,198, +100,133,117,57,231,173,207,62,254,104,126,118,86,102,167,188,39,167,53, +118,23,166,104,110,105,223,179,255,192,211,179,110,77,78,137,7,195,4,105, +150,246,200,214,141,17,213,71,106,220,78,135,117,224,196,48,57,224,18,128, +33,3,230,228,202,77,215,156,115,227,253,15,61,246,228,115,253,251,247,251, +13,251,65,246,23,172,187,69,155,144,32,37,110,218,184,81,85,149,204,204, +76,203,208,210,98,224,88,214,229,22,2,28,137,68,58,60,62,162,0,57,99,12, +41,163,224,52,195,93,24,167,133,139,186,56,62,95,81,209,61,139,197,121, +216,134,125,1,137,1,41,35,194,52,136,68,116,80,23,163,196,112,69,109,62, +180,253,180,82,79,151,252,46,134,41,0,165,68,144,68,160,104,62,67,60,254, +230,22,79,151,241,0,64,132,18,176,205,140,228,117,209,254,115,83,191,243, +71,103,188,246,121,197,187,139,126,122,247,213,39,227,227,220,86,99,100, +1,71,140,49,43,163,98,239,222,125,51,167,159,247,212,131,215,37,122,108, +50,16,148,134,33,76,105,134,35,204,164,220,244,52,146,50,22,82,6,212,49, +51,140,106,126,169,40,47,231,191,15,222,120,203,141,211,45,85,251,95,214, +71,30,159,213,7,136,192,130,129,208,250,245,235,29,78,167,205,102,139,143, +143,183,24,85,86,187,210,209,150,88,169,76,214,246,7,2,100,204,226,176, +115,45,142,100,36,53,85,49,117,227,80,141,111,242,216,30,219,118,181,6, +125,160,9,41,152,252,89,180,50,2,74,41,24,179,237,217,50,255,63,51,175, +2,51,196,53,5,72,0,99,220,97,107,105,107,62,235,202,89,133,67,239,2,69, +1,18,0,196,193,188,238,236,162,103,111,30,180,254,199,134,219,158,221,60, +102,96,78,205,166,151,52,214,236,118,123,173,183,181,252,170,3,129,0,34, +250,124,254,236,180,132,155,167,79,51,116,16,100,194,81,206,7,177,168,179, +22,90,72,5,179,38,45,236,168,31,154,144,16,214,35,253,122,230,222,116,205, +148,123,239,187,159,197,230,243,255,55,117,6,1,136,64,98,125,107,221,214, +173,91,51,211,211,58,27,97,89,211,143,206,83,214,112,56,236,118,187,155, +154,154,56,231,32,1,145,105,54,91,192,108,82,152,54,184,48,113,119,85,36, +222,46,250,247,138,159,187,120,159,80,12,96,156,147,2,120,140,115,47,1, +48,198,91,234,247,119,75,242,175,221,85,177,252,149,143,91,2,210,238,244, +164,38,218,50,146,179,103,207,253,56,119,248,189,166,98,3,25,54,164,200, +78,181,95,61,169,48,193,195,175,254,247,38,155,77,125,232,186,65,95,189, +251,216,242,175,23,22,247,237,43,132,180,166,190,14,135,163,189,189,93, +146,100,140,5,130,193,161,37,61,128,116,224,146,11,198,24,35,105,205,95, +152,41,37,34,197,60,196,163,147,159,24,227,158,1,128,130,160,146,2,97,227, +188,113,131,87,172,125,117,231,238,61,189,123,22,33,42,255,55,235,14,0, +64,92,129,133,139,190,177,41,252,103,151,79,43,245,201,178,195,176,126, +30,10,133,172,216,188,40,73,154,192,233,112,54,53,213,51,3,78,26,152,254, +241,87,101,35,6,165,212,53,155,101,135,91,53,187,211,186,161,32,252,140, +45,65,0,208,112,224,235,27,166,94,156,215,183,244,209,115,255,102,227,113, +150,17,205,35,143,63,69,105,103,58,227,10,116,221,32,16,19,71,101,79,28, +154,185,114,75,227,146,141,149,19,71,118,45,238,146,240,250,43,207,44,249, +100,94,239,62,197,29,8,162,203,229,234,136,144,147,82,198,121,189,223,173, +222,216,84,23,72,242,58,76,41,88,244,86,193,26,91,218,146,146,18,133,105, +30,5,0,48,230,0,125,172,94,131,16,193,148,19,70,14,152,255,241,135,61,238, +187,239,184,130,234,255,169,206,28,189,70,2,2,176,217,207,61,111,105,242, +126,118,217,177,4,228,16,75,6,211,117,253,152,42,79,96,119,56,131,190,253, +156,133,61,170,121,176,58,52,126,100,222,242,213,85,6,179,35,72,128,142, +146,222,249,163,65,48,18,140,87,90,46,156,124,86,207,62,67,164,116,251, +219,204,96,0,190,93,185,244,237,79,214,184,242,70,24,50,194,21,184,101, +90,215,83,6,230,252,107,206,143,27,247,214,60,112,197,64,167,162,221,247, +200,11,159,189,247,66,110,110,182,69,84,87,85,213,227,241,4,131,193,142, +36,48,68,212,52,213,155,144,124,214,101,119,248,125,33,206,98,215,125,85, +221,180,117,71,109,93,35,87,20,68,60,6,121,193,206,14,244,209,63,21,73, +244,235,153,183,119,247,182,72,88,167,227,57,53,255,79,235,110,121,134, +91,205,192,7,31,191,15,210,140,221,160,143,226,133,156,115,235,41,238,248, +146,20,69,177,172,224,162,111,194,144,49,238,182,115,209,94,30,98,54,140, +232,25,233,241,107,126,172,182,169,128,82,33,121,244,51,90,102,44,156,73, +147,147,222,176,187,180,119,78,78,102,94,36,164,155,126,32,21,253,254,218, +41,87,223,149,221,255,82,77,154,54,141,223,58,37,223,235,118,223,251,236, +154,156,180,248,25,151,150,126,241,93,229,99,79,62,179,113,209,131,133, +249,57,86,194,150,166,105,94,175,215,202,251,196,152,133,166,245,159,132, +196,248,160,206,46,187,103,118,93,187,223,20,22,40,97,120,146,146,95,248, +232,235,151,222,255,50,96,24,186,148,130,162,12,34,176,18,230,173,140,14, +136,14,157,129,105,89,105,41,50,210,122,160,188,2,225,56,193,157,255,235, +126,103,140,89,184,197,236,231,94,74,73,73,6,138,230,83,31,171,131,245, +180,180,180,116,70,181,44,103,67,85,85,33,150,54,145,148,144,220,120,112, +89,40,96,22,228,185,26,154,66,53,117,17,5,53,203,140,182,179,216,13,25, +9,82,236,166,214,90,179,254,172,179,70,43,170,45,28,38,206,81,149,193,139, +47,191,190,112,192,116,105,79,74,203,112,223,123,73,175,150,16,123,237, +147,189,151,158,219,227,244,97,153,179,158,250,252,157,23,111,221,191,242, +137,158,189,251,91,152,179,170,170,46,151,203,231,243,117,200,192,142,213, +24,145,203,97,175,60,92,61,233,234,199,218,116,9,140,144,208,166,217,235, +154,252,201,185,189,158,121,243,99,193,84,174,196,118,122,135,193,89,167, +127,1,37,83,149,162,188,46,235,215,173,253,63,233,103,136,8,17,62,249,228, +19,159,223,39,101,180,97,239,204,81,6,0,183,219,141,140,53,54,54,118,156, +183,29,48,25,139,101,179,199,199,39,84,28,92,87,93,31,42,200,242,110,222, +214,34,53,5,73,151,240,139,70,6,80,0,49,179,222,17,57,52,97,252,196,128, +159,24,48,174,178,127,62,249,116,189,210,211,145,85,212,39,215,126,235, +5,221,22,111,168,254,126,75,245,117,83,139,155,90,140,107,111,184,119,209, +156,219,234,15,172,236,213,187,216,97,183,91,52,77,135,195,97,149,151,163, +6,3,157,171,1,34,1,40,140,109,92,191,230,221,47,190,97,78,13,184,114,240, +192,193,174,69,61,38,95,244,55,123,114,143,171,110,123,36,20,33,84,212, +24,77,173,115,107,7,81,53,149,52,251,245,233,185,101,211,166,78,168,53, +253,69,235,78,134,32,8,135,131,11,23,126,105,93,80,45,230,105,84,235,78, +4,200,136,40,20,14,171,92,169,172,60,212,185,254,88,38,170,29,228,30,198, +185,67,229,115,231,46,200,204,72,220,85,214,72,54,9,196,16,127,142,166, +146,100,54,213,185,123,219,252,27,174,158,234,178,199,145,73,104,224,198, +205,63,44,94,185,203,153,127,114,78,162,109,218,196,252,23,63,216,135,76, +187,118,74,183,47,22,110,189,255,166,11,6,102,250,79,25,58,36,47,63,223, +225,116,72,146,150,183,174,181,211,163,143,32,88,30,138,72,68,22,243,153, +33,248,124,254,141,155,55,222,114,211,45,111,190,243,49,112,7,104,218,210, +21,155,78,30,61,212,136,192,244,43,111,157,118,233,109,131,206,184,108, +215,161,90,19,85,33,129,16,4,130,144,82,90,204,34,0,9,18,12,42,238,157, +127,240,192,129,227,94,157,254,183,250,78,28,16,183,109,251,113,235,150, +237,214,78,143,54,230,49,232,7,129,124,62,95,70,102,218,238,221,91,115, +178,114,14,31,57,220,177,191,132,16,214,72,36,198,128,144,201,73,41,91, +214,46,200,202,116,86,214,180,171,200,17,88,172,115,57,74,64,70,133,161, +217,106,52,151,253,125,250,205,237,109,130,72,154,44,252,175,103,103,203, +244,113,197,153,174,107,206,205,95,248,245,193,65,197,113,147,70,228,60, +250,159,143,86,126,249,228,162,57,47,95,115,237,213,43,214,124,151,146, +156,194,99,175,14,99,200,99,232,249,12,37,137,112,36,220,222,214,94,95, +215,144,146,148,252,222,27,239,61,243,248,51,167,77,56,119,238,135,95,236, +249,169,236,112,83,235,73,67,71,235,97,83,152,198,216,177,227,174,191,233, +246,139,254,126,255,252,111,214,213,251,34,194,34,216,51,6,66,198,148,14, +32,9,92,46,87,197,161,114,248,69,86,210,159,156,123,116,154,59,145,194, +217,155,111,205,211,141,136,117,126,90,154,152,104,48,3,231,149,149,135, +122,247,234,249,238,59,239,164,103,116,121,123,206,59,157,227,119,172,84, +34,139,197,103,173,169,199,227,214,140,234,72,123,109,123,72,5,195,60,46, +235,19,25,29,218,183,126,250,21,167,107,54,155,48,201,27,167,60,245,248, +127,119,213,198,141,26,58,232,156,113,121,95,46,175,236,209,51,203,235, +96,211,111,184,53,199,182,127,209,7,111,14,25,94,122,233,21,151,116,43, +42,234,32,173,91,184,99,231,79,193,145,19,81,77,77,117,89,89,69,106,90, +198,223,46,189,236,131,57,243,191,91,250,221,57,231,94,232,11,154,119,223, +127,247,87,107,118,253,227,233,247,31,125,236,89,34,144,66,72,9,166,14, +67,7,142,42,47,63,242,216,51,175,110,217,190,163,174,177,33,154,245,108, +73,118,16,73,18,227,188,166,182,206,138,229,253,229,196,70,249,19,61,140, +148,38,17,3,32,228,124,227,186,45,243,63,249,160,91,81,161,5,64,234,134, +222,193,147,45,43,43,63,123,210,153,79,60,249,164,219,237,21,82,12,31,49, +252,218,233,215,124,252,193,252,162,238,69,208,201,162,210,110,183,135, +195,97,203,82,134,100,104,213,15,59,37,57,25,104,38,25,63,203,14,32,64, +36,222,92,190,252,138,57,243,130,45,97,143,211,190,120,193,146,87,191,220, +49,121,234,131,195,123,166,46,92,114,224,172,73,5,63,110,62,248,226,51, +119,63,247,143,187,199,157,50,193,19,167,221,125,207,93,146,208,237,118, +119,222,218,214,224,151,136,20,174,8,41,42,171,42,219,124,109,83,39,79, +189,226,146,107,187,228,117,73,140,79,214,77,221,231,151,36,200,238,65, +183,61,225,185,231,94,10,71,140,204,204,116,161,11,146,204,106,99,226,19, +82,6,14,26,240,236,67,211,123,231,103,154,122,68,1,11,163,64,139,23,139, +128,160,41,159,45,89,61,114,228,152,227,206,168,255,92,157,97,156,35,50, +147,1,94,126,245,213,57,57,153,200,185,195,225,240,251,253,81,101,136,132, +214,182,182,113,167,77,120,250,241,167,29,78,183,32,137,128,82,208,253, +247,220,231,245,186,66,193,80,7,99,210,50,255,140,185,198,3,227,176,244, +171,213,100,218,64,50,30,245,160,61,230,229,111,169,27,61,164,48,57,33, +213,4,181,177,161,238,142,71,254,59,238,172,91,71,14,78,94,183,191,106, +218,69,189,183,174,221,55,231,165,135,191,120,247,217,211,199,159,65,130, +55,55,183,207,125,111,94,65,126,126,135,135,195,209,124,62,68,73,178,166, +182,102,247,206,157,103,77,56,99,215,182,189,207,61,253,98,207,94,197,30, +103,146,97,26,154,198,44,70,46,87,16,16,146,146,146,51,51,211,17,208,52, +8,36,48,68,64,230,15,182,13,42,41,202,203,72,66,32,205,102,139,169,242, +99,134,165,8,129,246,192,242,149,27,79,29,55,238,47,234,103,8,128,161,148, +6,67,219,227,47,188,220,84,95,229,241,120,29,118,135,229,120,29,137,68, +184,162,180,180,180,244,234,217,227,197,23,158,112,120,92,96,185,2,0,48, +134,89,57,57,55,222,116,99,85,85,85,199,20,219,226,146,91,56,6,0,58,108, +142,29,91,214,232,162,141,97,212,98,32,118,83,178,156,10,32,208,92,62,254, +228,161,40,72,74,227,137,23,158,43,40,61,107,194,152,222,251,142,248,70, +247,75,125,235,149,15,151,126,250,143,47,62,156,221,179,168,212,52,152, +205,206,23,45,89,232,114,58,129,197,102,179,22,133,149,161,161,27,71,170, +143,52,52,52,158,50,246,180,109,155,126,124,105,246,171,201,238,172,112, +128,49,198,20,39,57,188,156,219,24,74,80,84,139,92,111,193,94,68,68,122, +132,17,160,4,4,162,134,186,35,61,243,83,189,46,27,177,152,128,13,59,100, +83,4,32,246,149,31,110,15,68,74,7,14,56,174,0,225,196,215,221,186,34,32, +85,30,110,122,251,213,87,242,242,242,165,148,118,155,118,228,200,145,242, +138,67,105,105,169,173,45,173,35,70,142,120,227,141,55,60,158,68,137,196, +24,59,106,13,75,112,245,213,211,211,82,83,15,28,56,128,157,146,97,59,166, +169,154,205,46,130,101,194,215,100,50,131,4,68,247,40,34,17,67,50,5,73, +175,234,235,87,220,27,132,178,254,135,229,27,118,28,57,99,194,228,3,85, +7,122,229,37,190,249,252,83,9,74,217,252,247,230,231,102,244,208,117,9, +132,132,176,113,227,6,155,221,102,145,232,37,9,64,32,146,149,149,135,183, +253,184,125,194,132,137,31,206,157,255,252,83,47,165,36,231,181,180,9,67, +49,236,30,233,138,3,155,211,64,196,176,223,98,161,33,160,144,96,16,9,2, +48,194,146,76,201,145,115,64,80,96,199,142,77,165,125,186,65,204,243,35, +70,136,5,34,66,2,66,216,95,86,57,116,228,88,183,211,117,92,28,88,249,19, +251,93,160,96,82,251,96,254,39,161,160,207,237,72,114,57,93,71,170,143, +196,37,36,47,90,246,149,12,235,203,151,175,152,114,209,148,104,58,5,176, +206,146,35,41,41,46,206,251,143,71,30,185,240,194,11,203,15,149,231,117, +201,235,16,159,119,124,7,73,113,222,195,251,190,204,26,60,83,50,63,143, +198,184,129,68,9,192,21,25,78,74,212,139,10,139,252,129,214,107,111,157, +113,211,61,111,85,215,55,14,27,218,227,233,127,222,62,106,80,143,27,174, +190,81,225,118,195,144,140,152,229,226,223,216,212,96,209,170,16,16,25, +15,5,67,63,253,244,83,124,124,252,178,37,95,13,42,30,34,65,51,132,224,154, +212,108,76,81,20,134,66,128,4,224,122,200,68,82,4,26,168,32,50,134,196, +132,0,211,144,70,88,70,149,130,0,130,66,171,191,91,114,219,229,79,200,112, +16,33,246,83,140,221,96,9,128,176,172,170,118,236,216,177,170,166,28,139, +224,156,40,95,44,170,103,2,64,80,37,84,54,52,126,240,238,167,113,30,183, +166,105,4,36,165,88,184,224,67,111,92,34,67,126,85,225,85,86,205,81,162, +80,198,49,103,178,16,98,242,228,201,163,70,142,94,181,122,149,221,230,72, +73,73,134,99,93,154,18,147,82,183,237,92,81,52,96,186,159,51,0,105,61,95, +28,77,1,118,85,4,221,182,64,82,106,202,201,163,71,141,153,120,181,22,151, +214,55,69,121,122,214,140,158,133,169,183,223,50,195,8,49,41,17,136,33, +72,100,82,72,129,24,237,222,36,201,35,85,213,135,171,170,6,244,31,240,193, +187,31,229,164,23,10,16,78,39,99,170,21,178,37,128,76,9,8,4,194,228,145, +136,137,96,34,146,194,85,35,76,70,68,8,83,72,98,40,25,34,10,16,94,175,114, +251,93,15,93,117,209,68,48,77,32,32,146,136,172,83,92,22,18,144,41,216, +225,154,166,147,207,233,38,73,50,228,127,190,190,35,33,89,126,185,82,32, +163,247,63,90,85,85,177,197,102,183,59,157,206,230,230,230,51,38,158,238, +242,164,32,114,68,146,82,116,150,45,91,154,35,34,25,235,60,89,36,68,179, +103,207,246,38,230,9,119,255,234,154,90,43,242,252,40,144,207,48,61,217, +115,120,231,124,141,187,137,64,130,1,18,129,64,160,34,141,64,122,188,251, +201,199,30,11,129,107,216,201,23,162,8,62,61,235,214,188,52,219,179,143, +63,110,4,20,234,136,11,67,105,144,233,141,183,57,93,14,34,50,133,89,87, +91,95,91,91,93,58,112,240,231,159,45,40,234,89,104,143,55,29,9,146,219, +4,48,9,128,32,25,67,5,129,35,50,83,151,64,12,129,17,105,1,31,5,124,210, +140,32,72,13,37,103,140,73,2,198,88,117,77,195,250,245,223,157,121,214, +41,82,143,96,148,107,127,180,174,75,0,66,16,128,85,53,141,93,11,11,126, +109,244,193,254,120,89,239,72,105,56,82,175,61,254,200,205,121,93,186,88, +227,2,159,191,189,168,160,171,77,229,156,113,68,133,49,110,105,60,58,245, +15,81,78,58,16,232,33,17,242,201,220,180,174,221,10,243,236,89,35,110,156, +249,104,36,28,170,40,63,104,137,143,164,148,66,200,244,140,172,154,131, +75,84,17,226,90,156,162,197,75,85,33,166,18,66,75,115,89,107,253,145,143, +22,124,53,241,226,7,170,155,154,231,189,246,112,183,92,247,227,255,126, +222,215,10,132,64,200,145,1,130,36,6,174,56,149,169,144,146,154,34,165, +172,172,172,154,122,209,148,210,1,3,63,120,255,221,156,46,89,68,4,168,48, +80,145,20,70,220,74,6,177,190,50,97,162,169,19,99,0,196,9,145,36,99,160, +16,227,18,16,24,10,41,25,67,183,147,189,248,226,51,179,238,185,78,134,252, +29,209,9,29,26,65,9,36,137,144,243,138,35,117,170,221,158,148,16,207,24, +63,238,202,159,72,224,183,148,130,12,134,236,230,91,175,246,186,85,155, +205,225,176,59,252,126,191,202,149,132,196,132,95,37,57,17,144,180,212, +186,16,10,146,101,94,128,2,135,15,233,215,82,187,71,113,14,254,108,225, +26,244,12,216,181,115,119,48,24,136,82,89,165,76,244,218,54,125,57,115, +215,146,187,203,86,254,179,113,255,215,156,27,54,174,54,87,31,88,179,234, +187,194,129,231,238,173,18,187,54,45,106,171,222,57,235,225,89,200,84,11, +35,178,30,121,197,70,110,47,179,32,239,254,253,75,43,42,14,77,154,120,230, +133,83,46,184,250,154,171,10,10,10,142,49,135,137,29,60,24,221,173,92,15, +129,20,12,145,17,147,209,141,220,9,129,230,140,49,38,27,154,155,43,14,237, +25,53,160,87,148,130,64,49,235,18,2,36,98,156,51,134,168,40,203,215,172, +27,120,210,8,0,0,41,142,59,220,62,129,117,231,140,169,138,182,100,249,218, +149,95,47,200,204,200,82,53,197,52,77,93,215,25,87,28,238,248,223,188,106, +1,0,233,186,212,131,146,17,87,24,71,141,15,25,62,130,252,135,190,90,181, +225,72,99,121,159,210,225,93,186,117,19,102,67,89,217,129,198,166,22,221, +48,227,227,189,189,178,171,87,204,75,218,190,40,191,95,202,55,229,219,151, +25,97,95,160,61,16,146,142,125,135,154,183,174,91,178,228,163,183,206,58, +115,98,99,125,123,89,249,94,159,175,149,49,68,70,156,161,221,193,144,147, +133,116,157,50,118,52,17,204,152,121,91,109,109,125,191,146,254,191,54, +98,182,28,153,34,65,161,71,8,9,72,8,107,136,212,113,211,226,28,20,21,21, +5,145,193,247,63,172,26,49,184,39,19,6,8,1,157,225,35,4,66,36,33,165,148, +96,211,150,124,179,230,148,83,79,233,12,80,254,249,126,70,2,134,2,161,151, +158,121,58,59,43,19,16,236,54,187,207,239,3,0,206,153,67,85,127,251,76, +54,13,35,226,231,8,168,218,80,18,172,89,189,126,245,55,203,7,22,86,15,239, +250,73,229,246,224,45,231,64,94,110,175,164,196,193,43,190,63,252,245,170, +170,239,215,54,214,212,71,188,94,208,193,19,239,98,37,61,92,159,127,250, +118,143,180,195,167,140,244,175,251,166,38,190,233,205,72,93,187,147,69, +158,122,230,249,217,175,188,145,155,159,158,22,159,49,114,196,168,235,103, +220,156,158,146,32,165,1,132,200,20,0,72,74,74,189,254,250,233,126,127, +200,242,95,249,213,0,121,96,102,68,154,33,84,0,252,254,86,167,203,137,82, +139,182,227,68,12,233,167,159,246,236,218,179,61,20,9,142,26,62,122,253, +15,43,46,56,99,32,33,231,68,208,41,127,50,106,199,128,140,161,97,4,244, +109,59,15,14,42,237,47,163,174,103,255,219,186,19,200,149,43,191,223,177, +99,115,106,74,146,203,229,50,12,195,50,193,35,130,223,230,70,17,97,36,136, +192,192,230,128,247,231,125,60,119,238,19,163,199,120,254,126,85,94,151, +148,82,167,211,141,10,113,48,77,147,24,194,185,19,178,78,31,151,21,8,6, +191,91,223,50,227,246,213,31,46,60,40,199,167,174,248,230,208,150,77,167, +231,167,186,46,158,182,230,211,15,167,230,231,26,36,109,161,16,212,182, +248,231,204,45,123,235,237,141,34,183,229,179,197,59,223,126,247,157,135, +30,122,240,170,171,46,143,50,234,16,136,232,161,135,30,42,43,43,211,117, +253,87,255,66,2,2,48,117,46,133,137,76,212,214,213,22,21,21,81,204,31,5, +8,25,135,252,188,60,79,156,99,238,188,119,71,140,28,54,122,120,113,247, +235,206,226,12,65,178,168,137,114,204,87,193,26,113,51,166,172,216,176, +109,192,160,147,126,137,13,156,152,63,1,197,164,241,102,40,242,196,19,79, +184,28,118,43,80,50,24,12,118,92,227,127,105,170,69,157,20,245,82,72,41, +112,231,174,45,167,158,50,168,186,230,233,165,31,15,126,232,214,110,197, +57,220,235,114,50,240,115,146,32,53,198,56,71,228,18,236,60,146,20,103, +187,112,92,214,158,245,231,237,94,95,127,193,101,95,189,251,246,164,158, +5,233,143,63,123,224,156,41,67,7,244,117,122,121,92,28,87,50,60,174,146, +46,9,207,254,123,216,182,245,151,164,196,131,233,143,92,120,102,194,186, +111,95,24,119,242,128,149,171,150,133,98,252,28,206,121,81,81,81,75,75, +139,211,233,236,236,44,74,29,17,43,64,210,164,80,80,216,236,234,202,213, +223,117,235,214,53,154,155,99,53,98,12,164,4,64,89,94,126,104,253,198,141, +145,176,127,194,216,33,94,175,3,132,32,140,106,216,58,190,60,100,72,36, +192,225,248,116,209,215,231,95,56,229,151,48,226,137,236,119,4,131,76,85, +50,228,252,149,55,94,223,188,105,109,113,113,31,167,211,25,12,6,165,148, +214,92,140,72,26,134,254,203,77,110,18,33,17,71,118,228,80,237,107,111, +190,228,111,90,242,197,188,226,164,180,100,8,232,96,34,227,28,72,50,112, +128,32,0,131,1,2,152,192,128,129,6,4,12,33,62,197,249,183,203,123,44,88, +68,73,217,172,165,174,101,221,218,67,15,220,95,76,237,130,51,9,140,1,232, +12,16,130,145,130,12,247,215,159,95,248,252,171,59,150,126,123,184,111, +177,251,250,51,114,126,88,126,207,170,175,251,246,31,60,101,220,25,99,109, +170,22,8,4,131,193,160,69,143,233,172,89,176,110,243,64,92,143,72,77,83, +246,238,219,147,148,148,194,80,35,144,38,8,2,225,84,237,97,51,188,248,171, +47,230,126,186,104,235,30,145,152,154,159,152,146,48,237,172,49,96,8,22, +211,12,118,44,189,245,15,3,0,67,174,89,187,229,159,143,191,14,177,140,195, +227,10,157,126,255,92,101,196,145,179,253,7,126,122,232,193,7,123,244,232, +238,112,56,77,211,236,76,137,65,100,29,252,175,206,11,207,192,84,56,223, +183,167,236,254,123,111,25,53,100,239,51,255,28,149,232,117,73,191,46,99, +41,86,208,9,76,130,88,80,48,130,96,110,103,101,181,190,108,65,217,215,203, +246,13,29,208,11,244,240,15,235,170,53,23,3,33,59,115,223,173,119,144,134, +212,80,204,188,161,207,67,247,14,104,111,209,127,42,111,246,183,169,23, +79,115,44,249,226,182,7,238,126,216,52,69,36,18,9,4,2,86,116,111,231,7, +223,234,86,164,96,145,16,41,10,108,219,182,189,127,73,169,41,164,36,82, +137,39,184,237,59,118,111,184,234,166,91,158,126,103,123,3,63,189,231,132, +155,42,202,247,93,121,254,8,79,74,162,180,68,155,177,68,227,163,126,13, +68,192,113,231,158,3,158,184,228,248,132,184,142,155,212,9,224,4,199,40, +51,9,0,240,250,235,111,201,201,201,177,219,157,154,166,181,180,180,88,13, +31,16,72,146,161,80,192,58,96,143,237,97,152,8,171,251,247,31,188,224,226, +145,31,207,57,175,71,102,72,26,65,198,21,32,0,174,128,208,59,143,9,143, +78,200,24,6,130,202,27,175,45,83,156,105,101,149,109,139,151,183,166,166, +214,130,146,122,168,90,175,173,111,7,226,200,194,32,57,116,78,33,103,170, +196,8,211,109,35,6,36,20,117,29,241,218,107,123,39,93,144,123,199,141,223, +190,240,220,105,55,222,49,239,246,153,193,71,255,245,47,195,48,172,177, +234,49,148,31,148,0,44,20,20,12,213,45,91,183,12,28,88,98,152,4,132,156, +113,98,225,233,183,222,179,98,143,145,220,243,124,37,30,56,227,122,83,149, +209,176,118,198,117,243,133,223,136,2,50,209,206,53,198,160,97,86,138,39, +252,176,97,71,233,224,147,224,247,82,88,149,223,158,111,16,17,103,248,241, +252,143,202,14,238,79,79,79,52,191,124,112,0,0,32,0,73,68,65,84,183,219, +109,225,112,56,122,136,0,24,70,164,186,33,20,159,61,166,182,190,85,152, +17,9,10,162,64,201,245,176,52,34,82,24,226,202,235,166,125,243,249,185, +233,113,6,24,54,206,0,36,33,19,32,133,229,217,96,33,132,66,50,4,2,133,9, +146,251,15,181,108,217,82,243,247,171,78,117,56,3,224,176,77,58,189,250, +222,7,54,62,130,67,115,211,213,154,90,29,20,147,72,65,232,68,49,0,4,16, +76,168,13,109,198,155,239,254,116,222,164,236,155,167,23,45,91,89,255,218, +187,167,221,127,215,170,123,238,27,57,233,220,215,139,186,117,147,130,212, +99,3,239,40,170,66,146,32,8,165,104,111,109,206,205,202,102,12,165,225, +91,186,252,187,123,254,245,138,179,224,236,140,254,253,69,56,192,165,52, +65,57,180,231,187,107,47,59,59,46,217,45,125,6,34,139,234,149,173,211,2, +9,163,172,48,20,38,173,217,184,227,204,41,87,198,104,29,127,86,119,128, +136,13,245,13,79,62,241,184,199,227,81,85,213,34,179,145,36,64,208,245, +72,136,231,22,142,186,48,100,178,170,170,61,45,77,186,202,85,174,112,18, +96,154,192,85,229,217,151,158,191,254,154,244,244,68,160,96,12,162,192, +78,181,208,186,112,72,98,12,8,144,217,180,181,107,246,17,183,79,57,175, +24,133,95,70,52,17,48,71,143,236,114,225,164,186,15,231,254,52,246,140, +2,61,176,170,181,209,22,175,134,233,88,54,13,144,22,132,192,130,47,15,77, +187,176,107,78,166,99,233,215,135,218,90,154,33,144,113,227,244,126,171, +54,28,254,252,227,115,46,152,246,224,212,203,174,195,227,93,41,140,8,74, +129,205,45,141,13,205,13,41,25,41,59,119,108,127,121,206,220,85,123,88, +218,224,153,104,99,186,225,83,144,9,33,73,6,49,120,240,198,43,111,18,129, +48,112,68,138,102,121,67,167,20,115,107,255,55,181,250,43,107,155,250,149, +20,19,136,227,210,196,254,208,186,19,16,67,246,216,227,143,29,174,170,201, +203,235,226,118,187,219,218,218,44,52,89,74,17,132,180,164,190,147,21,42, +212,156,141,123,107,21,83,55,237,14,102,234,6,32,50,133,202,203,247,87, +148,125,114,203,223,122,233,33,80,84,64,113,188,47,223,154,73,2,48,206, +119,253,88,158,93,144,146,155,108,151,34,196,152,42,137,49,174,139,118, +227,250,155,251,13,63,229,243,149,27,26,85,143,246,229,178,3,151,158,147, +133,70,7,240,128,136,200,68,68,10,234,90,144,158,149,101,190,242,106,153, +55,77,153,60,185,127,188,23,19,147,156,107,55,84,116,43,138,155,62,181, +87,115,196,56,238,7,52,12,228,156,87,215,30,218,188,125,211,183,223,125, +245,195,150,67,201,125,46,79,41,234,130,220,196,8,49,198,12,52,133,65,62, +127,211,217,39,23,100,166,186,129,20,98,102,148,228,208,193,222,136,185, +129,0,98,197,145,90,205,21,159,154,146,140,128,68,128,39,188,223,17,132, +20,10,240,213,107,86,61,255,220,11,37,253,74,60,30,111,7,241,1,128,154, +219,141,164,126,23,50,37,93,128,79,33,123,216,222,175,54,200,28,77,229, +217,121,121,42,137,72,68,251,240,211,151,39,140,74,244,38,216,184,33,193, +228,196,4,30,103,225,17,192,4,100,145,176,204,77,75,240,120,108,100,2,7, +21,136,56,24,18,81,162,74,145,118,183,141,205,126,97,204,243,47,216,95, +122,117,253,165,23,77,149,194,4,38,193,64,198,36,0,8,230,178,65,35,80,128, +66,9,169,105,218,59,115,247,172,251,182,60,57,197,85,82,154,90,212,35,151, +135,236,3,70,38,172,92,39,127,241,141,131,36,221,52,184,194,149,119,222, +157,247,218,107,207,39,21,157,220,119,236,67,194,58,41,81,39,84,57,105, +233,9,182,241,195,50,83,76,35,17,138,221,76,37,41,72,112,64,64,73,146,197, +236,108,16,4,34,19,140,41,108,209,242,141,3,7,12,140,143,75,248,237,69, +255,173,126,134,51,86,87,119,248,242,203,47,235,209,163,135,229,129,16, +12,5,173,193,77,93,125,189,51,119,156,39,181,23,146,176,142,107,97,115, +220,255,220,202,55,223,123,219,105,67,61,194,72,109,223,181,117,241,249, +231,118,7,211,194,231,228,111,10,10,81,229,204,227,113,82,135,203,99,140, +210,175,104,161,131,21,145,154,154,118,209,26,184,246,202,210,250,186,208, +206,221,173,140,153,40,57,48,211,26,57,48,48,164,201,142,212,5,76,193,46, +56,39,247,203,47,198,61,250,239,65,103,157,155,109,70,130,149,7,26,155, +91,203,188,222,56,135,195,117,188,199,153,1,34,114,249,217,252,247,211, +187,157,81,124,242,221,134,52,9,69,68,154,140,156,125,187,38,220,113,105, +225,172,27,74,146,236,174,221,59,55,15,31,216,135,100,212,89,200,130,4, +142,225,83,17,2,8,3,149,249,11,150,141,31,63,238,119,205,56,224,215,125, +106,209,48,140,187,238,125,0,128,121,227,188,170,170,6,2,1,107,244,220, +220,88,7,222,254,169,189,206,233,147,203,20,85,141,122,74,33,181,10,231, +210,45,129,217,175,191,236,78,97,239,125,240,209,136,65,241,170,2,40,72, +2,1,251,25,253,168,243,241,134,32,1,20,33,65,183,212,19,71,29,172,65,1, +135,58,227,238,181,109,166,216,119,168,81,35,124,240,222,65,175,190,190, +23,84,36,51,106,19,9,132,136,134,166,185,14,86,52,11,166,8,221,16,62,225, +86,181,210,158,169,147,207,235,126,201,212,30,93,242,146,67,65,116,121, +146,143,3,216,73,180,219,249,242,239,190,14,123,186,119,27,117,157,0,85, +65,208,13,86,152,230,120,248,138,222,215,79,238,241,99,121,219,140,39,182, +127,178,120,205,153,35,123,51,133,89,203,13,100,69,34,28,211,125,32,0,179, +227,178,149,107,13,82,134,15,31,254,71,164,75,202,207,122,24,171,131,20, +82,46,90,178,244,187,111,191,205,204,204,114,58,157,134,97,8,83,0,34,145, +36,192,191,93,125,115,151,188,172,35,13,254,132,250,246,186,118,224,210, +64,137,28,121,66,193,169,115,87,238,216,179,247,129,197,139,63,89,248,193, +96,48,13,22,93,203,95,147,31,199,184,204,18,172,59,55,2,73,68,3,37,3,135, +106,211,63,249,176,122,217,186,114,7,87,183,108,109,234,153,159,60,233, +140,222,43,215,124,91,118,40,152,155,234,102,164,129,37,158,67,85,113,80, +75,67,160,57,32,220,113,10,41,18,133,66,166,4,65,132,97,36,13,88,64,70, +24,152,160,235,194,210,100,11,1,22,215,196,8,52,223,114,207,99,67,198,61, +28,228,146,145,8,9,28,214,203,113,243,180,65,95,253,176,103,214,155,245, +54,151,250,192,181,3,119,175,120,171,111,175,254,50,108,34,112,36,36,36, +68,136,26,176,196,240,86,34,9,182,184,167,103,207,157,58,245,98,69,81,126, +205,109,239,247,247,123,67,125,253,127,30,125,212,229,114,119,16,242,173, +29,139,8,134,105,236,221,179,121,116,255,52,27,96,239,130,84,140,104,18, +53,198,145,80,72,212,92,41,67,62,89,85,233,224,245,189,122,167,144,105, +30,157,174,227,241,121,243,128,29,110,107,81,203,36,4,80,77,141,201,96, +93,115,248,245,119,55,228,166,36,17,69,246,238,247,25,50,236,80,244,17, +195,51,54,111,111,32,30,137,29,212,200,164,14,166,89,58,52,239,235,111, +26,209,134,36,145,152,192,40,54,75,200,197,166,205,13,138,98,139,4,32,28, +192,112,0,34,33,178,104,1,70,56,120,217,140,251,210,7,94,169,43,200,9,153, +12,159,86,156,120,246,232,146,71,95,255,97,238,162,198,193,253,82,94,153, +57,104,213,194,215,179,227,121,148,121,122,204,100,63,54,234,64,0,2,174, +168,63,110,221,189,102,195,214,27,111,186,241,79,250,3,91,181,105,214,172, +89,7,15,30,180,18,148,218,219,219,59,145,161,49,206,27,247,237,194,143, +107,91,244,148,36,173,95,207,20,133,251,13,148,64,28,56,147,24,142,16,116, +31,118,17,197,141,60,84,209,142,42,143,225,28,244,71,185,80,132,4,18,17, +129,201,217,111,28,28,59,162,96,248,96,111,73,73,151,131,229,109,254,160, +212,16,199,14,207,254,110,69,165,64,213,58,90,0,72,50,213,52,197,5,231, +22,188,63,103,173,78,113,0,50,122,152,32,161,84,192,238,124,255,195,93, +158,184,216,85,11,17,136,17,49,0,190,101,199,246,186,72,18,216,178,164, +52,64,96,81,110,146,221,235,248,215,91,27,154,2,248,224,244,30,83,79,41, +184,231,137,119,151,45,252,244,244,177,131,100,88,118,174,45,199,240,32, +99,48,208,203,115,63,155,60,229,162,148,78,41,37,127,104,221,59,11,162, +231,205,155,59,103,206,156,194,194,66,75,34,19,197,188,16,44,62,177,195, +233,14,54,236,120,239,171,125,57,89,54,141,135,71,148,118,55,194,38,19, +32,77,201,64,69,25,65,208,18,122,95,126,211,221,107,76,83,154,156,194,138, +196,99,149,8,199,189,37,144,36,41,137,24,17,49,169,249,246,84,179,69,11, +247,92,124,97,110,183,252,244,158,69,241,205,190,80,85,157,1,196,115,115, +28,37,189,51,190,252,242,8,184,80,72,144,192,136,36,35,238,84,241,239,87, +244,185,111,214,10,238,213,152,84,162,120,30,67,144,88,95,221,180,97,227, +38,235,153,18,38,16,74,100,36,65,70,244,48,183,123,9,213,120,77,130,13, +15,55,235,139,127,168,233,150,105,255,239,141,3,246,86,70,238,248,247,98, +121,100,217,220,167,110,163,72,24,144,24,178,206,100,223,40,68,65,100,2, +73,198,234,26,26,214,172,221,122,247,221,247,90,181,243,215,98,198,142, +179,238,22,153,2,17,43,15,29,122,232,161,135,187,119,239,238,118,187,165, +148,29,122,1,139,13,96,97,61,105,169,41,171,231,191,224,112,36,237,222, +83,63,126,76,66,162,139,71,20,29,1,128,144,49,6,66,71,167,183,34,124,234, +139,175,29,96,166,80,48,94,74,249,187,7,60,33,32,67,211,20,8,24,136,56, +47,56,127,193,83,255,25,147,149,167,70,72,241,120,176,79,175,164,37,75, +170,81,11,80,72,155,126,93,255,165,95,237,245,27,42,50,211,36,131,51,100, +4,16,54,167,92,90,124,96,111,117,249,254,32,48,35,134,190,8,136,136,23, +94,62,235,181,215,94,121,250,185,255,16,134,153,106,34,34,73,100,200,16, +152,136,96,162,59,112,197,133,131,236,146,218,124,254,194,116,126,201,180, +254,47,124,188,231,243,165,123,106,183,63,255,252,195,215,100,165,38,89, +54,253,177,120,133,142,69,63,10,255,2,194,166,237,63,117,235,213,167,168, +176,144,98,217,16,240,187,249,30,157,119,186,97,24,79,60,241,36,17,196, +121,189,54,155,205,50,234,252,153,97,159,16,34,61,51,179,108,207,210,85, +63,236,238,209,35,127,243,230,195,211,78,239,154,236,118,152,18,8,192,148, +134,100,200,164,116,230,140,251,104,185,189,170,81,151,102,115,84,50,30, +67,30,126,165,175,33,33,77,174,218,155,117,121,233,223,22,206,126,126,244, +168,225,41,192,226,191,250,118,167,93,225,231,156,158,59,231,189,157,164, +216,4,161,209,230,127,242,233,209,239,205,217,102,128,67,65,9,20,133,216, +168,61,120,219,157,195,223,251,112,59,83,108,209,234,139,32,194,230,160, +18,239,245,55,92,153,152,144,122,231,93,119,108,219,182,169,177,169,86, +81,72,179,161,221,165,200,112,219,153,99,10,140,112,123,155,95,79,112,41, +167,140,200,125,227,189,29,107,55,215,148,173,127,242,221,167,166,167,196, +59,205,142,242,130,29,29,217,81,203,103,100,12,145,71,76,115,209,183,107, +207,185,224,2,69,85,128,254,232,252,142,33,162,36,18,100,8,83,174,91,183, +246,179,207,63,77,75,75,117,185,92,161,80,168,195,226,252,103,174,77,36, +101,102,90,220,156,87,159,201,232,226,104,110,209,13,9,247,93,94,114,254, +168,28,155,130,186,110,105,244,132,205,230,244,185,206,184,245,222,45,154, +205,33,73,74,21,37,2,210,175,217,251,17,0,3,59,143,232,250,83,207,173,189, +121,230,240,177,195,147,133,79,15,54,7,219,131,142,112,136,70,12,47,104, +243,133,190,250,166,86,181,153,40,41,78,213,70,143,206,221,178,229,176, +33,25,116,40,66,36,116,239,226,230,118,155,207,23,138,2,95,196,57,195,64, +11,119,217,189,87,95,125,229,63,255,241,223,112,200,40,47,47,251,240,163, +185,159,47,120,111,229,234,165,77,53,7,199,148,230,44,223,210,192,56,99, +138,246,229,183,71,118,239,111,13,148,189,63,231,193,115,251,246,232,41, +13,201,0,143,58,107,209,47,198,37,18,128,204,186,166,224,143,251,142,140, +57,249,228,223,131,194,126,81,103,16,1,4,114,166,207,152,57,211,237,246, +196,199,199,155,66,132,66,161,159,153,35,118,136,172,17,153,205,166,237, +223,177,232,173,55,62,159,52,169,199,166,77,53,115,151,148,151,246,78,121, +253,193,210,105,19,187,42,42,233,134,205,52,89,74,78,255,159,130,147,174, +186,225,51,230,73,0,131,3,185,137,113,252,213,170,199,48,172,127,179,174, +58,37,41,113,88,127,175,52,195,92,83,55,109,59,156,147,211,53,37,69,1,149, +221,62,99,192,63,30,221,2,30,13,185,73,130,242,114,29,133,133,201,128,12, +136,89,58,22,84,48,78,227,3,250,103,117,138,111,35,208,66,149,181,161,161, +131,199,132,131,160,170,206,161,67,70,15,232,119,210,153,19,207,110,106, +108,125,253,213,55,204,112,101,130,7,43,171,219,70,157,148,29,210,245,154, +54,209,86,179,250,182,169,197,35,7,22,131,30,180,136,6,71,183,122,172,37, +166,163,83,61,96,118,199,115,175,125,48,234,228,83,178,50,50,133,20,39, +182,238,0,192,21,101,198,237,119,87,148,87,100,101,101,49,198,58,194,152, +58,123,49,31,147,124,9,120,222,233,165,59,87,47,93,185,188,226,242,11,122, +157,212,35,254,241,185,27,30,123,251,192,160,174,222,215,239,25,126,237, +249,153,69,217,164,98,107,70,241,5,171,246,143,126,230,249,117,160,10,2, +159,144,122,7,160,65,29,101,39,234,29,43,26,131,252,205,55,127,186,100, +106,161,93,17,210,100,160,177,45,91,218,13,157,74,122,123,160,45,112,235, +117,3,154,90,219,55,175,109,224,26,18,72,133,48,49,142,35,147,146,88,244, +162,135,82,85,88,159,34,143,93,85,98,156,70,9,118,237,135,239,3,227,199, +159,33,116,98,8,8,146,43,220,174,186,47,191,236,186,119,94,159,171,154, +141,213,53,141,46,85,235,150,99,19,38,151,225,35,57,182,3,23,79,24,140, +140,1,177,40,247,139,48,198,60,176,174,76,157,204,252,25,29,110,9,191,59, +127,209,204,25,51,44,221,214,9,48,123,5,9,4,156,251,222,219,239,188,61, +167,87,175,94,150,22,226,151,88,124,167,113,1,18,144,20,178,119,183,162, +231,30,26,255,222,155,255,250,199,203,171,125,82,206,186,97,232,152,146, +164,55,23,252,116,239,139,91,247,86,52,151,116,177,157,212,83,201,142,111, +201,233,54,252,209,23,246,206,95,82,197,21,39,67,77,90,164,46,73,49,118, +36,151,204,36,224,66,193,27,103,108,188,99,102,159,20,175,157,4,99,232, +144,166,56,82,167,53,212,85,13,24,144,33,136,65,196,124,236,223,167,188, +254,230,38,33,109,132,68,146,115,98,28,200,2,101,45,78,32,130,204,72,178, +219,109,154,101,31,201,24,63,92,17,241,7,11,236,118,4,38,185,66,86,87,134, +200,117,3,198,142,25,119,198,105,103,236,218,91,229,117,105,118,85,85,184, +167,118,223,234,243,78,238,99,247,36,88,115,99,140,249,126,82,71,141,199, +142,77,131,0,192,220,174,187,30,124,226,214,219,102,38,38,38,252,241,100, +143,232,125,21,73,126,187,124,217,3,247,62,212,181,91,55,75,56,96,61,167, +191,234,196,135,64,64,140,243,230,198,166,146,94,197,79,220,9,83,111,126, +172,162,236,156,146,193,227,74,187,105,215,77,233,169,0,91,185,161,226, +219,77,149,213,85,213,13,123,62,139,180,84,164,167,166,220,249,208,143, +78,187,253,204,9,25,210,135,132,42,176,32,18,7,0,2,5,165,64,167,114,251, +93,223,159,115,78,234,176,65,153,194,207,128,11,96,178,188,162,201,196, +172,130,236,242,204,236,68,225,51,65,167,83,70,20,46,88,120,96,95,89,99, +81,86,50,87,35,40,20,78,42,160,117,102,16,23,8,140,192,180,28,201,1,72, +162,195,241,252,75,171,47,188,236,249,64,192,84,237,76,179,97,36,44,34, +33,43,195,137,12,3,207,61,103,210,203,243,151,102,117,159,196,20,198,164, +143,194,117,147,207,186,84,68,194,200,121,140,128,28,101,160,69,219,104, +107,2,73,68,36,153,170,108,223,182,119,253,198,157,111,207,157,15,36,16, +249,31,137,161,60,186,223,125,109,254,59,239,184,199,229,242,120,60,110, +68,180,204,195,127,235,55,201,218,50,172,45,16,49,130,225,81,125,243,87, +124,120,119,118,232,179,165,175,93,49,239,211,85,119,63,189,117,206,194, +35,69,185,93,254,115,243,233,255,184,227,146,177,99,38,38,196,219,61,110, +87,102,70,246,149,55,172,254,108,65,53,115,34,64,24,184,136,93,99,130,192, +149,101,203,15,187,92,202,228,137,37,194,79,160,132,73,114,38,244,221,101, +161,134,38,243,228,81,169,96,152,0,36,25,57,148,214,83,199,100,126,177, +168,78,218,66,20,209,98,244,149,24,191,168,115,147,135,136,136,194,192, +29,59,253,3,75,70,112,205,84,109,132,204,212,28,140,115,11,239,64,221,164, +97,131,135,109,92,253,173,203,174,216,20,155,175,169,60,55,77,139,75,242, +2,63,186,191,99,112,134,117,108,199,202,35,114,66,208,5,188,244,246,130, +46,93,139,84,77,161,78,215,207,63,178,232,0,192,102,205,122,176,226,208, +145,212,148,100,135,221,209,1,175,255,134,145,4,32,144,36,206,177,185,213, +231,11,6,136,88,81,70,214,215,95,188,241,237,156,153,67,29,11,91,214,223, +251,245,252,127,220,249,232,139,215,60,248,222,220,47,54,184,50,251,133, +195,17,198,121,107,107,203,11,47,191,182,179,172,215,103,75,106,67,97,193, +184,70,86,189,36,123,99,48,176,100,105,197,181,87,148,40,162,29,17,36,168, +12,85,33,204,198,230,184,67,85,181,39,143,41,130,80,16,8,136,9,69,170,147, +78,205,254,254,251,67,59,246,6,152,91,70,1,52,136,210,2,98,38,13,68,132, +72,2,20,182,100,241,214,241,103,156,139,146,217,92,140,169,8,28,24,3,197, +102,41,200,0,64,56,221,182,147,135,22,85,148,111,176,219,236,194,104,111, +170,221,15,193,0,200,168,55,63,197,70,143,150,9,4,235,224,252,146,144,140, +237,173,168,252,106,245,78,197,34,14,157,184,135,15,155,51,239,253,222, +189,122,58,93,174,214,214,214,206,49,9,157,251,250,159,21,47,171,220,7, +66,161,136,165,66,146,97,209,222,220,175,87,215,151,159,127,228,251,79, +31,159,251,240,25,255,186,68,187,122,88,93,105,106,101,224,200,42,68,8, +6,130,39,13,27,121,206,196,241,247,221,255,112,151,162,219,230,127,227, +126,125,222,14,116,185,136,153,204,33,190,93,218,122,234,41,25,57,233,54, +6,140,129,224,164,35,216,253,97,81,118,68,35,35,216,171,187,83,72,59,3, +226,2,17,165,199,227,184,233,134,193,151,95,254,245,193,186,0,218,20,73, +72,96,139,81,190,58,30,72,6,164,9,201,190,249,190,225,204,137,87,152,92, +34,114,32,134,164,34,99,92,147,20,85,17,98,32,36,239,188,245,174,67,155, +191,182,169,100,115,39,54,181,210,151,43,54,115,69,133,14,71,37,60,186, +166,29,33,141,32,145,41,236,193,199,223,162,228,177,54,205,99,13,147,79, +116,225,89,97,97,87,167,211,25,10,133,44,111,211,227,138,207,142,241,246, +39,0,32,198,152,223,31,210,35,122,84,29,78,8,146,132,63,172,114,91,73,247, +62,103,159,50,246,202,115,78,189,99,106,191,139,198,167,180,183,7,188,73, +169,183,221,124,157,162,40,166,48,251,15,24,58,105,202,3,105,121,183,63, +240,200,42,230,114,150,85,248,24,55,206,24,155,77,122,216,218,101,72,0, +20,168,111,215,14,149,43,189,122,198,107,76,177,52,224,22,149,200,52,130, +167,157,156,120,195,141,189,167,92,176,116,95,121,152,59,16,100,216,146, +53,88,205,7,16,2,70,8,101,197,225,6,167,167,71,74,86,38,87,9,100,76,96, +8,164,170,140,43,81,191,36,105,82,94,126,225,200,17,125,27,170,171,64,74, +111,198,128,183,191,220,26,9,69,152,165,1,237,148,243,2,81,39,98,32,41, +121,66,252,244,59,31,91,179,75,166,22,141,84,109,74,12,206,62,177,149,103, +30,175,135,136,172,110,253,184,193,181,199,65,17,17,17,177,213,231,15,132, +117,140,178,170,80,74,201,129,0,36,41,166,144,38,153,0,18,10,82,243,67, +193,192,229,127,155,86,92,92,66,82,87,80,17,210,136,115,198,157,118,250, +56,84,71,222,114,215,234,183,222,218,127,225,180,66,17,225,192,108,104, +125,86,114,160,221,92,176,176,42,191,176,107,94,30,0,152,209,89,61,89,23, +80,135,8,240,235,46,238,245,209,135,23,205,124,104,197,147,179,247,213, +54,69,66,33,17,77,111,181,206,124,102,35,146,123,118,154,93,242,71,122, +19,189,132,2,58,43,170,81,170,54,70,36,17,64,74,208,117,243,202,191,77, +173,169,40,87,120,56,172,122,106,101,254,170,173,101,196,132,165,203,139, +33,96,22,242,9,4,128,42,127,228,95,207,124,182,236,96,254,128,179,131,237, +190,194,140,108,176,168,9,132,39,180,238,138,170,40,237,237,237,161,80, +136,115,110,179,217,254,160,150,146,49,214,238,15,180,54,183,202,130,108, +144,18,9,56,50,32,226,192,64,196,114,127,9,237,46,101,236,184,177,151,95, +250,55,0,96,138,157,136,24,41,128,160,251,100,99,235,222,126,61,178,255, +126,105,22,180,70,20,6,64,34,22,188,100,0,58,63,93,116,232,250,235,243, +88,88,101,38,16,55,153,80,8,5,2,40,104,2,0,152,88,144,162,127,254,214,25, +239,124,184,255,230,251,86,38,38,121,186,23,198,15,40,246,244,235,147,158, +144,228,148,33,195,20,246,133,223,180,223,126,239,57,12,56,48,222,209,15, +3,130,36,176,57,64,15,51,211,100,200,0,137,39,39,101,118,205,173,210,87, +108,147,190,70,234,113,246,127,231,45,108,104,107,233,150,17,159,153,150, +16,23,231,114,168,118,198,21,83,96,75,91,235,222,202,234,207,191,218,177, +96,139,217,239,236,103,143,84,255,0,134,63,167,107,190,180,50,245,240,68, +110,171,0,138,223,239,15,135,195,166,105,254,140,97,242,235,107,110,41, +40,136,136,149,87,87,15,161,98,0,36,144,8,216,153,83,132,128,38,194,219, +31,44,154,243,214,219,71,33,24,203,248,23,217,243,207,61,119,193,25,202, +216,145,185,34,168,115,198,58,44,61,128,16,237,248,233,151,101,165,253, +39,134,130,109,5,153,8,146,129,2,4,63,27,207,146,144,10,97,228,202,105, +249,151,95,88,116,184,166,97,193,183,229,143,207,46,75,138,175,30,84,162, +221,116,211,73,79,61,182,59,187,224,212,174,5,57,157,30,223,14,145,12,34, +128,221,14,65,127,116,10,198,65,29,121,82,201,191,31,159,21,106,211,29, +78,87,48,225,212,255,46,254,41,142,14,57,104,139,141,7,84,187,234,114,186, +21,213,109,176,148,195,141,172,89,31,144,221,47,191,181,241,96,82,74,105, +229,230,79,75,138,47,149,150,155,33,158,152,82,76,49,12,35,24,12,90,169, +244,157,51,83,126,75,86,134,8,146,92,78,231,134,45,63,94,124,246,56,105, +82,236,22,218,193,142,37,80,148,5,95,127,55,229,178,233,241,241,73,82,18, +99,71,223,208,239,15,214,86,126,55,118,70,137,217,22,36,208,56,24,4,120, +20,63,208,180,103,159,94,247,234,188,23,62,255,236,149,129,125,136,129, +170,67,152,225,81,157,79,199,202,35,217,68,68,18,134,115,211,147,187,231, +251,234,74,78,185,231,238,59,230,127,250,201,233,231,190,233,107,51,150, +45,159,17,18,186,253,103,68,101,66,68,38,201,84,84,149,49,146,18,8,64,50, +97,211,226,230,189,242,210,160,113,83,185,238,227,138,45,46,189,183,48, +153,31,200,71,82,5,86,15,40,117,137,8,232,82,189,222,48,134,90,3,190,114, +48,176,123,118,77,159,226,94,82,74,14,242,68,21,122,138,207,231,115,56, +28,74,71,94,239,239,117,160,132,8,82,114,206,157,46,231,198,237,123,128, +169,0,6,49,1,50,250,107,86,76,99,83,83,83,91,72,139,79,72,69,142,150,231, +6,99,12,192,96,204,54,119,206,188,171,46,238,70,33,3,24,50,161,91,124,78, +201,184,4,161,48,101,227,230,218,172,220,209,25,57,169,141,117,229,201, +46,143,100,186,42,20,32,209,249,65,38,68,14,4,160,3,1,33,7,102,216,121, +36,108,26,170,26,55,121,202,85,167,79,188,8,65,216,57,7,206,127,246,236, +71,89,70,168,146,66,154,83,26,1,100,0,82,48,33,101,94,126,183,251,103,94, +243,210,226,117,41,61,70,169,186,228,64,200,36,48,50,100,152,129,91,225, +128,4,186,233,23,161,230,178,189,203,179,226,35,131,186,249,31,188,239, +205,196,132,100,146,18,144,159,104,31,169,112,206,237,118,251,207,192,128, +223,62,86,9,144,136,92,78,231,143,63,110,15,155,204,134,146,136,89,182, +20,132,209,129,115,74,82,82,113,65,218,220,55,158,25,53,110,210,224,193, +67,132,20,82,74,2,14,0,91,182,46,189,238,178,44,8,68,56,65,135,73,58,17, +161,100,160,210,7,159,236,154,254,247,215,124,173,173,122,184,37,33,33, +31,17,65,72,224,216,217,97,186,19,251,137,72,2,114,102,119,106,62,95,43, +99,16,10,155,110,175,29,145,64,181,30,178,159,149,221,14,113,28,168,42, +234,32,137,56,0,49,142,129,128,184,124,218,180,79,151,77,23,237,197,134, +75,97,66,147,168,114,206,93,170,166,251,91,154,27,14,6,90,202,108,162,162, +180,91,218,229,87,14,26,115,242,168,30,189,250,72,41,162,73,90,136,39,188, +238,46,151,235,132,173,59,45,96,133,115,83,194,186,109,187,199,148,22,50, +61,58,164,179,162,30,16,65,24,198,192,222,93,243,187,100,60,250,194,27, +205,205,190,9,19,198,17,129,4,243,192,193,178,246,230,154,31,55,178,164, +100,111,102,182,23,52,128,128,14,38,33,19,104,106,71,14,183,133,101,239, +162,158,221,195,254,32,163,54,183,91,35,33,144,1,128,164,227,207,104,173, +178,141,137,73,113,161,112,128,115,80,109,168,58,0,36,179,208,2,6,191,26, +202,142,92,168,26,23,97,132,104,234,19,170,138,107,230,149,211,238,120, +230,189,236,129,215,131,194,49,212,86,127,96,69,253,193,85,204,104,136, +243,216,202,246,238,218,185,125,71,151,194,60,151,203,69,146,132,16,204, +50,241,144,127,198,248,84,249,221,130,126,124,26,25,2,0,36,39,39,127,242, +197,178,49,195,111,54,77,161,128,96,209,171,52,16,72,142,204,148,210,227, +180,253,243,174,203,175,186,229,95,122,40,48,254,140,83,25,119,7,90,253, +195,134,76,126,250,245,173,13,245,85,21,149,101,137,169,182,187,102,118, +27,55,36,147,153,204,208,90,55,238,241,247,202,63,45,193,19,119,200,31, +72,205,12,1,3,52,76,58,58,241,62,206,203,36,228,70,36,63,63,165,165,113, +51,49,96,170,129,164,49,206,172,130,251,171,54,236,8,0,92,113,81,68,23, +64,209,233,171,42,101,118,215,2,189,122,83,249,178,89,17,209,22,104,220, +159,148,16,215,37,41,217,225,204,168,173,171,59,237,180,211,122,247,45, +150,82,70,199,106,22,142,27,131,116,79,112,13,65,249,227,144,194,49,59, +140,72,74,153,152,152,176,248,155,85,160,222,193,13,31,41,208,161,153,5, +66,64,178,162,172,185,20,3,138,139,206,62,255,252,155,111,186,233,250,233, +87,245,234,211,183,87,143,190,170,26,253,115,203,202,106,175,187,241,230, +157,63,238,185,249,170,2,161,39,125,182,160,118,230,61,227,9,128,241,72, +81,97,28,72,3,126,135,119,5,12,36,48,206,236,54,187,114,164,182,182,37, +53,203,13,104,2,104,157,120,144,191,90,47,57,7,155,29,195,65,193,144,91, +22,152,105,41,137,249,5,121,71,14,31,240,58,156,133,125,122,119,100,242, +213,213,213,62,253,244,83,191,177,190,39,184,134,192,115,114,114,254,196, +99,98,121,161,86,85,85,33,200,11,199,143,241,196,217,59,248,236,29,172, +83,203,181,152,115,197,231,15,108,221,115,104,215,174,93,159,125,241,5, +227,188,127,105,255,72,144,5,252,50,162,11,183,203,121,209,121,231,237, +253,41,188,120,217,138,253,101,33,205,61,250,236,179,78,103,146,54,111, +217,0,145,13,61,186,38,130,60,118,128,15,199,195,71,17,25,82,139,95,223, +189,143,157,52,100,112,180,210,253,126,63,12,72,66,81,184,169,71,65,118, +68,242,184,29,27,215,174,173,174,175,246,196,197,73,73,49,50,168,180,59, +236,15,220,255,128,221,110,239,28,55,249,191,188,254,164,255,12,67,214, +218,218,58,160,127,233,3,15,61,242,210,59,31,50,205,13,132,86,252,178,133, +172,3,2,3,98,132,76,202,180,228,120,135,93,73,75,75,179,219,28,255,124, +100,214,176,97,67,126,220,183,217,155,192,20,66,46,73,74,126,233,197,215, +94,114,233,91,111,205,173,186,107,198,237,102,200,148,76,57,124,164,50, +35,221,13,46,4,39,130,131,129,157,131,93,5,155,2,54,9,118,0,141,136,147, +100,0,200,165,144,68,40,195,198,164,241,93,54,175,222,110,169,52,255,216, +39,71,4,149,113,180,123,128,208,100,36,9,76,6,74,73,255,210,182,246,118, +139,241,107,21,225,112,56,124,222,185,231,88,209,23,112,188,188,235,63, +83,223,79,216,22,34,102,227,224,243,249,30,253,231,195,43,191,223,178,228, +187,31,30,190,253,58,110,77,52,129,144,0,193,186,56,71,169,116,41,73,9, +54,85,17,68,170,170,20,22,22,30,44,43,31,58,100,224,101,23,95,124,251,204, +123,19,19,114,19,226,92,66,176,156,236,194,69,11,87,72,129,210,80,185,10, +173,193,240,191,159,63,146,242,94,173,221,198,53,155,212,52,80,85,174,42, +138,198,152,203,161,184,189,90,92,162,154,158,98,79,136,215,18,92,118,77, +53,144,51,9,9,169,217,237,0,36,77,134,202,239,84,219,163,109,13,129,162, +130,205,6,66,39,146,220,48,96,208,160,33,225,112,164,163,187,83,184,130, +54,60,251,236,243,59,7,56,255,239,251,29,135,14,29,122,34,155,221,26,185, +200,128,63,120,234,169,99,199,142,61,229,214,25,183,219,53,120,253,241, +59,135,148,244,33,41,163,41,86,209,249,117,20,154,37,70,103,93,126,71,163, +47,202,94,99,140,53,54,55,149,29,60,216,189,123,215,241,19,38,229,100,100, +116,45,232,222,179,103,113,65,94,118,56,4,17,29,144,135,93,118,123,68,151, +117,45,149,181,53,141,109,173,126,61,12,194,36,195,48,35,70,68,215,131, +145,72,200,23,8,5,252,33,105,6,146,146,212,46,121,201,156,163,175,29,78, +25,123,86,122,110,156,144,168,48,126,252,11,228,241,46,243,4,146,132,8, +182,163,208,129,49,176,187,149,194,30,93,178,50,51,173,135,219,233,116, +122,60,222,47,190,248,28,254,210,215,137,249,66,88,79,24,99,204,23,244, +77,156,52,241,177,255,252,55,37,57,177,177,177,113,237,166,31,7,23,247, +5,98,2,12,142,24,229,177,89,195,72,34,166,57,6,149,246,249,116,241,15,46, +143,7,1,165,148,137,9,9,238,226,190,129,96,96,243,15,43,102,255,20,234, +218,173,31,139,252,187,48,61,101,202,69,23,77,60,251,44,187,102,15,249, +37,87,69,65,65,151,252,252,44,144,138,148,104,177,39,5,73,206,57,99,32, +9,132,0,146,64,36,25,103,102,24,132,0,142,4,134,20,66,48,13,49,202,252, +142,41,42,45,238,37,3,160,40,233,78,146,73,68,156,171,4,166,36,38,1,25, +151,66,160,234,128,46,217,89,97,221,80,20,133,49,214,218,218,122,233,197, +23,253,137,142,229,175,169,239,22,231,91,74,82,20,101,255,129,3,51,110, +153,249,249,103,31,53,54,54,1,144,219,237,94,188,124,109,75,168,21,152, +73,29,51,96,232,52,2,54,204,51,199,141,110,110,105,103,200,58,228,139,170, +170,38,39,37,111,217,177,171,247,201,211,18,251,93,237,29,242,112,115,214, +101,15,190,242,117,81,207,129,183,221,58,163,165,173,134,129,162,135,37, +17,143,0,17,51,153,98,162,74,76,1,96,36,136,144,11,69,51,85,187,169,57, +64,81,9,64,74,83,152,146,116,157,233,33,146,38,32,113,161,99,36,192,2,109, +34,28,0,35,34,73,114,32,22,51,199,149,32,25,8,213,223,102,248,27,33,212, +66,164,155,18,16,121,228,222,187,238,60,88,94,110,185,234,186,92,174,170, +170,170,191,93,118,5,193,239,54,86,127,233,126,63,250,37,71,205,138,216, +145,195,71,206,28,127,90,90,90,210,243,47,172,72,76,74,68,100,78,167,115, +235,238,3,219,247,214,140,25,88,200,45,74,104,20,36,139,178,239,133,48, +7,13,232,229,180,219,37,17,99,40,76,97,26,38,34,250,125,109,224,236,18, +151,86,42,245,136,68,34,116,102,246,187,132,250,77,89,242,211,202,247,39, +92,54,178,36,239,148,49,35,250,151,20,36,39,39,120,226,147,61,30,23,87, +52,155,77,141,93,14,173,109,27,245,132,67,70,192,144,36,233,97,16,66,209, +67,32,12,105,234,64,38,74,64,9,36,145,56,23,140,1,83,144,49,148,130,132, +144,8,200,65,107,242,53,55,52,214,249,218,91,119,237,220,50,251,149,217, +129,80,40,63,175,128,128,24,99,109,109,173,227,199,143,231,138,42,164,201, +144,255,133,75,255,251,245,189,3,180,145,36,67,193,112,122,102,210,53,87, +95,243,224,3,255,136,143,139,239,224,34,135,194,97,70,180,121,213,219,162, +53,132,32,45,8,7,128,16,37,115,216,65,67,211,31,190,225,174,39,63,90,184, +212,229,242,170,182,20,198,109,145,112,91,125,237,190,156,62,147,178,134, +221,46,141,16,71,157,73,78,164,72,134,22,66,233,247,55,181,214,29,84,68, +99,162,83,184,149,144,215,38,76,225,247,58,148,140,244,148,228,228,248, +180,140,204,46,249,5,217,153,217,233,105,169,78,87,28,0,144,25,179,196, +176,96,124,180,98,176,98,99,87,22,107,58,13,48,117,104,108,109,171,58,180, +191,172,188,108,243,182,141,155,182,111,171,172,172,8,135,66,92,225,233, +105,105,170,170,10,41,16,208,102,179,237,216,177,99,249,242,21,37,37,125, +165,20,136,12,255,255,175,187,245,156,69,34,145,27,111,184,225,165,87,94, +225,81,80,59,26,181,192,16,170,142,212,221,127,219,244,191,95,54,65,247, +251,56,147,92,117,130,166,52,214,53,206,255,98,233,167,139,55,28,110,70, +53,161,192,180,229,199,167,117,23,28,129,41,76,144,30,104,172,44,219,214, +187,100,132,212,210,0,201,36,131,161,96,164,80,116,150,105,81,84,136,76, +67,23,6,9,67,234,33,25,106,48,245,166,80,160,94,247,213,154,129,70,146, +17,100,134,166,50,143,166,36,184,61,73,73,73,94,143,91,85,53,155,205,166, +217,109,0,36,26,17,93,217,0,0,12,106,73,68,65,84,77,105,152,66,10,51,232, +247,181,250,218,27,155,219,218,252,13,193,8,11,182,215,235,134,116,185, +92,110,143,155,49,102,179,217,57,143,37,161,88,61,25,1,0,24,166,185,113, +195,134,191,176,141,249,189,58,19,179,202,234,104,87,25,99,77,77,141,211, +166,94,178,244,171,101,140,113,4,144,150,69,21,16,18,74,160,156,172,140, +71,159,125,163,79,247,220,1,221,179,170,26,26,22,126,243,195,187,159,173, +216,91,141,41,133,99,51,187,222,156,218,39,57,40,84,23,6,208,12,107,96, +19,68,200,209,105,215,250,164,164,69,66,60,88,95,193,205,128,55,189,56, +140,196,201,164,152,57,0,129,41,72,65,197,169,50,9,170,1,110,167,160,12, +59,105,113,160,32,231,140,73,162,176,36,82,8,21,8,187,237,18,192,168,104, +110,105,110,110,54,12,195,48,76,139,143,133,192,145,161,211,233,240,164, +199,219,51,53,78,30,111,160,98,207,55,15,247,234,213,77,72,146,166,64,22, +141,102,138,26,176,161,53,216,225,77,77,77,87,93,113,133,21,254,130,127, +105,113,255,213,253,30,203,147,141,18,66,24,178,154,218,154,179,39,78,100, +154,109,217,210,175,156,46,23,71,140,210,33,128,33,67,41,204,96,32,16,8, +133,109,14,111,86,110,183,109,21,210,157,82,156,150,87,226,246,36,25,38, +72,169,35,152,140,132,0,70,200,56,161,100,166,148,12,64,69,48,24,114,174, +208,161,109,95,66,164,222,147,94,18,151,210,147,57,19,136,76,50,5,162,36, +36,66,73,146,16,84,2,149,129,4,16,0,66,128,64,224,28,20,146,146,16,36,67, +65,146,19,3,4,206,44,105,38,18,0,72,22,195,46,192,36,144,32,237,54,239, +222,239,238,79,164,74,175,55,225,168,228,228,216,237,44,165,80,20,181,165, +165,101,222,59,243,250,149,246,251,227,96,237,95,177,223,59,29,170,213, +53,71,110,188,225,250,202,195,213,223,125,189,204,237,118,71,243,68,0,57, +227,126,127,123,83,67,157,9,78,111,122,159,228,130,65,186,154,30,112,165, +247,201,78,145,138,46,77,35,18,9,89,162,43,34,20,168,32,89,163,41,201,37, +83,1,37,153,38,215,52,197,222,188,255,27,61,212,150,219,99,152,191,166, +242,224,129,217,164,218,147,114,6,121,51,138,29,206,100,193,152,46,4,146, +193,64,72,8,73,137,12,152,68,32,80,25,33,161,96,81,107,95,201,162,19,88, +4,105,17,21,45,132,65,70,7,77,18,56,32,71,149,1,24,45,13,241,121,9,66,68, +129,226,227,32,131,136,68,84,212,173,123,94,65,110,231,124,186,255,243, +58,211,153,10,25,12,6,38,95,112,126,121,101,221,250,181,223,59,157,46,75, +107,39,12,179,185,165,41,24,8,199,101,150,230,140,188,146,39,246,48,165, +170,144,211,6,62,68,155,144,97,169,235,44,122,6,224,209,30,44,122,73,196, +48,16,67,187,77,145,188,189,106,235,186,151,28,73,249,93,251,77,230,90, +60,243,246,73,236,62,46,208,124,176,161,236,135,242,173,115,12,97,120,189, +217,222,196,124,71,90,161,195,153,238,176,165,106,14,39,41,10,145,66,196, +37,162,9,130,164,224,4,146,17,128,169,144,36,146,68,196,136,91,20,3,138, +13,86,129,17,147,196,193,12,183,238,179,41,65,34,123,108,4,118,60,174,58, +1,67,28,208,191,36,33,49,233,255,162,184,3,64,204,14,173,195,49,158,98, +201,21,0,64,20,210,245,210,65,39,249,2,225,245,107,191,87,84,205,16,50, +98,80,32,44,85,87,94,218,128,43,181,148,62,38,33,233,38,151,6,144,36,240, +1,99,6,133,84,149,49,147,3,48,66,9,29,35,172,232,213,5,24,254,191,222,174, +54,70,174,178,10,159,143,247,189,243,185,179,187,179,203,110,183,251,193, +150,238,86,118,11,13,84,74,75,45,218,146,86,139,18,162,152,32,106,12,68, +138,70,18,19,248,225,31,195,15,99,36,152,152,248,139,31,106,34,17,126,152, +72,2,162,33,177,49,242,17,177,16,16,74,109,107,217,214,109,109,187,221, +118,63,250,177,59,51,59,51,119,238,251,158,227,143,59,51,237,110,183,133, +104,235,253,61,153,220,156,123,238,115,222,123,206,243,60,135,209,23,163, +185,241,83,227,111,149,203,211,183,108,248,174,109,95,83,145,98,68,85,118, +20,17,164,219,87,175,218,52,50,224,30,149,176,80,91,152,42,206,30,155,29, +123,7,160,90,13,23,106,81,217,82,34,153,204,5,9,203,54,201,169,60,167,178, +65,144,75,36,218,49,200,85,109,210,24,195,132,10,36,74,200,1,7,153,58,137, +192,59,31,158,159,153,57,58,119,98,111,128,110,217,228,109,90,117,36,147, +201,11,231,207,223,247,197,29,215,60,205,23,245,223,33,94,168,25,79,210, +234,171,52,80,196,85,66,183,227,222,251,43,165,217,63,191,241,65,123,215, +90,228,14,207,237,201,108,119,62,191,6,109,82,125,20,69,21,82,64,6,81,64, +66,2,82,5,3,86,92,93,123,20,199,27,81,28,41,122,36,182,236,252,212,248, +107,149,194,81,195,153,174,225,173,233,238,17,117,81,232,10,12,241,226, +0,69,69,143,66,85,55,125,234,237,124,239,104,170,99,85,170,99,152,90,122, +58,86,174,182,182,87,124,81,188,139,220,130,119,145,68,21,87,43,137,15, +65,124,36,94,195,34,186,170,178,141,0,153,19,152,204,178,9,184,161,2,171, +86,139,174,60,111,108,208,217,183,118,246,159,31,46,11,29,218,112,219,49, +198,180,231,243,235,239,216,188,100,50,124,45,227,238,189,139,77,61,194, +106,168,0,226,35,21,112,162,133,66,245,158,47,124,254,173,191,125,136,157, +235,70,182,63,53,63,79,24,112,0,8,128,2,130,81,21,155,15,170,193,30,108, +110,29,197,203,154,223,44,137,116,130,103,143,237,25,63,244,74,239,240, +150,149,35,95,197,76,78,77,160,53,143,232,47,89,245,12,12,138,166,253,232, +216,243,189,61,27,109,208,230,157,3,169,74,249,92,228,6,68,207,33,120,69, +32,107,201,50,167,82,12,121,1,84,97,68,82,244,10,2,138,168,196,200,138, +145,111,172,109,85,213,108,186,205,103,242,130,6,177,54,113,240,229,82, +169,148,205,102,23,37,178,214,5,92,201,100,242,232,209,163,207,60,243,204, +21,27,58,215,226,226,205,247,126,93,236,224,236,66,203,67,15,222,95,162, +161,84,207,93,115,97,80,9,77,166,239,14,215,186,165,255,182,135,28,246, +85,170,2,150,107,158,13,51,138,139,101,143,218,68,238,58,189,71,49,238, +173,54,188,91,99,77,157,34,10,113,180,48,121,240,47,63,43,148,78,143,110, +121,50,221,121,11,38,24,20,141,68,12,94,144,235,109,204,152,241,198,48, +254,222,11,3,189,27,177,243,38,244,64,136,97,181,24,205,159,12,242,3,198, +18,57,34,32,246,86,48,238,52,7,2,160,172,138,34,32,0,12,192,74,224,192, +171,18,145,173,219,132,33,70,177,46,70,132,141,201,180,247,157,216,255, +135,174,174,238,69,123,25,26,31,218,169,84,106,226,228,196,243,47,60,31, +203,80,175,7,200,0,128,249,214,35,63,68,40,63,245,203,177,7,191,177,161, +229,205,243,207,253,105,111,199,208,112,7,162,77,100,68,228,244,153,105, +68,4,34,80,8,72,212,11,32,163,54,98,91,231,198,197,245,161,238,14,66,192, +64,170,40,40,18,112,102,110,254,248,236,137,119,162,179,255,94,181,225, +155,217,21,183,251,176,0,224,81,44,32,168,178,143,13,20,0,21,98,95,93,158, +62,176,187,119,224,86,234,94,173,174,204,66,138,42,18,10,136,161,64,52, +133,92,81,96,96,71,138,10,224,209,129,34,122,4,64,65,175,8,134,20,60,32, +16,160,138,248,230,233,196,196,124,90,132,90,84,203,247,108,60,150,238, +95,40,21,82,169,108,221,209,183,14,59,96,152,39,38,38,190,247,248,227,87, +99,162,95,147,190,216,171,175,127,180,186,47,215,153,211,63,190,54,185, +249,206,182,116,34,13,137,52,5,41,47,14,180,254,192,235,132,103,109,74, +213,26,38,73,139,209,36,174,207,30,69,189,88,9,80,162,35,31,252,122,102, +255,139,157,173,125,67,219,158,72,117,222,236,195,11,13,181,8,92,124,85, +16,21,128,1,44,182,78,31,120,57,221,217,103,187,215,58,169,34,144,34,8, +17,185,138,195,192,0,1,248,184,246,215,233,232,117,17,65,29,9,8,12,137, +117,181,162,42,106,140,128,205,37,197,23,253,156,20,81,139,82,30,189,125, +215,233,153,41,36,92,210,128,50,134,171,213,240,177,199,30,89,178,162,228, +218,199,253,248,180,179,224,7,122,179,127,221,123,162,39,159,190,113,69, +11,123,79,42,245,65,88,125,179,213,213,91,196,13,146,1,42,128,0,250,128, +211,197,243,255,56,176,251,233,124,215,170,129,205,223,79,15,110,96,79, +62,170,8,46,41,82,23,21,126,20,36,198,247,254,42,221,214,159,93,177,222, +56,177,206,8,145,0,120,64,112,101,192,4,19,130,184,43,130,45,2,168,7,31, +206,23,142,71,209,66,195,165,90,47,251,21,37,20,77,36,246,134,117,145,233, +136,201,254,151,18,84,194,176,182,237,158,207,117,228,187,46,103,65,95, +227,184,87,4,15,30,159,223,50,146,59,51,159,152,156,44,175,27,204,85,77, +108,120,225,129,0,9,21,5,81,98,122,243,50,79,64,21,5,4,80,5,217,147,2,72, +88,26,223,251,236,191,222,123,101,120,235,15,178,125,91,12,177,70,234,8, +153,12,45,166,111,170,34,67,4,104,12,203,137,15,94,108,207,174,200,15,221, +205,224,5,81,209,163,23,20,32,50,229,242,66,50,107,35,80,82,6,33,192,229, +149,152,66,160,214,112,100,65,202,96,68,180,70,184,52,244,138,26,41,19, +161,55,181,246,222,207,150,74,229,184,61,16,207,175,141,49,181,90,109,231, +142,237,38,145,140,89,186,244,113,138,231,255,62,238,222,193,123,251,206, +109,221,208,111,109,117,247,251,167,110,91,215,154,210,36,176,211,203,169, +197,186,252,39,86,188,69,4,12,139,117,103,143,188,126,236,237,231,90,58, +134,111,191,239,199,137,150,14,130,6,83,76,245,242,111,15,4,141,32,96,242, +211,99,111,164,18,173,29,163,219,92,84,6,47,113,145,70,0,98,82,239,43,11, +83,201,160,3,149,1,124,67,96,180,12,165,7,197,32,24,155,202,150,231,79, +115,20,48,164,164,201,97,187,4,9,235,69,20,185,181,127,253,133,82,212,252, +59,34,202,229,90,82,169,196,198,187,54,241,98,14,250,117,137,59,83,117, +223,241,179,214,224,157,163,173,31,142,21,87,245,100,218,50,70,181,170, +98,151,102,214,37,34,171,134,196,34,62,3,43,153,172,20,78,127,180,251,105, +23,149,86,111,126,164,229,198,109,206,87,193,135,23,173,232,151,28,147, +155,114,92,78,204,77,236,169,86,102,90,63,181,195,215,40,16,6,148,250,136, +86,69,69,24,200,87,166,178,153,30,239,129,24,84,101,89,34,141,2,146,58, +165,74,75,91,223,244,233,35,73,187,0,138,122,21,51,16,213,214,252,16,103, +215,76,205,204,196,236,243,116,58,93,42,21,135,135,111,30,28,28,250,132, +147,241,255,41,238,40,52,123,65,247,28,56,183,235,75,107,39,103,167,39, +166,225,238,145,116,9,18,54,94,218,46,138,177,145,130,214,253,212,80,209, +171,103,36,227,13,137,2,49,42,159,59,252,251,253,175,255,124,248,51,187, +86,222,250,0,5,237,86,61,8,168,178,42,46,89,172,17,167,102,164,142,156, +122,6,152,58,52,126,228,205,27,215,63,108,157,7,208,8,68,148,226,128,41, +130,39,38,235,43,231,103,52,153,99,6,241,136,72,186,92,48,81,65,145,209, +179,128,49,134,202,197,130,98,200,130,87,58,125,199,203,153,7,215,125,109, +226,212,233,40,170,49,115,38,147,217,191,255,224,3,15,124,5,0,232,162,198, +233,186,197,29,64,173,181,47,237,62,54,52,148,25,29,232,220,253,246,201, +157,247,172,73,186,200,19,97,93,142,210,152,215,197,249,142,96,129,4,93, +152,168,137,49,110,126,114,226,253,95,204,159,155,186,243,254,159,112,186, +31,156,143,99,92,247,63,105,188,216,139,243,29,146,136,64,70,207,158,25, +59,240,194,198,173,63,170,105,168,86,27,138,181,166,250,159,17,188,15,231, +149,210,104,184,233,120,120,37,226,88,253,246,84,250,7,63,61,254,209,171, +9,147,21,48,87,0,71,64,0,239,124,162,111,205,13,171,183,158,60,113,44,151, +203,77,77,77,69,81,180,125,251,246,69,132,131,235,25,119,52,228,199,167, +162,61,127,63,247,240,151,111,122,103,223,84,85,220,150,219,86,134,53,7, +77,215,246,139,152,82,175,97,30,13,11,159,217,247,187,137,131,47,181,246, +110,30,222,244,237,138,88,111,165,233,132,190,60,81,40,22,194,32,56,0,87, +157,59,121,248,165,53,27,159,116,198,179,103,144,165,152,166,202,150,92, +241,194,116,75,91,183,255,88,148,141,123,158,136,34,62,151,31,41,95,56, +170,26,9,134,87,2,26,69,32,2,31,206,141,108,122,162,92,81,239,221,225,195, +135,183,111,223,145,74,165,174,223,153,125,113,93,229,144,60,166,115,246, +217,23,223,29,93,149,95,51,144,251,205,43,135,118,110,233,207,26,117,172, +138,132,74,49,84,170,71,34,5,64,135,96,43,149,177,55,126,106,83,153,129, +13,143,230,86,174,115,222,51,42,59,109,204,211,150,131,2,84,85,36,69,80, +80,207,147,135,127,219,125,211,78,204,102,197,123,88,100,9,89,199,107,134, +90,213,182,132,39,246,167,86,140,146,143,62,193,107,31,115,14,160,170,181, +214,190,205,115,39,223,101,182,87,155,136,42,146,103,73,36,186,70,239,27, +59,116,168,80,40,124,103,215,99,240,255,186,254,3,42,78,87,47,2,79,35,39, +0,0,0,0,73,69,78,68,174,66,96,130}; + +static size_t xml_res_size_7 = 53534; +static unsigned char xml_res_file_7[] = { +60,63,120,109,108,32,118,101,114,115,105,111,110,61,34,49,46,48,34,32,101, +110,99,111,100,105,110,103,61,34,85,84,70,45,56,34,63,62,10,60,114,101, +115,111,117,114,99,101,32,120,109,108,110,115,61,34,104,116,116,112,58, +47,47,119,119,119,46,119,120,119,105,110,100,111,119,115,46,111,114,103, +47,119,120,120,114,99,34,32,118,101,114,115,105,111,110,61,34,50,46,51, +46,48,46,49,34,62,10,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,68,105,97,108,111,103,34,32,110,97,109,101,61,34,68,105,97, +108,111,103,67,97,114,100,77,97,110,97,103,101,114,34,62,10,32,32,32,32, +60,115,116,121,108,101,62,119,120,68,69,70,65,85,76,84,95,68,73,65,76,79, +71,95,83,84,89,76,69,124,119,120,77,65,88,73,77,73,90,69,95,66,79,88,124, +119,120,82,69,83,73,90,69,95,66,79,82,68,69,82,60,47,115,116,121,108,101, +62,10,32,32,32,32,60,115,105,122,101,62,54,52,48,44,52,56,48,60,47,115, +105,122,101,62,10,32,32,32,32,60,116,105,116,108,101,62,70,108,97,115,104, +32,99,97,114,100,32,109,97,110,97,103,101,114,60,47,116,105,116,108,101, +62,10,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,66,111,120,83,105,122,101,114,34,62,10,32,32,32,32,32,32,60,111,114, +105,101,110,116,62,119,120,72,79,82,73,90,79,78,84,65,76,60,47,111,114, +105,101,110,116,62,10,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32, +32,32,32,32,32,32,60,111,112,116,105,111,110,62,49,60,47,111,112,116,105, +111,110,62,10,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76, +76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,83,112,108,105,116,116,101,114,87,105,110,100,111,119, +34,32,110,97,109,101,61,34,109,95,115,112,108,105,116,116,101,114,49,34, +62,10,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,78, +79,95,66,79,82,68,69,82,60,47,115,116,121,108,101,62,10,32,32,32,32,32, +32,32,32,32,32,60,115,97,115,104,112,111,115,62,51,48,48,60,47,115,97,115, +104,112,111,115,62,10,32,32,32,32,32,32,32,32,32,32,60,103,114,97,118,105, +116,121,62,48,60,47,103,114,97,118,105,116,121,62,10,32,32,32,32,32,32, +32,32,32,32,60,109,105,110,115,105,122,101,62,51,50,60,47,109,105,110,115, +105,122,101,62,10,32,32,32,32,32,32,32,32,32,32,60,111,114,105,101,110, +116,97,116,105,111,110,62,118,101,114,116,105,99,97,108,60,47,111,114,105, +101,110,116,97,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,80,97,110,101,108, +34,32,110,97,109,101,61,34,109,95,112,97,110,101,108,54,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,84,65,66, +95,84,82,65,86,69,82,83,65,76,60,47,115,116,121,108,101,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,83,116,97,116,105,99,66,111,120,83,105,122,101,114,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,114,105,101,110,116, +62,119,120,86,69,82,84,73,67,65,76,60,47,111,114,105,101,110,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,83,117, +109,109,97,114,121,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105, +111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53, +60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120, +70,108,101,120,71,114,105,100,83,105,122,101,114,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,114,111,119,115,62,50,60,47,114, +111,119,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,99,111,108,115,62,50,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,118,103,97,112,62,48,60,47,118,103, +97,112,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,104, +103,97,112,62,48,60,47,104,103,97,112,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,98,108,101,99,111,108, +115,62,49,60,47,103,114,111,119,97,98,108,101,99,111,108,115,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,98, +108,101,114,111,119,115,47,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78, +84,69,82,95,86,69,82,84,73,67,65,76,124,119,120,65,76,76,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120, +116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120, +116,56,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,108,97,98,101,108,62,70,105,108,116,101,114,32,116,101,120, +116,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112, +116,105,111,110,62,49,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100, +101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,84,101,120,116,67,116,114,108,34,32,110,97,109, +101,61,34,116,101,120,116,70,105,108,116,101,114,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101, +62,119,120,84,69,95,80,82,79,67,69,83,83,95,69,78,84,69,82,60,47,115,116, +121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,118,97,108,117,101,47,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,109,97,120,108,101,110,103,116,104, +62,48,60,47,109,97,120,108,101,110,103,116,104,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114, +105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111, +110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95,86,69, +82,84,73,67,65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100, +101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110, +97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,57,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108, +97,98,101,108,62,83,101,97,114,99,104,32,105,110,60,47,108,97,98,101,108, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61, +34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60, +47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120, +69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47, +98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,67,104,111,105,99,101,34,32,110,97,109,101,61,34,99,104,111,105,99, +101,83,101,97,114,99,104,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,115,101,108,101,99,116,105,111,110,62,48, +60,47,115,101,108,101,99,116,105,111,110,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,99,111,110,116,101,110,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,105,116,101,109,62,81,117,101,115,116,105,111,110,60,47,105,116, +101,109,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,105,116,101,109,62,65,110,115,119,101,114,60,47,105,116, +101,109,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,99,111,110,116,101,110,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116, +101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95,86,69,82,84,73, +67,65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114, +62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109, +101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,50,54,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97, +98,101,108,62,83,111,114,116,32,98,121,60,47,108,97,98,101,108,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88, +80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111, +114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,67, +104,111,105,99,101,34,32,110,97,109,101,61,34,99,104,111,105,99,101,83, +111,114,116,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,115,101,108,101,99,116,105,111,110,62,48,60,47,115,101, +108,101,99,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,99,111,110,116,101,110,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,105,116, +101,109,62,65,100,100,101,100,32,116,105,109,101,60,47,105,116,101,109, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,105,116,101,109,62,82,101,118,105,101,119,101,100,32,116,105,109, +101,60,47,105,116,101,109,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,105,116,101,109,62,69,120,112,105,114, +97,116,105,111,110,32,116,105,109,101,60,47,105,116,101,109,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,105, +116,101,109,62,67,117,114,114,101,110,116,32,100,101,99,107,60,47,105,116, +101,109,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,105,116,101,109,62,69,110,97,98,108,101,100,32,115,116, +97,116,101,60,47,105,116,101,109,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,105,116,101,109,62,81,117,101, +115,116,105,111,110,32,116,101,120,116,60,47,105,116,101,109,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,105, +116,101,109,62,65,110,115,119,101,114,32,116,101,120,116,60,47,105,116, +101,109,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,105,116,101,109,62,82,101,109,101,109,98,101,114,101, +100,32,99,111,117,110,116,60,47,105,116,101,109,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,105,116,101,109, +62,70,111,114,103,111,116,116,101,110,32,99,111,117,110,116,60,47,105,116, +101,109,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,105,116,101,109,62,66,117,110,103,108,101,100,32,99,111, +117,110,116,60,47,105,116,101,109,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,99,111,110,116,101,110,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,112,116,105,111,110,62,49,60,47,111,112,116,105, +111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111, +114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97, +115,115,61,34,119,120,67,104,101,99,107,76,105,115,116,66,111,120,34,32, +110,97,109,101,61,34,99,104,101,99,107,76,105,115,116,67,97,114,100,115, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116, +121,108,101,62,119,120,76,66,95,69,88,84,69,78,68,69,68,60,47,115,116,121, +108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +99,111,110,116,101,110,116,47,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105, +111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,60,47,102,108,97, +103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,66,111,120,83,105,122,101,114,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,114,105,101,110,116,62,119, +120,72,79,82,73,90,79,78,84,65,76,60,47,111,114,105,101,110,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112, +116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114, +100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,117, +116,116,111,110,34,32,110,97,109,101,61,34,98,117,116,116,111,110,65,100, +100,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,108,97,98,101,108,62,95,65,100,100,60,47,108,97,98,101,108,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +100,101,102,97,117,108,116,62,48,60,47,100,101,102,97,117,108,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98, +111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97, +109,101,61,34,98,117,116,116,111,110,82,101,109,111,118,101,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97, +98,101,108,62,95,82,101,109,111,118,101,60,47,108,97,98,101,108,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,100,101, +102,97,117,108,116,62,48,60,47,100,101,102,97,117,108,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,80,97,110,101,108,34,32,110, +97,109,101,61,34,109,95,112,97,110,101,108,55,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,84,65,66,95,84,82,65, +86,69,82,83,65,76,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,83,116,97,116,105,99,66,111,120,83,105,122,101,114,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,114,105,101,110,116,62,119,120, +86,69,82,84,73,67,65,76,60,47,111,114,105,101,110,116,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,67,97,114,100,60, +47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105, +116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,112,116,105,111,110,62,49,60,47,111,112,116,105,111,110,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62, +53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,78,111,116,101,98,111,111,107,34,32,110,97,109,101,61,34,110,111,116, +101,98,111,111,107,67,97,114,100,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,78,66,95,66,79, +84,84,79,77,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,101,110,97,98,108,101,100,62,48,60,47,101, +110,97,98,108,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,110,111,116, +101,98,111,111,107,112,97,103,101,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,86,105,101,119,60, +47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,115,101,108,101,99,116,101,100,62,49,60,47,115,101,108, +101,99,116,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120, +80,97,110,101,108,34,32,110,97,109,101,61,34,112,97,110,101,108,72,116, +109,108,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,115,116,121,108,101,62,119,120,84,65,66,95,84,82,65,86,69, +82,83,65,76,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,66,111,120,83,105,122,101,114,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,114, +105,101,110,116,62,119,120,86,69,82,84,73,67,65,76,60,47,111,114,105,101, +110,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111, +110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62, +119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101, +114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120, +116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120, +116,54,49,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,81,117,101,115,116, +105,111,110,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99, +116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,112,116,105,111,110,62,49,60,47,111,112,116,105,111,110,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68, +60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47, +98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,72,116,109,108,87,105,110,100,111,119,34,32,110, +97,109,101,61,34,104,116,109,108,81,117,101,115,116,105,111,110,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,115,116,121,108,101,62,119,120,72,87,95,83,67,82,79,76,76, +66,65,82,95,65,85,84,79,124,119,120,83,85,78,75,69,78,95,66,79,82,68,69, +82,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116, +105,99,84,101,120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116, +105,99,84,101,120,116,55,49,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62, +65,110,115,119,101,114,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,112,116,105,111,110,62,49,60,47,111,112,116,105,111, +110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88, +80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114, +62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,119,120,72,116,109,108,87,105,110,100,111,119, +34,32,110,97,109,101,61,34,104,116,109,108,65,110,115,119,101,114,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,115,116,121,108,101,62,119,120,72,87,95,83,67,82,79,76, +76,66,65,82,95,65,85,84,79,124,119,120,83,85,78,75,69,78,95,66,79,82,68, +69,82,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,110, +111,116,101,98,111,111,107,112,97,103,101,34,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,69,100,105, +116,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,115,101,108,101,99,116,101,100,62,48,60,47,115, +101,108,101,99,116,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34, +119,120,80,97,110,101,108,34,32,110,97,109,101,61,34,112,97,110,101,108, +84,101,120,116,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,84,65,66,95,84,82,65, +86,69,82,83,65,76,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,119,120,66,111,120,83,105,122,101,114,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,114,105,101,110,116,62,119,120,86,69,82,84,73,67,65,76,60,47,111, +114,105,101,110,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116, +105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101, +120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101, +120,116,54,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,81,117,101,115, +116,105,111,110,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,111,112,116,105,111,110,62,49,60,47,111,112,116,105,111,110,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78, +68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60, +47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,84,101,120,116,67,116,114,108,34,32,110,97,109, +101,61,34,116,101,120,116,81,117,101,115,116,105,111,110,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,115,116,121,108,101,62,119,120,84,69,95,77,85,76,84,73,76,73,78, +69,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97,108,117,101,47, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,109,97,120,108,101,110,103,116,104,62,48,60,47,109, +97,120,108,101,110,103,116,104,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116, +105,99,84,101,120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116, +105,99,84,101,120,116,55,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,65, +110,115,119,101,114,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,112,116,105,111,110,62,49,60,47,111,112,116,105,111,110, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88,80, +65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62, +53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,119,120,84,101,120,116,67,116,114,108,34,32,110, +97,109,101,61,34,116,101,120,116,65,110,115,119,101,114,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,115,116,121,108,101,62,119,120,84,69,95,77,85,76,84,73,76,73,78, +69,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97,108,117,101,47, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,109,97,120,108,101,110,103,116,104,62,48,60,47,109, +97,120,108,101,110,103,116,104,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,110,111,116, +101,98,111,111,107,112,97,103,101,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,83,116,97,116,115, +60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,115,101,108,101,99,116,101,100,62,48,60,47,115,101, +108,101,99,116,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,80,97,110,101,108,34,32,110,97,109,101,61,34,112,97,110,101,108,83, +116,97,116,115,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,84,65,66,95,84,82,65, +86,69,82,83,65,76,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,119,120,70,108,101,120,71,114,105,100,83,105,122, +101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,114,111,119,115,62,50,60,47,114,111,119,115,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,99,111,108,115,62,50,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,103,97,112,62, +48,60,47,118,103,97,112,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,104,103,97,112,62,48,60,47,104,103,97, +112,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,103,114,111,119,97,98,108,101,99,111,108,115,47,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,103, +114,111,119,97,98,108,101,114,111,119,115,47,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,82,73,71,72, +84,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101, +120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101, +120,116,52,51,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,67,117,114, +114,101,110,116,32,100,101,99,107,58,60,47,108,97,98,101,108,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116, +101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47, +102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111, +114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101, +61,34,115,116,97,116,105,99,68,101,99,107,34,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97, +98,101,108,62,45,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,82,73,71,72, +84,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101, +120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101, +120,116,49,48,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,82,101,109, +101,109,98,101,114,101,100,32,99,111,117,110,116,58,60,47,108,97,98,101, +108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99, +116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122, +101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48, +60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62, +53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34, +32,110,97,109,101,61,34,115,116,97,116,105,99,67,111,117,110,116,82,101, +109,101,109,98,101,114,101,100,34,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108, +62,45,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,102,108,97,103,62,119,120,65,76,73,71,78,95,82,73,71,72,84,124,119,120, +65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62, +53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34, +32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,49, +50,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,70,111,114,103,111,116, +116,101,110,32,99,111,117,110,116,58,60,47,108,97,98,101,108,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116, +101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47, +102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111, +114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101, +61,34,115,116,97,116,105,99,67,111,117,110,116,70,111,114,103,111,116,116, +101,110,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,45,60,47,108,97,98, +101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111, +110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62, +119,120,65,76,73,71,78,95,82,73,71,72,84,124,119,120,65,76,76,60,47,102, +108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114, +100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61, +34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61, +34,109,95,115,116,97,116,105,99,84,101,120,116,50,50,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,108,97,98,101,108,62,66,117,110,103,108,101,100,32,99,111,117,110, +116,58,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116, +105,99,84,101,120,116,34,32,110,97,109,101,61,34,115,116,97,116,105,99, +67,111,117,110,116,66,117,110,103,108,101,100,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108, +97,98,101,108,62,45,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,82,73,71,72, +84,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101, +120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101, +120,116,52,53,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,65,100,100, +101,100,32,116,105,109,101,58,60,47,108,97,98,101,108,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111, +110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120, +83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61,34,115,116, +97,116,105,99,84,105,109,101,65,100,100,101,100,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +108,97,98,101,108,62,45,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111, +110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,82,73,71, +72,84,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101, +120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101, +120,116,49,54,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,82,101,118, +105,101,119,101,100,32,116,105,109,101,58,60,47,108,97,98,101,108,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114, +105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76, +60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47, +98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110, +97,109,101,61,34,115,116,97,116,105,99,84,105,109,101,82,101,118,105,101, +119,80,114,101,118,105,111,117,115,34,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101, +108,62,45,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,102,108,97,103,62,119,120,65,76,73,71,78,95,82,73,71,72,84,124,119,120, +65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62, +53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34, +32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,49, +56,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,69,120,112,105,114,97,116, +105,111,110,32,116,105,109,101,58,60,47,108,97,98,101,108,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98, +106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101, +109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105, +111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100, +101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34, +119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61,34, +115,116,97,116,105,99,84,105,109,101,82,101,118,105,101,119,78,101,120, +116,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,45,60,47,108,97,98,101, +108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99, +116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99, +116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99, +116,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,60,47,111,98,106,101,99,116,62,10,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,68,105,97,108,111,103,34, +32,110,97,109,101,61,34,68,105,97,108,111,103,67,97,114,100,34,62,10,32, +32,32,32,60,115,116,121,108,101,62,119,120,68,69,70,65,85,76,84,95,68,73, +65,76,79,71,95,83,84,89,76,69,124,119,120,77,65,88,73,77,73,90,69,95,66, +79,88,124,119,120,82,69,83,73,90,69,95,66,79,82,68,69,82,60,47,115,116, +121,108,101,62,10,32,32,32,32,60,115,105,122,101,62,54,52,48,44,52,56,48, +60,47,115,105,122,101,62,10,32,32,32,32,60,116,105,116,108,101,62,70,108, +97,115,104,32,99,97,114,100,60,47,116,105,116,108,101,62,10,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,111,120, +83,105,122,101,114,34,62,10,32,32,32,32,32,32,60,111,114,105,101,110,116, +62,119,120,86,69,82,84,73,67,65,76,60,47,111,114,105,101,110,116,62,10, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,60,111, +112,116,105,111,110,62,49,60,47,111,112,116,105,111,110,62,10,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68,60,47,102, +108,97,103,62,10,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53, +60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,83,112,108,105,116,116,101, +114,87,105,110,100,111,119,34,32,110,97,109,101,61,34,109,95,115,112,108, +105,116,116,101,114,50,34,62,10,32,32,32,32,32,32,32,32,32,32,60,115,116, +121,108,101,62,119,120,78,79,95,66,79,82,68,69,82,60,47,115,116,121,108, +101,62,10,32,32,32,32,32,32,32,32,32,32,60,115,97,115,104,112,111,115,62, +48,60,47,115,97,115,104,112,111,115,62,10,32,32,32,32,32,32,32,32,32,32, +60,103,114,97,118,105,116,121,62,48,46,53,60,47,103,114,97,118,105,116, +121,62,10,32,32,32,32,32,32,32,32,32,32,60,109,105,110,115,105,122,101, +62,51,50,60,47,109,105,110,115,105,122,101,62,10,32,32,32,32,32,32,32,32, +32,32,60,111,114,105,101,110,116,97,116,105,111,110,62,118,101,114,116, +105,99,97,108,60,47,111,114,105,101,110,116,97,116,105,111,110,62,10,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,80,97,110,101,108,34,32,110,97,109,101,61,34,112,97,110,101, +108,81,117,101,115,116,105,111,110,34,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,60,115,116,121,108,101,62,119,120,84,65,66,95,84,82,65,86,69,82, +83,65,76,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,111, +120,83,105,122,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,111,114,105,101,110,116,62,119,120,86,69,82,84,73,67,65,76,60,47, +111,114,105,101,110,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114, +105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120, +116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120, +116,52,50,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,108,97,98,101,108,62,81,117,101,115,116,105,111,110,60,47,108,97,98, +101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105, +116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,112,116,105,111,110,62,49,60,47,111,112,116,105,111,110,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62, +53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,72,116,109,108,87,105,110,100,111,119,34,32,110,97,109,101,61,34,104, +116,109,108,81,117,101,115,116,105,111,110,34,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,72,87, +95,83,67,82,79,76,76,66,65,82,95,65,85,84,79,124,119,120,83,85,78,75,69, +78,95,66,79,82,68,69,82,60,47,115,116,121,108,101,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,80,97,110,101,108,34,32,110,97,109,101,61,34,112,97,110,101,108,65, +110,115,119,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115, +116,121,108,101,62,119,120,84,65,66,95,84,82,65,86,69,82,83,65,76,60,47, +115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98, +106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,111,120,83,105,122, +101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,114,105, +101,110,116,62,119,120,86,69,82,84,73,67,65,76,60,47,111,114,105,101,110, +116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111, +110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111, +114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97, +115,115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97, +109,101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,52,51,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101, +108,62,65,110,115,119,101,114,60,47,108,97,98,101,108,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62, +49,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88, +80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101, +114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,80,97,110,101,108,34,32,110, +97,109,101,61,34,112,97,110,101,108,67,111,110,99,101,97,108,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101, +62,119,120,83,85,78,75,69,78,95,66,79,82,68,69,82,124,119,120,84,65,66, +95,84,82,65,86,69,82,83,65,76,60,47,115,116,121,108,101,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,103,62,35,57,50,57,49, +56,101,60,47,98,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,104,105,100,100,101,110,62,49,60,47,104,105,100,100,101,110, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,66,111,120,83,105,122,101, +114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,114,105,101,110,116,62,119,120,86,69,82,84,73,67,65,76,60,47,111, +114,105,101,110,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +112,97,99,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,49,60,47,111,112,116, +105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115, +105,122,101,62,48,44,48,60,47,115,105,122,101,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102, +108,97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95,72,79,82,73, +90,79,78,84,65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97, +109,101,61,34,98,117,116,116,111,110,83,104,111,119,34,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98, +101,108,62,95,83,104,111,119,60,47,108,97,98,101,108,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,100,101, +102,97,117,108,116,62,49,60,47,100,101,102,97,117,108,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,115,112,97,99,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,49,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68,60, +47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100, +101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,115,105,122,101,62,48,44,48,60,47,115,105,122,101,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,112,116,105,111,110,62,49,60,47,111,112,116,105, +111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111, +114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97, +115,115,61,34,119,120,72,116,109,108,87,105,110,100,111,119,34,32,110,97, +109,101,61,34,104,116,109,108,65,110,115,119,101,114,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62, +119,120,72,87,95,83,67,82,79,76,76,66,65,82,95,65,85,84,79,124,119,120, +83,85,78,75,69,78,95,66,79,82,68,69,82,60,47,115,116,121,108,101,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99, +116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99, +116,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109, +34,62,10,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47, +111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,60,102,108,97,103, +62,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32, +32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62, +10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,66,111,120,83,105,122,101,114,34,62,10,32,32,32,32,32,32, +32,32,32,32,60,111,114,105,101,110,116,62,119,120,86,69,82,84,73,67,65, +76,60,47,111,114,105,101,110,116,62,10,32,32,32,32,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105, +116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116, +105,111,110,62,49,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68,32,124, +32,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,119,120,80,97,110,101,108,34,32,110,97,109,101,61, +34,109,95,112,97,110,101,108,49,53,34,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,115,116,121,108,101,62,119,120,84,65,66,95,84,82,65,86, +69,82,83,65,76,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,66,111,120,83,105,122,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,114,105,101,110,116,62,119,120,72,79,82,73,90, +79,78,84,65,76,60,47,111,114,105,101,110,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47, +111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,67,104,101,99,107,66,111,120,34,32,110,97,109, +101,61,34,99,104,101,99,107,98,111,120,76,101,97,114,110,101,100,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,104,105, +100,100,101,110,62,49,60,47,104,105,100,100,101,110,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,76, +101,97,114,110,101,100,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,99,104,101,99,107,101,100, +62,48,60,47,99,104,101,99,107,101,100,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111, +110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47, +102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,119,120,67,104,101,99,107,66,111,120,34, +32,110,97,109,101,61,34,99,104,101,99,107,98,111,120,69,110,97,98,108,101, +100,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,104,105,100,100,101,110,62,49,60,47,104,105,100,100,101,110,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101, +108,62,69,110,97,98,108,101,100,60,47,108,97,98,101,108,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,99,104,101,99,107, +101,100,62,48,60,47,99,104,101,99,107,101,100,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116, +105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76, +73,71,78,95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119,120,65, +76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101, +114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105, +99,84,101,120,116,34,32,110,97,109,101,61,34,115,116,97,116,105,99,82,101, +109,101,109,98,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,104,105,100,100,101,110,62,49,60,47,104,105,100, +100,101,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,108,97,98,101,108,62,68,105,100,32,121,111,117,32,114,101,109, +101,109,98,101,114,63,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,112,97,99,101,114,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110, +62,49,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68, +60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,105,122, +101,62,48,44,48,60,47,115,105,122,101,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60, +47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61, +34,98,117,116,116,111,110,80,114,101,118,105,111,117,115,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,104,105,100,100, +101,110,62,49,60,47,104,105,100,100,101,110,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,95,80,114, +101,118,105,111,117,115,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,100,101,102,97,117,108,116, +62,48,60,47,100,101,102,97,117,108,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111, +110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47, +102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110, +97,109,101,61,34,98,117,116,116,111,110,78,101,120,116,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,104,105,100,100,101, +110,62,49,60,47,104,105,100,100,101,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,95,78,101,120, +116,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,100,101,102,97,117,108,116,62,48,60,47,100,101, +102,97,117,108,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61, +34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61, +34,98,117,116,116,111,110,89,101,115,34,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,101,110,97,98,108,101,100,62,48,60, +47,101,110,97,98,108,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,104,105,100,100,101,110,62,49,60,47,104,105, +100,100,101,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,108,97,98,101,108,62,95,89,101,115,60,47,108,97,98,101,108, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,100, +101,102,97,117,108,116,62,48,60,47,100,101,102,97,117,108,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114, +105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97, +103,62,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47, +98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120, +66,117,116,116,111,110,34,32,110,97,109,101,61,34,98,117,116,116,111,110, +80,97,114,116,105,97,108,108,121,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,101,110,97,98,108,101,100,62,48,60,47, +101,110,97,98,108,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,104,105,100,100,101,110,62,49,60,47,104,105,100, +100,101,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,108,97,98,101,108,62,95,80,97,114,116,105,97,108,108,121,60,47, +108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,100,101,102,97,117,108,116,62,48,60,47,100,101,102,97,117, +108,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101, +114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61,34,98,117, +116,116,111,110,78,111,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,101,110,97,98,108,101,100,62,48,60,47,101,110,97, +98,108,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,104,105,100,100,101,110,62,49,60,47,104,105,100,100,101,110, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108, +97,98,101,108,62,95,78,111,60,47,108,97,98,101,108,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,100,101,102,97,117,108, +116,62,48,60,47,100,101,102,97,117,108,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,60,47,111,98,106,101,99,116,62,10,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,119,120,70,114,97,109,101,34,32,110,97,109,101, +61,34,70,114,97,109,101,77,101,103,97,110,101,107,107,111,34,62,10,32,32, +32,32,60,115,116,121,108,101,62,119,120,68,69,70,65,85,76,84,95,70,82,65, +77,69,95,83,84,89,76,69,124,119,120,84,65,66,95,84,82,65,86,69,82,83,65, +76,60,47,115,116,121,108,101,62,10,32,32,32,32,60,115,105,122,101,62,54, +52,48,44,52,56,48,60,47,115,105,122,101,62,10,32,32,32,32,60,116,105,116, +108,101,62,77,101,103,97,110,101,107,107,111,60,47,116,105,116,108,101, +62,10,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,80,97,110,101,108,34,32,110,97,109,101,61,34,109,95,112,97,110,101, +108,50,34,62,10,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,84, +65,66,95,84,82,65,86,69,82,83,65,76,60,47,115,116,121,108,101,62,10,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,66,111,120,83,105,122,101,114,34,62,10,32,32,32,32,32,32,32,32,60,111, +114,105,101,110,116,62,119,120,86,69,82,84,73,67,65,76,60,47,111,114,105, +101,110,116,62,10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32, +32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,49,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62, +119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,70,108,101,120,71,114,105,100,83,105,122,101,114, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,114,111,119,115,62,50,60, +47,114,111,119,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,99,111, +108,115,62,52,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,60,118,103,97,112,62,48,60,47,118,103,97,112,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,60,104,103,97,112,62,48,60,47,104,103,97,112,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,98,108,101,99, +111,108,115,62,48,44,49,44,50,44,51,60,47,103,114,111,119,97,98,108,101, +99,111,108,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,103,114,111, +119,97,98,108,101,114,111,119,115,62,48,60,47,103,114,111,119,97,98,108, +101,114,111,119,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98, +106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101, +109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105, +111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120, +69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101, +114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,119,120,71,97,117,103,101,34,32,110,97,109, +101,61,34,103,97,117,103,101,85,110,116,101,115,116,101,100,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62, +119,120,71,65,95,83,77,79,79,84,72,124,119,120,71,65,95,86,69,82,84,73, +67,65,76,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,114,97,110,103,101,62,49,48,48,60,47,114,97,110,103, +101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97,108, +117,101,62,48,60,47,118,97,108,117,101,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122, +101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60, +47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,71,97,117, +103,101,34,32,110,97,109,101,61,34,103,97,117,103,101,69,120,112,105,114, +101,100,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115, +116,121,108,101,62,119,120,71,65,95,83,77,79,79,84,72,124,119,120,71,65, +95,86,69,82,84,73,67,65,76,60,47,115,116,121,108,101,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,114,97,110,103,101,62,49,48,48,60, +47,114,97,110,103,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,118,97,108,117,101,62,48,60,47,118,97,108,117,101,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116, +105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100, +101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,71,97,117,103,101,34,32,110,97,109,101,61,34,103,97,117,103,101,70, +97,105,108,101,100,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,115,116,121,108,101,62,119,120,71,65,95,83,77,79,79,84,72,124,119, +120,71,65,95,86,69,82,84,73,67,65,76,60,47,115,116,121,108,101,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,114,97,110,103,101,62,49, +48,48,60,47,114,97,110,103,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,118,97,108,117,101,62,48,60,47,118,97,108,117,101,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47, +111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60, +47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98, +111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,71,97,117,103,101,34,32,110,97,109,101,61,34,103,97,117, +103,101,80,101,110,100,105,110,103,34,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,71,65,95,83,77,79, +79,84,72,124,119,120,71,65,95,86,69,82,84,73,67,65,76,60,47,115,116,121, +108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,114,97, +110,103,101,62,49,48,48,60,47,114,97,110,103,101,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,118,97,108,117,101,62,48,60,47,118,97, +108,117,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111, +110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88, +80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97,109, +101,61,34,98,117,116,116,111,110,85,110,116,101,115,116,101,100,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,101,110,97,98,108,101, +100,62,48,60,47,101,110,97,98,108,101,100,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,95,85,110,116,101,115,116, +101,100,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,100,101,102,97,117,108,116,62,48,60,47,100,101,102,97, +117,108,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111, +110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88, +80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97,109, +101,61,34,98,117,116,116,111,110,69,120,112,105,114,101,100,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,101,110,97,98,108,101,100, +62,48,60,47,101,110,97,98,108,101,100,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,108,97,98,101,108,62,95,69,120,112,105,114,101, +100,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,100,101,102,97,117,108,116,62,48,60,47,100,101,102,97,117,108, +116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99, +116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62, +48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88,80,65, +78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61, +34,98,117,116,116,111,110,70,97,105,108,101,100,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,101,110,97,98,108,101,100,62,48,60, +47,101,110,97,98,108,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,108,97,98,101,108,62,70,95,97,105,108,101,100,60,47,108, +97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +100,101,102,97,117,108,116,62,48,60,47,100,101,102,97,117,108,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47, +111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60, +47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98, +111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61,34,98, +117,116,116,111,110,80,101,110,100,105,110,103,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,101,110,97,98,108,101,100,62,48,60, +47,101,110,97,98,108,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,108,97,98,101,108,62,95,80,101,110,100,105,110,103,60,47, +108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,100,101,102,97,117,108,116,62,48,60,47,100,101,102,97,117,108,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,77,101,110,117,66,97,114,34,32,110,97,109,101,61,34,109,101,110,117, +98,97,114,34,62,10,32,32,32,32,32,32,60,108,97,98,101,108,62,77,121,77, +101,110,117,66,97,114,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117, +34,32,110,97,109,101,61,34,109,101,110,117,70,105,108,101,34,62,10,32,32, +32,32,32,32,32,32,60,108,97,98,101,108,62,95,70,105,108,101,60,47,108,97, +98,101,108,62,10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,119,120,77,101,110,117,73,116,101,109,34,32,110,97, +109,101,61,34,109,101,110,117,70,105,108,101,78,101,119,34,62,10,32,32, +32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,38,97,109,112,59,78,101, +119,92,116,67,84,82,76,43,78,60,47,108,97,98,101,108,62,10,32,32,32,32, +32,32,32,32,32,32,60,104,101,108,112,47,62,10,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117,73,116,101,109, +34,32,110,97,109,101,61,34,109,101,110,117,70,105,108,101,79,112,101,110, +34,62,10,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,38,97,109, +112,59,79,112,101,110,46,46,46,92,116,67,84,82,76,43,79,60,47,108,97,98, +101,108,62,10,32,32,32,32,32,32,32,32,32,32,60,104,101,108,112,47,62,10, +32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,77, +101,110,117,73,116,101,109,34,32,110,97,109,101,61,34,109,101,110,117,70, +105,108,101,83,97,118,101,34,62,10,32,32,32,32,32,32,32,32,32,32,60,108, +97,98,101,108,62,38,97,109,112,59,83,97,118,101,92,116,67,84,82,76,43,83, +60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,60,104,101, +108,112,47,62,10,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,77,101,110,117,73,116,101,109,34,32,110,97,109,101,61,34, +109,101,110,117,70,105,108,101,83,97,118,101,65,115,34,62,10,32,32,32,32, +32,32,32,32,32,32,60,108,97,98,101,108,62,83,97,118,101,32,38,97,109,112, +59,97,115,46,46,46,92,116,67,84,82,76,43,83,72,73,70,84,43,83,60,47,108, +97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,60,104,101,108,112,47, +62,10,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +101,112,97,114,97,116,111,114,34,47,62,10,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117,73, +116,101,109,34,32,110,97,109,101,61,34,109,101,110,117,70,105,108,101,69, +120,105,116,34,62,10,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108, +62,69,38,97,109,112,59,120,105,116,92,116,67,84,82,76,43,81,60,47,108,97, +98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,60,104,101,108,112,47,62, +10,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117,34,32,110, +97,109,101,61,34,109,101,110,117,84,111,111,108,115,34,62,10,32,32,32,32, +32,32,32,32,60,108,97,98,101,108,62,95,84,111,111,108,115,60,47,108,97, +98,101,108,62,10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,119,120,77,101,110,117,34,32,110,97,109,101,61,34, +109,101,110,117,84,111,111,108,115,67,97,114,100,115,34,62,10,32,32,32, +32,32,32,32,32,32,32,60,108,97,98,101,108,62,95,67,97,114,100,115,60,47, +108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117,73,116,101,109, +34,32,110,97,109,101,61,34,109,101,110,117,84,111,111,108,115,67,97,114, +100,115,77,97,110,97,103,101,34,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,60,108,97,98,101,108,62,38,97,109,112,59,77,97,110,97,103,101,46,46, +46,92,116,67,84,82,76,43,77,60,47,108,97,98,101,108,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,60,104,101,108,112,47,62,10,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117, +73,116,101,109,34,32,110,97,109,101,61,34,109,101,110,117,84,111,111,108, +115,67,97,114,100,115,69,120,112,105,114,101,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,60,108,97,98,101,108,62,38,97,109,112,59,69,120,112,105, +114,101,92,116,67,84,82,76,43,69,60,47,108,97,98,101,108,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,104,101,108,112,47,62,10,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117,34,32,110,97,109, +101,61,34,109,101,110,117,84,111,111,108,115,82,101,118,105,101,119,34, +62,10,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,95,82,101,118, +105,101,119,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,77,101,110, +117,73,116,101,109,34,32,110,97,109,101,61,34,109,101,110,117,84,111,111, +108,115,82,101,118,105,101,119,83,101,113,117,101,110,116,105,97,108,34, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,83,101, +113,38,97,109,112,59,117,101,110,116,105,97,108,46,46,46,92,116,67,84,82, +76,43,85,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,60,104,101,108,112,47,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117,73,116,101,109, +34,32,110,97,109,101,61,34,109,101,110,117,84,111,111,108,115,82,101,118, +105,101,119,83,116,117,100,121,34,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,60,108,97,98,101,108,62,83,38,97,109,112,59,116,117,100,121,46,46,46, +92,116,67,84,82,76,43,84,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,60,104,101,108,112,47,62,10,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,119,120,77,101,110,117,73,116,101,109,34,32, +110,97,109,101,61,34,109,101,110,117,84,111,111,108,115,79,112,116,105, +111,110,115,34,62,10,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108, +62,38,97,109,112,59,79,112,116,105,111,110,115,46,46,46,60,47,108,97,98, +101,108,62,10,32,32,32,32,32,32,32,32,32,32,60,104,101,108,112,47,62,10, +32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117,34,32,110,97,109, +101,61,34,109,101,110,117,72,101,108,112,34,62,10,32,32,32,32,32,32,32, +32,60,108,97,98,101,108,62,95,72,101,108,112,60,47,108,97,98,101,108,62, +10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,77,101,110,117,73,116,101,109,34,32,110,97,109,101,61,34, +109,101,110,117,72,101,108,112,72,111,109,101,112,97,103,101,34,62,10,32, +32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,38,97,109,112,59,72, +111,109,101,112,97,103,101,46,46,46,60,47,108,97,98,101,108,62,10,32,32, +32,32,32,32,32,32,32,32,60,104,101,108,112,47,62,10,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60,111,98, +106,101,99,116,32,99,108,97,115,115,61,34,119,120,77,101,110,117,73,116, +101,109,34,32,110,97,109,101,61,34,109,101,110,117,72,101,108,112,65,98, +111,117,116,34,62,10,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108, +62,38,97,109,112,59,65,98,111,117,116,46,46,46,92,116,70,49,60,47,108,97, +98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,60,104,101,108,112,47,62, +10,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,84,111,111,108,66,97,114,34,32,110,97,109,101,61,34,109,95, +116,111,111,108,66,97,114,49,34,62,10,32,32,32,32,32,32,60,115,116,121, +108,101,62,119,120,84,66,95,72,79,82,73,90,79,78,84,65,76,60,47,115,116, +121,108,101,62,10,32,32,32,32,32,32,60,98,105,116,109,97,112,115,105,122, +101,47,62,10,32,32,32,32,32,32,60,109,97,114,103,105,110,115,47,62,10,32, +32,32,32,32,32,60,112,97,99,107,105,110,103,62,49,60,47,112,97,99,107,105, +110,103,62,10,32,32,32,32,32,32,60,115,101,112,97,114,97,116,105,111,110, +62,53,60,47,115,101,112,97,114,97,116,105,111,110,62,10,32,32,32,32,32, +32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,116,111,111,108, +34,32,110,97,109,101,61,34,109,101,110,117,70,105,108,101,78,101,119,34, +62,10,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,116,111,111,108,60, +47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,60,116,111,111,108,116, +105,112,62,78,101,119,32,102,105,108,101,60,47,116,111,111,108,116,105, +112,62,10,32,32,32,32,32,32,32,32,60,108,111,110,103,104,101,108,112,47, +62,10,32,32,32,32,32,32,32,32,60,98,105,116,109,97,112,62,82,101,115,111, +117,114,99,101,46,99,112,112,36,71,114,97,112,104,105,99,115,95,102,105, +108,101,45,110,101,119,46,112,110,103,60,47,98,105,116,109,97,112,62,10, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,116,111,111,108,34,32, +110,97,109,101,61,34,109,101,110,117,70,105,108,101,79,112,101,110,34,62, +10,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,116,111,111,108,60,47, +108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,60,116,111,111,108,116, +105,112,62,79,112,101,110,32,102,105,108,101,60,47,116,111,111,108,116, +105,112,62,10,32,32,32,32,32,32,32,32,60,108,111,110,103,104,101,108,112, +47,62,10,32,32,32,32,32,32,32,32,60,98,105,116,109,97,112,62,82,101,115, +111,117,114,99,101,46,99,112,112,36,71,114,97,112,104,105,99,115,95,102, +105,108,101,45,111,112,101,110,46,112,110,103,60,47,98,105,116,109,97,112, +62,10,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,116,111,111,108, +34,32,110,97,109,101,61,34,109,101,110,117,70,105,108,101,83,97,118,101, +34,62,10,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,116,111,111,108, +60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,60,116,111,111,108, +116,105,112,62,83,97,118,101,32,102,105,108,101,60,47,116,111,111,108,116, +105,112,62,10,32,32,32,32,32,32,32,32,60,108,111,110,103,104,101,108,112, +47,62,10,32,32,32,32,32,32,32,32,60,98,105,116,109,97,112,62,82,101,115, +111,117,114,99,101,46,99,112,112,36,71,114,97,112,104,105,99,115,95,102, +105,108,101,45,115,97,118,101,46,112,110,103,60,47,98,105,116,109,97,112, +62,10,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,101,112,97,114, +97,116,111,114,34,47,62,10,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,116,111,111,108,34,32,110,97,109,101,61,34,109, +101,110,117,84,111,111,108,115,67,97,114,100,115,77,97,110,97,103,101,34, +62,10,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,116,111,111,108,60, +47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,60,116,111,111,108,116, +105,112,62,77,97,110,97,103,101,32,99,97,114,100,115,60,47,116,111,111, +108,116,105,112,62,10,32,32,32,32,32,32,32,32,60,108,111,110,103,104,101, +108,112,47,62,10,32,32,32,32,32,32,32,32,60,98,105,116,109,97,112,62,82, +101,115,111,117,114,99,101,46,99,112,112,36,71,114,97,112,104,105,99,115, +95,116,111,111,108,115,45,99,97,114,100,115,45,109,97,110,97,103,101,46, +112,110,103,60,47,98,105,116,109,97,112,62,10,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,116,111,111,108,34,32,110,97,109,101,61,34,109,101, +110,117,84,111,111,108,115,67,97,114,100,115,69,120,112,105,114,101,34, +62,10,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,116,111,111,108,60, +47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,60,116,111,111,108,116, +105,112,62,69,120,112,105,114,101,32,99,97,114,100,115,60,47,116,111,111, +108,116,105,112,62,10,32,32,32,32,32,32,32,32,60,108,111,110,103,104,101, +108,112,47,62,10,32,32,32,32,32,32,32,32,60,98,105,116,109,97,112,62,82, +101,115,111,117,114,99,101,46,99,112,112,36,71,114,97,112,104,105,99,115, +95,116,111,111,108,115,45,99,97,114,100,115,45,101,120,112,105,114,101, +46,112,110,103,60,47,98,105,116,109,97,112,62,10,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,115,101,112,97,114,97,116,111,114,34,47,62,10, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,116, +111,111,108,34,32,110,97,109,101,61,34,109,101,110,117,84,111,111,108,115, +79,112,116,105,111,110,115,34,62,10,32,32,32,32,32,32,32,32,60,108,97,98, +101,108,62,116,111,111,108,60,47,108,97,98,101,108,62,10,32,32,32,32,32, +32,32,32,60,116,111,111,108,116,105,112,62,79,112,116,105,111,110,115,60, +47,116,111,111,108,116,105,112,62,10,32,32,32,32,32,32,32,32,60,108,111, +110,103,104,101,108,112,47,62,10,32,32,32,32,32,32,32,32,60,98,105,116, +109,97,112,62,82,101,115,111,117,114,99,101,46,99,112,112,36,71,114,97, +112,104,105,99,115,95,116,111,111,108,115,45,99,97,114,100,115,45,111,112, +116,105,111,110,115,46,112,110,103,60,47,98,105,116,109,97,112,62,10,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,60,47,111,98,106,101,99,116,62,10,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,68,105,97,108, +111,103,34,32,110,97,109,101,61,34,68,105,97,108,111,103,65,98,111,117, +116,34,62,10,32,32,32,32,60,115,116,121,108,101,62,119,120,68,69,70,65, +85,76,84,95,68,73,65,76,79,71,95,83,84,89,76,69,60,47,115,116,121,108,101, +62,10,32,32,32,32,60,98,103,62,35,102,102,102,102,102,102,60,47,98,103, +62,10,32,32,32,32,60,102,103,62,35,48,48,48,48,48,48,60,47,102,103,62,10, +32,32,32,32,60,116,105,116,108,101,62,65,98,111,117,116,60,47,116,105,116, +108,101,62,10,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,66,111,120,83,105,122,101,114,34,62,10,32,32,32,32,32,32, +60,111,114,105,101,110,116,62,119,120,72,79,82,73,90,79,78,84,65,76,60, +47,111,114,105,101,110,116,62,10,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,60,102,108,97,103,47,62,10, +32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114, +100,101,114,62,10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,119,120,83,116,97,116,105,99,66,105,116,109,97,112, +34,32,110,97,109,101,61,34,109,95,98,105,116,109,97,112,49,34,62,10,32, +32,32,32,32,32,32,32,32,32,60,98,105,116,109,97,112,62,82,101,115,111,117, +114,99,101,46,99,112,112,36,71,114,97,112,104,105,99,115,95,75,117,114, +111,75,111,110,97,46,112,110,103,60,47,98,105,116,109,97,112,62,10,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10, +32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,49,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119, +120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32, +32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100, +101,114,62,10,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,66,111,120,83,105,122,101,114,34,62,10,32,32,32, +32,32,32,32,32,32,32,60,111,114,105,101,110,116,62,119,120,86,69,82,84, +73,67,65,76,60,47,111,114,105,101,110,116,62,10,32,32,32,32,32,32,32,32, +32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101, +114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,60,47, +102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119, +120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61,34,109, +95,115,116,97,116,105,99,84,101,120,116,50,51,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,102,111,110,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,115,105,122,101,62,49,54,60,47,115,105,122,101, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,97,109,105, +108,121,62,100,101,102,97,117,108,116,60,47,102,97,109,105,108,121,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101, +62,110,111,114,109,97,108,60,47,115,116,121,108,101,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,119,101,105,103,104,116,62,110,111, +114,109,97,108,60,47,119,101,105,103,104,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,117,110,100,101,114,108,105,110,101,100,62, +48,60,47,117,110,100,101,114,108,105,110,101,100,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,47,102,111,110,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,108,97,98,101,108,62,77,101,103,97,110,101,107, +107,111,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110, +62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68,124,119,120,76,69, +70,84,124,119,120,82,73,71,72,84,60,47,102,108,97,103,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114, +100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,76,105,110, +101,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,108,105,110, +101,50,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121, +108,101,62,119,120,76,73,95,72,79,82,73,90,79,78,84,65,76,60,47,115,116, +121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99, +116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,76,69,70,84,124,119,120,82,73,71,72,84,124,119,120,84, +79,80,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, +98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101, +61,34,109,95,115,116,97,116,105,99,84,101,120,116,50,52,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,70,108,97,115, +104,32,99,97,114,100,32,109,97,110,97,103,101,114,32,102,111,114,32,74, +97,112,97,110,101,115,101,32,97,110,100,32,111,116,104,101,114,32,116,104, +105,110,103,115,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116, +101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105, +111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,76,69,70,84,124,119,120,82, +73,71,72,84,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97, +115,115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97, +109,101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,50,53,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,86,101, +114,115,105,111,110,32,49,46,48,32,98,121,32,65,108,101,120,32,89,97,116, +115,107,111,118,32,38,108,116,59,97,108,101,120,64,102,111,111,115,111, +102,116,46,110,101,116,38,103,116,59,60,47,108,97,98,101,108,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105, +122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,66,79,84, +84,79,77,124,119,120,76,69,70,84,124,119,120,82,73,71,72,84,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101, +114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83, +116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61,34,109,95,115, +116,97,116,105,99,84,101,120,116,50,55,34,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,108,97,98,101,108,62,80,108,101,97,115,101,32,115, +101,101,32,76,105,99,101,110,115,101,46,116,120,116,32,102,111,114,32,108, +105,99,101,110,115,101,32,105,110,102,111,114,109,97,116,105,111,110,60, +47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60, +47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, +102,108,97,103,62,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111, +114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,72,121,112,101,114,108,105, +110,107,67,116,114,108,34,32,110,97,109,101,61,34,109,95,104,121,112,101, +114,108,105,110,107,49,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,108,97,98,101,108,62,104,116,116,112,58,47,47,102,111,111,115,111, +102,116,46,110,101,116,47,109,101,103,97,110,101,107,107,111,60,47,108, +97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,117,114, +108,62,104,116,116,112,58,47,47,102,111,111,115,111,102,116,46,110,101, +116,47,109,101,103,97,110,101,107,107,111,60,47,117,114,108,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,72, +76,95,68,69,70,65,85,76,84,95,83,84,89,76,69,60,47,115,116,121,108,101, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,103,62,35,102,102, +102,102,102,102,60,47,98,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,115,112,97,99,101,114,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,49,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111, +114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115,105,122, +101,62,48,44,48,60,47,115,105,122,101,62,10,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116, +101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105, +111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68,60,47,102, +108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100, +101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120, +83,116,100,68,105,97,108,111,103,66,117,116,116,111,110,83,105,122,101, +114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,98,117,116,116,111,110,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,73,71,78,95,67,69,78,84,69,82,95,72,79,82,73,90,79,78,84,65,76,124, +119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100, +101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98, +106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,117,116,116,111,110, +34,32,110,97,109,101,61,34,119,120,73,68,95,79,75,34,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,38,97, +109,112,59,79,75,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,60,111,98,106,101,99,116,32,99,108,97, +115,115,61,34,119,120,68,105,97,108,111,103,34,32,110,97,109,101,61,34, +68,105,97,108,111,103,79,112,116,105,111,110,115,34,62,10,32,32,32,32,60, +115,116,121,108,101,62,119,120,68,69,70,65,85,76,84,95,68,73,65,76,79,71, +95,83,84,89,76,69,124,119,120,77,65,88,73,77,73,90,69,95,66,79,88,124,119, +120,82,69,83,73,90,69,95,66,79,82,68,69,82,60,47,115,116,121,108,101,62, +10,32,32,32,32,60,115,105,122,101,62,53,48,48,44,51,53,48,60,47,115,105, +122,101,62,10,32,32,32,32,60,116,105,116,108,101,62,79,112,116,105,111, +110,115,60,47,116,105,116,108,101,62,10,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,119,120,66,111,120,83,105,122,101,114,34, +62,10,32,32,32,32,32,32,60,111,114,105,101,110,116,62,119,120,86,69,82, +84,73,67,65,76,60,47,111,114,105,101,110,116,62,10,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105, +116,101,109,34,62,10,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110, +62,49,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,60,102, +108,97,103,62,119,120,69,88,80,65,78,68,32,124,32,119,120,65,76,76,60,47, +102,108,97,103,62,10,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114, +62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,78,111,116,101,98, +111,111,107,34,32,110,97,109,101,61,34,109,95,110,111,116,101,98,111,111, +107,50,34,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,110,111,116,101,98,111,111,107,112,97,103,101, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,82, +101,118,105,101,119,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,60,115,101,108,101,99,116,101,100,62,49,60,47,115,101,108, +101,99,116,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98, +106,101,99,116,32,99,108,97,115,115,61,34,119,120,80,97,110,101,108,34, +32,110,97,109,101,61,34,109,95,112,97,110,101,108,49,50,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,84, +65,66,95,84,82,65,86,69,82,83,65,76,60,47,115,116,121,108,101,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,66,111,120,83,105,122,101,114,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,114,105,101,110,116,62,119, +120,86,69,82,84,73,67,65,76,60,47,111,114,105,101,110,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110, +62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68, +60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,70,108,101,120,71,114,105, +100,83,105,122,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,114,111,119,115,62,51,60,47,114,111,119,115,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,99,111, +108,115,62,51,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,118,103,97,112,62,48,60,47,118,103,97, +112,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +104,103,97,112,62,48,60,47,104,103,97,112,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,98,108,101,99, +111,108,115,62,49,60,47,103,114,111,119,97,98,108,101,99,111,108,115,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,103,114, +111,119,97,98,108,101,114,111,119,115,47,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116, +105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119, +120,65,76,73,71,78,95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124, +119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53, +60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109, +101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,52,54,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +108,97,98,101,108,62,77,105,110,105,109,117,109,32,114,101,118,105,101, +119,32,105,110,116,101,114,118,97,108,60,47,108,97,98,101,108,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97, +115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105, +111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,119,120,83,112,105,110,67,116,114,108,34,32, +110,97,109,101,61,34,115,112,105,110,84,105,109,101,82,101,118,105,101, +119,77,105,110,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,83,80,95,65,82, +82,79,87,95,75,69,89,83,60,47,115,116,121,108,101,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97,108, +117,101,62,48,60,47,118,97,108,117,101,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,109,105,110,62,49,60,47, +109,105,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,109,97,120,62,51,54,53,60,47,109,97,120,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111, +110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65, +76,73,71,78,95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119,120, +65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98, +111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34, +119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61,34, +109,95,115,116,97,116,105,99,84,101,120,116,53,48,34,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98, +101,108,62,100,97,121,115,60,47,108,97,98,101,108,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34, +115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48, +60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71, +78,95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119,120,65,76,76, +60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100, +101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83, +116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61,34,109,95,115, +116,97,116,105,99,84,101,120,116,52,56,34,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62, +77,97,120,105,109,117,109,32,114,101,118,105,101,119,32,105,110,116,101, +114,118,97,108,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122, +101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88, +80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47, +98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61, +34,119,120,83,112,105,110,67,116,114,108,34,32,110,97,109,101,61,34,115, +112,105,110,84,105,109,101,82,101,118,105,101,119,77,97,120,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +115,116,121,108,101,62,119,120,83,80,95,65,82,82,79,87,95,75,69,89,83,60, +47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,118,97,108,117,101,62,48,60,47,118,97, +108,117,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,109,105,110,62,49,60,47,109,105,110,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,109,97, +120,62,51,54,53,60,47,109,97,120,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101, +114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78, +84,69,82,95,86,69,82,84,73,67,65,76,124,119,120,65,76,76,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105, +99,84,101,120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105, +99,84,101,120,116,53,49,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,100,97,121,115, +60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116, +101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111, +110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95, +86,69,82,84,73,67,65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98, +111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120, +116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120, +116,52,57,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,108,97,98,101,108,62,82,101,118,105,101,119,32,105, +110,116,101,114,118,97,108,32,101,110,116,114,111,112,121,60,47,108,97, +98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,108,105,100,101, +114,34,32,110,97,109,101,61,34,115,108,105,100,101,114,84,105,109,101,82, +101,118,105,101,119,69,110,116,114,111,112,121,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121, +108,101,62,119,120,83,76,95,72,79,82,73,90,79,78,84,65,76,124,119,120,83, +76,95,76,65,66,69,76,83,60,47,115,116,121,108,101,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97,108, +117,101,62,48,60,47,118,97,108,117,101,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,109,105,110,62,48,60,47, +109,105,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,109,97,120,62,49,48,48,60,47,109,97,120,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111, +110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65, +76,73,71,78,95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119,120, +65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98, +111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34, +119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61,34, +109,95,115,116,97,116,105,99,84,101,120,116,53,50,34,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98, +101,108,62,37,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98, +106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,110,111,116,101,98,111,111, +107,112,97,103,101,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,108, +97,98,101,108,62,72,84,77,76,60,47,108,97,98,101,108,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,60,115,101,108,101,99,116,101,100,62,48,60,47,115, +101,108,101,99,116,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,80,97,110,101, +108,34,32,110,97,109,101,61,34,109,95,112,97,110,101,108,49,51,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119, +120,84,65,66,95,84,82,65,86,69,82,83,65,76,60,47,115,116,121,108,101,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32, +99,108,97,115,115,61,34,119,120,66,111,120,83,105,122,101,114,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,114,105,101,110, +116,62,119,120,86,69,82,84,73,67,65,76,60,47,111,114,105,101,110,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116, +105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,69,88, +80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100, +101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,70,108,101,120, +71,114,105,100,83,105,122,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,114,111,119,115,62,50,60,47,114,111,119, +115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +99,111,108,115,62,50,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,118,103,97,112,62,48,60,47,118,103, +97,112,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,104,103,97,112,62,48,60,47,104,103,97,112,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,98,108,101, +99,111,108,115,62,49,60,47,103,114,111,119,97,98,108,101,99,111,108,115, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,103, +114,111,119,97,98,108,101,114,111,119,115,47,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116, +105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119, +120,65,76,73,71,78,95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124, +119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53, +60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109, +101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,50,56,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +108,97,98,101,108,62,78,111,114,109,97,108,32,102,111,110,116,32,110,97, +109,101,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101, +114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88, +80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47, +98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61, +34,119,120,84,101,120,116,67,116,114,108,34,32,110,97,109,101,61,34,116, +101,120,116,70,111,110,116,78,97,109,101,78,111,114,109,97,108,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,118,97,108,117,101,47,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,109,97,120,108,101,110,103,116,104,62, +48,60,47,109,97,120,108,101,110,103,116,104,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115, +105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60, +47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78, +95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119,120,65,76,76,60, +47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100, +101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83, +116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61,34,109,95,115, +116,97,116,105,99,84,101,120,116,50,57,34,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62, +70,105,120,101,100,32,102,111,110,116,32,110,97,109,101,60,47,108,97,98, +101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,84,101,120,116,67, +116,114,108,34,32,110,97,109,101,61,34,116,101,120,116,70,111,110,116,78, +97,109,101,70,105,120,101,100,34,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97,108,117,101,47,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +109,97,120,108,101,110,103,116,104,62,48,60,47,109,97,120,108,101,110,103, +116,104,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116, +101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62, +119,120,69,88,80,65,78,68,32,124,32,119,120,65,76,76,60,47,102,108,97,103, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,83,116,97,116,105,99,76,105,110,101,34,32,110, +97,109,101,61,34,109,95,115,116,97,116,105,99,108,105,110,101,51,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116, +121,108,101,62,119,120,76,73,95,72,79,82,73,90,79,78,84,65,76,60,47,115, +116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34, +115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95, +86,69,82,84,73,67,65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100, +101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109, +101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,51,55,34,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101, +108,62,70,111,110,116,32,112,111,105,110,116,32,115,105,122,101,115,32, +102,111,114,32,72,84,77,76,32,115,105,122,101,115,32,45,50,32,116,111,32, +43,52,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110, +62,49,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,69,88,80,65,78,68, +60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,70,108,101,120,71,114,105, +100,83,105,122,101,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,114,111,119,115,62,52,60,47,114,111,119,115,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,99,111, +108,115,62,54,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,118,103,97,112,62,48,60,47,118,103,97, +112,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +104,103,97,112,62,48,60,47,104,103,97,112,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,103,114,111,119,97,98,108,101,99, +111,108,115,62,49,44,51,44,53,60,47,103,114,111,119,97,98,108,101,99,111, +108,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,103,114,111,119,97,98,108,101,114,111,119,115,47,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97, +103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95,86,69,82,84,73,67, +65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114, +62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110, +97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120,116,51,57,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,108,97,98,101,108,62,45,50,60,47,108,97,98,101,108,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110, +62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76, +76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100, +101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,119,120,83,112,105,110,67,116,114,108,34,32,110,97, +109,101,61,34,115,112,105,110,70,111,110,116,83,105,122,101,48,34,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,115,116,121,108,101,62,119,120,83,80,95,65,82,82,79,87,95,75,69,89,83, +60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,118,97,108,117,101,62,48,60,47,118, +97,108,117,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,109,105,110,62,48,60,47,109,105,110,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,109, +97,120,62,49,50,56,60,47,109,97,120,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101, +114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112, +116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78, +84,69,82,95,86,69,82,84,73,67,65,76,124,119,120,65,76,76,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105, +99,84,101,120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105, +99,84,101,120,116,52,48,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,45,49,60,47,108, +97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102, +108,97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102, +108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,112,105, +110,67,116,114,108,34,32,110,97,109,101,61,34,115,112,105,110,70,111,110, +116,83,105,122,101,49,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,83,80,95, +65,82,82,79,87,95,75,69,89,83,60,47,115,116,121,108,101,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97, +108,117,101,62,48,60,47,118,97,108,117,101,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,109,105,110,62,48,60, +47,109,105,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,109,97,120,62,49,50,56,60,47,109,97,120,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97, +115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105, +111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,73,71,78,95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119, +120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47, +98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61, +34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61, +34,109,95,115,116,97,116,105,99,84,101,120,116,52,49,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97, +98,101,108,62,48,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105, +122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120, +69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53, +60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,83,112,105,110,67,116,114,108,34,32,110,97,109,101,61, +34,115,112,105,110,70,111,110,116,83,105,122,101,50,34,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116, +121,108,101,62,119,120,83,80,95,65,82,82,79,87,95,75,69,89,83,60,47,115, +116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,118,97,108,117,101,62,48,60,47,118,97,108,117,101, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,109,105,110,62,48,60,47,109,105,110,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,109,97,120,62,49, +50,56,60,47,109,97,120,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116, +101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111, +110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95, +86,69,82,84,73,67,65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98, +111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120, +116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120, +116,52,50,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,108,97,98,101,108,62,49,60,47,108,97,98,101,108,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116, +105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119, +120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111, +114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,119,120,83,112,105,110,67,116,114,108,34, +32,110,97,109,101,61,34,115,112,105,110,70,111,110,116,83,105,122,101,51, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,115,116,121,108,101,62,119,120,83,80,95,65,82,82,79,87,95,75, +69,89,83,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97,108,117,101,62,48,60, +47,118,97,108,117,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,109,105,110,62,48,60,47,109,105,110,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,109,97,120,62,49,50,56,60,47,109,97,120,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105, +122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,67, +69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119,120,65,76,76,60,47,102, +108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116, +105,99,84,101,120,116,34,32,110,97,109,101,61,34,109,95,115,116,97,116, +105,99,84,101,120,116,52,51,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,50,60,47,108, +97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102, +108,97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102, +108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,112,105, +110,67,116,114,108,34,32,110,97,109,101,61,34,115,112,105,110,70,111,110, +116,83,105,122,101,52,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,83,80,95, +65,82,82,79,87,95,75,69,89,83,60,47,115,116,121,108,101,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97, +108,117,101,62,48,60,47,118,97,108,117,101,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,109,105,110,62,48,60, +47,109,105,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,109,97,120,62,49,50,56,60,47,109,97,120,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97, +115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116,105, +111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120, +65,76,73,71,78,95,67,69,78,84,69,82,95,86,69,82,84,73,67,65,76,124,119, +120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47, +98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61, +34,119,120,83,116,97,116,105,99,84,101,120,116,34,32,110,97,109,101,61, +34,109,95,115,116,97,116,105,99,84,101,120,116,52,52,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97, +98,101,108,62,51,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105, +122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111, +112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120, +69,88,80,65,78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53, +60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115, +115,61,34,119,120,83,112,105,110,67,116,114,108,34,32,110,97,109,101,61, +34,115,112,105,110,70,111,110,116,83,105,122,101,53,34,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116, +121,108,101,62,119,120,83,80,95,65,82,82,79,87,95,75,69,89,83,60,47,115, +116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,118,97,108,117,101,62,48,60,47,118,97,108,117,101, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,109,105,110,62,48,60,47,109,105,110,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,109,97,120,62,49, +50,56,60,47,109,97,120,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111, +98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116, +101,109,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,111,112,116,105,111,110,62,48,60,47,111,112,116,105,111, +110,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95, +86,69,82,84,73,67,65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98, +111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,83,116,97,116,105,99,84,101,120, +116,34,32,110,97,109,101,61,34,109,95,115,116,97,116,105,99,84,101,120, +116,52,53,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,108,97,98,101,108,62,52,60,47,108,97,98,101,108,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116, +105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119, +120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108,97,103,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111, +114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,119,120,83,112,105,110,67,116,114,108,34, +32,110,97,109,101,61,34,115,112,105,110,70,111,110,116,83,105,122,101,54, +34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,60,115,116,121,108,101,62,119,120,83,80,95,65,82,82,79,87,95,75, +69,89,83,60,47,115,116,121,108,101,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,118,97,108,117,101,62,48,60, +47,118,97,108,117,101,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,109,105,110,62,48,60,47,109,105,110,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,109,97,120,62,49,50,56,60,47,109,97,120,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,110,111,116,101,98,111, +111,107,112,97,103,101,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, +108,97,98,101,108,62,77,105,115,99,60,47,108,97,98,101,108,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,60,115,101,108,101,99,116,101,100,62,48,60, +47,115,101,108,101,99,116,101,100,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,80,97,110, +101,108,34,32,110,97,109,101,61,34,109,95,112,97,110,101,108,49,52,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62, +119,120,84,65,66,95,84,82,65,86,69,82,83,65,76,60,47,115,116,121,108,101, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116, +32,99,108,97,115,115,61,34,119,120,66,111,120,83,105,122,101,114,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,114,105,101,110, +116,62,119,120,86,69,82,84,73,67,65,76,60,47,111,114,105,101,110,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101,109,34,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,112,116, +105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76, +76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,67,104,101,99,107,66,111, +120,34,32,110,97,109,101,61,34,99,104,101,99,107,65,117,116,111,83,97,118, +101,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32, +60,108,97,98,101,108,62,65,117,116,111,32,115,97,118,101,32,100,101,99, +107,115,32,111,110,32,99,108,111,115,101,60,47,108,97,98,101,108,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,99,104,101, +99,107,101,100,62,48,60,47,99,104,101,99,107,101,100,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116, +62,10,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,60,111,98, +106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105,116,101, +109,34,62,10,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110,62,48,60, +47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,60,102,108,97, +103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102,108,97, +103,62,10,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47, +98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,119,120,83,116,100,68,105,97,108,111, +103,66,117,116,116,111,110,83,105,122,101,114,34,62,10,32,32,32,32,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,98,117, +116,116,111,110,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108, +97,103,62,119,120,65,76,73,71,78,95,67,69,78,84,69,82,95,72,79,82,73,90, +79,78,84,65,76,124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111, +114,100,101,114,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,66,117,116,116,111,110,34, +32,110,97,109,101,61,34,119,120,73,68,95,79,75,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,38,97,109,112,59,79, +75,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101, +99,116,32,99,108,97,115,115,61,34,98,117,116,116,111,110,34,62,10,32,32, +32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71, +78,95,67,69,78,84,69,82,95,72,79,82,73,90,79,78,84,65,76,124,119,120,65, +76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, +98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115, +61,34,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61,34,119,120, +73,68,95,67,65,78,67,69,76,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32, +32,32,60,108,97,98,101,108,62,38,97,109,112,59,67,97,110,99,101,108,60, +47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,47,111, +98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62, +10,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,60,47, +111,98,106,101,99,116,62,10,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,68,105,97, +108,111,103,34,32,110,97,109,101,61,34,68,105,97,108,111,103,67,97,114, +100,69,100,105,116,111,114,34,62,10,32,32,32,32,60,115,116,121,108,101, +62,119,120,68,69,70,65,85,76,84,95,68,73,65,76,79,71,95,83,84,89,76,69, +124,119,120,77,65,88,73,77,73,90,69,95,66,79,88,124,119,120,82,69,83,73, +90,69,95,66,79,82,68,69,82,60,47,115,116,121,108,101,62,10,32,32,32,32, +60,115,105,122,101,62,53,48,48,44,51,48,48,60,47,115,105,122,101,62,10, +32,32,32,32,60,116,105,116,108,101,62,67,97,114,100,32,101,100,105,116, +111,114,60,47,116,105,116,108,101,62,10,32,32,32,32,60,111,98,106,101,99, +116,32,99,108,97,115,115,61,34,119,120,66,111,120,83,105,122,101,114,34, +62,10,32,32,32,32,32,32,60,111,114,105,101,110,116,62,119,120,86,69,82, +84,73,67,65,76,60,47,111,114,105,101,110,116,62,10,32,32,32,32,32,32,60, +111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105,122,101,114,105, +116,101,109,34,62,10,32,32,32,32,32,32,32,32,60,111,112,116,105,111,110, +62,49,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32,32,32,32,60,102, +108,97,103,62,119,120,65,76,76,124,119,120,69,88,80,65,78,68,60,47,102, +108,97,103,62,10,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,53, +60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,60,111,98,106, +101,99,116,32,99,108,97,115,115,61,34,119,120,84,101,120,116,67,116,114, +108,34,32,110,97,109,101,61,34,116,101,120,116,69,100,105,116,34,62,10, +32,32,32,32,32,32,32,32,32,32,60,115,116,121,108,101,62,119,120,84,69,95, +77,85,76,84,73,76,73,78,69,60,47,115,116,121,108,101,62,10,32,32,32,32, +32,32,32,32,32,32,60,118,97,108,117,101,47,62,10,32,32,32,32,32,32,32,32, +32,32,60,109,97,120,108,101,110,103,116,104,62,48,60,47,109,97,120,108, +101,110,103,116,104,62,10,32,32,32,32,32,32,32,32,60,47,111,98,106,101, +99,116,62,10,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32, +32,32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,115,105, +122,101,114,105,116,101,109,34,62,10,32,32,32,32,32,32,32,32,60,111,112, +116,105,111,110,62,48,60,47,111,112,116,105,111,110,62,10,32,32,32,32,32, +32,32,32,60,102,108,97,103,62,119,120,65,76,76,124,119,120,69,88,80,65, +78,68,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32,60,98,111,114, +100,101,114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32, +32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,83,116, +100,68,105,97,108,111,103,66,117,116,116,111,110,83,105,122,101,114,34, +62,10,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99,108, +97,115,115,61,34,98,117,116,116,111,110,34,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,60,102,108,97,103,62,119,120,65,76,73,71,78,95,67,69,78,84, +69,82,95,72,79,82,73,90,79,78,84,65,76,124,119,120,65,76,76,60,47,102,108, +97,103,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101, +114,62,53,60,47,98,111,114,100,101,114,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66, +117,116,116,111,110,34,32,110,97,109,101,61,34,119,120,73,68,95,79,75,34, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62, +38,97,109,112,59,79,75,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32, +60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,98,117,116,116,111, +110,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119, +120,65,76,73,71,78,95,67,69,78,84,69,82,95,72,79,82,73,90,79,78,84,65,76, +124,119,120,65,76,76,60,47,102,108,97,103,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,60,98,111,114,100,101,114,62,53,60,47,98,111,114,100,101,114, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,111,98,106,101,99,116,32,99, +108,97,115,115,61,34,119,120,66,117,116,116,111,110,34,32,110,97,109,101, +61,34,119,120,73,68,95,67,65,78,67,69,76,34,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,32,32,60,108,97,98,101,108,62,38,97,109,112,59,67,97,110, +99,101,108,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,60,47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,32,32,60, +47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60,47,111,98,106, +101,99,116,62,10,32,32,32,32,32,32,60,47,111,98,106,101,99,116,62,10,32, +32,32,32,60,47,111,98,106,101,99,116,62,10,32,32,60,47,111,98,106,101,99, +116,62,10,60,47,114,101,115,111,117,114,99,101,62,10}; + +void InitXmlResource() +{ + + // Check for memory FS. If not present, load the handler: + { + wxMemoryFSHandler::AddFile(wxT("XRC_resource/dummy_file"), wxT("dummy one")); + wxFileSystem fsys; + wxFSFile *f = fsys.OpenFile(wxT("memory:XRC_resource/dummy_file")); + wxMemoryFSHandler::RemoveFile(wxT("XRC_resource/dummy_file")); + if (f) delete f; + else wxFileSystem::AddHandler(new wxMemoryFSHandler); + } + + XRC_ADD_FILE(wxT("XRC_resource/Resource.cpp$Graphics_file-new.png"), xml_res_file_0, xml_res_size_0, _T("image/png")); + XRC_ADD_FILE(wxT("XRC_resource/Resource.cpp$Graphics_file-open.png"), xml_res_file_1, xml_res_size_1, _T("image/png")); + XRC_ADD_FILE(wxT("XRC_resource/Resource.cpp$Graphics_file-save.png"), xml_res_file_2, xml_res_size_2, _T("image/png")); + XRC_ADD_FILE(wxT("XRC_resource/Resource.cpp$Graphics_tools-cards-manage.png"), xml_res_file_3, xml_res_size_3, _T("image/png")); + XRC_ADD_FILE(wxT("XRC_resource/Resource.cpp$Graphics_tools-cards-expire.png"), xml_res_file_4, xml_res_size_4, _T("image/png")); + XRC_ADD_FILE(wxT("XRC_resource/Resource.cpp$Graphics_tools-cards-options.png"), xml_res_file_5, xml_res_size_5, _T("image/png")); + XRC_ADD_FILE(wxT("XRC_resource/Resource.cpp$Graphics_KuroKona.png"), xml_res_file_6, xml_res_size_6, _T("image/png")); + XRC_ADD_FILE(wxT("XRC_resource/Resource.cpp$Meganekko.xrc"), xml_res_file_7, xml_res_size_7, _T("text/xml")); + wxXmlResource::Get()->Load(wxT("memory:XRC_resource/Resource.cpp$Meganekko.xrc")); +} diff --git a/Util.cpp b/Util.cpp new file mode 100644 index 0000000..d7504b0 --- /dev/null +++ b/Util.cpp @@ -0,0 +1,88 @@ +#include "Pch.h" +#include "Util.h" + +typedef std::string Str; +typedef std::wstring WStr; + +static void utf8toWStr(WStr& dest, const Str& src){ + dest.clear(); + wchar_t w = 0; + int bytes = 0; + wchar_t err = L'�'; + for (size_t i = 0; i < src.size(); i++){ + unsigned char c = (unsigned char)src[i]; + if (c <= 0x7f){//first byte + if (bytes){ + dest.push_back(err); + bytes = 0; + } + dest.push_back((wchar_t)c); + } + else if (c <= 0xbf){//second/third/etc byte + if (bytes){ + w = ((w << 6)|(c & 0x3f)); + bytes--; + if (bytes == 0) + dest.push_back(w); + } + else + dest.push_back(err); + } + else if (c <= 0xdf){//2byte sequence start + bytes = 1; + w = c & 0x1f; + } + else if (c <= 0xef){//3byte sequence start + bytes = 2; + w = c & 0x0f; + } + else if (c <= 0xf7){//3byte sequence start + bytes = 3; + w = c & 0x07; + } + else{ + dest.push_back(err); + bytes = 0; + } + } + if (bytes) + dest.push_back(err); +} + +static void wstrToUtf8(Str& dest, const WStr& src){ + dest.clear(); + for (size_t i = 0; i < src.size(); i++){ + wchar_t w = src[i]; + if (w <= 0x7f) + dest.push_back((char)w); + else if (w <= 0x7ff){ + dest.push_back(0xc0 | ((w >> 6)& 0x1f)); + dest.push_back(0x80| (w & 0x3f)); + } + else if (w <= 0xffff){ + dest.push_back(0xe0 | ((w >> 12)& 0x0f)); + dest.push_back(0x80| ((w >> 6) & 0x3f)); + dest.push_back(0x80| (w & 0x3f)); + } + else if (w <= 0x10ffff){ + dest.push_back(0xf0 | ((w >> 18)& 0x07)); + dest.push_back(0x80| ((w >> 12) & 0x3f)); + dest.push_back(0x80| ((w >> 6) & 0x3f)); + dest.push_back(0x80| (w & 0x3f)); + } + else + dest.push_back('?'); + } +} + +Str wstrToUtf8(const WStr& str){ + Str result; + wstrToUtf8(result, str); + return result; +} + +WStr utf8toWStr(const Str& str){ + WStr result; + utf8toWStr(result, str); + return result; +} diff --git a/Util.h b/Util.h new file mode 100644 index 0000000..f86361c --- /dev/null +++ b/Util.h @@ -0,0 +1,5 @@ +#pragma once + +std::string wstrToUtf8(const std::wstring& str); +std::wstring utf8toWStr(const std::string& str); + diff --git a/tinystr.cpp b/tinystr.cpp new file mode 100644 index 0000000..7a6fb51 --- /dev/null +++ b/tinystr.cpp @@ -0,0 +1,115 @@ +/* +www.sourceforge.net/projects/tinyxml +Original file by Yves Berquin. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +/* + * THIS FILE WAS ALTERED BY Tyge Løvset, 7. April 2005. + */ + +#ifndef TIXML_USE_STL + +#include "tinystr.h" + +// Error value for find primitive +const TiXmlString::size_type TiXmlString::npos = static_cast< TiXmlString::size_type >(-1); + + +// Null rep. +TiXmlString::Rep TiXmlString::nullrep_ = { 0, 0, { '\0' } }; + + +void TiXmlString::reserve (size_type cap) +{ + if (cap > capacity()) + { + TiXmlString tmp; + tmp.init(length(), cap); + memcpy(tmp.start(), data(), length()); + swap(tmp); + } +} + + +TiXmlString& TiXmlString::assign(const char* str, size_type len) +{ + size_type cap = capacity(); + if (len > cap || cap > 3*(len + 8)) + { + TiXmlString tmp; + tmp.init(len); + memcpy(tmp.start(), str, len); + swap(tmp); + } + else + { + memmove(start(), str, len); + set_size(len); + } + return *this; +} + + +TiXmlString& TiXmlString::append(const char* str, size_type len) +{ + size_type newsize = length() + len; + if (newsize > capacity()) + { + reserve (newsize + capacity()); + } + memmove(finish(), str, len); + set_size(newsize); + return *this; +} + + +TiXmlString operator + (const TiXmlString & a, const TiXmlString & b) +{ + TiXmlString tmp; + tmp.reserve(a.length() + b.length()); + tmp += a; + tmp += b; + return tmp; +} + +TiXmlString operator + (const TiXmlString & a, const char* b) +{ + TiXmlString tmp; + TiXmlString::size_type b_len = static_cast( strlen(b) ); + tmp.reserve(a.length() + b_len); + tmp += a; + tmp.append(b, b_len); + return tmp; +} + +TiXmlString operator + (const char* a, const TiXmlString & b) +{ + TiXmlString tmp; + TiXmlString::size_type a_len = static_cast( strlen(a) ); + tmp.reserve(a_len + b.length()); + tmp.append(a, a_len); + tmp += b; + return tmp; +} + + +#endif // TIXML_USE_STL diff --git a/tinystr.h b/tinystr.h new file mode 100644 index 0000000..3c2aa9d --- /dev/null +++ b/tinystr.h @@ -0,0 +1,319 @@ +/* +www.sourceforge.net/projects/tinyxml +Original file by Yves Berquin. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +/* + * THIS FILE WAS ALTERED BY Tyge Lovset, 7. April 2005. + * + * - completely rewritten. compact, clean, and fast implementation. + * - sizeof(TiXmlString) = pointer size (4 bytes on 32-bit systems) + * - fixed reserve() to work as per specification. + * - fixed buggy compares operator==(), operator<(), and operator>() + * - fixed operator+=() to take a const ref argument, following spec. + * - added "copy" constructor with length, and most compare operators. + * - added swap(), clear(), size(), capacity(), operator+(). + */ + +#ifndef TIXML_USE_STL + +#ifndef TIXML_STRING_INCLUDED +#define TIXML_STRING_INCLUDED + +#include +#include + +/* The support for explicit isn't that universal, and it isn't really + required - it is used to check that the TiXmlString class isn't incorrectly + used. Be nice to old compilers and macro it here: +*/ +#if defined(_MSC_VER) && (_MSC_VER >= 1200 ) + // Microsoft visual studio, version 6 and higher. + #define TIXML_EXPLICIT explicit +#elif defined(__GNUC__) && (__GNUC__ >= 3 ) + // GCC version 3 and higher.s + #define TIXML_EXPLICIT explicit +#else + #define TIXML_EXPLICIT +#endif + + +/* + TiXmlString is an emulation of a subset of the std::string template. + Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. + Only the member functions relevant to the TinyXML project have been implemented. + The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase + a string and there's no more room, we allocate a buffer twice as big as we need. +*/ +class TiXmlString +{ + public : + // The size type used + typedef size_t size_type; + + // Error value for find primitive + static const size_type npos; // = -1; + + + // TiXmlString empty constructor + TiXmlString () : rep_(&nullrep_) + { + } + + // TiXmlString copy constructor + TiXmlString ( const TiXmlString & copy) : rep_(0) + { + init(copy.length()); + memcpy(start(), copy.data(), length()); + } + + // TiXmlString constructor, based on a string + TIXML_EXPLICIT TiXmlString ( const char * copy) : rep_(0) + { + init( static_cast( strlen(copy) )); + memcpy(start(), copy, length()); + } + + // TiXmlString constructor, based on a string + TIXML_EXPLICIT TiXmlString ( const char * str, size_type len) : rep_(0) + { + init(len); + memcpy(start(), str, len); + } + + // TiXmlString destructor + ~TiXmlString () + { + quit(); + } + + // = operator + TiXmlString& operator = (const char * copy) + { + return assign( copy, (size_type)strlen(copy)); + } + + // = operator + TiXmlString& operator = (const TiXmlString & copy) + { + return assign(copy.start(), copy.length()); + } + + + // += operator. Maps to append + TiXmlString& operator += (const char * suffix) + { + return append(suffix, static_cast( strlen(suffix) )); + } + + // += operator. Maps to append + TiXmlString& operator += (char single) + { + return append(&single, 1); + } + + // += operator. Maps to append + TiXmlString& operator += (const TiXmlString & suffix) + { + return append(suffix.data(), suffix.length()); + } + + + // Convert a TiXmlString into a null-terminated char * + const char * c_str () const { return rep_->str; } + + // Convert a TiXmlString into a char * (need not be null terminated). + const char * data () const { return rep_->str; } + + // Return the length of a TiXmlString + size_type length () const { return rep_->size; } + + // Alias for length() + size_type size () const { return rep_->size; } + + // Checks if a TiXmlString is empty + bool empty () const { return rep_->size == 0; } + + // Return capacity of string + size_type capacity () const { return rep_->capacity; } + + + // single char extraction + const char& at (size_type index) const + { + assert( index < length() ); + return rep_->str[ index ]; + } + + // [] operator + char& operator [] (size_type index) const + { + assert( index < length() ); + return rep_->str[ index ]; + } + + // find a char in a string. Return TiXmlString::npos if not found + size_type find (char lookup) const + { + return find(lookup, 0); + } + + // find a char in a string from an offset. Return TiXmlString::npos if not found + size_type find (char tofind, size_type offset) const + { + if (offset >= length()) return npos; + + for (const char* p = c_str() + offset; *p != '\0'; ++p) + { + if (*p == tofind) return static_cast< size_type >( p - c_str() ); + } + return npos; + } + + void clear () + { + //Lee: + //The original was just too strange, though correct: + // TiXmlString().swap(*this); + //Instead use the quit & re-init: + quit(); + init(0,0); + } + + /* Function to reserve a big amount of data when we know we'll need it. Be aware that this + function DOES NOT clear the content of the TiXmlString if any exists. + */ + void reserve (size_type cap); + + TiXmlString& assign (const char* str, size_type len); + + TiXmlString& append (const char* str, size_type len); + + void swap (TiXmlString& other) + { + Rep* r = rep_; + rep_ = other.rep_; + other.rep_ = r; + } + + private: + + void init(size_type sz) { init(sz, sz); } + void set_size(size_type sz) { rep_->str[ rep_->size = sz ] = '\0'; } + char* start() const { return rep_->str; } + char* finish() const { return rep_->str + rep_->size; } + + struct Rep + { + size_type size, capacity; + char str[1]; + }; + + void init(size_type sz, size_type cap) + { + if (cap) + { + // Lee: the original form: + // rep_ = static_cast(operator new(sizeof(Rep) + cap)); + // doesn't work in some cases of new being overloaded. Switching + // to the normal allocation, although use an 'int' for systems + // that are overly picky about structure alignment. + const size_type bytesNeeded = sizeof(Rep) + cap; + const size_type intsNeeded = ( bytesNeeded + sizeof(int) - 1 ) / sizeof( int ); + rep_ = reinterpret_cast( new int[ intsNeeded ] ); + + rep_->str[ rep_->size = sz ] = '\0'; + rep_->capacity = cap; + } + else + { + rep_ = &nullrep_; + } + } + + void quit() + { + if (rep_ != &nullrep_) + { + // The rep_ is really an array of ints. (see the allocator, above). + // Cast it back before delete, so the compiler won't incorrectly call destructors. + delete [] ( reinterpret_cast( rep_ ) ); + } + } + + Rep * rep_; + static Rep nullrep_; + +} ; + + +inline bool operator == (const TiXmlString & a, const TiXmlString & b) +{ + return ( a.length() == b.length() ) // optimization on some platforms + && ( strcmp(a.c_str(), b.c_str()) == 0 ); // actual compare +} +inline bool operator < (const TiXmlString & a, const TiXmlString & b) +{ + return strcmp(a.c_str(), b.c_str()) < 0; +} + +inline bool operator != (const TiXmlString & a, const TiXmlString & b) { return !(a == b); } +inline bool operator > (const TiXmlString & a, const TiXmlString & b) { return b < a; } +inline bool operator <= (const TiXmlString & a, const TiXmlString & b) { return !(b < a); } +inline bool operator >= (const TiXmlString & a, const TiXmlString & b) { return !(a < b); } + +inline bool operator == (const TiXmlString & a, const char* b) { return strcmp(a.c_str(), b) == 0; } +inline bool operator == (const char* a, const TiXmlString & b) { return b == a; } +inline bool operator != (const TiXmlString & a, const char* b) { return !(a == b); } +inline bool operator != (const char* a, const TiXmlString & b) { return !(b == a); } + +TiXmlString operator + (const TiXmlString & a, const TiXmlString & b); +TiXmlString operator + (const TiXmlString & a, const char* b); +TiXmlString operator + (const char* a, const TiXmlString & b); + + +/* + TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. + Only the operators that we need for TinyXML have been developped. +*/ +class TiXmlOutStream : public TiXmlString +{ +public : + + // TiXmlOutStream << operator. + TiXmlOutStream & operator << (const TiXmlString & in) + { + *this += in; + return *this; + } + + // TiXmlOutStream << operator. + TiXmlOutStream & operator << (const char * in) + { + *this += in; + return *this; + } + +} ; + +#endif // TIXML_STRING_INCLUDED +#endif // TIXML_USE_STL diff --git a/tinyxml.cpp b/tinyxml.cpp new file mode 100644 index 0000000..23a6b80 --- /dev/null +++ b/tinyxml.cpp @@ -0,0 +1,1888 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include + +#ifdef TIXML_USE_STL +#include +#include +#endif + +#include "tinyxml.h" + + +bool TiXmlBase::condenseWhiteSpace = true; + +// Microsoft compiler security +FILE* TiXmlFOpen( const char* filename, const char* mode ) +{ + #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) + FILE* fp = 0; + errno_t err = fopen_s( &fp, filename, mode ); + if ( !err && fp ) + return fp; + return 0; + #else + return fopen( filename, mode ); + #endif +} + +void TiXmlBase::EncodeString( const TIXML_STRING& str, TIXML_STRING* outString ) +{ + int i=0; + + while( i<(int)str.length() ) + { + unsigned char c = (unsigned char) str[i]; + + if ( c == '&' + && i < ( (int)str.length() - 2 ) + && str[i+1] == '#' + && str[i+2] == 'x' ) + { + // Hexadecimal character reference. + // Pass through unchanged. + // © -- copyright symbol, for example. + // + // The -1 is a bug fix from Rob Laveaux. It keeps + // an overflow from happening if there is no ';'. + // There are actually 2 ways to exit this loop - + // while fails (error case) and break (semicolon found). + // However, there is no mechanism (currently) for + // this function to return an error. + while ( i<(int)str.length()-1 ) + { + outString->append( str.c_str() + i, 1 ); + ++i; + if ( str[i] == ';' ) + break; + } + } + else if ( c == '&' ) + { + outString->append( entity[0].str, entity[0].strLength ); + ++i; + } + else if ( c == '<' ) + { + outString->append( entity[1].str, entity[1].strLength ); + ++i; + } + else if ( c == '>' ) + { + outString->append( entity[2].str, entity[2].strLength ); + ++i; + } + else if ( c == '\"' ) + { + outString->append( entity[3].str, entity[3].strLength ); + ++i; + } + else if ( c == '\'' ) + { + outString->append( entity[4].str, entity[4].strLength ); + ++i; + } + else if ( c < 32 ) + { + // Easy pass at non-alpha/numeric/symbol + // Below 32 is symbolic. + char buf[ 32 ]; + + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "&#x%02X;", (unsigned) ( c & 0xff ) ); + #else + sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); + #endif + + //*ME: warning C4267: convert 'size_t' to 'int' + //*ME: Int-Cast to make compiler happy ... + outString->append( buf, (int)strlen( buf ) ); + ++i; + } + else + { + //char realc = (char) c; + //outString->append( &realc, 1 ); + *outString += (char) c; // somewhat more efficient function call. + ++i; + } + } +} + + +TiXmlNode::TiXmlNode( NodeType _type ) : TiXmlBase() +{ + parent = 0; + type = _type; + firstChild = 0; + lastChild = 0; + prev = 0; + next = 0; +} + + +TiXmlNode::~TiXmlNode() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } +} + + +void TiXmlNode::CopyTo( TiXmlNode* target ) const +{ + target->SetValue (value.c_str() ); + target->userData = userData; +} + + +void TiXmlNode::Clear() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } + + firstChild = 0; + lastChild = 0; +} + + +TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) +{ + assert( node->parent == 0 || node->parent == this ); + assert( node->GetDocument() == 0 || node->GetDocument() == this->GetDocument() ); + + if ( node->Type() == TiXmlNode::DOCUMENT ) + { + delete node; + if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + node->parent = this; + + node->prev = lastChild; + node->next = 0; + + if ( lastChild ) + lastChild->next = node; + else + firstChild = node; // it was an empty list. + + lastChild = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) +{ + if ( addThis.Type() == TiXmlNode::DOCUMENT ) + { + if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + + return LinkEndChild( node ); +} + + +TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) +{ + if ( !beforeThis || beforeThis->parent != this ) { + return 0; + } + if ( addThis.Type() == TiXmlNode::DOCUMENT ) + { + if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->next = beforeThis; + node->prev = beforeThis->prev; + if ( beforeThis->prev ) + { + beforeThis->prev->next = node; + } + else + { + assert( firstChild == beforeThis ); + firstChild = node; + } + beforeThis->prev = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) +{ + if ( !afterThis || afterThis->parent != this ) { + return 0; + } + if ( addThis.Type() == TiXmlNode::DOCUMENT ) + { + if ( GetDocument() ) GetDocument()->SetError( TIXML_ERROR_DOCUMENT_TOP_ONLY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->prev = afterThis; + node->next = afterThis->next; + if ( afterThis->next ) + { + afterThis->next->prev = node; + } + else + { + assert( lastChild == afterThis ); + lastChild = node; + } + afterThis->next = node; + return node; +} + + +TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) +{ + if ( replaceThis->parent != this ) + return 0; + + TiXmlNode* node = withThis.Clone(); + if ( !node ) + return 0; + + node->next = replaceThis->next; + node->prev = replaceThis->prev; + + if ( replaceThis->next ) + replaceThis->next->prev = node; + else + lastChild = node; + + if ( replaceThis->prev ) + replaceThis->prev->next = node; + else + firstChild = node; + + delete replaceThis; + node->parent = this; + return node; +} + + +bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) +{ + if ( removeThis->parent != this ) + { + assert( 0 ); + return false; + } + + if ( removeThis->next ) + removeThis->next->prev = removeThis->prev; + else + lastChild = removeThis->prev; + + if ( removeThis->prev ) + removeThis->prev->next = removeThis->next; + else + firstChild = removeThis->next; + + delete removeThis; + return true; +} + +const TiXmlNode* TiXmlNode::FirstChild( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = firstChild; node; node = node->next ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +const TiXmlNode* TiXmlNode::LastChild( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = lastChild; node; node = node->prev ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +const TiXmlNode* TiXmlNode::IterateChildren( const TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild(); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling(); + } +} + + +const TiXmlNode* TiXmlNode::IterateChildren( const char * val, const TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild( val ); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling( val ); + } +} + + +const TiXmlNode* TiXmlNode::NextSibling( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = next; node; node = node->next ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +const TiXmlNode* TiXmlNode::PreviousSibling( const char * _value ) const +{ + const TiXmlNode* node; + for ( node = prev; node; node = node->prev ) + { + if ( strcmp( node->Value(), _value ) == 0 ) + return node; + } + return 0; +} + + +void TiXmlElement::RemoveAttribute( const char * name ) +{ + #ifdef TIXML_USE_STL + TIXML_STRING str( name ); + TiXmlAttribute* node = attributeSet.Find( str ); + #else + TiXmlAttribute* node = attributeSet.Find( name ); + #endif + if ( node ) + { + attributeSet.Remove( node ); + delete node; + } +} + +const TiXmlElement* TiXmlNode::FirstChildElement() const +{ + const TiXmlNode* node; + + for ( node = FirstChild(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlElement* TiXmlNode::FirstChildElement( const char * _value ) const +{ + const TiXmlNode* node; + + for ( node = FirstChild( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlElement* TiXmlNode::NextSiblingElement() const +{ + const TiXmlNode* node; + + for ( node = NextSibling(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlElement* TiXmlNode::NextSiblingElement( const char * _value ) const +{ + const TiXmlNode* node; + + for ( node = NextSibling( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +const TiXmlDocument* TiXmlNode::GetDocument() const +{ + const TiXmlNode* node; + + for( node = this; node; node = node->parent ) + { + if ( node->ToDocument() ) + return node->ToDocument(); + } + return 0; +} + + +TiXmlElement::TiXmlElement (const char * _value) + : TiXmlNode( TiXmlNode::ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} + + +#ifdef TIXML_USE_STL +TiXmlElement::TiXmlElement( const std::string& _value ) + : TiXmlNode( TiXmlNode::ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} +#endif + + +TiXmlElement::TiXmlElement( const TiXmlElement& copy) + : TiXmlNode( TiXmlNode::ELEMENT ) +{ + firstChild = lastChild = 0; + copy.CopyTo( this ); +} + + +void TiXmlElement::operator=( const TiXmlElement& base ) +{ + ClearThis(); + base.CopyTo( this ); +} + + +TiXmlElement::~TiXmlElement() +{ + ClearThis(); +} + + +void TiXmlElement::ClearThis() +{ + Clear(); + while( attributeSet.First() ) + { + TiXmlAttribute* node = attributeSet.First(); + attributeSet.Remove( node ); + delete node; + } +} + + +const char* TiXmlElement::Attribute( const char* name ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + return node->Value(); + return 0; +} + + +#ifdef TIXML_USE_STL +const std::string* TiXmlElement::Attribute( const std::string& name ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + return &node->ValueStr(); + return 0; +} +#endif + + +const char* TiXmlElement::Attribute( const char* name, int* i ) const +{ + const char* s = Attribute( name ); + if ( i ) + { + if ( s ) { + *i = atoi( s ); + } + else { + *i = 0; + } + } + return s; +} + + +#ifdef TIXML_USE_STL +const std::string* TiXmlElement::Attribute( const std::string& name, int* i ) const +{ + const std::string* s = Attribute( name ); + if ( i ) + { + if ( s ) { + *i = atoi( s->c_str() ); + } + else { + *i = 0; + } + } + return s; +} +#endif + + +const char* TiXmlElement::Attribute( const char* name, double* d ) const +{ + const char* s = Attribute( name ); + if ( d ) + { + if ( s ) { + *d = atof( s ); + } + else { + *d = 0; + } + } + return s; +} + + +#ifdef TIXML_USE_STL +const std::string* TiXmlElement::Attribute( const std::string& name, double* d ) const +{ + const std::string* s = Attribute( name ); + if ( d ) + { + if ( s ) { + *d = atof( s->c_str() ); + } + else { + *d = 0; + } + } + return s; +} +#endif + + +int TiXmlElement::QueryIntAttribute( const char* name, int* ival ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + return node->QueryIntValue( ival ); +} + + +#ifdef TIXML_USE_STL +int TiXmlElement::QueryIntAttribute( const std::string& name, int* ival ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + return node->QueryIntValue( ival ); +} +#endif + + +int TiXmlElement::QueryDoubleAttribute( const char* name, double* dval ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + return node->QueryDoubleValue( dval ); +} + + +#ifdef TIXML_USE_STL +int TiXmlElement::QueryDoubleAttribute( const std::string& name, double* dval ) const +{ + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + return node->QueryDoubleValue( dval ); +} +#endif + + +void TiXmlElement::SetAttribute( const char * name, int val ) +{ + char buf[64]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "%d", val ); + #else + sprintf( buf, "%d", val ); + #endif + SetAttribute( name, buf ); +} + + +#ifdef TIXML_USE_STL +void TiXmlElement::SetAttribute( const std::string& name, int val ) +{ + std::ostringstream oss; + oss << val; + SetAttribute( name, oss.str() ); +} +#endif + + +void TiXmlElement::SetDoubleAttribute( const char * name, double val ) +{ + char buf[256]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "%f", val ); + #else + sprintf( buf, "%f", val ); + #endif + SetAttribute( name, buf ); +} + + +void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ) +{ + #ifdef TIXML_USE_STL + TIXML_STRING _name( cname ); + TIXML_STRING _value( cvalue ); + #else + const char* _name = cname; + const char* _value = cvalue; + #endif + + TiXmlAttribute* node = attributeSet.Find( _name ); + if ( node ) + { + node->SetValue( _value ); + return; + } + + TiXmlAttribute* attrib = new TiXmlAttribute( cname, cvalue ); + if ( attrib ) + { + attributeSet.Add( attrib ); + } + else + { + TiXmlDocument* document = GetDocument(); + if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); + } +} + + +#ifdef TIXML_USE_STL +void TiXmlElement::SetAttribute( const std::string& name, const std::string& _value ) +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + { + node->SetValue( _value ); + return; + } + + TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); + if ( attrib ) + { + attributeSet.Add( attrib ); + } + else + { + TiXmlDocument* document = GetDocument(); + if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0, TIXML_ENCODING_UNKNOWN ); + } +} +#endif + + +void TiXmlElement::Print( FILE* cfile, int depth ) const +{ + int i; + assert( cfile ); + for ( i=0; iNext() ) + { + fprintf( cfile, " " ); + attrib->Print( cfile, depth ); + } + + // There are 3 different formatting approaches: + // 1) An element without children is printed as a node + // 2) An element with only a text child is printed as text + // 3) An element with children is printed on multiple lines. + TiXmlNode* node; + if ( !firstChild ) + { + fprintf( cfile, " />" ); + } + else if ( firstChild == lastChild && firstChild->ToText() ) + { + fprintf( cfile, ">" ); + firstChild->Print( cfile, depth + 1 ); + fprintf( cfile, "", value.c_str() ); + } + else + { + fprintf( cfile, ">" ); + + for ( node = firstChild; node; node=node->NextSibling() ) + { + if ( !node->ToText() ) + { + fprintf( cfile, "\n" ); + } + node->Print( cfile, depth+1 ); + } + fprintf( cfile, "\n" ); + for( i=0; i", value.c_str() ); + } +} + + +void TiXmlElement::CopyTo( TiXmlElement* target ) const +{ + // superclass: + TiXmlNode::CopyTo( target ); + + // Element class: + // Clone the attributes, then clone the children. + const TiXmlAttribute* attribute = 0; + for( attribute = attributeSet.First(); + attribute; + attribute = attribute->Next() ) + { + target->SetAttribute( attribute->Name(), attribute->Value() ); + } + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + target->LinkEndChild( node->Clone() ); + } +} + +bool TiXmlElement::Accept( TiXmlVisitor* visitor ) const +{ + if ( visitor->VisitEnter( *this, attributeSet.First() ) ) + { + for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) + { + if ( !node->Accept( visitor ) ) + break; + } + } + return visitor->VisitExit( *this ); +} + + +TiXmlNode* TiXmlElement::Clone() const +{ + TiXmlElement* clone = new TiXmlElement( Value() ); + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +const char* TiXmlElement::GetText() const +{ + const TiXmlNode* child = this->FirstChild(); + if ( child ) { + const TiXmlText* childText = child->ToText(); + if ( childText ) { + return childText->Value(); + } + } + return 0; +} + + +TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + tabsize = 4; + useMicrosoftBOM = false; + ClearError(); +} + +TiXmlDocument::TiXmlDocument( const char * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + tabsize = 4; + useMicrosoftBOM = false; + value = documentName; + ClearError(); +} + + +#ifdef TIXML_USE_STL +TiXmlDocument::TiXmlDocument( const std::string& documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + tabsize = 4; + useMicrosoftBOM = false; + value = documentName; + ClearError(); +} +#endif + + +TiXmlDocument::TiXmlDocument( const TiXmlDocument& copy ) : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + copy.CopyTo( this ); +} + + +void TiXmlDocument::operator=( const TiXmlDocument& copy ) +{ + Clear(); + copy.CopyTo( this ); +} + + +bool TiXmlDocument::LoadFile( TiXmlEncoding encoding ) +{ + // See STL_STRING_BUG below. + //StringToBuffer buf( value ); + + return LoadFile( Value(), encoding ); +} + + +bool TiXmlDocument::SaveFile() const +{ + // See STL_STRING_BUG below. +// StringToBuffer buf( value ); +// +// if ( buf.buffer && SaveFile( buf.buffer ) ) +// return true; +// +// return false; + return SaveFile( Value() ); +} + +bool TiXmlDocument::LoadFile( const char* _filename, TiXmlEncoding encoding ) +{ + // There was a really terrifying little bug here. The code: + // value = filename + // in the STL case, cause the assignment method of the std::string to + // be called. What is strange, is that the std::string had the same + // address as it's c_str() method, and so bad things happen. Looks + // like a bug in the Microsoft STL implementation. + // Add an extra string to avoid the crash. + TIXML_STRING filename( _filename ); + value = filename; + + // reading in binary mode so that tinyxml can normalize the EOL + FILE* file = TiXmlFOpen( value.c_str (), "rb" ); + + if ( file ) + { + bool result = LoadFile( file, encoding ); + fclose( file ); + return result; + } + else + { + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } +} + +bool TiXmlDocument::LoadFile( FILE* file, TiXmlEncoding encoding ) +{ + if ( !file ) + { + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } + + // Delete the existing data: + Clear(); + location.Clear(); + + // Get the file size, so we can pre-allocate the string. HUGE speed impact. + long length = 0; + fseek( file, 0, SEEK_END ); + length = ftell( file ); + fseek( file, 0, SEEK_SET ); + + // Strange case, but good to handle up front. + if ( length <= 0 ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } + + // If we have a file, assume it is all one big XML file, and read it in. + // The document parser may decide the document ends sooner than the entire file, however. + TIXML_STRING data; + data.reserve( length ); + + // Subtle bug here. TinyXml did use fgets. But from the XML spec: + // 2.11 End-of-Line Handling + // + // + // ...the XML processor MUST behave as if it normalized all line breaks in external + // parsed entities (including the document entity) on input, before parsing, by translating + // both the two-character sequence #xD #xA and any #xD that is not followed by #xA to + // a single #xA character. + // + // + // It is not clear fgets does that, and certainly isn't clear it works cross platform. + // Generally, you expect fgets to translate from the convention of the OS to the c/unix + // convention, and not work generally. + + /* + while( fgets( buf, sizeof(buf), file ) ) + { + data += buf; + } + */ + + char* buf = new char[ length+1 ]; + buf[0] = 0; + + if ( fread( buf, length, 1, file ) != 1 ) { + delete [] buf; + SetError( TIXML_ERROR_OPENING_FILE, 0, 0, TIXML_ENCODING_UNKNOWN ); + return false; + } + + const char* lastPos = buf; + const char* p = buf; + + buf[length] = 0; + while( *p ) { + assert( p < (buf+length) ); + if ( *p == 0xa ) { + // Newline character. No special rules for this. Append all the characters + // since the last string, and include the newline. + data.append( lastPos, (p-lastPos+1) ); // append, include the newline + ++p; // move past the newline + lastPos = p; // and point to the new buffer (may be 0) + assert( p <= (buf+length) ); + } + else if ( *p == 0xd ) { + // Carriage return. Append what we have so far, then + // handle moving forward in the buffer. + if ( (p-lastPos) > 0 ) { + data.append( lastPos, p-lastPos ); // do not add the CR + } + data += (char)0xa; // a proper newline + + if ( *(p+1) == 0xa ) { + // Carriage return - new line sequence + p += 2; + lastPos = p; + assert( p <= (buf+length) ); + } + else { + // it was followed by something else...that is presumably characters again. + ++p; + lastPos = p; + assert( p <= (buf+length) ); + } + } + else { + ++p; + } + } + // Handle any left over characters. + if ( p-lastPos ) { + data.append( lastPos, p-lastPos ); + } + delete [] buf; + buf = 0; + + Parse( data.c_str(), 0, encoding ); + + if ( Error() ) + return false; + else + return true; +} + + +bool TiXmlDocument::SaveFile( const char * filename ) const +{ + // The old c stuff lives on... + FILE* fp = TiXmlFOpen( filename, "w" ); + if ( fp ) + { + bool result = SaveFile( fp ); + fclose( fp ); + return result; + } + return false; +} + + +bool TiXmlDocument::SaveFile( FILE* fp ) const +{ + if ( useMicrosoftBOM ) + { + const unsigned char TIXML_UTF_LEAD_0 = 0xefU; + const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; + const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + + fputc( TIXML_UTF_LEAD_0, fp ); + fputc( TIXML_UTF_LEAD_1, fp ); + fputc( TIXML_UTF_LEAD_2, fp ); + } + Print( fp, 0 ); + return (ferror(fp) == 0); +} + + +void TiXmlDocument::CopyTo( TiXmlDocument* target ) const +{ + TiXmlNode::CopyTo( target ); + + target->error = error; + target->errorId = errorId; + target->errorDesc = errorDesc; + target->tabsize = tabsize; + target->errorLocation = errorLocation; + target->useMicrosoftBOM = useMicrosoftBOM; + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + target->LinkEndChild( node->Clone() ); + } +} + + +TiXmlNode* TiXmlDocument::Clone() const +{ + TiXmlDocument* clone = new TiXmlDocument(); + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +void TiXmlDocument::Print( FILE* cfile, int depth ) const +{ + assert( cfile ); + for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) + { + node->Print( cfile, depth ); + fprintf( cfile, "\n" ); + } +} + + +bool TiXmlDocument::Accept( TiXmlVisitor* visitor ) const +{ + if ( visitor->VisitEnter( *this ) ) + { + for ( const TiXmlNode* node=FirstChild(); node; node=node->NextSibling() ) + { + if ( !node->Accept( visitor ) ) + break; + } + } + return visitor->VisitExit( *this ); +} + + +const TiXmlAttribute* TiXmlAttribute::Next() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; +} + +/* +TiXmlAttribute* TiXmlAttribute::Next() +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; +} +*/ + +const TiXmlAttribute* TiXmlAttribute::Previous() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; +} + +/* +TiXmlAttribute* TiXmlAttribute::Previous() +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; +} +*/ + +void TiXmlAttribute::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const +{ + TIXML_STRING n, v; + + EncodeString( name, &n ); + EncodeString( value, &v ); + + if (value.find ('\"') == TIXML_STRING::npos) { + if ( cfile ) { + fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); + } + if ( str ) { + (*str) += n; (*str) += "=\""; (*str) += v; (*str) += "\""; + } + } + else { + if ( cfile ) { + fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); + } + if ( str ) { + (*str) += n; (*str) += "='"; (*str) += v; (*str) += "'"; + } + } +} + + +int TiXmlAttribute::QueryIntValue( int* ival ) const +{ + if ( TIXML_SSCANF( value.c_str(), "%d", ival ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +int TiXmlAttribute::QueryDoubleValue( double* dval ) const +{ + if ( TIXML_SSCANF( value.c_str(), "%lf", dval ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +void TiXmlAttribute::SetIntValue( int _value ) +{ + char buf [64]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF(buf, sizeof(buf), "%d", _value); + #else + sprintf (buf, "%d", _value); + #endif + SetValue (buf); +} + +void TiXmlAttribute::SetDoubleValue( double _value ) +{ + char buf [256]; + #if defined(TIXML_SNPRINTF) + TIXML_SNPRINTF( buf, sizeof(buf), "%lf", _value); + #else + sprintf (buf, "%lf", _value); + #endif + SetValue (buf); +} + +int TiXmlAttribute::IntValue() const +{ + return atoi (value.c_str ()); +} + +double TiXmlAttribute::DoubleValue() const +{ + return atof (value.c_str ()); +} + + +TiXmlComment::TiXmlComment( const TiXmlComment& copy ) : TiXmlNode( TiXmlNode::COMMENT ) +{ + copy.CopyTo( this ); +} + + +void TiXmlComment::operator=( const TiXmlComment& base ) +{ + Clear(); + base.CopyTo( this ); +} + + +void TiXmlComment::Print( FILE* cfile, int depth ) const +{ + assert( cfile ); + for ( int i=0; i", value.c_str() ); +} + + +void TiXmlComment::CopyTo( TiXmlComment* target ) const +{ + TiXmlNode::CopyTo( target ); +} + + +bool TiXmlComment::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlComment::Clone() const +{ + TiXmlComment* clone = new TiXmlComment(); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +void TiXmlText::Print( FILE* cfile, int depth ) const +{ + assert( cfile ); + if ( cdata ) + { + int i; + fprintf( cfile, "\n" ); + for ( i=0; i\n", value.c_str() ); // unformatted output + } + else + { + TIXML_STRING buffer; + EncodeString( value, &buffer ); + fprintf( cfile, "%s", buffer.c_str() ); + } +} + + +void TiXmlText::CopyTo( TiXmlText* target ) const +{ + TiXmlNode::CopyTo( target ); + target->cdata = cdata; +} + + +bool TiXmlText::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlText::Clone() const +{ + TiXmlText* clone = 0; + clone = new TiXmlText( "" ); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +TiXmlDeclaration::TiXmlDeclaration( const char * _version, + const char * _encoding, + const char * _standalone ) + : TiXmlNode( TiXmlNode::DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} + + +#ifdef TIXML_USE_STL +TiXmlDeclaration::TiXmlDeclaration( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ) + : TiXmlNode( TiXmlNode::DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} +#endif + + +TiXmlDeclaration::TiXmlDeclaration( const TiXmlDeclaration& copy ) + : TiXmlNode( TiXmlNode::DECLARATION ) +{ + copy.CopyTo( this ); +} + + +void TiXmlDeclaration::operator=( const TiXmlDeclaration& copy ) +{ + Clear(); + copy.CopyTo( this ); +} + + +void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/, TIXML_STRING* str ) const +{ + if ( cfile ) fprintf( cfile, "" ); + if ( str ) (*str) += "?>"; +} + + +void TiXmlDeclaration::CopyTo( TiXmlDeclaration* target ) const +{ + TiXmlNode::CopyTo( target ); + + target->version = version; + target->encoding = encoding; + target->standalone = standalone; +} + + +bool TiXmlDeclaration::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlDeclaration::Clone() const +{ + TiXmlDeclaration* clone = new TiXmlDeclaration(); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +void TiXmlUnknown::Print( FILE* cfile, int depth ) const +{ + for ( int i=0; i", value.c_str() ); +} + + +void TiXmlUnknown::CopyTo( TiXmlUnknown* target ) const +{ + TiXmlNode::CopyTo( target ); +} + + +bool TiXmlUnknown::Accept( TiXmlVisitor* visitor ) const +{ + return visitor->Visit( *this ); +} + + +TiXmlNode* TiXmlUnknown::Clone() const +{ + TiXmlUnknown* clone = new TiXmlUnknown(); + + if ( !clone ) + return 0; + + CopyTo( clone ); + return clone; +} + + +TiXmlAttributeSet::TiXmlAttributeSet() +{ + sentinel.next = &sentinel; + sentinel.prev = &sentinel; +} + + +TiXmlAttributeSet::~TiXmlAttributeSet() +{ + assert( sentinel.next == &sentinel ); + assert( sentinel.prev == &sentinel ); +} + + +void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) +{ + #ifdef TIXML_USE_STL + assert( !Find( TIXML_STRING( addMe->Name() ) ) ); // Shouldn't be multiply adding to the set. + #else + assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. + #endif + + addMe->next = &sentinel; + addMe->prev = sentinel.prev; + + sentinel.prev->next = addMe; + sentinel.prev = addMe; +} + +void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) +{ + TiXmlAttribute* node; + + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node == removeMe ) + { + node->prev->next = node->next; + node->next->prev = node->prev; + node->next = 0; + node->prev = 0; + return; + } + } + assert( 0 ); // we tried to remove a non-linked attribute. +} + + +#ifdef TIXML_USE_STL +const TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) const +{ + for( const TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node->name == name ) + return node; + } + return 0; +} + +/* +TiXmlAttribute* TiXmlAttributeSet::Find( const std::string& name ) +{ + for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node->name == name ) + return node; + } + return 0; +} +*/ +#endif + + +const TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) const +{ + for( const TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( strcmp( node->name.c_str(), name ) == 0 ) + return node; + } + return 0; +} + +/* +TiXmlAttribute* TiXmlAttributeSet::Find( const char* name ) +{ + for( TiXmlAttribute* node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( strcmp( node->name.c_str(), name ) == 0 ) + return node; + } + return 0; +} +*/ + +#ifdef TIXML_USE_STL +std::istream& operator>> (std::istream & in, TiXmlNode & base) +{ + TIXML_STRING tag; + tag.reserve( 8 * 1000 ); + base.StreamIn( &in, &tag ); + + base.Parse( tag.c_str(), 0, TIXML_DEFAULT_ENCODING ); + return in; +} +#endif + + +#ifdef TIXML_USE_STL +std::ostream& operator<< (std::ostream & out, const TiXmlNode & base) +{ + TiXmlPrinter printer; + printer.SetStreamPrinting(); + base.Accept( &printer ); + out << printer.Str(); + + return out; +} + + +std::string& operator<< (std::string& out, const TiXmlNode& base ) +{ + TiXmlPrinter printer; + printer.SetStreamPrinting(); + base.Accept( &printer ); + out.append( printer.Str() ); + + return out; +} +#endif + + +TiXmlHandle TiXmlHandle::FirstChild() const +{ + if ( node ) + { + TiXmlNode* child = node->FirstChild(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChild( const char * value ) const +{ + if ( node ) + { + TiXmlNode* child = node->FirstChild( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChildElement() const +{ + if ( node ) + { + TiXmlElement* child = node->FirstChildElement(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChildElement( const char * value ) const +{ + if ( node ) + { + TiXmlElement* child = node->FirstChildElement( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::Child( int count ) const +{ + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild(); + for ( i=0; + child && iNextSibling(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::Child( const char* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild( value ); + for ( i=0; + child && iNextSibling( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::ChildElement( int count ) const +{ + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement(); + for ( i=0; + child && iNextSiblingElement(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::ChildElement( const char* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement( value ); + for ( i=0; + child && iNextSiblingElement( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +bool TiXmlPrinter::VisitEnter( const TiXmlDocument& ) +{ + return true; +} + +bool TiXmlPrinter::VisitExit( const TiXmlDocument& ) +{ + return true; +} + +bool TiXmlPrinter::VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ) +{ + DoIndent(); + buffer += "<"; + buffer += element.Value(); + + for( const TiXmlAttribute* attrib = firstAttribute; attrib; attrib = attrib->Next() ) + { + buffer += " "; + attrib->Print( 0, 0, &buffer ); + } + + if ( !element.FirstChild() ) + { + buffer += " />"; + DoLineBreak(); + } + else + { + buffer += ">"; + if ( element.FirstChild()->ToText() + && element.LastChild() == element.FirstChild() + && element.FirstChild()->ToText()->CDATA() == false ) + { + simpleTextPrint = true; + // no DoLineBreak()! + } + else + { + DoLineBreak(); + } + } + ++depth; + return true; +} + + +bool TiXmlPrinter::VisitExit( const TiXmlElement& element ) +{ + --depth; + if ( !element.FirstChild() ) + { + // nothing. + } + else + { + if ( simpleTextPrint ) + { + simpleTextPrint = false; + } + else + { + DoIndent(); + } + buffer += ""; + DoLineBreak(); + } + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlText& text ) +{ + if ( text.CDATA() ) + { + DoIndent(); + buffer += ""; + DoLineBreak(); + } + else if ( simpleTextPrint ) + { + TIXML_STRING str; + TiXmlBase::EncodeString( text.ValueTStr(), &str ); + buffer += str; + } + else + { + DoIndent(); + TIXML_STRING str; + TiXmlBase::EncodeString( text.ValueTStr(), &str ); + buffer += str; + DoLineBreak(); + } + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlDeclaration& declaration ) +{ + DoIndent(); + declaration.Print( 0, 0, &buffer ); + DoLineBreak(); + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlComment& comment ) +{ + DoIndent(); + buffer += ""; + DoLineBreak(); + return true; +} + + +bool TiXmlPrinter::Visit( const TiXmlUnknown& unknown ) +{ + DoIndent(); + buffer += "<"; + buffer += unknown.Value(); + buffer += ">"; + DoLineBreak(); + return true; +} + diff --git a/tinyxml.h b/tinyxml.h new file mode 100644 index 0000000..c6f40cc --- /dev/null +++ b/tinyxml.h @@ -0,0 +1,1802 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + + +#ifndef TINYXML_INCLUDED +#define TINYXML_INCLUDED + +#ifdef _MSC_VER +#pragma warning( push ) +#pragma warning( disable : 4530 ) +#pragma warning( disable : 4786 ) +#endif + +#include +#include +#include +#include +#include + +// Help out windows: +#if defined( _DEBUG ) && !defined( DEBUG ) +#define DEBUG +#endif + +#ifdef TIXML_USE_STL + #include + #include + #include + #define TIXML_STRING std::string +#else + #include "tinystr.h" + #define TIXML_STRING TiXmlString +#endif + +// Deprecated library function hell. Compilers want to use the +// new safe versions. This probably doesn't fully address the problem, +// but it gets closer. There are too many compilers for me to fully +// test. If you get compilation troubles, undefine TIXML_SAFE +#define TIXML_SAFE + +#ifdef TIXML_SAFE + #if defined(_MSC_VER) && (_MSC_VER >= 1400 ) + // Microsoft visual studio, version 2005 and higher. + #define TIXML_SNPRINTF _snprintf_s + #define TIXML_SNSCANF _snscanf_s + #define TIXML_SSCANF sscanf_s + #elif defined(_MSC_VER) && (_MSC_VER >= 1200 ) + // Microsoft visual studio, version 6 and higher. + //#pragma message( "Using _sn* functions." ) + #define TIXML_SNPRINTF _snprintf + #define TIXML_SNSCANF _snscanf + #define TIXML_SSCANF sscanf + #elif defined(__GNUC__) && (__GNUC__ >= 3 ) + // GCC version 3 and higher.s + //#warning( "Using sn* functions." ) + #define TIXML_SNPRINTF snprintf + #define TIXML_SNSCANF snscanf + #define TIXML_SSCANF sscanf + #else + #define TIXML_SSCANF sscanf + #endif +#endif + +class TiXmlDocument; +class TiXmlElement; +class TiXmlComment; +class TiXmlUnknown; +class TiXmlAttribute; +class TiXmlText; +class TiXmlDeclaration; +class TiXmlParsingData; + +const int TIXML_MAJOR_VERSION = 2; +const int TIXML_MINOR_VERSION = 5; +const int TIXML_PATCH_VERSION = 3; + +/* Internal structure for tracking location of items + in the XML file. +*/ +struct TiXmlCursor +{ + TiXmlCursor() { Clear(); } + void Clear() { row = col = -1; } + + int row; // 0 based. + int col; // 0 based. +}; + + +/** + If you call the Accept() method, it requires being passed a TiXmlVisitor + class to handle callbacks. For nodes that contain other nodes (Document, Element) + you will get called with a VisitEnter/VisitExit pair. Nodes that are always leaves + are simple called with Visit(). + + If you return 'true' from a Visit method, recursive parsing will continue. If you return + false, no children of this node or its sibilings will be Visited. + + All flavors of Visit methods have a default implementation that returns 'true' (continue + visiting). You need to only override methods that are interesting to you. + + Generally Accept() is called on the TiXmlDocument, although all nodes suppert Visiting. + + You should never change the document from a callback. + + @sa TiXmlNode::Accept() +*/ +class TiXmlVisitor +{ +public: + virtual ~TiXmlVisitor() {} + + /// Visit a document. + virtual bool VisitEnter( const TiXmlDocument& /*doc*/ ) { return true; } + /// Visit a document. + virtual bool VisitExit( const TiXmlDocument& /*doc*/ ) { return true; } + + /// Visit an element. + virtual bool VisitEnter( const TiXmlElement& /*element*/, const TiXmlAttribute* /*firstAttribute*/ ) { return true; } + /// Visit an element. + virtual bool VisitExit( const TiXmlElement& /*element*/ ) { return true; } + + /// Visit a declaration + virtual bool Visit( const TiXmlDeclaration& /*declaration*/ ) { return true; } + /// Visit a text node + virtual bool Visit( const TiXmlText& /*text*/ ) { return true; } + /// Visit a comment node + virtual bool Visit( const TiXmlComment& /*comment*/ ) { return true; } + /// Visit an unknow node + virtual bool Visit( const TiXmlUnknown& /*unknown*/ ) { return true; } +}; + +// Only used by Attribute::Query functions +enum +{ + TIXML_SUCCESS, + TIXML_NO_ATTRIBUTE, + TIXML_WRONG_TYPE +}; + + +// Used by the parsing routines. +enum TiXmlEncoding +{ + TIXML_ENCODING_UNKNOWN, + TIXML_ENCODING_UTF8, + TIXML_ENCODING_LEGACY +}; + +const TiXmlEncoding TIXML_DEFAULT_ENCODING = TIXML_ENCODING_UNKNOWN; + +/** TiXmlBase is a base class for every class in TinyXml. + It does little except to establish that TinyXml classes + can be printed and provide some utility functions. + + In XML, the document and elements can contain + other elements and other types of nodes. + + @verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + A Decleration contains: Attributes (not on tree) + @endverbatim +*/ +class TiXmlBase +{ + friend class TiXmlNode; + friend class TiXmlElement; + friend class TiXmlDocument; + +public: + TiXmlBase() : userData(0) {} + virtual ~TiXmlBase() {} + + /** All TinyXml classes can print themselves to a filestream + or the string class (TiXmlString in non-STL mode, std::string + in STL mode.) Either or both cfile and str can be null. + + This is a formatted print, and will insert + tabs and newlines. + + (For an unformatted stream, use the << operator.) + */ + virtual void Print( FILE* cfile, int depth ) const = 0; + + /** The world does not agree on whether white space should be kept or + not. In order to make everyone happy, these global, static functions + are provided to set whether or not TinyXml will condense all white space + into a single space or not. The default is to condense. Note changing this + value is not thread safe. + */ + static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } + + /// Return the current white space setting. + static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } + + /** Return the position, in the original source file, of this node or attribute. + The row and column are 1-based. (That is the first row and first column is + 1,1). If the returns values are 0 or less, then the parser does not have + a row and column value. + + Generally, the row and column value will be set when the TiXmlDocument::Load(), + TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set + when the DOM was created from operator>>. + + The values reflect the initial load. Once the DOM is modified programmatically + (by adding or changing nodes and attributes) the new values will NOT update to + reflect changes in the document. + + There is a minor performance cost to computing the row and column. Computation + can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. + + @sa TiXmlDocument::SetTabSize() + */ + int Row() const { return location.row + 1; } + int Column() const { return location.col + 1; } ///< See Row() + + void SetUserData( void* user ) { userData = user; } ///< Set a pointer to arbitrary user data. + void* GetUserData() { return userData; } ///< Get a pointer to arbitrary user data. + const void* GetUserData() const { return userData; } ///< Get a pointer to arbitrary user data. + + // Table that returs, for a given lead byte, the total number of bytes + // in the UTF-8 sequence. + static const int utf8ByteTable[256]; + + virtual const char* Parse( const char* p, + TiXmlParsingData* data, + TiXmlEncoding encoding /*= TIXML_ENCODING_UNKNOWN */ ) = 0; + + /** Expands entities in a string. Note this should not contian the tag's '<', '>', etc, + or they will be transformed into entities! + */ + static void EncodeString( const TIXML_STRING& str, TIXML_STRING* out ); + + enum + { + TIXML_NO_ERROR = 0, + TIXML_ERROR, + TIXML_ERROR_OPENING_FILE, + TIXML_ERROR_OUT_OF_MEMORY, + TIXML_ERROR_PARSING_ELEMENT, + TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, + TIXML_ERROR_READING_ELEMENT_VALUE, + TIXML_ERROR_READING_ATTRIBUTES, + TIXML_ERROR_PARSING_EMPTY, + TIXML_ERROR_READING_END_TAG, + TIXML_ERROR_PARSING_UNKNOWN, + TIXML_ERROR_PARSING_COMMENT, + TIXML_ERROR_PARSING_DECLARATION, + TIXML_ERROR_DOCUMENT_EMPTY, + TIXML_ERROR_EMBEDDED_NULL, + TIXML_ERROR_PARSING_CDATA, + TIXML_ERROR_DOCUMENT_TOP_ONLY, + + TIXML_ERROR_STRING_COUNT + }; + +protected: + + static const char* SkipWhiteSpace( const char*, TiXmlEncoding encoding ); + inline static bool IsWhiteSpace( char c ) + { + return ( isspace( (unsigned char) c ) || c == '\n' || c == '\r' ); + } + inline static bool IsWhiteSpace( int c ) + { + if ( c < 256 ) + return IsWhiteSpace( (char) c ); + return false; // Again, only truly correct for English/Latin...but usually works. + } + + #ifdef TIXML_USE_STL + static bool StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ); + static bool StreamTo( std::istream * in, int character, TIXML_STRING * tag ); + #endif + + /* Reads an XML name into the string provided. Returns + a pointer just past the last character of the name, + or 0 if the function has an error. + */ + static const char* ReadName( const char* p, TIXML_STRING* name, TiXmlEncoding encoding ); + + /* Reads text. Returns a pointer past the given end tag. + Wickedly complex options, but it keeps the (sensitive) code in one place. + */ + static const char* ReadText( const char* in, // where to start + TIXML_STRING* text, // the string read + bool ignoreWhiteSpace, // whether to keep the white space + const char* endTag, // what ends this text + bool ignoreCase, // whether to ignore case in the end tag + TiXmlEncoding encoding ); // the current encoding + + // If an entity has been found, transform it into a character. + static const char* GetEntity( const char* in, char* value, int* length, TiXmlEncoding encoding ); + + // Get a character, while interpreting entities. + // The length can be from 0 to 4 bytes. + inline static const char* GetChar( const char* p, char* _value, int* length, TiXmlEncoding encoding ) + { + assert( p ); + if ( encoding == TIXML_ENCODING_UTF8 ) + { + *length = utf8ByteTable[ *((const unsigned char*)p) ]; + assert( *length >= 0 && *length < 5 ); + } + else + { + *length = 1; + } + + if ( *length == 1 ) + { + if ( *p == '&' ) + return GetEntity( p, _value, length, encoding ); + *_value = *p; + return p+1; + } + else if ( *length ) + { + //strncpy( _value, p, *length ); // lots of compilers don't like this function (unsafe), + // and the null terminator isn't needed + for( int i=0; p[i] && i<*length; ++i ) { + _value[i] = p[i]; + } + return p + (*length); + } + else + { + // Not valid text. + return 0; + } + } + + // Return true if the next characters in the stream are any of the endTag sequences. + // Ignore case only works for english, and should only be relied on when comparing + // to English words: StringEqual( p, "version", true ) is fine. + static bool StringEqual( const char* p, + const char* endTag, + bool ignoreCase, + TiXmlEncoding encoding ); + + static const char* errorString[ TIXML_ERROR_STRING_COUNT ]; + + TiXmlCursor location; + + /// Field containing a generic user pointer + void* userData; + + // None of these methods are reliable for any language except English. + // Good for approximation, not great for accuracy. + static int IsAlpha( unsigned char anyByte, TiXmlEncoding encoding ); + static int IsAlphaNum( unsigned char anyByte, TiXmlEncoding encoding ); + inline static int ToLower( int v, TiXmlEncoding encoding ) + { + if ( encoding == TIXML_ENCODING_UTF8 ) + { + if ( v < 128 ) return tolower( v ); + return v; + } + else + { + return tolower( v ); + } + } + static void ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ); + +private: + TiXmlBase( const TiXmlBase& ); // not implemented. + void operator=( const TiXmlBase& base ); // not allowed. + + struct Entity + { + const char* str; + unsigned int strLength; + char chr; + }; + enum + { + NUM_ENTITY = 5, + MAX_ENTITY_LENGTH = 6 + + }; + static Entity entity[ NUM_ENTITY ]; + static bool condenseWhiteSpace; +}; + + +/** The parent class for everything in the Document Object Model. + (Except for attributes). + Nodes have siblings, a parent, and children. A node can be + in a document, or stand on its own. The type of a TiXmlNode + can be queried, and it can be cast to its more defined type. +*/ +class TiXmlNode : public TiXmlBase +{ + friend class TiXmlDocument; + friend class TiXmlElement; + +public: + #ifdef TIXML_USE_STL + + /** An input stream operator, for every class. Tolerant of newlines and + formatting, but doesn't expect them. + */ + friend std::istream& operator >> (std::istream& in, TiXmlNode& base); + + /** An output stream operator, for every class. Note that this outputs + without any newlines or formatting, as opposed to Print(), which + includes tabs and new lines. + + The operator<< and operator>> are not completely symmetric. Writing + a node to a stream is very well defined. You'll get a nice stream + of output, without any extra whitespace or newlines. + + But reading is not as well defined. (As it always is.) If you create + a TiXmlElement (for example) and read that from an input stream, + the text needs to define an element or junk will result. This is + true of all input streams, but it's worth keeping in mind. + + A TiXmlDocument will read nodes until it reads a root element, and + all the children of that root element. + */ + friend std::ostream& operator<< (std::ostream& out, const TiXmlNode& base); + + /// Appends the XML node or attribute to a std::string. + friend std::string& operator<< (std::string& out, const TiXmlNode& base ); + + #endif + + /** The types of XML nodes supported by TinyXml. (All the + unsupported types are picked up by UNKNOWN.) + */ + enum NodeType + { + DOCUMENT, + ELEMENT, + COMMENT, + UNKNOWN, + TEXT, + DECLARATION, + TYPECOUNT + }; + + virtual ~TiXmlNode(); + + /** The meaning of 'value' changes for the specific type of + TiXmlNode. + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + + The subclasses will wrap this function. + */ + const char *Value() const { return value.c_str (); } + + #ifdef TIXML_USE_STL + /** Return Value() as a std::string. If you only use STL, + this is more efficient than calling Value(). + Only available in STL mode. + */ + const std::string& ValueStr() const { return value; } + #endif + + const TIXML_STRING& ValueTStr() const { return value; } + + /** Changes the value of the node. Defined as: + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + */ + void SetValue(const char * _value) { value = _value;} + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetValue( const std::string& _value ) { value = _value; } + #endif + + /// Delete all the children of this node. Does not affect 'this'. + void Clear(); + + /// One step up the DOM. + TiXmlNode* Parent() { return parent; } + const TiXmlNode* Parent() const { return parent; } + + const TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. + TiXmlNode* FirstChild() { return firstChild; } + const TiXmlNode* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. + /// The first child of this node with the matching 'value'. Will be null if none found. + TiXmlNode* FirstChild( const char * _value ) { + // Call through to the const version - safe since nothing is changed. Exiting syntax: cast this to a const (always safe) + // call the method, cast the return back to non-const. + return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->FirstChild( _value )); + } + const TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. + TiXmlNode* LastChild() { return lastChild; } + + const TiXmlNode* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. + TiXmlNode* LastChild( const char * _value ) { + return const_cast< TiXmlNode* > ((const_cast< const TiXmlNode* >(this))->LastChild( _value )); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* FirstChild( const std::string& _value ) { return FirstChild (_value.c_str ()); } ///< STL std::string form. + const TiXmlNode* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* LastChild( const std::string& _value ) { return LastChild (_value.c_str ()); } ///< STL std::string form. + #endif + + /** An alternate way to walk the children of a node. + One way to iterate over nodes is: + @verbatim + for( child = parent->FirstChild(); child; child = child->NextSibling() ) + @endverbatim + + IterateChildren does the same thing with the syntax: + @verbatim + child = 0; + while( child = parent->IterateChildren( child ) ) + @endverbatim + + IterateChildren takes the previous child as input and finds + the next one. If the previous child is null, it returns the + first. IterateChildren will return null when done. + */ + const TiXmlNode* IterateChildren( const TiXmlNode* previous ) const; + TiXmlNode* IterateChildren( const TiXmlNode* previous ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( previous ) ); + } + + /// This flavor of IterateChildren searches for children with a particular 'value' + const TiXmlNode* IterateChildren( const char * value, const TiXmlNode* previous ) const; + TiXmlNode* IterateChildren( const char * _value, const TiXmlNode* previous ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->IterateChildren( _value, previous ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + TiXmlNode* IterateChildren( const std::string& _value, const TiXmlNode* previous ) { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + #endif + + /** Add a new node related to this. Adds a child past the LastChild. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); + + + /** Add a new node related to this. Adds a child past the LastChild. + + NOTE: the node to be added is passed by pointer, and will be + henceforth owned (and deleted) by tinyXml. This method is efficient + and avoids an extra copy, but should be used with care as it + uses a different memory model than the other insert functions. + + @sa InsertEndChild + */ + TiXmlNode* LinkEndChild( TiXmlNode* addThis ); + + /** Add a new node related to this. Adds a child before the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); + + /** Add a new node related to this. Adds a child after the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); + + /** Replace a child of this node. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); + + /// Delete a child of this node. + bool RemoveChild( TiXmlNode* removeThis ); + + /// Navigate to a sibling node. + const TiXmlNode* PreviousSibling() const { return prev; } + TiXmlNode* PreviousSibling() { return prev; } + + /// Navigate to a sibling node. + const TiXmlNode* PreviousSibling( const char * ) const; + TiXmlNode* PreviousSibling( const char *_prev ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->PreviousSibling( _prev ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlNode* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* PreviousSibling( const std::string& _value ) { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + const TiXmlNode* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNode* NextSibling( const std::string& _value) { return NextSibling (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Navigate to a sibling node. + const TiXmlNode* NextSibling() const { return next; } + TiXmlNode* NextSibling() { return next; } + + /// Navigate to a sibling node with the given 'value'. + const TiXmlNode* NextSibling( const char * ) const; + TiXmlNode* NextSibling( const char* _next ) { + return const_cast< TiXmlNode* >( (const_cast< const TiXmlNode* >(this))->NextSibling( _next ) ); + } + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + const TiXmlElement* NextSiblingElement() const; + TiXmlElement* NextSiblingElement() { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement() ); + } + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + const TiXmlElement* NextSiblingElement( const char * ) const; + TiXmlElement* NextSiblingElement( const char *_next ) { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->NextSiblingElement( _next ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlElement* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + TiXmlElement* NextSiblingElement( const std::string& _value) { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Convenience function to get through elements. + const TiXmlElement* FirstChildElement() const; + TiXmlElement* FirstChildElement() { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement() ); + } + + /// Convenience function to get through elements. + const TiXmlElement* FirstChildElement( const char * _value ) const; + TiXmlElement* FirstChildElement( const char * _value ) { + return const_cast< TiXmlElement* >( (const_cast< const TiXmlNode* >(this))->FirstChildElement( _value ) ); + } + + #ifdef TIXML_USE_STL + const TiXmlElement* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + TiXmlElement* FirstChildElement( const std::string& _value ) { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /** Query the type (as an enumerated value, above) of this node. + The possible types are: DOCUMENT, ELEMENT, COMMENT, + UNKNOWN, TEXT, and DECLARATION. + */ + int Type() const { return type; } + + /** Return a pointer to the Document this node lives in. + Returns null if not in a document. + */ + const TiXmlDocument* GetDocument() const; + TiXmlDocument* GetDocument() { + return const_cast< TiXmlDocument* >( (const_cast< const TiXmlNode* >(this))->GetDocument() ); + } + + /// Returns true if this node has no children. + bool NoChildren() const { return !firstChild; } + + virtual const TiXmlDocument* ToDocument() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlElement* ToElement() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlComment* ToComment() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlUnknown* ToUnknown() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlText* ToText() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual const TiXmlDeclaration* ToDeclaration() const { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + + virtual TiXmlDocument* ToDocument() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlElement* ToElement() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlComment* ToComment() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlUnknown* ToUnknown() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlText* ToText() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + virtual TiXmlDeclaration* ToDeclaration() { return 0; } ///< Cast to a more defined type. Will return null if not of the requested type. + + /** Create an exact duplicate of this node and return it. The memory must be deleted + by the caller. + */ + virtual TiXmlNode* Clone() const = 0; + + /** Accept a hierchical visit the nodes in the TinyXML DOM. Every node in the + XML tree will be conditionally visited and the host will be called back + via the TiXmlVisitor interface. + + This is essentially a SAX interface for TinyXML. (Note however it doesn't re-parse + the XML for the callbacks, so the performance of TinyXML is unchanged by using this + interface versus any other.) + + The interface has been based on ideas from: + + - http://www.saxproject.org/ + - http://c2.com/cgi/wiki?HierarchicalVisitorPattern + + Which are both good references for "visiting". + + An example of using Accept(): + @verbatim + TiXmlPrinter printer; + tinyxmlDoc.Accept( &printer ); + const char* xmlcstr = printer.CStr(); + @endverbatim + */ + virtual bool Accept( TiXmlVisitor* visitor ) const = 0; + +protected: + TiXmlNode( NodeType _type ); + + // Copy to the allocated object. Shared functionality between Clone, Copy constructor, + // and the assignment operator. + void CopyTo( TiXmlNode* target ) const; + + #ifdef TIXML_USE_STL + // The real work of the input operator. + virtual void StreamIn( std::istream* in, TIXML_STRING* tag ) = 0; + #endif + + // Figure out what is at *p, and parse it. Returns null if it is not an xml node. + TiXmlNode* Identify( const char* start, TiXmlEncoding encoding ); + + TiXmlNode* parent; + NodeType type; + + TiXmlNode* firstChild; + TiXmlNode* lastChild; + + TIXML_STRING value; + + TiXmlNode* prev; + TiXmlNode* next; + +private: + TiXmlNode( const TiXmlNode& ); // not implemented. + void operator=( const TiXmlNode& base ); // not allowed. +}; + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not TiXmlNodes, since they are not + part of the tinyXML document object model. There are other + suggested ways to look at this problem. +*/ +class TiXmlAttribute : public TiXmlBase +{ + friend class TiXmlAttributeSet; + +public: + /// Construct an empty attribute. + TiXmlAttribute() : TiXmlBase() + { + document = 0; + prev = next = 0; + } + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlAttribute( const std::string& _name, const std::string& _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + #endif + + /// Construct an attribute with a name and value. + TiXmlAttribute( const char * _name, const char * _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + + const char* Name() const { return name.c_str(); } ///< Return the name of this attribute. + const char* Value() const { return value.c_str(); } ///< Return the value of this attribute. + #ifdef TIXML_USE_STL + const std::string& ValueStr() const { return value; } ///< Return the value of this attribute. + #endif + int IntValue() const; ///< Return the value of this attribute, converted to an integer. + double DoubleValue() const; ///< Return the value of this attribute, converted to a double. + + // Get the tinyxml string representation + const TIXML_STRING& NameTStr() const { return name; } + + /** QueryIntValue examines the value string. It is an alternative to the + IntValue() method with richer error checking. + If the value is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. + + A specialized but useful call. Note that for success it returns 0, + which is the opposite of almost all other TinyXml calls. + */ + int QueryIntValue( int* _value ) const; + /// QueryDoubleValue examines the value string. See QueryIntValue(). + int QueryDoubleValue( double* _value ) const; + + void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. + void SetValue( const char* _value ) { value = _value; } ///< Set the value. + + void SetIntValue( int _value ); ///< Set the value from an integer. + void SetDoubleValue( double _value ); ///< Set the value from a double. + + #ifdef TIXML_USE_STL + /// STL std::string form. + void SetName( const std::string& _name ) { name = _name; } + /// STL std::string form. + void SetValue( const std::string& _value ) { value = _value; } + #endif + + /// Get the next sibling attribute in the DOM. Returns null at end. + const TiXmlAttribute* Next() const; + TiXmlAttribute* Next() { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Next() ); + } + + /// Get the previous sibling attribute in the DOM. Returns null at beginning. + const TiXmlAttribute* Previous() const; + TiXmlAttribute* Previous() { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttribute* >(this))->Previous() ); + } + + bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } + bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } + bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } + + /* Attribute parsing starts: first letter of the name + returns: the next char after the value end quote + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + // Prints this Attribute to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const { + Print( cfile, depth, 0 ); + } + void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; + + // [internal use] + // Set the document pointer so the attribute can report errors. + void SetDocument( TiXmlDocument* doc ) { document = doc; } + +private: + TiXmlAttribute( const TiXmlAttribute& ); // not implemented. + void operator=( const TiXmlAttribute& base ); // not allowed. + + TiXmlDocument* document; // A pointer back to a document, for error reporting. + TIXML_STRING name; + TIXML_STRING value; + TiXmlAttribute* prev; + TiXmlAttribute* next; +}; + + +/* A class used to manage a group of attributes. + It is only used internally, both by the ELEMENT and the DECLARATION. + + The set can be changed transparent to the Element and Declaration + classes that use it, but NOT transparent to the Attribute + which has to implement a next() and previous() method. Which makes + it a bit problematic and prevents the use of STL. + + This version is implemented with circular lists because: + - I like circular lists + - it demonstrates some independence from the (typical) doubly linked list. +*/ +class TiXmlAttributeSet +{ +public: + TiXmlAttributeSet(); + ~TiXmlAttributeSet(); + + void Add( TiXmlAttribute* attribute ); + void Remove( TiXmlAttribute* attribute ); + + const TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + TiXmlAttribute* First() { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + const TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + TiXmlAttribute* Last() { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + + const TiXmlAttribute* Find( const char* _name ) const; + TiXmlAttribute* Find( const char* _name ) { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) ); + } + #ifdef TIXML_USE_STL + const TiXmlAttribute* Find( const std::string& _name ) const; + TiXmlAttribute* Find( const std::string& _name ) { + return const_cast< TiXmlAttribute* >( (const_cast< const TiXmlAttributeSet* >(this))->Find( _name ) ); + } + + #endif + +private: + //*ME: Because of hidden/disabled copy-construktor in TiXmlAttribute (sentinel-element), + //*ME: this class must be also use a hidden/disabled copy-constructor !!! + TiXmlAttributeSet( const TiXmlAttributeSet& ); // not allowed + void operator=( const TiXmlAttributeSet& ); // not allowed (as TiXmlAttribute) + + TiXmlAttribute sentinel; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class TiXmlElement : public TiXmlNode +{ +public: + /// Construct an element. + TiXmlElement (const char * in_value); + + #ifdef TIXML_USE_STL + /// std::string constructor. + TiXmlElement( const std::string& _value ); + #endif + + TiXmlElement( const TiXmlElement& ); + + void operator=( const TiXmlElement& base ); + + virtual ~TiXmlElement(); + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + */ + const char* Attribute( const char* name ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an integer, + the integer value will be put in the return 'i', if 'i' + is non-null. + */ + const char* Attribute( const char* name, int* i ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an double, + the double value will be put in the return 'd', if 'd' + is non-null. + */ + const char* Attribute( const char* name, double* d ) const; + + /** QueryIntAttribute examines the attribute - it is an alternative to the + Attribute() method with richer error checking. + If the attribute is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. If the attribute + does not exist, then TIXML_NO_ATTRIBUTE is returned. + */ + int QueryIntAttribute( const char* name, int* _value ) const; + /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). + int QueryDoubleAttribute( const char* name, double* _value ) const; + /// QueryFloatAttribute examines the attribute - see QueryIntAttribute(). + int QueryFloatAttribute( const char* name, float* _value ) const { + double d; + int result = QueryDoubleAttribute( name, &d ); + if ( result == TIXML_SUCCESS ) { + *_value = (float)d; + } + return result; + } + + #ifdef TIXML_USE_STL + /** Template form of the attribute query which will try to read the + attribute into the specified type. Very easy, very powerful, but + be careful to make sure to call this with the correct type. + + NOTE: This method doesn't work correctly for 'string' types. + + @return TIXML_SUCCESS, TIXML_WRONG_TYPE, or TIXML_NO_ATTRIBUTE + */ + template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const + { + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + std::stringstream sstream( node->ValueStr() ); + sstream >> *outValue; + if ( !sstream.fail() ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; + } + /* + This is - in theory - a bug fix for "QueryValueAtribute returns truncated std::string" + but template specialization is hard to get working cross-compiler. Leaving the bug for now. + + // The above will fail for std::string because the space character is used as a seperator. + // Specialize for strings. Bug [ 1695429 ] QueryValueAtribute returns truncated std::string + template<> int QueryValueAttribute( const std::string& name, std::string* outValue ) const + { + const TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + *outValue = node->ValueStr(); + return TIXML_SUCCESS; + } + */ + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char* name, const char * _value ); + + #ifdef TIXML_USE_STL + const std::string* Attribute( const std::string& name ) const; + const std::string* Attribute( const std::string& name, int* i ) const; + const std::string* Attribute( const std::string& name, double* d ) const; + int QueryIntAttribute( const std::string& name, int* _value ) const; + int QueryDoubleAttribute( const std::string& name, double* _value ) const; + + /// STL std::string form. + void SetAttribute( const std::string& name, const std::string& _value ); + ///< STL std::string form. + void SetAttribute( const std::string& name, int _value ); + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char * name, int value ); + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetDoubleAttribute( const char * name, double value ); + + /** Deletes an attribute with the given name. + */ + void RemoveAttribute( const char * name ); + #ifdef TIXML_USE_STL + void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. + #endif + + const TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. + TiXmlAttribute* FirstAttribute() { return attributeSet.First(); } + const TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. + TiXmlAttribute* LastAttribute() { return attributeSet.Last(); } + + /** Convenience function for easy access to the text inside an element. Although easy + and concise, GetText() is limited compared to getting the TiXmlText child + and accessing it directly. + + If the first child of 'this' is a TiXmlText, the GetText() + returns the character string of the Text node, else null is returned. + + This is a convenient method for getting the text of simple contained text: + @verbatim + This is text + const char* str = fooElement->GetText(); + @endverbatim + + 'str' will be a pointer to "This is text". + + Note that this function can be misleading. If the element foo was created from + this XML: + @verbatim + This is text + @endverbatim + + then the value of str would be null. The first child node isn't a text node, it is + another element. From this XML: + @verbatim + This is text + @endverbatim + GetText() will return "This is ". + + WARNING: GetText() accesses a child node - don't become confused with the + similarly named TiXmlHandle::Text() and TiXmlNode::ToText() which are + safe type casts on the referenced node. + */ + const char* GetText() const; + + /// Creates a new Element and returns it - the returned element is a copy. + virtual TiXmlNode* Clone() const; + // Print the Element to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /* Attribtue parsing starts: next char past '<' + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlElement* ToElement() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlElement* ToElement() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + + void CopyTo( TiXmlElement* target ) const; + void ClearThis(); // like clear, but initializes 'this' object as well + + // Used to be public [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + /* [internal use] + Reads the "value" of the element -- another element, or text. + This should terminate with the current end tag. + */ + const char* ReadValue( const char* in, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + +private: + + TiXmlAttributeSet attributeSet; +}; + + +/** An XML comment. +*/ +class TiXmlComment : public TiXmlNode +{ +public: + /// Constructs an empty comment. + TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} + /// Construct a comment from text. + TiXmlComment( const char* _value ) : TiXmlNode( TiXmlNode::COMMENT ) { + SetValue( _value ); + } + TiXmlComment( const TiXmlComment& ); + void operator=( const TiXmlComment& base ); + + virtual ~TiXmlComment() {} + + /// Returns a copy of this Comment. + virtual TiXmlNode* Clone() const; + // Write this Comment to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /* Attribtue parsing starts: at the ! of the !-- + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlComment* ToComment() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlComment* ToComment() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + void CopyTo( TiXmlComment* target ) const; + + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif +// virtual void StreamOut( TIXML_OSTREAM * out ) const; + +private: + +}; + + +/** XML text. A text node can have 2 ways to output the next. "normal" output + and CDATA. It will default to the mode it was parsed from the XML file and + you generally want to leave it alone, but you can change the output mode with + SetCDATA() and query it with CDATA(). +*/ +class TiXmlText : public TiXmlNode +{ + friend class TiXmlElement; +public: + /** Constructor for text element. By default, it is treated as + normal, encoded text. If you want it be output as a CDATA text + element, set the parameter _cdata to 'true' + */ + TiXmlText (const char * initValue ) : TiXmlNode (TiXmlNode::TEXT) + { + SetValue( initValue ); + cdata = false; + } + virtual ~TiXmlText() {} + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlText( const std::string& initValue ) : TiXmlNode (TiXmlNode::TEXT) + { + SetValue( initValue ); + cdata = false; + } + #endif + + TiXmlText( const TiXmlText& copy ) : TiXmlNode( TiXmlNode::TEXT ) { copy.CopyTo( this ); } + void operator=( const TiXmlText& base ) { base.CopyTo( this ); } + + // Write this text object to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + /// Queries whether this represents text using a CDATA section. + bool CDATA() const { return cdata; } + /// Turns on or off a CDATA representation of text. + void SetCDATA( bool _cdata ) { cdata = _cdata; } + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlText* ToText() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlText* ToText() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected : + /// [internal use] Creates a new Element and returns it. + virtual TiXmlNode* Clone() const; + void CopyTo( TiXmlText* target ) const; + + bool Blank() const; // returns true if all white space and new lines + // [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + bool cdata; // true if this should be input and output as a CDATA style text element +}; + + +/** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXml will happily read or write files without a declaration, + however. There are 3 possible attributes to the declaration: + version, encoding, and standalone. + + Note: In this version of the code, the attributes are + handled as special cases, not generic attributes, simply + because there can only be at most 3 and they are always the same. +*/ +class TiXmlDeclaration : public TiXmlNode +{ +public: + /// Construct an empty declaration. + TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} + +#ifdef TIXML_USE_STL + /// Constructor. + TiXmlDeclaration( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ); +#endif + + /// Construct. + TiXmlDeclaration( const char* _version, + const char* _encoding, + const char* _standalone ); + + TiXmlDeclaration( const TiXmlDeclaration& copy ); + void operator=( const TiXmlDeclaration& copy ); + + virtual ~TiXmlDeclaration() {} + + /// Version. Will return an empty string if none was found. + const char *Version() const { return version.c_str (); } + /// Encoding. Will return an empty string if none was found. + const char *Encoding() const { return encoding.c_str (); } + /// Is this a standalone document? + const char *Standalone() const { return standalone.c_str (); } + + /// Creates a copy of this Declaration and returns it. + virtual TiXmlNode* Clone() const; + // Print this declaration to a FILE stream. + virtual void Print( FILE* cfile, int depth, TIXML_STRING* str ) const; + virtual void Print( FILE* cfile, int depth ) const { + Print( cfile, depth, 0 ); + } + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlDeclaration* ToDeclaration() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlDeclaration* ToDeclaration() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* visitor ) const; + +protected: + void CopyTo( TiXmlDeclaration* target ) const; + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + + TIXML_STRING version; + TIXML_STRING encoding; + TIXML_STRING standalone; +}; + + +/** Any tag that tinyXml doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. + + DTD tags get thrown into TiXmlUnknowns. +*/ +class TiXmlUnknown : public TiXmlNode +{ +public: + TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} + virtual ~TiXmlUnknown() {} + + TiXmlUnknown( const TiXmlUnknown& copy ) : TiXmlNode( TiXmlNode::UNKNOWN ) { copy.CopyTo( this ); } + void operator=( const TiXmlUnknown& copy ) { copy.CopyTo( this ); } + + /// Creates a copy of this Unknown and returns it. + virtual TiXmlNode* Clone() const; + // Print this Unknown to a FILE stream. + virtual void Print( FILE* cfile, int depth ) const; + + virtual const char* Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ); + + virtual const TiXmlUnknown* ToUnknown() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlUnknown* ToUnknown() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected: + void CopyTo( TiXmlUnknown* target ) const; + + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + +}; + + +/** Always the top level node. A document binds together all the + XML pieces. It can be saved, loaded, and printed to the screen. + The 'value' of a document node is the xml file name. +*/ +class TiXmlDocument : public TiXmlNode +{ +public: + /// Create an empty document, that has no name. + TiXmlDocument(); + /// Create a document with a name. The name of the document is also the filename of the xml. + TiXmlDocument( const char * documentName ); + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlDocument( const std::string& documentName ); + #endif + + TiXmlDocument( const TiXmlDocument& copy ); + void operator=( const TiXmlDocument& copy ); + + virtual ~TiXmlDocument() {} + + /** Load a file using the current document value. + Returns true if successful. Will delete any existing + document data before loading. + */ + bool LoadFile( TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the current document value. Returns true if successful. + bool SaveFile() const; + /// Load a file using the given filename. Returns true if successful. + bool LoadFile( const char * filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the given filename. Returns true if successful. + bool SaveFile( const char * filename ) const; + /** Load a file using the given FILE*. Returns true if successful. Note that this method + doesn't stream - the entire object pointed at by the FILE* + will be interpreted as an XML file. TinyXML doesn't stream in XML from the current + file location. Streaming may be added in the future. + */ + bool LoadFile( FILE*, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + /// Save a file using the given FILE*. Returns true if successful. + bool SaveFile( FILE* ) const; + + #ifdef TIXML_USE_STL + bool LoadFile( const std::string& filename, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ) ///< STL std::string version. + { +// StringToBuffer f( filename ); +// return ( f.buffer && LoadFile( f.buffer, encoding )); + return LoadFile( filename.c_str(), encoding ); + } + bool SaveFile( const std::string& filename ) const ///< STL std::string version. + { +// StringToBuffer f( filename ); +// return ( f.buffer && SaveFile( f.buffer )); + return SaveFile( filename.c_str() ); + } + #endif + + /** Parse the given null terminated block of xml data. Passing in an encoding to this + method (either TIXML_ENCODING_LEGACY or TIXML_ENCODING_UTF8 will force TinyXml + to use that encoding, regardless of what TinyXml might otherwise try to detect. + */ + virtual const char* Parse( const char* p, TiXmlParsingData* data = 0, TiXmlEncoding encoding = TIXML_DEFAULT_ENCODING ); + + /** Get the root element -- the only top level element -- of the document. + In well formed XML, there should only be one. TinyXml is tolerant of + multiple elements at the document level. + */ + const TiXmlElement* RootElement() const { return FirstChildElement(); } + TiXmlElement* RootElement() { return FirstChildElement(); } + + /** If an error occurs, Error will be set to true. Also, + - The ErrorId() will contain the integer identifier of the error (not generally useful) + - The ErrorDesc() method will return the name of the error. (very useful) + - The ErrorRow() and ErrorCol() will return the location of the error (if known) + */ + bool Error() const { return error; } + + /// Contains a textual (english) description of the error if one occurs. + const char * ErrorDesc() const { return errorDesc.c_str (); } + + /** Generally, you probably want the error string ( ErrorDesc() ). But if you + prefer the ErrorId, this function will fetch it. + */ + int ErrorId() const { return errorId; } + + /** Returns the location (if known) of the error. The first column is column 1, + and the first row is row 1. A value of 0 means the row and column wasn't applicable + (memory errors, for example, have no row/column) or the parser lost the error. (An + error in the error reporting, in that case.) + + @sa SetTabSize, Row, Column + */ + int ErrorRow() const { return errorLocation.row+1; } + int ErrorCol() const { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() + + /** SetTabSize() allows the error reporting functions (ErrorRow() and ErrorCol()) + to report the correct values for row and column. It does not change the output + or input in any way. + + By calling this method, with a tab size + greater than 0, the row and column of each node and attribute is stored + when the file is loaded. Very useful for tracking the DOM back in to + the source file. + + The tab size is required for calculating the location of nodes. If not + set, the default of 4 is used. The tabsize is set per document. Setting + the tabsize to 0 disables row/column tracking. + + Note that row and column tracking is not supported when using operator>>. + + The tab size needs to be enabled before the parse or load. Correct usage: + @verbatim + TiXmlDocument doc; + doc.SetTabSize( 8 ); + doc.Load( "myfile.xml" ); + @endverbatim + + @sa Row, Column + */ + void SetTabSize( int _tabsize ) { tabsize = _tabsize; } + + int TabSize() const { return tabsize; } + + /** If you have handled the error, it can be reset with this call. The error + state is automatically cleared if you Parse a new XML block. + */ + void ClearError() { error = false; + errorId = 0; + errorDesc = ""; + errorLocation.row = errorLocation.col = 0; + //errorLocation.last = 0; + } + + /** Write the document to standard out using formatted printing ("pretty print"). */ + void Print() const { Print( stdout, 0 ); } + + /* Write the document to a string using formatted printing ("pretty print"). This + will allocate a character array (new char[]) and return it as a pointer. The + calling code pust call delete[] on the return char* to avoid a memory leak. + */ + //char* PrintToMemory() const; + + /// Print this Document to a FILE stream. + virtual void Print( FILE* cfile, int depth = 0 ) const; + // [internal use] + void SetError( int err, const char* errorLocation, TiXmlParsingData* prevData, TiXmlEncoding encoding ); + + virtual const TiXmlDocument* ToDocument() const { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + virtual TiXmlDocument* ToDocument() { return this; } ///< Cast to a more defined type. Will return null not of the requested type. + + /** Walk the XML tree visiting this node and all of its children. + */ + virtual bool Accept( TiXmlVisitor* content ) const; + +protected : + // [internal use] + virtual TiXmlNode* Clone() const; + #ifdef TIXML_USE_STL + virtual void StreamIn( std::istream * in, TIXML_STRING * tag ); + #endif + +private: + void CopyTo( TiXmlDocument* target ) const; + + bool error; + int errorId; + TIXML_STRING errorDesc; + int tabsize; + TiXmlCursor errorLocation; + bool useMicrosoftBOM; // the UTF-8 BOM were found when read. Note this, and try to write. +}; + + +/** + A TiXmlHandle is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml + DOM structure. It is a separate utility class. + + Take an example: + @verbatim + + + + + + + @endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + @verbatim + TiXmlElement* root = document.FirstChildElement( "Document" ); + if ( root ) + { + TiXmlElement* element = root->FirstChildElement( "Element" ); + if ( element ) + { + TiXmlElement* child = element->FirstChildElement( "Child" ); + if ( child ) + { + TiXmlElement* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + @endverbatim + + And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity + of such code. A TiXmlHandle checks for null pointers so it is perfectly safe + and correct to use: + + @verbatim + TiXmlHandle docHandle( &document ); + TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); + if ( child2 ) + { + // do something useful + @endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + @verbatim + TiXmlHandle handleCopy = handle; + @endverbatim + + What they should not be used for is iteration: + + @verbatim + int i=0; + while ( true ) + { + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement(); + if ( !child ) + break; + // do something + ++i; + } + @endverbatim + + It seems reasonable, but it is in fact two embedded while loops. The Child method is + a linear walk to find the element, so this code would iterate much more than it needs + to. Instead, prefer: + + @verbatim + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement(); + + for( child; child; child=child->NextSiblingElement() ) + { + // do something + } + @endverbatim +*/ +class TiXmlHandle +{ +public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + TiXmlHandle( TiXmlNode* _node ) { this->node = _node; } + /// Copy constructor + TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } + TiXmlHandle operator=( const TiXmlHandle& ref ) { this->node = ref.node; return *this; } + + /// Return a handle to the first child node. + TiXmlHandle FirstChild() const; + /// Return a handle to the first child node with the given name. + TiXmlHandle FirstChild( const char * value ) const; + /// Return a handle to the first child element. + TiXmlHandle FirstChildElement() const; + /// Return a handle to the first child element with the given name. + TiXmlHandle FirstChildElement( const char * value ) const; + + /** Return a handle to the "index" child with the given name. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( const char* value, int index ) const; + /** Return a handle to the "index" child. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( int index ) const; + /** Return a handle to the "index" child element with the given name. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( const char* value, int index ) const; + /** Return a handle to the "index" child element. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( int index ) const; + + #ifdef TIXML_USE_STL + TiXmlHandle FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } + TiXmlHandle FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } + + TiXmlHandle Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } + TiXmlHandle ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } + #endif + + /** Return the handle as a TiXmlNode. This may return null. + */ + TiXmlNode* ToNode() const { return node; } + /** Return the handle as a TiXmlElement. This may return null. + */ + TiXmlElement* ToElement() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } + /** Return the handle as a TiXmlText. This may return null. + */ + TiXmlText* ToText() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } + /** Return the handle as a TiXmlUnknown. This may return null. + */ + TiXmlUnknown* ToUnknown() const { return ( ( node && node->ToUnknown() ) ? node->ToUnknown() : 0 ); } + + /** @deprecated use ToNode. + Return the handle as a TiXmlNode. This may return null. + */ + TiXmlNode* Node() const { return ToNode(); } + /** @deprecated use ToElement. + Return the handle as a TiXmlElement. This may return null. + */ + TiXmlElement* Element() const { return ToElement(); } + /** @deprecated use ToText() + Return the handle as a TiXmlText. This may return null. + */ + TiXmlText* Text() const { return ToText(); } + /** @deprecated use ToUnknown() + Return the handle as a TiXmlUnknown. This may return null. + */ + TiXmlUnknown* Unknown() const { return ToUnknown(); } + +private: + TiXmlNode* node; +}; + + +/** Print to memory functionality. The TiXmlPrinter is useful when you need to: + + -# Print to memory (especially in non-STL mode) + -# Control formatting (line endings, etc.) + + When constructed, the TiXmlPrinter is in its default "pretty printing" mode. + Before calling Accept() you can call methods to control the printing + of the XML document. After TiXmlNode::Accept() is called, the printed document can + be accessed via the CStr(), Str(), and Size() methods. + + TiXmlPrinter uses the Visitor API. + @verbatim + TiXmlPrinter printer; + printer.SetIndent( "\t" ); + + doc.Accept( &printer ); + fprintf( stdout, "%s", printer.CStr() ); + @endverbatim +*/ +class TiXmlPrinter : public TiXmlVisitor +{ +public: + TiXmlPrinter() : depth( 0 ), simpleTextPrint( false ), + buffer(), indent( " " ), lineBreak( "\n" ) {} + + virtual bool VisitEnter( const TiXmlDocument& doc ); + virtual bool VisitExit( const TiXmlDocument& doc ); + + virtual bool VisitEnter( const TiXmlElement& element, const TiXmlAttribute* firstAttribute ); + virtual bool VisitExit( const TiXmlElement& element ); + + virtual bool Visit( const TiXmlDeclaration& declaration ); + virtual bool Visit( const TiXmlText& text ); + virtual bool Visit( const TiXmlComment& comment ); + virtual bool Visit( const TiXmlUnknown& unknown ); + + /** Set the indent characters for printing. By default 4 spaces + but tab (\t) is also useful, or null/empty string for no indentation. + */ + void SetIndent( const char* _indent ) { indent = _indent ? _indent : "" ; } + /// Query the indention string. + const char* Indent() { return indent.c_str(); } + /** Set the line breaking string. By default set to newline (\n). + Some operating systems prefer other characters, or can be + set to the null/empty string for no indenation. + */ + void SetLineBreak( const char* _lineBreak ) { lineBreak = _lineBreak ? _lineBreak : ""; } + /// Query the current line breaking string. + const char* LineBreak() { return lineBreak.c_str(); } + + /** Switch over to "stream printing" which is the most dense formatting without + linebreaks. Common when the XML is needed for network transmission. + */ + void SetStreamPrinting() { indent = ""; + lineBreak = ""; + } + /// Return the result. + const char* CStr() { return buffer.c_str(); } + /// Return the length of the result string. + size_t Size() { return buffer.size(); } + + #ifdef TIXML_USE_STL + /// Return the result. + const std::string& Str() { return buffer; } + #endif + +private: + void DoIndent() { + for( int i=0; i +#include + +#include "tinyxml.h" + +//#define DEBUG_PARSER +#if defined( DEBUG_PARSER ) +# if defined( DEBUG ) && defined( _MSC_VER ) +# include +# define TIXML_LOG OutputDebugString +# else +# define TIXML_LOG printf +# endif +#endif + +// Note tha "PutString" hardcodes the same list. This +// is less flexible than it appears. Changing the entries +// or order will break putstring. +TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = +{ + { "&", 5, '&' }, + { "<", 4, '<' }, + { ">", 4, '>' }, + { """, 6, '\"' }, + { "'", 6, '\'' } +}; + +// Bunch of unicode info at: +// http://www.unicode.org/faq/utf_bom.html +// Including the basic of this table, which determines the #bytes in the +// sequence from the lead byte. 1 placed for invalid sequences -- +// although the result will be junk, pass it through as much as possible. +// Beware of the non-characters in UTF-8: +// ef bb bf (Microsoft "lead bytes") +// ef bf be +// ef bf bf + +const unsigned char TIXML_UTF_LEAD_0 = 0xefU; +const unsigned char TIXML_UTF_LEAD_1 = 0xbbU; +const unsigned char TIXML_UTF_LEAD_2 = 0xbfU; + +const int TiXmlBase::utf8ByteTable[256] = +{ + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x00 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x10 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x20 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x30 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x40 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x50 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x60 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 + 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd0 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte + 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid +}; + + +void TiXmlBase::ConvertUTF32ToUTF8( unsigned long input, char* output, int* length ) +{ + const unsigned long BYTE_MASK = 0xBF; + const unsigned long BYTE_MARK = 0x80; + const unsigned long FIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; + + if (input < 0x80) + *length = 1; + else if ( input < 0x800 ) + *length = 2; + else if ( input < 0x10000 ) + *length = 3; + else if ( input < 0x200000 ) + *length = 4; + else + { *length = 0; return; } // This code won't covert this correctly anyway. + + output += *length; + + // Scary scary fall throughs. + switch (*length) + { + case 4: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 3: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 2: + --output; + *output = (char)((input | BYTE_MARK) & BYTE_MASK); + input >>= 6; + case 1: + --output; + *output = (char)(input | FIRST_BYTE_MARK[*length]); + } +} + + +/*static*/ int TiXmlBase::IsAlpha( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) +{ + // This will only work for low-ascii, everything else is assumed to be a valid + // letter. I'm not sure this is the best approach, but it is quite tricky trying + // to figure out alhabetical vs. not across encoding. So take a very + // conservative approach. + +// if ( encoding == TIXML_ENCODING_UTF8 ) +// { + if ( anyByte < 127 ) + return isalpha( anyByte ); + else + return 1; // What else to do? The unicode set is huge...get the english ones right. +// } +// else +// { +// return isalpha( anyByte ); +// } +} + + +/*static*/ int TiXmlBase::IsAlphaNum( unsigned char anyByte, TiXmlEncoding /*encoding*/ ) +{ + // This will only work for low-ascii, everything else is assumed to be a valid + // letter. I'm not sure this is the best approach, but it is quite tricky trying + // to figure out alhabetical vs. not across encoding. So take a very + // conservative approach. + +// if ( encoding == TIXML_ENCODING_UTF8 ) +// { + if ( anyByte < 127 ) + return isalnum( anyByte ); + else + return 1; // What else to do? The unicode set is huge...get the english ones right. +// } +// else +// { +// return isalnum( anyByte ); +// } +} + + +class TiXmlParsingData +{ + friend class TiXmlDocument; + public: + void Stamp( const char* now, TiXmlEncoding encoding ); + + const TiXmlCursor& Cursor() { return cursor; } + + private: + // Only used by the document! + TiXmlParsingData( const char* start, int _tabsize, int row, int col ) + { + assert( start ); + stamp = start; + tabsize = _tabsize; + cursor.row = row; + cursor.col = col; + } + + TiXmlCursor cursor; + const char* stamp; + int tabsize; +}; + + +void TiXmlParsingData::Stamp( const char* now, TiXmlEncoding encoding ) +{ + assert( now ); + + // Do nothing if the tabsize is 0. + if ( tabsize < 1 ) + { + return; + } + + // Get the current row, column. + int row = cursor.row; + int col = cursor.col; + const char* p = stamp; + assert( p ); + + while ( p < now ) + { + // Treat p as unsigned, so we have a happy compiler. + const unsigned char* pU = (const unsigned char*)p; + + // Code contributed by Fletcher Dunn: (modified by lee) + switch (*pU) { + case 0: + // We *should* never get here, but in case we do, don't + // advance past the terminating null character, ever + return; + + case '\r': + // bump down to the next line + ++row; + col = 0; + // Eat the character + ++p; + + // Check for \r\n sequence, and treat this as a single character + if (*p == '\n') { + ++p; + } + break; + + case '\n': + // bump down to the next line + ++row; + col = 0; + + // Eat the character + ++p; + + // Check for \n\r sequence, and treat this as a single + // character. (Yes, this bizarre thing does occur still + // on some arcane platforms...) + if (*p == '\r') { + ++p; + } + break; + + case '\t': + // Eat the character + ++p; + + // Skip to next tab stop + col = (col / tabsize + 1) * tabsize; + break; + + case TIXML_UTF_LEAD_0: + if ( encoding == TIXML_ENCODING_UTF8 ) + { + if ( *(p+1) && *(p+2) ) + { + // In these cases, don't advance the column. These are + // 0-width spaces. + if ( *(pU+1)==TIXML_UTF_LEAD_1 && *(pU+2)==TIXML_UTF_LEAD_2 ) + p += 3; + else if ( *(pU+1)==0xbfU && *(pU+2)==0xbeU ) + p += 3; + else if ( *(pU+1)==0xbfU && *(pU+2)==0xbfU ) + p += 3; + else + { p +=3; ++col; } // A normal character. + } + } + else + { + ++p; + ++col; + } + break; + + default: + if ( encoding == TIXML_ENCODING_UTF8 ) + { + // Eat the 1 to 4 byte utf8 character. + int step = TiXmlBase::utf8ByteTable[*((const unsigned char*)p)]; + if ( step == 0 ) + step = 1; // Error case from bad encoding, but handle gracefully. + p += step; + + // Just advance one column, of course. + ++col; + } + else + { + ++p; + ++col; + } + break; + } + } + cursor.row = row; + cursor.col = col; + assert( cursor.row >= -1 ); + assert( cursor.col >= -1 ); + stamp = p; + assert( stamp ); +} + + +const char* TiXmlBase::SkipWhiteSpace( const char* p, TiXmlEncoding encoding ) +{ + if ( !p || !*p ) + { + return 0; + } + if ( encoding == TIXML_ENCODING_UTF8 ) + { + while ( *p ) + { + const unsigned char* pU = (const unsigned char*)p; + + // Skip the stupid Microsoft UTF-8 Byte order marks + if ( *(pU+0)==TIXML_UTF_LEAD_0 + && *(pU+1)==TIXML_UTF_LEAD_1 + && *(pU+2)==TIXML_UTF_LEAD_2 ) + { + p += 3; + continue; + } + else if(*(pU+0)==TIXML_UTF_LEAD_0 + && *(pU+1)==0xbfU + && *(pU+2)==0xbeU ) + { + p += 3; + continue; + } + else if(*(pU+0)==TIXML_UTF_LEAD_0 + && *(pU+1)==0xbfU + && *(pU+2)==0xbfU ) + { + p += 3; + continue; + } + + if ( IsWhiteSpace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. + ++p; + else + break; + } + } + else + { + while ( ( *p && IsWhiteSpace( *p ) ) || *p == '\n' || *p =='\r' ) + ++p; + } + + return p; +} + +#ifdef TIXML_USE_STL +/*static*/ bool TiXmlBase::StreamWhiteSpace( std::istream * in, TIXML_STRING * tag ) +{ + for( ;; ) + { + if ( !in->good() ) return false; + + int c = in->peek(); + // At this scope, we can't get to a document. So fail silently. + if ( !IsWhiteSpace( c ) || c <= 0 ) + return true; + + *tag += (char) in->get(); + } +} + +/*static*/ bool TiXmlBase::StreamTo( std::istream * in, int character, TIXML_STRING * tag ) +{ + //assert( character > 0 && character < 128 ); // else it won't work in utf-8 + while ( in->good() ) + { + int c = in->peek(); + if ( c == character ) + return true; + if ( c <= 0 ) // Silent failure: can't get document at this scope + return false; + + in->get(); + *tag += (char) c; + } + return false; +} +#endif + +// One of TinyXML's more performance demanding functions. Try to keep the memory overhead down. The +// "assign" optimization removes over 10% of the execution time. +// +const char* TiXmlBase::ReadName( const char* p, TIXML_STRING * name, TiXmlEncoding encoding ) +{ + // Oddly, not supported on some comilers, + //name->clear(); + // So use this: + *name = ""; + assert( p ); + + // Names start with letters or underscores. + // Of course, in unicode, tinyxml has no idea what a letter *is*. The + // algorithm is generous. + // + // After that, they can be letters, underscores, numbers, + // hyphens, or colons. (Colons are valid ony for namespaces, + // but tinyxml can't tell namespaces from names.) + if ( p && *p + && ( IsAlpha( (unsigned char) *p, encoding ) || *p == '_' ) ) + { + const char* start = p; + while( p && *p + && ( IsAlphaNum( (unsigned char ) *p, encoding ) + || *p == '_' + || *p == '-' + || *p == '.' + || *p == ':' ) ) + { + //(*name) += *p; // expensive + ++p; + } + if ( p-start > 0 ) { + name->assign( start, p-start ); + } + return p; + } + return 0; +} + +const char* TiXmlBase::GetEntity( const char* p, char* value, int* length, TiXmlEncoding encoding ) +{ + // Presume an entity, and pull it out. + TIXML_STRING ent; + int i; + *length = 0; + + if ( *(p+1) && *(p+1) == '#' && *(p+2) ) + { + unsigned long ucs = 0; + ptrdiff_t delta = 0; + unsigned mult = 1; + + if ( *(p+2) == 'x' ) + { + // Hexadecimal. + if ( !*(p+3) ) return 0; + + const char* q = p+3; + q = strchr( q, ';' ); + + if ( !q || !*q ) return 0; + + delta = q-p; + --q; + + while ( *q != 'x' ) + { + if ( *q >= '0' && *q <= '9' ) + ucs += mult * (*q - '0'); + else if ( *q >= 'a' && *q <= 'f' ) + ucs += mult * (*q - 'a' + 10); + else if ( *q >= 'A' && *q <= 'F' ) + ucs += mult * (*q - 'A' + 10 ); + else + return 0; + mult *= 16; + --q; + } + } + else + { + // Decimal. + if ( !*(p+2) ) return 0; + + const char* q = p+2; + q = strchr( q, ';' ); + + if ( !q || !*q ) return 0; + + delta = q-p; + --q; + + while ( *q != '#' ) + { + if ( *q >= '0' && *q <= '9' ) + ucs += mult * (*q - '0'); + else + return 0; + mult *= 10; + --q; + } + } + if ( encoding == TIXML_ENCODING_UTF8 ) + { + // convert the UCS to UTF-8 + ConvertUTF32ToUTF8( ucs, value, length ); + } + else + { + *value = (char)ucs; + *length = 1; + } + return p + delta + 1; + } + + // Now try to match it. + for( i=0; iappend( cArr, len ); + } + } + else + { + bool whitespace = false; + + // Remove leading white space: + p = SkipWhiteSpace( p, encoding ); + while ( p && *p + && !StringEqual( p, endTag, caseInsensitive, encoding ) ) + { + if ( *p == '\r' || *p == '\n' ) + { + whitespace = true; + ++p; + } + else if ( IsWhiteSpace( *p ) ) + { + whitespace = true; + ++p; + } + else + { + // If we've found whitespace, add it before the + // new character. Any whitespace just becomes a space. + if ( whitespace ) + { + (*text) += ' '; + whitespace = false; + } + int len; + char cArr[4] = { 0, 0, 0, 0 }; + p = GetChar( p, cArr, &len, encoding ); + if ( len == 1 ) + (*text) += cArr[0]; // more efficient + else + text->append( cArr, len ); + } + } + } + if ( p ) + p += strlen( endTag ); + return p; +} + +#ifdef TIXML_USE_STL + +void TiXmlDocument::StreamIn( std::istream * in, TIXML_STRING * tag ) +{ + // The basic issue with a document is that we don't know what we're + // streaming. Read something presumed to be a tag (and hope), then + // identify it, and call the appropriate stream method on the tag. + // + // This "pre-streaming" will never read the closing ">" so the + // sub-tag can orient itself. + + if ( !StreamTo( in, '<', tag ) ) + { + SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + while ( in->good() ) + { + int tagIndex = (int) tag->length(); + while ( in->good() && in->peek() != '>' ) + { + int c = in->get(); + if ( c <= 0 ) + { + SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + break; + } + (*tag) += (char) c; + } + + if ( in->good() ) + { + // We now have something we presume to be a node of + // some sort. Identify it, and call the node to + // continue streaming. + TiXmlNode* node = Identify( tag->c_str() + tagIndex, TIXML_DEFAULT_ENCODING ); + + if ( node ) + { + node->StreamIn( in, tag ); + bool isElement = node->ToElement() != 0; + delete node; + node = 0; + + // If this is the root element, we're done. Parsing will be + // done by the >> operator. + if ( isElement ) + { + return; + } + } + else + { + SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + } + } + // We should have returned sooner. + SetError( TIXML_ERROR, 0, 0, TIXML_ENCODING_UNKNOWN ); +} + +#endif + +const char* TiXmlDocument::Parse( const char* p, TiXmlParsingData* prevData, TiXmlEncoding encoding ) +{ + ClearError(); + + // Parse away, at the document level. Since a document + // contains nothing but other tags, most of what happens + // here is skipping white space. + if ( !p || !*p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + // Note that, for a document, this needs to come + // before the while space skip, so that parsing + // starts from the pointer we are given. + location.Clear(); + if ( prevData ) + { + location.row = prevData->cursor.row; + location.col = prevData->cursor.col; + } + else + { + location.row = 0; + location.col = 0; + } + TiXmlParsingData data( p, TabSize(), location.row, location.col ); + location = data.Cursor(); + + if ( encoding == TIXML_ENCODING_UNKNOWN ) + { + // Check for the Microsoft UTF-8 lead bytes. + const unsigned char* pU = (const unsigned char*)p; + if ( *(pU+0) && *(pU+0) == TIXML_UTF_LEAD_0 + && *(pU+1) && *(pU+1) == TIXML_UTF_LEAD_1 + && *(pU+2) && *(pU+2) == TIXML_UTF_LEAD_2 ) + { + encoding = TIXML_ENCODING_UTF8; + useMicrosoftBOM = true; + } + } + + p = SkipWhiteSpace( p, encoding ); + if ( !p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, TIXML_ENCODING_UNKNOWN ); + return 0; + } + + while ( p && *p ) + { + TiXmlNode* node = Identify( p, encoding ); + if ( node ) + { + p = node->Parse( p, &data, encoding ); + LinkEndChild( node ); + } + else + { + break; + } + + // Did we get encoding info? + if ( encoding == TIXML_ENCODING_UNKNOWN + && node->ToDeclaration() ) + { + TiXmlDeclaration* dec = node->ToDeclaration(); + const char* enc = dec->Encoding(); + assert( enc ); + + if ( *enc == 0 ) + encoding = TIXML_ENCODING_UTF8; + else if ( StringEqual( enc, "UTF-8", true, TIXML_ENCODING_UNKNOWN ) ) + encoding = TIXML_ENCODING_UTF8; + else if ( StringEqual( enc, "UTF8", true, TIXML_ENCODING_UNKNOWN ) ) + encoding = TIXML_ENCODING_UTF8; // incorrect, but be nice + else + encoding = TIXML_ENCODING_LEGACY; + } + + p = SkipWhiteSpace( p, encoding ); + } + + // Was this empty? + if ( !firstChild ) { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0, encoding ); + return 0; + } + + // All is well. + return p; +} + +void TiXmlDocument::SetError( int err, const char* pError, TiXmlParsingData* data, TiXmlEncoding encoding ) +{ + // The first error in a chain is more accurate - don't set again! + if ( error ) + return; + + assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); + error = true; + errorId = err; + errorDesc = errorString[ errorId ]; + + errorLocation.Clear(); + if ( pError && data ) + { + data->Stamp( pError, encoding ); + errorLocation = data->Cursor(); + } +} + + +TiXmlNode* TiXmlNode::Identify( const char* p, TiXmlEncoding encoding ) +{ + TiXmlNode* returnNode = 0; + + p = SkipWhiteSpace( p, encoding ); + if( !p || !*p || *p != '<' ) + { + return 0; + } + + TiXmlDocument* doc = GetDocument(); + p = SkipWhiteSpace( p, encoding ); + + if ( !p || !*p ) + { + return 0; + } + + // What is this thing? + // - Elements start with a letter or underscore, but xml is reserved. + // - Comments: "; + + if ( !StringEqual( p, startTag, false, encoding ) ) + { + document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data, encoding ); + return 0; + } + p += strlen( startTag ); + + // [ 1475201 ] TinyXML parses entities in comments + // Oops - ReadText doesn't work, because we don't want to parse the entities. + // p = ReadText( p, &value, false, endTag, false, encoding ); + // + // from the XML spec: + /* + [Definition: Comments may appear anywhere in a document outside other markup; in addition, + they may appear within the document type declaration at places allowed by the grammar. + They are not part of the document's character data; an XML processor MAY, but need not, + make it possible for an application to retrieve the text of comments. For compatibility, + the string "--" (double-hyphen) MUST NOT occur within comments.] Parameter entity + references MUST NOT be recognized within comments. + + An example of a comment: + + + */ + + value = ""; + // Keep all the white space. + while ( p && *p && !StringEqual( p, endTag, false, encoding ) ) + { + value.append( p, 1 ); + ++p; + } + if ( p ) + p += strlen( endTag ); + + return p; +} + + +const char* TiXmlAttribute::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) +{ + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p ) return 0; + +// int tabsize = 4; +// if ( document ) +// tabsize = document->TabSize(); + + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + // Read the name, the '=' and the value. + const char* pErr = p; + p = ReadName( p, &name, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data, encoding ); + return 0; + } + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p || *p != '=' ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + + ++p; // skip '=' + p = SkipWhiteSpace( p, encoding ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + + const char* end; + const char SINGLE_QUOTE = '\''; + const char DOUBLE_QUOTE = '\"'; + + if ( *p == SINGLE_QUOTE ) + { + ++p; + end = "\'"; // single quote in string + p = ReadText( p, &value, false, end, false, encoding ); + } + else if ( *p == DOUBLE_QUOTE ) + { + ++p; + end = "\""; // double quote in string + p = ReadText( p, &value, false, end, false, encoding ); + } + else + { + // All attribute values should be in single or double quotes. + // But this is such a common error that the parser will try + // its best, even without them. + value = ""; + while ( p && *p // existence + && !IsWhiteSpace( *p ) && *p != '\n' && *p != '\r' // whitespace + && *p != '/' && *p != '>' ) // tag end + { + if ( *p == SINGLE_QUOTE || *p == DOUBLE_QUOTE ) { + // [ 1451649 ] Attribute values with trailing quotes not handled correctly + // We did not have an opening quote but seem to have a + // closing one. Give up and throw an error. + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data, encoding ); + return 0; + } + value += *p; + ++p; + } + } + return p; +} + +#ifdef TIXML_USE_STL +void TiXmlText::StreamIn( std::istream * in, TIXML_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->peek(); + if ( !cdata && (c == '<' ) ) + { + return; + } + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + + (*tag) += (char) c; + in->get(); // "commits" the peek made above + + if ( cdata && c == '>' && tag->size() >= 3 ) { + size_t len = tag->size(); + if ( (*tag)[len-2] == ']' && (*tag)[len-3] == ']' ) { + // terminator of cdata. + return; + } + } + } +} +#endif + +const char* TiXmlText::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding encoding ) +{ + value = ""; + TiXmlDocument* document = GetDocument(); + + if ( data ) + { + data->Stamp( p, encoding ); + location = data->Cursor(); + } + + const char* const startTag = ""; + + if ( cdata || StringEqual( p, startTag, false, encoding ) ) + { + cdata = true; + + if ( !StringEqual( p, startTag, false, encoding ) ) + { + document->SetError( TIXML_ERROR_PARSING_CDATA, p, data, encoding ); + return 0; + } + p += strlen( startTag ); + + // Keep all the white space, ignore the encoding, etc. + while ( p && *p + && !StringEqual( p, endTag, false, encoding ) + ) + { + value += *p; + ++p; + } + + TIXML_STRING dummy; + p = ReadText( p, &dummy, false, endTag, false, encoding ); + return p; + } + else + { + bool ignoreWhite = true; + + const char* end = "<"; + p = ReadText( p, &value, ignoreWhite, end, false, encoding ); + if ( p ) + return p-1; // don't truncate the '<' + return 0; + } +} + +#ifdef TIXML_USE_STL +void TiXmlDeclaration::StreamIn( std::istream * in, TIXML_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->get(); + if ( c <= 0 ) + { + TiXmlDocument* document = GetDocument(); + if ( document ) + document->SetError( TIXML_ERROR_EMBEDDED_NULL, 0, 0, TIXML_ENCODING_UNKNOWN ); + return; + } + (*tag) += (char) c; + + if ( c == '>' ) + { + // All is well. + return; + } + } +} +#endif + +const char* TiXmlDeclaration::Parse( const char* p, TiXmlParsingData* data, TiXmlEncoding _encoding ) +{ + p = SkipWhiteSpace( p, _encoding ); + // Find the beginning, find the end, and look for + // the stuff in-between. + TiXmlDocument* document = GetDocument(); + if ( !p || !*p || !StringEqual( p, "SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0, _encoding ); + return 0; + } + if ( data ) + { + data->Stamp( p, _encoding ); + location = data->Cursor(); + } + p += 5; + + version = ""; + encoding = ""; + standalone = ""; + + while ( p && *p ) + { + if ( *p == '>' ) + { + ++p; + return p; + } + + p = SkipWhiteSpace( p, _encoding ); + if ( StringEqual( p, "version", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + version = attrib.Value(); + } + else if ( StringEqual( p, "encoding", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + encoding = attrib.Value(); + } + else if ( StringEqual( p, "standalone", true, _encoding ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data, _encoding ); + standalone = attrib.Value(); + } + else + { + // Read over whatever it is. + while( p && *p && *p != '>' && !IsWhiteSpace( *p ) ) + ++p; + } + } + return 0; +} + +bool TiXmlText::Blank() const +{ + for ( unsigned i=0; i