From e619f0501aa70a785f940e01d32e24cccc5dc0e5 Mon Sep 17 00:00:00 2001 From: guillaume Date: Fri, 25 Sep 2009 14:51:52 +0000 Subject: [PATCH] Highlight processes according to their activity. git-svn-id: svn://svn.pgadmin.org/trunk/pgadmin3@8044 a7884b65-44f6-0310-8a51-81a127f17b15 --- CHANGELOG | 1 + pgadmin/frm/frmOptions.cpp | 132 ++++++++++++++++++++++++---- pgadmin/frm/frmStatus.cpp | 44 +++++++++- pgadmin/include/frm/frmOptions.h | 5 ++ pgadmin/include/frm/frmStatus.h | 2 + pgadmin/include/utils/sysSettings.h | 10 +++ pgadmin/ui/frmOptions.xrc | 57 ++++++++++++ pgadmin/ui/xrcDialogs.cpp | 104 +++++++++++++++++++++- 8 files changed, 337 insertions(+), 18 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a73c62521..5f25ba56a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -36,6 +36,7 @@ Changes Date Dev Ver Change details ---------- --- ------ -------------- +2009-09-25 GL 1.12.0 Highlight processes according to their activity. 2009-09-24 GL 1.10.1 Reverse engineer function defaults values correctly. 2009-09-18 DP 1.10.1 Fix a potential crash in the edit grid. 2009-09-17 GL 1.12.0 Add a button to open the query tool with the query diff --git a/pgadmin/frm/frmOptions.cpp b/pgadmin/frm/frmOptions.cpp index 9c9b705d2..77ab00b7a 100644 --- a/pgadmin/frm/frmOptions.cpp +++ b/pgadmin/frm/frmOptions.cpp @@ -27,6 +27,9 @@ #include "utils/misc.h" #include "frm/menu.h" +// Must be after pgAdmin3.h or MSVC++ complains +#include + #include "images/properties.xpm" #define nbOptions CTRL_NOTEBOOK("nbOptions") @@ -65,23 +68,35 @@ #define lstDisplay CTRL_CHECKLISTBOX("lstDisplay") #define chkSystemObjects CTRL_CHECKBOX("chkSystemObjects") #define chkIgnoreVersion CTRL_CHECKBOX("chkIgnoreVersion") +#define txtIdleProcessColour CTRL_TEXT("txtIdleProcessColour") +#define btnIdleProcessColour CTRL_BUTTON("btnIdleProcessColour") +#define txtActiveProcessColour CTRL_TEXT("txtActiveProcessColour") +#define btnActiveProcessColour CTRL_BUTTON("btnActiveProcessColour") +#define txtSlowProcessColour CTRL_TEXT("txtSlowProcessColour") +#define btnSlowProcessColour CTRL_BUTTON("btnSlowProcessColour") +#define txtBlockedProcessColour CTRL_TEXT("txtBlockedProcessColour") +#define btnBlockedProcessColour CTRL_BUTTON("btnBlockedProcessColour") BEGIN_EVENT_TABLE(frmOptions, pgDialog) - EVT_MENU(MNU_HELP, frmOptions::OnHelp) - EVT_BUTTON (XRCID("btnFont"), frmOptions::OnFontSelect) - EVT_BUTTON (XRCID("btnSqlFont"), frmOptions::OnSqlFontSelect) - EVT_BUTTON (XRCID("btnBrowseLogfile"), frmOptions::OnBrowseLogFile) - EVT_BUTTON (XRCID("btnSlonyPath"), frmOptions::OnSlonyPathSelect) - EVT_BUTTON (XRCID("btnPostgresqlPath"), frmOptions::OnPostgresqlPathSelect) - EVT_BUTTON (XRCID("btnEnterprisedbPath"), frmOptions::OnEnterprisedbPathSelect) - EVT_BUTTON (XRCID("btnGPDBPath"), frmOptions::OnGPDBPathSelect) - EVT_BUTTON (XRCID("btnDefault"), frmOptions::OnDefault) - EVT_CHECKBOX(XRCID("chkSuppressHints"), frmOptions::OnSuppressHints) - EVT_CHECKBOX(XRCID("chkResetHints"), frmOptions::OnResetHints) - EVT_BUTTON (wxID_OK, frmOptions::OnOK) - EVT_BUTTON (wxID_HELP, frmOptions::OnHelp) - EVT_BUTTON (wxID_CANCEL, frmOptions::OnCancel) - EVT_COMBOBOX(XRCID("cbCopyQuote"), frmOptions::OnChangeCopyQuote) + EVT_MENU(MNU_HELP, frmOptions::OnHelp) + EVT_BUTTON (XRCID("btnFont"), frmOptions::OnFontSelect) + EVT_BUTTON (XRCID("btnSqlFont"), frmOptions::OnSqlFontSelect) + EVT_BUTTON (XRCID("btnBrowseLogfile"), frmOptions::OnBrowseLogFile) + EVT_BUTTON (XRCID("btnSlonyPath"), frmOptions::OnSlonyPathSelect) + EVT_BUTTON (XRCID("btnPostgresqlPath"), frmOptions::OnPostgresqlPathSelect) + EVT_BUTTON (XRCID("btnEnterprisedbPath"), frmOptions::OnEnterprisedbPathSelect) + EVT_BUTTON (XRCID("btnGPDBPath"), frmOptions::OnGPDBPathSelect) + EVT_BUTTON (XRCID("btnDefault"), frmOptions::OnDefault) + EVT_CHECKBOX(XRCID("chkSuppressHints"), frmOptions::OnSuppressHints) + EVT_CHECKBOX(XRCID("chkResetHints"), frmOptions::OnResetHints) + EVT_BUTTON (wxID_OK, frmOptions::OnOK) + EVT_BUTTON (wxID_HELP, frmOptions::OnHelp) + EVT_BUTTON (wxID_CANCEL, frmOptions::OnCancel) + EVT_COMBOBOX(XRCID("cbCopyQuote"), frmOptions::OnChangeCopyQuote) + EVT_BUTTON(XRCID("btnIdleProcessColour"), frmOptions::OnChooseIdleProcessColour) + EVT_BUTTON(XRCID("btnActiveProcessColour"), frmOptions::OnChooseActiveProcessColour) + EVT_BUTTON(XRCID("btnSlowProcessColour"), frmOptions::OnChooseSlowProcessColour) + EVT_BUTTON(XRCID("btnBlockedProcessColour"), frmOptions::OnChooseBlockedProcessColour) END_EVENT_TABLE() frmOptions::frmOptions(frmMain *parent) @@ -144,6 +159,12 @@ frmOptions::frmOptions(frmMain *parent) txtGPDBPath->SetValue(settings->GetGPDBPath()); chkIgnoreVersion->SetValue(settings->GetIgnoreVersion()); + // Get back the colours + txtIdleProcessColour->SetValue(settings->GetIdleProcessColour()); + txtActiveProcessColour->SetValue(settings->GetActiveProcessColour()); + txtSlowProcessColour->SetValue(settings->GetSlowProcessColour()); + txtBlockedProcessColour->SetValue(settings->GetBlockedProcessColour()); + cbLanguage->Append(_("Default")); int sel=0; wxLanguage langId=settings->GetCanonicalLanguage(); @@ -483,6 +504,28 @@ void frmOptions::OnOK(wxCommandEvent &ev) settings->SetShowSystemObjects(chkSystemObjects->GetValue()); } + // Change the status colours + if (txtIdleProcessColour->GetValue() != settings->GetIdleProcessColour()) + { + changed = true; + settings->SetIdleProcessColour(CheckColour(txtIdleProcessColour->GetValue().Trim())); + } + if (txtActiveProcessColour->GetValue() != settings->GetActiveProcessColour()) + { + changed = true; + settings->SetActiveProcessColour(CheckColour(txtActiveProcessColour->GetValue().Trim())); + } + if (txtSlowProcessColour->GetValue() != settings->GetSlowProcessColour()) + { + changed = true; + settings->SetSlowProcessColour(CheckColour(txtSlowProcessColour->GetValue().Trim())); + } + if (txtBlockedProcessColour->GetValue() != settings->GetBlockedProcessColour()) + { + changed = true; + settings->SetBlockedProcessColour(CheckColour(txtBlockedProcessColour->GetValue().Trim())); + } + // Change the language last, as it will affect our tests for changes // in the display object types. int langNo=cbLanguage->GetCurrentSelection(); @@ -555,6 +598,46 @@ void frmOptions::OnBrowseLogFile(wxCommandEvent &ev) } +void frmOptions::OnChooseIdleProcessColour(wxCommandEvent &ev) +{ + wxColourDialog dlg( NULL ); + if ( dlg.ShowModal() == wxID_OK ) + { + txtIdleProcessColour->SetValue(dlg.GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX)); + } +} + + +void frmOptions::OnChooseActiveProcessColour(wxCommandEvent &ev) +{ + wxColourDialog dlg( NULL ); + if ( dlg.ShowModal() == wxID_OK ) + { + txtActiveProcessColour->SetValue(dlg.GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX)); + } +} + + +void frmOptions::OnChooseSlowProcessColour(wxCommandEvent &ev) +{ + wxColourDialog dlg( NULL ); + if ( dlg.ShowModal() == wxID_OK ) + { + txtSlowProcessColour->SetValue(dlg.GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX)); + } +} + + +void frmOptions::OnChooseBlockedProcessColour(wxCommandEvent &ev) +{ + wxColourDialog dlg( NULL ); + if ( dlg.ShowModal() == wxID_OK ) + { + txtBlockedProcessColour->SetValue(dlg.GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX)); + } +} + + optionsFactory::optionsFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar) : actionFactory(list) { mnu->Append(id, _("&Options..."), _("Show options dialog.")); @@ -576,3 +659,22 @@ void frmOptions::OnChangeCopyQuote(wxCommandEvent& WXUNUSED(ev)) else cbCopyQuoteChar->Enable(); } + + +wxString frmOptions::CheckColour(wxString oldColour) +{ + wxString newColour = wxEmptyString; + + if (oldColour != wxEmptyString) + { + wxColour colour; + + if (colour.Set(oldColour)) + newColour = colour.GetAsString(wxC2S_HTML_SYNTAX); + else + wxLogError(_("The colour specified is not valid.")); + } + + return newColour; +} + diff --git a/pgadmin/frm/frmStatus.cpp b/pgadmin/frm/frmStatus.cpp index ce220e1f7..fed6eaf94 100644 --- a/pgadmin/frm/frmStatus.cpp +++ b/pgadmin/frm/frmStatus.cpp @@ -54,6 +54,7 @@ BEGIN_EVENT_TABLE(frmStatus, pgFrame) EVT_MENU(MNU_LOGPAGE, frmStatus::OnToggleLogPane) EVT_MENU(MNU_TOOLBAR, frmStatus::OnToggleToolBar) EVT_MENU(MNU_DEFAULTVIEW, frmStatus::OnDefaultView) + EVT_MENU(MNU_HIGHLIGHTSTATUS, frmStatus::OnHighlightStatus) EVT_AUI_PANE_CLOSE( frmStatus::OnPaneClose) @@ -148,6 +149,8 @@ wxString frmStatus::rateToCboString(int rate) frmStatus::frmStatus(frmMain *form, const wxString& _title, pgConn *conn) : pgFrame(NULL, _title) { + bool highlight = false; + dlgName = wxT("frmStatus"); loaded = false; @@ -194,6 +197,7 @@ frmStatus::frmStatus(frmMain *form, const wxString& _title, pgConn *conn) : pgFr viewMenu->Append(MNU_LOGPAGE, _("Log&file\tCtrl-Alt-F"), _("Show or hide the logfile tab."), wxITEM_CHECK); viewMenu->AppendSeparator(); viewMenu->Append(MNU_TOOLBAR, _("Tool&bar\tCtrl-Alt-B"), _("Show or hide the toolbar."), wxITEM_CHECK); + viewMenu->Append(MNU_HIGHLIGHTSTATUS, _("Highlight items of the activity list"), _("Highlight or not the items of the activity list."), wxITEM_CHECK); viewMenu->AppendSeparator(); viewMenu->Append(MNU_DEFAULTVIEW, _("&Default view\tCtrl-Alt-V"), _("Restore the default view.")); @@ -285,6 +289,10 @@ frmStatus::frmStatus(frmMain *form, const wxString& _title, pgConn *conn) : pgFr viewMenu->Check(MNU_XACTPAGE, manager.GetPane(wxT("Transactions")).IsShown()); viewMenu->Check(MNU_LOGPAGE, manager.GetPane(wxT("Logfile")).IsShown()); viewMenu->Check(MNU_TOOLBAR, manager.GetPane(wxT("toolBar")).IsShown()); + + // Read the highlight status checkbox + settings->Read(wxT("frmStatus/HighlightStatus"), &highlight, true); + viewMenu->Check(MNU_HIGHLIGHTSTATUS, highlight); // Get our PID backend_pid = connection->GetBackendPID(); @@ -313,6 +321,9 @@ frmStatus::~frmStatus() settings->Write(wxT("frmStatus/Perspective-") + VerFromRev(FRMSTATUS_PERSPECTIVE_VER), manager.SavePerspective()); manager.UnInit(); SavePosition(); + + // Save the highlight status checkbox + settings->Write(wxT("frmStatus/HighlightStatus"), viewMenu->IsChecked(MNU_HIGHLIGHTSTATUS)); // For each current page, save the slider's position and delete the timer settings->Write(wxT("frmStatus/RefreshStatusRate"), statusRate); @@ -909,6 +920,14 @@ void frmStatus::OnDefaultView(wxCommandEvent& event) } +void frmStatus::OnHighlightStatus(wxCommandEvent& event) +{ + wxTimerEvent evt; + + OnRefreshStatusTimer(evt); +} + + void frmStatus::OnHelp(wxCommandEvent& event) { wxString page; @@ -1029,7 +1048,11 @@ void frmStatus::OnRefreshStatusTimer(wxTimerEvent &event) connection->ExecuteVoid(wxT("SET log_statement='none';SET log_duration='off';"),false); long row=0; - pgSet *dataSet1=connection->ExecuteSet(wxT("SELECT *,(SELECT min(pid) FROM pg_locks l1 WHERE GRANTED AND relation IN (SELECT relation FROM pg_locks l2 WHERE l2.pid=procpid AND NOT granted)) AS blockedby FROM pg_stat_activity ORDER BY procpid")); + pgSet *dataSet1=connection->ExecuteSet(wxT("SELECT *, ") + wxT("CASE WHEN query_start IS NULL THEN false ELSE query_start + '10 seconds'::interval > now() END AS slowquery, ") + wxT("(SELECT min(pid) FROM pg_locks l1 WHERE GRANTED AND relation IN ") + wxT("(SELECT relation FROM pg_locks l2 WHERE l2.pid=procpid AND NOT granted)) AS blockedby ") + wxT("FROM pg_stat_activity ORDER BY procpid")); if (dataSet1) { statusList->Freeze(); @@ -1083,6 +1106,25 @@ void frmStatus::OnRefreshStatusTimer(wxTimerEvent &event) statusList->SetItem(row, colpos++, dataSet1->GetVal(wxT("blockedby"))); statusList->SetItem(row, colpos, qry); + + // Colorize the new line + if (viewMenu->IsChecked(MNU_HIGHLIGHTSTATUS)) + { + statusList->SetItemBackgroundColour(row, + wxColour(settings->GetActiveProcessColour())); + if (qry == wxT("")) + statusList->SetItemBackgroundColour(row, + wxColour(settings->GetIdleProcessColour())); + if (dataSet1->GetVal(wxT("blockedby")).Length() > 0) + statusList->SetItemBackgroundColour(row, + wxColour(settings->GetBlockedProcessColour())); + if (dataSet1->GetBool(wxT("slowquery"))) + statusList->SetItemBackgroundColour(row, + wxColour(settings->GetSlowProcessColour())); + } + else + statusList->SetItemBackgroundColour(row, *wxWHITE); + row++; } dataSet1->MoveNext(); diff --git a/pgadmin/include/frm/frmOptions.h b/pgadmin/include/frm/frmOptions.h index 3951c8dfa..b210ab2bc 100644 --- a/pgadmin/include/frm/frmOptions.h +++ b/pgadmin/include/frm/frmOptions.h @@ -48,6 +48,11 @@ private: void OnSuppressHints(wxCommandEvent &ev); void OnResetHints(wxCommandEvent &ev); void OnChangeCopyQuote(wxCommandEvent &ev); + void OnChooseIdleProcessColour(wxCommandEvent&); + void OnChooseActiveProcessColour(wxCommandEvent&); + void OnChooseSlowProcessColour(wxCommandEvent&); + void OnChooseBlockedProcessColour(wxCommandEvent&); + wxString CheckColour(wxString colour); DECLARE_EVENT_TABLE() }; diff --git a/pgadmin/include/frm/frmStatus.h b/pgadmin/include/frm/frmStatus.h index 8dfe70be5..cd6876141 100644 --- a/pgadmin/include/frm/frmStatus.h +++ b/pgadmin/include/frm/frmStatus.h @@ -48,6 +48,7 @@ enum MNU_COMMIT, MNU_ROLLBACK, MNU_COPY_QUERY, + MNU_HIGHLIGHTSTATUS, TIMER_REFRESHUI_ID, TIMER_STATUS_ID, TIMER_LOCKS_ID, @@ -147,6 +148,7 @@ private: void OnToggleLogPane(wxCommandEvent& event); void OnToggleToolBar(wxCommandEvent& event); void OnDefaultView(wxCommandEvent& event); + void OnHighlightStatus(wxCommandEvent& event); void OnRefreshUITimer(wxTimerEvent &event); void OnRefreshStatusTimer(wxTimerEvent &event); diff --git a/pgadmin/include/utils/sysSettings.h b/pgadmin/include/utils/sysSettings.h index 794d6896e..05cf68b95 100644 --- a/pgadmin/include/utils/sysSettings.h +++ b/pgadmin/include/utils/sysSettings.h @@ -121,6 +121,16 @@ public: int GetLineEndingType() const { int i; Read(wxT("LineEndingType"), &i, 2); return i; } void SetLineEndingType(const int newval) { Write(wxT("LineEndingType"), newval); } + // Status Colours options + wxString GetIdleProcessColour() const { wxString s; Read(wxT("IdleProcessColour"), &s, wxT("#5fa4d9")); return s; } + void SetIdleProcessColour(const wxString &newval) { Write(wxT("IdleProcessColour"), newval); } + wxString GetActiveProcessColour() const { wxString s; Read(wxT("ActiveProcessColour"), &s, wxT("#5fd95f")); return s; } + void SetActiveProcessColour(const wxString &newval) { Write(wxT("ActiveProcessColour"), newval); } + wxString GetSlowProcessColour() const { wxString s; Read(wxT("SlowProcessColour"), &s, wxT("#d9a75f")); return s; } + void SetSlowProcessColour(const wxString &newval) { Write(wxT("SlowProcessColour"), newval); } + wxString GetBlockedProcessColour() const { wxString s; Read(wxT("BlockedProcessColour"), &s, wxT("#d96e5f")); return s; } + void SetBlockedProcessColour(const wxString &newval) { Write(wxT("BlockedProcessColour"), newval); } + // Misc options long GetAutoRowCountThreshold() const { long l; Read(wxT("AutoRowCount"), &l, 2000L); return l; } void SetAutoRowCountThreshold(const long newval) { Write(wxT("AutoRowCount"), newval); } diff --git a/pgadmin/ui/frmOptions.xrc b/pgadmin/ui/frmOptions.xrc index f87b301bb..6197890f8 100644 --- a/pgadmin/ui/frmOptions.xrc +++ b/pgadmin/ui/frmOptions.xrc @@ -320,6 +320,63 @@ + + + + + + 5,5d + + + 100,5d + 50,12d + + + + 170,5d + 20,12d + + + + 5,22d + + + 100,22d + 50,12d + + + + 170,22d + 20,12d + + + + 5,39d + + + 100,39d + 50,12d + + + + 170,39d + 20,12d + + + + 5,56d + + + 100,56d + 50,12d + + + + 170,56d + 20,12d + + + diff --git a/pgadmin/ui/xrcDialogs.cpp b/pgadmin/ui/xrcDialogs.cpp index 2c98ed05e..e354e35a0 100644 --- a/pgadmin/ui/xrcDialogs.cpp +++ b/pgadmin/ui/xrcDialogs.cpp @@ -25147,7 +25147,7 @@ static unsigned char xml_res_file_64[] = { 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}; -static size_t xml_res_size_65 = 14931; +static size_t xml_res_size_65 = 17071; static unsigned char xml_res_file_65[] = { 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,73,83,79,45,56,56,53,57,45,49,34,63,62, @@ -25704,7 +25704,107 @@ static unsigned char xml_res_file_65[] = { 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,110,111,116,101,98,111,111,107,112,97,103,101,34,62, -10,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,76,111,103,103,105,110, +10,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,83,116,97,116,117,115, +32,87,105,110,100,111,119,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,80, +97,110,101,108,34,32,110,97,109,101,61,34,112,110,108,83,116,97,116,117, +115,87,105,110,100,111,119,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,119,120,83,116,97,116,105, +99,84,101,120,116,34,32,110,97,109,101,61,34,115,116,73,100,108,101,80, +114,111,99,101,115,115,67,111,108,111,117,114,34,62,10,32,32,32,32,32,32, +32,32,32,32,32,32,60,108,97,98,101,108,62,73,100,108,101,32,80,114,111, +99,101,115,115,32,67,111,108,111,117,114,60,47,108,97,98,101,108,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,60,112,111,115,62,53,44,53,100,60,47, +112,111,115,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,84,101,120,116,67,116,114,108,34,32,110,97, +109,101,61,34,116,120,116,73,100,108,101,80,114,111,99,101,115,115,67,111, +108,111,117,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,112,111, +115,62,49,48,48,44,53,100,60,47,112,111,115,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,60,115,105,122,101,62,53,48,44,49,50,100,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,119,120,66,117,116,116,111,110,34,32,110,97,109,101,61,34, +98,116,110,73,100,108,101,80,114,111,99,101,115,115,67,111,108,111,117, +114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62, +46,46,46,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32, +32,60,112,111,115,62,49,55,48,44,53,100,60,47,112,111,115,62,10,32,32,32, +32,32,32,32,32,32,32,32,32,60,115,105,122,101,62,50,48,44,49,50,100,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,119,120,83,116,97,116,105,99,84,101,120,116, +34,32,110,97,109,101,61,34,115,116,65,99,116,105,118,101,80,114,111,99, +101,115,115,67,111,108,111,117,114,34,62,10,32,32,32,32,32,32,32,32,32, +32,32,32,60,108,97,98,101,108,62,65,99,116,105,118,101,32,80,114,111,99, +101,115,115,32,67,111,108,111,117,114,60,47,108,97,98,101,108,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,60,112,111,115,62,53,44,50,50,100,60,47, +112,111,115,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,84,101,120,116,67,116,114,108,34,32,110,97, +109,101,61,34,116,120,116,65,99,116,105,118,101,80,114,111,99,101,115,115, +67,111,108,111,117,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60, +112,111,115,62,49,48,48,44,50,50,100,60,47,112,111,115,62,10,32,32,32,32, +32,32,32,32,32,32,32,32,60,115,105,122,101,62,53,48,44,49,50,100,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,119,120,66,117,116,116,111,110,34,32,110,97,109, +101,61,34,98,116,110,65,99,116,105,118,101,80,114,111,99,101,115,115,67, +111,108,111,117,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,108, +97,98,101,108,62,46,46,46,60,47,108,97,98,101,108,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,60,112,111,115,62,49,55,48,44,50,50,100,60,47,112, +111,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115,105,122,101,62, +50,48,44,49,50,100,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,119,120,83,116,97,116, +105,99,84,101,120,116,34,32,110,97,109,101,61,34,115,116,83,108,111,119, +80,114,111,99,101,115,115,67,111,108,111,117,114,34,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,60,108,97,98,101,108,62,83,108,111,119,32,80,114,111, +99,101,115,115,32,67,111,108,111,117,114,60,47,108,97,98,101,108,62,10, +32,32,32,32,32,32,32,32,32,32,32,32,60,112,111,115,62,53,44,51,57,100,60, +47,112,111,115,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,84,101,120,116,67,116,114,108,34,32,110, +97,109,101,61,34,116,120,116,83,108,111,119,80,114,111,99,101,115,115,67, +111,108,111,117,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,112, +111,115,62,49,48,48,44,51,57,100,60,47,112,111,115,62,10,32,32,32,32,32, +32,32,32,32,32,32,32,60,115,105,122,101,62,53,48,44,49,50,100,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,119,120,66,117,116,116,111,110,34,32,110,97,109,101, +61,34,98,116,110,83,108,111,119,80,114,111,99,101,115,115,67,111,108,111, +117,114,34,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108, +62,46,46,46,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,32,32,32, +32,32,60,112,111,115,62,49,55,48,44,51,57,100,60,47,112,111,115,62,10,32, +32,32,32,32,32,32,32,32,32,32,32,60,115,105,122,101,62,50,48,44,49,50,100, +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,119,120,83,116,97,116,105,99,84,101,120, +116,34,32,110,97,109,101,61,34,115,116,66,108,111,99,107,101,100,80,114, +111,99,101,115,115,67,111,108,111,117,114,34,62,10,32,32,32,32,32,32,32, +32,32,32,32,32,60,108,97,98,101,108,62,66,108,111,99,107,101,100,32,80, +114,111,99,101,115,115,32,67,111,108,111,117,114,60,47,108,97,98,101,108, +62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,112,111,115,62,53,44,53,54, +100,60,47,112,111,115,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,84,101,120,116,67,116,114,108,34, +32,110,97,109,101,61,34,116,120,116,66,108,111,99,107,101,100,80,114,111, +99,101,115,115,67,111,108,111,117,114,34,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,60,112,111,115,62,49,48,48,44,53,54,100,60,47,112,111,115,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,60,115,105,122,101,62,53,48,44,49, +50,100,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,119,120,66,117,116,116,111,110,34, +32,110,97,109,101,61,34,98,116,110,66,108,111,99,107,101,100,80,114,111, +99,101,115,115,67,111,108,111,117,114,34,62,10,32,32,32,32,32,32,32,32, +32,32,32,32,60,108,97,98,101,108,62,46,46,46,60,47,108,97,98,101,108,62, +10,32,32,32,32,32,32,32,32,32,32,32,32,60,112,111,115,62,49,55,48,44,53, +54,100,60,47,112,111,115,62,10,32,32,32,32,32,32,32,32,32,32,32,32,60,115, +105,122,101,62,50,48,44,49,50,100,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,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,110,111,116,101,98,111,111,107,112,97,103,101,34,62,10, +32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,76,111,103,103,105,110, 103,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,80,97,110,101,108,34,32,110, 97,109,101,61,34,112,110,108,76,111,103,103,105,110,103,34,62,10,32,32, -- 2.39.5