multicolumns sort query result, vacuum opt

Add multicolumns sort
Vacuum opt and reindex opt
This commit is contained in:
levinsv 2020-04-11 20:55:49 +05:00
parent 4e01ba92c4
commit ae8ca667e7
10 changed files with 478 additions and 125 deletions

View file

@ -70,9 +70,12 @@ This text Russian language.
10.09.2019
Окно Server Status
* иправлено падение окна Server Status при аварийном завершении СУБД
* исправлено падение окна Server Status при аварийном завершении СУБД
- добавлена расцветка процессов которые блокируют другие процессы
Окно Query
- добавлен фильтр в окно результатов запроса. Активируется двойным щелчком мыши по ячейке, текст которой и будет являтся условием фильтра. Снимается из контекстного меню.
При нажатом Alt условие отбора инвертируется (Скрыть строки содержащие значение).
- Для избегания ожиданий при получении информации об объектах. Выставляется клиентский параметр SET lock_timeout=15000 для служебного соединения.
@ -95,6 +98,20 @@ This text Russian language.
- добавлен вывод CREATE STATISTICS для таблиц
* исправлен вывод SQL команды для создания задания для комманд заданных в виде массива
28.03.2020
- добавлена информация о фрагментации таблицы (cfs_fragmentation)
* убрано предупреждение о версии сервера
11.04.2020
- добавлена многоколоночная сортировка результатов выполнения запроса. Порядок сортировки колонок и направление отмечается цветными индикаторами (RED,YELLOW,GREEN,BLUE,GREY).
Максимальное число колонок сортировки 5. Для выполнения сортировки нужно щелкнуть по заголовку колонки удерживая клавишу Alt.
- добавлены новые опции для Vaccum ( DISABLE_PAGE_SKIPPING ) и Reindex ( CONCURRENTLY )
* ускорена работа фильтра в окне результав запроса.

Binary file not shown.

View file

@ -20,7 +20,7 @@
#include "utils/sysSettings.h"
#include "frm/frmExport.h"
#include <wx/regex.h>
#include "ctl/ctlSQLResult.h"
#define EXTRAEXTENT_HEIGHT 6
#define EXTRAEXTENT_WIDTH 6
@ -56,10 +56,94 @@ ctlSQLGrid::ctlSQLGrid(wxWindow *parent, wxWindowID id, const wxPoint &pos, cons
SetDefaultCellOverflow(false);
//SetDefaultRenderer(new wxGridCellAutoWrapStringRenderer);
SetDefaultRenderer(new CursorCellRenderer);
//SetUseNativeColLabels(true);
//UseNativeColHeader(true);
grp=NULL;
Connect(wxID_ANY, wxEVT_GRID_LABEL_LEFT_DCLICK, wxGridEventHandler(ctlSQLGrid::OnLabelDoubleClick));
}
#include "wx/renderer.h"
#include "wx/headerctrl.h"
void ctlSQLGrid::DrawColLabel( wxDC& dc, int col ) {
wxGrid::DrawColLabel(dc,col);
int colLeft = GetColLeft(col);
wxRect rect(colLeft, 0, GetColWidth(col), m_colLabelHeight);
sqlResultTable *t=(sqlResultTable *)GetTable();
wxHeaderSortIconType sortArrow=t->getSortColumn(col)!=0
? t->getSortColumn(col)>0
? wxHDR_SORT_ICON_UP
: wxHDR_SORT_ICON_DOWN
: wxHDR_SORT_ICON_NONE;
if (sortArrow != wxHDR_SORT_ICON_NONE )
{
wxRect ar = rect;
// make a rect for the arrow
ar.height = 4;
ar.width = 8;
ar.y += (rect.height - ar.height)/2;
ar.x = ar.x + rect.width - 3*ar.width/2;
int arrowSpace = 0;
arrowSpace = 3*ar.width/2; // space to preserve when drawing the label
wxPoint triPt[3];
if ( sortArrow & wxHDR_SORT_ICON_UP )
{
triPt[0].x = ar.width / 2;
triPt[0].y = 0;
triPt[1].x = ar.width;
triPt[1].y = ar.height;
triPt[2].x = 0;
triPt[2].y = ar.height;
}
else
{
triPt[0].x = 0;
triPt[0].y = 0;
triPt[1].x = ar.width;
triPt[1].y = 0;
triPt[2].x = ar.width / 2;
triPt[2].y = ar.height;
}
wxColour c;
c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW);
for (int k=0;k<MAX_COL_SORT;k++) {
int cl=t->colsortnumber[k];
if (cl!=-1) {
if (cl==col) {
if (k==0) c=wxColor(155,17,48); // red
if (k==1) c=wxColor(255,255,0); // yellow
if (k==2) c=wxColor(34,199,76); // green
if (k==3) c=wxColor(12,38,160); // blue
}
} else break;
}
wxDCPenChanger setPen(dc, c);
wxDCBrushChanger setBrush(dc, c);
wxDCClipper clip(dc, rect);
dc.DrawPolygon( 3, triPt, ar.x, ar.y);
}
//wxRendererNative::Get().DrawHeaderButton
// (m_colWindow,
// //GetColLabelWindow(),
// dc,
// rect,
// 0,
// IsSortingBy(col)
// ? IsSortOrderAscending()
// ? wxHDR_SORT_ICON_UP
// : wxHDR_SORT_ICON_DOWN
// : wxHDR_SORT_ICON_NONE
// );
}
void ctlSQLGrid::OnGridColSize(wxGridSizeEvent &event)
{
@ -429,8 +513,15 @@ void ctlSQLGrid::OnLabelClick(wxGridEvent &event)
grp->VisibleGroup(row,GetRowSize(row+1)==0);
return;
}
if ( col >= 0 && (event.AltDown() ) )
{
// continue for sort event
sqlResultTable *t=(sqlResultTable *)GetTable();
t->setSortColumn(col);
return;
}
// add support for (de)selecting multiple rows and cols with Control pressed
if ( row >= 0 && (event.ControlDown() || event.CmdDown()) )
else if ( row >= 0 && (event.ControlDown() || event.CmdDown()) )
{
if (GetSelectedRows().Index(row) == wxNOT_FOUND)
SelectRow(row, true);
@ -443,6 +534,7 @@ void ctlSQLGrid::OnLabelClick(wxGridEvent &event)
SelectCol(col, true);
else
DeselectCol(col);
event.Skip();
}
else
event.Skip();

View file

@ -30,11 +30,12 @@ ctlSQLResult::ctlSQLResult(wxWindow *parent, pgConn *_conn, wxWindowID id, const
thread = NULL;
SetTable(new sqlResultTable(), true);
EnableEditing(false);
SetSizer(new wxBoxSizer(wxVERTICAL));
cg=GetGridLineColour();
Connect(wxID_ANY, wxEVT_GRID_RANGE_SELECT, wxGridRangeSelectEventHandler(ctlSQLResult::OnGridSelect));
Connect(wxID_ANY, wxEVT_GRID_COL_SORT, wxGridEventHandler(ctlSQLResult::OnGridColSort));
}
@ -179,7 +180,6 @@ void ctlSQLResult::DisplayData(bool single)
*/
wxGridTableMessage *msg;
sqlResultTable *table = (sqlResultTable *)GetTable();
msg = new wxGridTableMessage(table, wxGRIDTABLE_NOTIFY_ROWS_DELETED, 0, GetNumberRows());
ProcessTableMessage(*msg);
@ -193,6 +193,7 @@ void ctlSQLResult::DisplayData(bool single)
msg = new wxGridTableMessage(table, wxGRIDTABLE_NOTIFY_COLS_APPENDED, thread->DataSet()->NumCols());
ProcessTableMessage(*msg);
delete msg;
table->initSort();
if (NumRows()<1000) {
for(int row = 0; row < NumRows(); ++row) {
if (row%2==0) {
@ -318,14 +319,17 @@ wxString ctlSQLResult::OnGetItemText(long item, long col) const
}
if (item >= 0)
{
thread->DataSet()->Locate(item + 1);
return thread->DataSet()->GetVal(col);
//thread->DataSet()->Locate(item + 1);
//return thread->DataSet()->GetVal(col);
sqlResultTable *t=(sqlResultTable *)GetTable();
return t->GetValueFast(item,col);
}
else
return thread->DataSet()->ColName(col);
}
return wxEmptyString;
}
wxString ctlSQLResult::SummaryColumn()
{
//ce=cells.Item(0);
@ -404,6 +408,11 @@ wxString ctlSQLResult::SummaryColumn()
result.Printf(wxT("%f"), sum);
return result;
}
void ctlSQLResult::OnGridColSort(wxGridEvent& event)
{
const int col = event.GetCol();
//m_table->Sort(col, !(m_grid->IsSortingBy(col) && m_grid->IsSortOrderAscending()));
}
void ctlSQLResult::OnGridSelect(wxGridRangeSelectEvent &event)
{
@ -413,7 +422,7 @@ void ctlSQLResult::ClearFilter()
{
size_t numRows = GetNumberRows();
int sizerow=GetDefaultRowSize();
for (int i = 0 ; i < numRows; i++)
for (size_t i = 0 ; i < numRows; i++)
{
if (GetRowSize(i)>0) continue;
//SetRowSize(i,sizerow);
@ -424,18 +433,23 @@ void ctlSQLResult::ClearFilter()
}
wxString ctlSQLResult::SetFilter(int row,int col,bool reverse)
{
wxString fltval=GetCellValue(row,col);
wxString result=wxEmptyString;
sqlResultTable *t=(sqlResultTable *)GetTable();
if (!(thread && thread->DataValid())) {result.Printf(wxT("Error thread not valid"));return result; }
//wxString fltval=GetCellValue(row,col);
wxString fltval=t->GetValueFast(row,col);
wxString text;
bool eq;
size_t numRows = GetNumberRows();
int all=0,show=0,hide=0;
for (int i = 0 ; i < numRows; i++)
for (size_t i = 0 ; i < numRows; i++)
{
//str.Append(GetExportLine(i, cols));
//SetRowSize(i,sizerow);
if (GetRowSize(i)==0) continue;
eq=(fltval==GetCellValue(i, col));
eq=(fltval==t->GetValueFast(i,col));
if (reverse) eq=!eq;
if (!eq) {
HideRow(i);
@ -445,18 +459,173 @@ wxString ctlSQLResult::SetFilter(int row,int col,bool reverse)
}
SetGridLineColour(wxColor(0,0,255));
wxString result;
result.Printf(wxT("Show rows:%d hide:%d all:%d"), show,hide,all);
return result;
}
#include <map>
int sqlResultTable::sortColumns()
{
bool no_sort=colsortnumber[0]==-1;
if (!maplines) {
maplines = new int[GetNumberRows()];
for(int i=0;i<GetNumberRows();i++) maplines[i]=i;
}
if (no_sort) {
for(int i=0;i<GetNumberRows();i++) maplines[i]=i;
use_map=true;
return 0;
}
use_map=false;
int *cols[MAX_COL_SORT];
for (int i=0;i<MAX_COL_SORT;i++) cols[i]=NULL;
int col;
for (int k=0;k<MAX_COL_SORT;k++) {
col=colsortnumber[k];
if (col!=-1) {
if (thread && thread->DataSet()->ColTypClass(col) == PGTYPCLASS_NUMERIC)
{
//sort numeric column
std::multimap<double, int> mp;
double d;
for (int i=0;i<GetNumberRows();i++) {
thread->DataSet()->Locate(i+1);
d=thread->DataSet()->GetDouble(col);
mp.insert(std::pair<double, int>(d, i));
}
std::multimap<double, int>::iterator it = mp.begin();
double prev;
int row;
int minval=0;
cols[k] = new int[GetNumberRows()];
for (int i = 0; it != mp.end(); it++, i++) { // âûâîäèì èõ
row=it->second; // row
if (i>0) if (prev!=it->first) minval++;
cols[k][row]=minval;
prev=it->first;
}
} else {
//no numeric sort as string
std::multimap<wxString, int> mp;
wxString s;
for (int i=0;i<GetNumberRows();i++) {
thread->DataSet()->Locate(i+1);
s=thread->DataSet()->GetVal(col);
mp.insert(std::pair<wxString, int>(s, i));
}
std::multimap<wxString, int>::iterator it = mp.begin();
wxString prev;
int row;
int minval=0;
cols[k] = new int[GetNumberRows()];
for (int i = 0; it != mp.end(); it++, i++) {
row=it->second; // row
if (i>0) if (prev!=it->first) minval++;
cols[k][row]=minval;
prev=it->first;
}
}
} else break;
}
class sorter {
int **cols;
sqlResultTable *m;
public:
sorter(int *_cols[], sqlResultTable *my_obj) { cols=_cols;m=my_obj;}
bool operator() (int i,int j) {
bool rez=true;
int a;
int b;
int col,ord;
for (int k=0;k<MAX_COL_SORT;k++) {
col=m->colsortnumber[k];
if (col!=-1) {
ord=m->colorder[col];
if (ord==0) continue;
a=cols[k][i];
b=cols[k][j];
if (a!=b) {
rez=a<b;
} else
{
rez=false;
continue;
}
if (ord==-1) rez=!rez;
}
break;
}
return rez;
}
};
std::sort(maplines,maplines+GetNumberRows(),sorter(cols,this));
for (int i=0;i<MAX_COL_SORT;i++) if (cols[i]!=NULL) delete cols[i];
use_map=true;
return 0;
}
int sqlResultTable::getSortColumn(int col)
{
return colorder[col];
}
int sqlResultTable::setSortColumn(int col)
{
if (col<GetNumberCols()) {
if (colorder[col]==0) colorder[col]=1;
else if (colorder[col]==1) colorder[col]=-1;
else if (colorder[col]==-1) colorder[col]=0; // no sort
int pos=-1,poszero=-1;
for (int i=0;i<MAX_COL_SORT;i++) if (colsortnumber[i]==col) {pos=i; break;}
else if (colsortnumber[i]==-1) { poszero=i; break;}
if (pos==-1 && poszero==-1) { colorder[col]=0; return 0;} // limit sort columns
if (pos==-1 && poszero!=-1) colsortnumber[poszero]=col; // add sort column
if (colorder[col]==0 && pos!=-1) {
// shift array (remove sort for column)
for (int i=pos;i<MAX_COL_SORT-1;i++) colsortnumber[i]=colsortnumber[i+1];
colsortnumber[MAX_COL_SORT-1]=-1;
}
sortColumns();
return colorder[col];
}
return 0;
}
int sqlResultTable::initSort()
{
if (colorder) delete [] colorder;
if (maplines) delete [] maplines;
maplines=NULL;
colorder = new int[GetNumberCols()];
for (int i=0;i<GetNumberCols();i++) colorder[i]=0;
for (int i=0;i<MAX_COL_SORT;i++) colsortnumber[i]=-1;
//maplines = new int[GetNumberRows()];
use_map=false;
return 0;
}
wxString sqlResultTable::GetValueFast(int row, int col)
{
wxString s;
if (thread && thread->DataValid())
{
if (col >= 0)
{
if (use_map) row=maplines[row];
thread->DataSet()->Locate(row + 1);
wxString s = thread->DataSet()->GetVal(col);
return s;
}
}
return "";
}
wxString sqlResultTable::GetValue(int row, int col)
{
if (thread && thread->DataValid())
{
if (col >= 0)
{
if (use_map) row=maplines[row];
thread->DataSet()->Locate(row + 1);
if (settings->GetIndicateNull() && thread->DataSet()->IsNull(col))
return wxT("<NULL>");
@ -508,6 +677,8 @@ wxString sqlResultTable::GetValue(int row, int col)
sqlResultTable::sqlResultTable()
{
thread = NULL;
colorder=NULL;
maplines=NULL;
}
int sqlResultTable::GetNumberRows()

View file

@ -38,6 +38,9 @@ END_EVENT_TABLE()
#define chkFreeze CTRL_CHECKBOX("chkFreeze")
#define chkAnalyze CTRL_CHECKBOX("chkAnalyze")
#define chkVerbose CTRL_CHECKBOX("chkVerbose")
#define chkDISABLE_PAGE_SKIPPING CTRL_CHECKBOX("chkDISABLE_PAGE_SKIPPING")
#define chkCONCURRENTLY CTRL_CHECKBOX("chkCONCURRENTLY")
#define stBitmap CTRL("stBitmap", wxStaticBitmap)
@ -109,10 +112,13 @@ void frmMaintenance::OnAction(wxCommandEvent &ev)
chkFull->Enable(isVacuum);
chkFreeze->Enable(isVacuum);
chkAnalyze->Enable(isVacuum);
chkDISABLE_PAGE_SKIPPING->Enable(isVacuum && conn->BackendMinimumVersion(10, 0));
bool isReindex = (rbxAction->GetSelection() == 2);
chkCONCURRENTLY->Enable(isReindex && conn->BackendMinimumVersion(12, 0));
bool isCluster = (rbxAction->GetSelection() == 3);
if (isReindex || (isCluster && !conn->BackendMinimumVersion(8, 4)))
if ((isCluster && !conn->BackendMinimumVersion(8, 4)))
{
chkVerbose->SetValue(false);
chkVerbose->Enable(false);
@ -142,16 +148,18 @@ wxString frmMaintenance::GetSql()
return wxEmptyString;
}
sql = wxT("VACUUM ");
wxString opt = "";
if (chkFull->GetValue())
sql += wxT("FULL ");
AppendIfFilled(opt,",",wxT("FULL"));
if (chkFreeze->GetValue())
sql += wxT("FREEZE ");
AppendIfFilled(opt,",",wxT("FREEZE"));
if (chkVerbose->GetValue())
sql += wxT("VERBOSE ");
AppendIfFilled(opt,",",wxT("VERBOSE"));
if (chkAnalyze->GetValue())
sql += wxT("ANALYZE ");
AppendIfFilled(opt,",",wxT("ANALYZE"));
if (chkDISABLE_PAGE_SKIPPING->GetValue())
AppendIfFilled(opt,",",wxT("DISABLE_PAGE_SKIPPING"));
sql += opt.IsNull() ? "" : "("+opt.Mid(1)+")";
if (object->GetMetaType() != PGM_DATABASE)
sql += object->GetQuotedFullIdentifier();
@ -170,14 +178,20 @@ wxString frmMaintenance::GetSql()
}
case 2:
{
sql = wxT("REINDEX ");
if (chkVerbose->GetValue())
sql += wxT("(VERBOSE) ");
if (object->GetMetaType() == PGM_UNIQUE || object->GetMetaType() == PGM_PRIMARYKEY)
{
sql = wxT("REINDEX INDEX ") + object->GetQuotedFullIdentifier();
sql += wxT("INDEX ") + chkCONCURRENTLY->GetValue() ? "CONCURRENTLY ": "";
sql += object->GetQuotedFullIdentifier();
}
else // Database, Tables, and Index (but not Constraintes ones)
{
sql = wxT("REINDEX ") + object->GetTypeName().Upper()
+ wxT(" ") + object->GetQuotedFullIdentifier();
sql += object->GetTypeName().Upper();
sql += chkCONCURRENTLY->GetValue() ? " CONCURRENTLY ": " ";
sql += object->GetQuotedFullIdentifier();
}
break;
}

View file

@ -56,6 +56,7 @@ private:
void OnCopy(wxCommandEvent &event);
void OnMouseWheel(wxMouseEvent &event);
void OnGridColSize(wxGridSizeEvent &event);
void DrawColLabel( wxDC& dc, int col );
wxString GetColumnName(int colNum);
wxString GetColKeyValue(int col);
void AppendColumnHeader(wxString &str, int start, int end);

View file

@ -69,6 +69,7 @@ public:
void SetMaxRows(int rows);
void ResultsFinished();
void OnGridSelect(wxGridRangeSelectEvent &event);
void OnGridColSort(wxGridEvent& event);
wxString SetFilter(int row,int col,bool reverse);
wxArrayString colNames;
@ -86,10 +87,20 @@ class sqlResultTable : public wxGridStringTable//wxGridTableBase
public:
sqlResultTable();
wxString GetValue(int row, int col);
wxString GetValueFast(int row, int col);
wxString GetRowLabelValue( int row ) ;
int GetNumberRows();
int GetNumberCols();
bool isplan;
bool use_map; // use maplines for GetValue
int *maplines; // maplines[visible_row]=real_row
int *colorder; // array order type -1 desc , 0 no sort, 1 asc
#define MAX_COL_SORT 5
int colsortnumber[MAX_COL_SORT];
int sortColumns(); //
int setSortColumn(int col); // set order for column (cycle change value -1,0,1)
int getSortColumn(int col);
int initSort(); // allocate memory
bool IsEmptyCell(int row, int col)
{
return false;

View file

@ -13,7 +13,7 @@
#define VERSION_H
// Application Versions
#define VERSION_STR wxT("1.25.0 Dev ASUTP version with support PG11")
#define VERSION_STR wxT("1.25.0 Dev ASUTP version with support PG12")
#define VERSION_NUM 1,25,0,0
#define VERSION_PACKAGE 1.25.0-dev

View file

@ -37,7 +37,7 @@
<object class="sizeritem">
<object class="wxStaticBoxSizer">
<label>VACUUM options</label>
<cols>3</cols>
<cols>5</cols>
<vgap>5</vgap>
<hgap>5</hgap>
<growablecols>0</growablecols>
@ -63,6 +63,20 @@
<flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
<border>4</border>
</object>
<object class="sizeritem">
<object class="wxCheckBox" name="chkDISABLE_PAGE_SKIPPING">
<label>DISABLE_PAGE_SKIPPING</label>
</object>
<flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
<border>4</border>
</object>
<object class="sizeritem">
<object class="wxCheckBox" name="chkCONCURRENTLY">
<label>CONCURRENTLY</label>
</object>
<flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
<border>4</border>
</object>
</object>
<flag>wxEXPAND|wxALIGN_CENTER_VERTICAL|wxTOP|wxLEFT|wxRIGHT</flag>
<border>4</border>

View file

@ -35378,7 +35378,7 @@ static unsigned char xml_res_file_76[] = {
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};
static size_t xml_res_size_77 = 5178;
static size_t xml_res_size_77 = 5924;
static unsigned char xml_res_file_77[] = {
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,
@ -35456,7 +35456,7 @@ static unsigned char xml_res_file_77[] = {
32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,108,97,98,101,108,62,
86,65,67,85,85,77,32,111,112,116,105,111,110,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,99,
111,108,115,62,51,60,47,99,111,108,115,62,10,32,32,32,32,32,32,32,32,32,
111,108,115,62,53,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,53,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,53,60,47,104,103,97,112,62,10,32,32,32,32,32,32,32,
@ -35512,111 +35512,144 @@ static unsigned char xml_res_file_77[] = {
32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,52,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,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,102,108,97,103,62,119,120,
69,88,80,65,78,68,124,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,84,79,80,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,32,32,32,32,32,32,60,98,111,114,100,101,114,62,52,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,
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,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,107,86,101,
114,98,111,115,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,101,114,98,111,115,101,32,109,
101,115,115,97,103,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,99,104,101,99,107,101,100,
62,49,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,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,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,107,68,73,83,65,66,76,69,95,80,65,
71,69,95,83,75,73,80,80,73,78,71,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,68,73,
83,65,66,76,69,95,80,65,71,69,95,83,75,73,80,80,73,78,71,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,32,32,60,102,108,97,103,62,119,120,69,88,
80,65,78,68,124,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,84,79,80,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,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,101,114,62,52,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,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,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,107,67,79,78,67,85,82,82,69,78,84,
76,89,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,67,79,78,67,85,82,82,69,78,84,76,
89,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,60,102,108,97,103,62,119,120,
69,88,80,65,78,68,124,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,84,79,80,124,119,120,76,69,70,84,124,119,
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,124,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,84,79,80,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,32,32,32,32,32,32,32,32,32,32,60,98,111,114,100,
101,114,62,52,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,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,102,
108,97,103,62,119,120,69,88,80,65,78,68,124,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,84,79,80,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,32,32,32,32,32,32,60,98,111,114,100,101,
114,62,52,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,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,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,107,86,101,114,98,111,115,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,
101,114,98,111,115,101,32,109,101,115,115,97,103,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,99,104,101,99,107,101,100,62,49,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,32,32,
60,102,108,97,103,62,119,120,69,88,80,65,78,68,124,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,84,79,80,
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,32,32,32,32,32,32,60,98,111,114,
100,101,114,62,52,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,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,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,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,101,115,115,97,103,101,115,60,47,108,97,98,101,108,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,84,101,120,116,67,116,114,108,34,32,110,97,109,101,61,
34,116,120,116,77,101,115,115,97,103,101,115,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,69,95,77,85,
76,84,73,76,73,78,69,124,119,120,84,69,95,82,69,65,68,79,78,76,89,124,119,
120,72,83,67,82,79,76,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,60,
47,111,98,106,101,99,116,62,10,32,32,32,32,32,32,32,32,60,102,108,97,103,
62,119,120,84,79,80,124,119,120,66,79,84,84,79,77,124,119,120,76,69,70,
84,124,119,120,82,73,71,72,84,124,119,120,69,88,80,65,78,68,124,119,120,
71,82,79,87,124,119,120,65,76,73,71,78,95,67,69,78,84,82,69,60,47,102,108,
97,103,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,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,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,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,
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,72,69,76,80,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,72,101,108,112,60,47,108,97,98,101,108,62,10,32,32,32,32,32,32,32,
32,32,32,32,32,32,32,60,112,111,115,62,50,44,49,51,53,100,60,47,112,111,
115,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,102,108,97,103,62,119,120,
84,79,80,124,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,32,32,32,32,32,32,60,98,111,114,100,101,114,62,52,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,
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,32,32,60,115,
101,108,101,99,116,101,100,62,49,60,47,115,101,108,101,99,116,101,100,62,
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,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,101,115,115,97,103,101,
115,60,47,108,97,98,101,108,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,84,101,120,116,
67,116,114,108,34,32,110,97,109,101,61,34,116,120,116,77,101,115,115,97,
103,101,115,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,69,95,77,85,76,84,73,76,73,78,69,124,119,120,
84,69,95,82,69,65,68,79,78,76,89,124,119,120,72,83,67,82,79,76,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,60,47,111,98,106,101,99,116,62,
10,32,32,32,32,32,32,32,32,60,102,108,97,103,62,119,120,84,79,80,124,119,
120,66,79,84,84,79,77,124,119,120,76,69,70,84,124,119,120,82,73,71,72,84,
124,119,120,69,88,80,65,78,68,124,119,120,71,82,79,87,124,119,120,65,76,
73,71,78,95,67,69,78,84,82,69,60,47,102,108,97,103,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,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,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,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,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,72,69,76,80,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,72,101,108,112,60,47,108,97,
98,101,108,62,10,32,32,32,32,32,32,32,32,32,32,32,32,32,32,60,112,111,115,
62,50,44,49,51,53,100,60,47,112,111,115,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,102,108,97,103,62,119,120,84,79,80,124,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,
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,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,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,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,60,112,111,115,62,57,51,44,49,51,53,100,60,47,112,
34,115,112,97,99,101,114,34,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,
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,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,60,112,111,115,62,57,
51,44,49,51,53,100,60,47,112,111,115,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,102,108,97,103,62,119,120,84,79,80,124,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,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,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,32,32,60,112,111,115,62,49,52,54,44,49,51,53,100,60,47,112,
111,115,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,102,108,97,103,62,119,
120,84,79,80,124,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,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,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,32,32,60,112,
111,115,62,49,52,54,44,49,51,53,100,60,47,112,111,115,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,102,108,97,103,62,119,120,84,79,80,124,119,120,
66,79,84,84,79,77,124,119,120,76,69,70,84,124,119,120,82,73,71,72,84,124,
119,120,69,88,80,65,78,68,124,119,120,71,82,79,87,124,119,120,65,76,73,
71,78,95,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,60,47,111,98,106,101,99,116,62,
10,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,60,47,111,98,106,101,99,116,62,10,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,71,
82,79,87,60,47,102,108,97,103,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};
119,120,82,73,71,72,84,124,119,120,69,88,80,65,78,68,124,119,120,71,82,
79,87,124,119,120,65,76,73,71,78,95,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,60,
47,111,98,106,101,99,116,62,10,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,60,47,111,98,106,101,
99,116,62,10,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,71,82,79,87,60,47,102,108,97,103,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};
static size_t xml_res_size_78 = 70018;
static unsigned char xml_res_file_78[] = {