changed svn layout

git-svn-id: svn://ultimatepp.org/upp/trunk@281 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
mdelfede 2008-06-07 22:31:27 +00:00
commit 263ff5f895
2665 changed files with 642923 additions and 0 deletions

View file

@ -0,0 +1,204 @@
// This is an upp conversion of qt example, see
// http://doc.trolltech.com/3.0/addressbook-example.html
#include <CtrlLib/CtrlLib.h>
#include <Report/Report.h>
using namespace Upp;
#define LAYOUTFILE <AddressBook/AddressBook.lay>
#include <CtrlCore/lay.h>
class AddressBook : public WithAddressBookLayout<TopWindow> {
WithModifyLayout<ParentCtrl> modify;
WithSearchLayout<ParentCtrl> search;
FileSel fs;
String filename;
void SetupSearch();
void Add();
void Change();
void Search();
void Open();
void Save();
void SaveAs();
void Print();
void Quit();
void FileMenu(Bar& bar);
void MainMenu(Bar& bar);
typedef AddressBook CLASSNAME;
public:
void Serialize(Stream& s);
AddressBook();
};
AddressBook::AddressBook()
{
CtrlLayout(*this, "Address book");
CtrlLayout(modify);
CtrlLayout(search);
tab.Add(modify, "Modify");
tab.Add(search, "Search");
ActiveFocus(search.name);
search.oname = true;
search.oname <<= search.osurname <<= search.oaddress
<<= search.oemail <<= THISBACK(SetupSearch);
array.AddColumn("Name");
array.AddColumn("Surname");
array.AddColumn("Address");
array.AddColumn("Email");
modify.add <<= THISBACK(Add);
modify.change <<= THISBACK(Change);
search.search <<= THISBACK(Search);
SetupSearch();
fs.AllFilesType();
menu.Set(THISBACK(MainMenu));
}
void AddressBook::FileMenu(Bar& bar)
{
bar.Add("Open..", CtrlImg::open(), THISBACK(Open));
bar.Add("Save", CtrlImg::save(), THISBACK(Save));
bar.Add("Save as..", CtrlImg::save_as(), THISBACK(SaveAs));
bar.Separator();
bar.Add("Print", CtrlImg::print(), THISBACK(Print));
bar.Separator();
bar.Add("Quit", THISBACK(Quit));
}
void AddressBook::MainMenu(Bar& bar)
{
bar.Add("File", THISBACK(FileMenu));
}
void AddressBook::SetupSearch()
{
search.name.Enable(search.oname);
search.surname.Enable(search.osurname);
search.address.Enable(search.oaddress);
search.email.Enable(search.oemail);
}
void AddressBook::Add()
{
array.Add(~modify.name, ~modify.surname, ~modify.address, ~modify.email);
array.GoEnd();
modify.name <<= modify.surname <<= modify.address <<= modify.email <<= Null;
ActiveFocus(modify.name);
}
void AddressBook::Change()
{
if(array.IsCursor()) {
array.Set(0, ~modify.name);
array.Set(1, ~modify.surname);
array.Set(2, ~modify.address);
array.Set(3, ~modify.email);
}
}
bool Contains(const String& text, const String& substr)
{
for(const char *s = text; s <= text.End() - substr.GetLength(); s++)
if(strncmp(s, substr, substr.GetLength()) == 0)
return true;
return false;
}
void AddressBook::Search()
{
if(!array.GetCount()) return;
bool sc = true;
array.ClearSelection();
for(int i = 0; i < array.GetCount(); i++) {
if((!search.oname || Contains(array.Get(i, 0), ~search.name)) &&
(!search.osurname || Contains(array.Get(i, 1), ~search.surname)) &&
(!search.oaddress || Contains(array.Get(i, 2), ~search.address)) &&
(!search.oemail || Contains(array.Get(i, 3), ~search.email))) {
array.Select(i);
if(sc) {
array.SetCursor(i);
array.CenterCursor();
sc = false;
};
}
}
}
void AddressBook::Open()
{
if(!fs.ExecuteOpen()) return;
filename = fs;
FileIn in(filename);
if(!in) {
Exclamation("Unable to open [* " + DeQtf(filename));
return;
}
array.Clear();
while(!in.IsEof()) {
Vector<Value> q;
for(int i = 0; i < 4; i++)
q.Add(in.GetLine());
array.Add(q);
}
}
void AddressBook::Save()
{
if(IsEmpty(filename)) {
SaveAs();
return;
}
FileOut out(filename);
if(!out) {
Exclamation("Unable to open " + filename);
return;
}
for(int i = 0; i < array.GetCount(); i++)
for(int q = 0; q < 4; q++)
out.PutLine(String(array.Get(i, q)));
}
void AddressBook::SaveAs()
{
if(!fs.ExecuteSaveAs()) return;
filename = fs;
Save();
}
void AddressBook::Print()
{
String qtf;
qtf = "{{1:1:1:1 Name:: Surname:: Address:: Email";
for(int i = 0; i < array.GetCount(); i++)
for(int q = 0; q < 4; q++)
qtf << ":: " << DeQtf((String)array.Get(i, q));
Report report;
report << qtf;
Perform(report);
}
void AddressBook::Quit()
{
Break();
}
void AddressBook::Serialize(Stream& s)
{
int version = 0;
s / version;
s % search.oname % search.osurname % search.oaddress % search.oemail;
s % fs;
SetupSearch();
}
GUI_APP_MAIN
{
AddressBook ab;
LoadFromFile(ab);
ab.Run();
StoreToFile(ab);
}

View file

@ -0,0 +1,30 @@
LAYOUT(AddressBookLayout, 512, 456)
ITEM(MenuBar, menu, LeftPosZ(0, 216).TopPosZ(0, 20))
ITEM(TabCtrl, tab, LeftPosZ(8, 496).TopPosZ(32, 84))
ITEM(ArrayCtrl, array, LeftPosZ(8, 496).TopPosZ(124, 324))
END_LAYOUT
LAYOUT(ModifyLayout, 480, 52)
ITEM(Label, dv___0, SetLabel(t_("&Name")).LeftPosZ(8, 48).TopPosZ(8, 15))
ITEM(EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19))
ITEM(Label, dv___2, SetLabel(t_("&Surname")).LeftPosZ(108, 48).TopPosZ(8, 15))
ITEM(EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19))
ITEM(Label, dv___4, SetLabel(t_("&Address")).LeftPosZ(208, 48).TopPosZ(8, 15))
ITEM(EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19))
ITEM(Label, dv___6, SetLabel(t_("&Email")).LeftPosZ(308, 48).TopPosZ(8, 15))
ITEM(EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19))
ITEM(Button, add, SetLabel(t_("Ad&d")).LeftPosZ(416, 56).TopPosZ(4, 20))
ITEM(Button, change, SetLabel(t_("&Change")).LeftPosZ(416, 56).TopPosZ(28, 20))
END_LAYOUT
LAYOUT(SearchLayout, 480, 56)
ITEM(Option, oname, SetLabel(t_("&Name")).LeftPosZ(8, 56).TopPosZ(8, 18))
ITEM(EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19))
ITEM(Option, osurname, SetLabel(t_("&Surname")).LeftPosZ(108, 64).TopPosZ(8, 18))
ITEM(EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19))
ITEM(Option, oaddress, SetLabel(t_("&Address")).LeftPosZ(208, 64).TopPosZ(8, 18))
ITEM(EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19))
ITEM(Option, oemail, SetLabel(t_("&Email")).LeftPosZ(308, 52).TopPosZ(8, 18))
ITEM(EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19))
ITEM(Button, search, SetLabel(t_("&Search")).LeftPosZ(416, 56).TopPosZ(28, 20))
END_LAYOUT

View file

@ -0,0 +1,13 @@
description "Simple address book application";
uses
CtrlLib,
Report;
file
AddressBook.cpp,
AddressBook.lay;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,232 @@
#include <CtrlLib/CtrlLib.h>
#include <Report/Report.h>
using namespace Upp;
#define LAYOUTFILE <AddressBookXML/AddressBook.lay>
#include <CtrlCore/lay.h>
class AddressBook : public WithAddressBookLayout<TopWindow> {
WithModifyLayout<ParentCtrl> modify;
WithSearchLayout<ParentCtrl> search;
FileSel fs;
String filename;
void SetupSearch();
void Add();
void Change();
void Search();
void Open();
void Save();
void SaveAs();
void Print();
void Quit();
void FileMenu(Bar& bar);
void MainMenu(Bar& bar);
typedef AddressBook CLASSNAME;
public:
void Serialize(Stream& s);
AddressBook();
};
AddressBook::AddressBook()
{
CtrlLayout(*this, "Address book");
CtrlLayout(modify);
CtrlLayout(search);
tab.Add(modify, "Modify");
tab.Add(search, "Search");
ActiveFocus(search.name);
search.oname = true;
search.oname <<= search.osurname <<= search.oaddress
<<= search.oemail <<= THISBACK(SetupSearch);
array.AddColumn("Name");
array.AddColumn("Surname");
array.AddColumn("Address");
array.AddColumn("Email");
modify.add <<= THISBACK(Add);
modify.change <<= THISBACK(Change);
search.search <<= THISBACK(Search);
SetupSearch();
fs.AllFilesType();
menu.Set(THISBACK(MainMenu));
}
void AddressBook::FileMenu(Bar& bar)
{
bar.Add("Open..", CtrlImg::open(), THISBACK(Open));
bar.Add("Save", CtrlImg::save(), THISBACK(Save));
bar.Add("Save as..", CtrlImg::save_as(), THISBACK(SaveAs));
bar.Separator();
bar.Add("Print", CtrlImg::print(), THISBACK(Print));
bar.Separator();
bar.Add("Quit", THISBACK(Quit));
}
void AddressBook::MainMenu(Bar& bar)
{
bar.Add("File", THISBACK(FileMenu));
}
void AddressBook::SetupSearch()
{
search.name.Enable(search.oname);
search.surname.Enable(search.osurname);
search.address.Enable(search.oaddress);
search.email.Enable(search.oemail);
}
void AddressBook::Add()
{
array.Add(~modify.name, ~modify.surname, ~modify.address, ~modify.email);
array.GoEnd();
modify.name <<= modify.surname <<= modify.address <<= modify.email <<= Null;
ActiveFocus(modify.name);
}
void AddressBook::Change()
{
if(array.IsCursor()) {
array.Set(0, ~modify.name);
array.Set(1, ~modify.surname);
array.Set(2, ~modify.address);
array.Set(3, ~modify.email);
}
}
bool Contains(const String& text, const String& substr)
{
for(const char *s = text; s <= text.End() - substr.GetLength(); s++)
if(strncmp(s, substr, substr.GetLength()) == 0)
return true;
return false;
}
void AddressBook::Search()
{
if(!array.GetCount()) return;
bool sc = true;
array.ClearSelection();
for(int i = 0; i < array.GetCount(); i++) {
if((!search.oname || Contains(array.Get(i, 0), ~search.name)) &&
(!search.osurname || Contains(array.Get(i, 1), ~search.surname)) &&
(!search.oaddress || Contains(array.Get(i, 2), ~search.address)) &&
(!search.oemail || Contains(array.Get(i, 3), ~search.email))) {
array.Select(i);
if(sc) {
array.SetCursor(i);
array.CenterCursor();
sc = false;
};
}
}
}
void AddressBook::Open()
{
if(!fs.ExecuteOpen()) return;
filename = fs;
array.Clear();
try {
String d = LoadFile(filename);
XmlParser p(d);
while(!p.IsTag())
p.Skip();
p.PassTag("AddressBook");
while(!p.IsEof()) {
if(p.Tag("person")) {
String name;
String surname;
String address;
String email;
while(!p.End()) {
if(p.Tag("name"))
name = p.ReadText();
else
if(p.Tag("surname"))
surname = p.ReadText();
else
if(p.Tag("address"))
address = p.ReadText();
else
if(p.Tag("email"))
email = p.ReadText();
else {
p.Skip();
continue;
}
p.PassEnd();
}
array.Add(name, surname, address, email);
}
else
p.Skip();
}
}
catch(XmlError) {
Exclamation("Error reading the input file!");
}
}
void AddressBook::Save()
{
if(IsEmpty(filename)) {
SaveAs();
return;
}
String xml;
for(int i = 0; i < array.GetCount(); i++)
xml <<
XmlTag("person") (
XmlTag("name").Text(array.Get(i, 0)) +
XmlTag("surname").Text(array.Get(i, 1)) +
XmlTag("address").Text(array.Get(i, 2)) +
XmlTag("email").Text(array.Get(i, 3))
);
if(!SaveFile(filename, XmlDoc("AddressBook", xml)))
Exclamation("Error saving the file!");
}
void AddressBook::SaveAs()
{
if(!fs.ExecuteSaveAs()) return;
filename = fs;
Save();
}
void AddressBook::Print()
{
String qtf;
qtf = "{{1:1:1:1 Name:: Surname:: Address:: Email";
for(int i = 0; i < array.GetCount(); i++)
for(int q = 0; q < 4; q++)
qtf << ":: " << DeQtf((String)array.Get(i, q));
Report report;
report << qtf;
Perform(report);
}
void AddressBook::Quit()
{
Break();
}
void AddressBook::Serialize(Stream& s)
{
int version = 0;
s / version;
s % search.oname % search.osurname % search.oaddress % search.oemail;
s % fs;
SetupSearch();
}
GUI_APP_MAIN
{
AddressBook ab;
LoadFromFile(ab);
ab.Run();
StoreToFile(ab);
}

View file

@ -0,0 +1,30 @@
LAYOUT(AddressBookLayout, 516, 456)
ITEM(MenuBar, menu, LeftPosZ(0, 200).TopPosZ(0, 20))
ITEM(TabCtrl, tab, LeftPosZ(8, 500).TopPosZ(32, 84))
ITEM(ArrayCtrl, array, LeftPosZ(8, 500).TopPosZ(124, 324))
END_LAYOUT
LAYOUT(ModifyLayout, 480, 52)
ITEM(Label, dv___0, SetLabel(t_("&Name")).LeftPosZ(8, 48).TopPosZ(8, 15))
ITEM(EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19))
ITEM(Label, dv___2, SetLabel(t_("&Surname")).LeftPosZ(108, 48).TopPosZ(8, 15))
ITEM(EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19))
ITEM(Label, dv___4, SetLabel(t_("&Address")).LeftPosZ(208, 48).TopPosZ(8, 15))
ITEM(EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19))
ITEM(Label, dv___6, SetLabel(t_("&Email")).LeftPosZ(308, 48).TopPosZ(8, 15))
ITEM(EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19))
ITEM(Button, add, SetLabel(t_("Ad&d")).LeftPosZ(416, 56).TopPosZ(4, 20))
ITEM(Button, change, SetLabel(t_("&Change")).LeftPosZ(416, 56).TopPosZ(28, 20))
END_LAYOUT
LAYOUT(SearchLayout, 480, 56)
ITEM(Option, oname, SetLabel(t_("&Name")).LeftPosZ(8, 56).TopPosZ(8, 18))
ITEM(EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19))
ITEM(Option, osurname, SetLabel(t_("&Surname")).LeftPosZ(108, 64).TopPosZ(8, 18))
ITEM(EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19))
ITEM(Option, oaddress, SetLabel(t_("&Address")).LeftPosZ(208, 64).TopPosZ(8, 18))
ITEM(EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19))
ITEM(Option, oemail, SetLabel(t_("&Email")).LeftPosZ(308, 52).TopPosZ(8, 18))
ITEM(EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19))
ITEM(Button, search, SetLabel(t_("&Search")).LeftPosZ(416, 56).TopPosZ(28, 20))
END_LAYOUT

View file

@ -0,0 +1,13 @@
description "Address book application, uses XML to store data (using SAX like U++ classes)";
uses
CtrlLib,
Report;
file
AddressBook.cpp,
AddressBook.lay;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,228 @@
#include <CtrlLib/CtrlLib.h>
#include <Report/Report.h>
using namespace Upp;
#define LAYOUTFILE <AddressBookXML2/AddressBook.lay>
#include <CtrlCore/lay.h>
#define TAG_ADDRESSBOOK "AddressBook"
#define TAG_PERSON "person"
#define TAG_NAME "name"
#define TAG_SURNAME "surname"
#define TAG_ADDRESS "address"
#define TAG_EMAIL "email"
class AddressBook : public WithAddressBookLayout<TopWindow> {
WithModifyLayout<ParentCtrl> modify;
WithSearchLayout<ParentCtrl> search;
FileSel fs;
String filename;
void SetupSearch();
void Add();
void Change();
void Search();
void Open();
void Save();
void SaveAs();
void Print();
void Quit();
void FileMenu(Bar& bar);
void MainMenu(Bar& bar);
typedef AddressBook CLASSNAME;
public:
void Serialize(Stream& s);
AddressBook();
};
AddressBook::AddressBook()
{
CtrlLayout(*this, "Address book");
CtrlLayout(modify);
CtrlLayout(search);
tab.Add(modify, "Modify");
tab.Add(search, "Search");
ActiveFocus(search.name);
search.oname = true;
search.oname <<= search.osurname <<= search.oaddress
<<= search.oemail <<= THISBACK(SetupSearch);
array.AddColumn(TAG_NAME, "Name");
array.AddColumn(TAG_SURNAME, "Surname");
array.AddColumn(TAG_ADDRESS, "Address");
array.AddColumn(TAG_EMAIL, "Email");
modify.add <<= THISBACK(Add);
modify.change <<= THISBACK(Change);
search.search <<= THISBACK(Search);
SetupSearch();
fs.AllFilesType();
menu.Set(THISBACK(MainMenu));
}
void AddressBook::FileMenu(Bar& bar)
{
bar.Add("Open..", CtrlImg::open(), THISBACK(Open));
bar.Add("Save", CtrlImg::save(), THISBACK(Save));
bar.Add("Save as..", CtrlImg::save_as(), THISBACK(SaveAs));
bar.Separator();
bar.Add("Print", CtrlImg::print(), THISBACK(Print));
bar.Separator();
bar.Add("Quit", THISBACK(Quit));
}
void AddressBook::MainMenu(Bar& bar)
{
bar.Add("File", THISBACK(FileMenu));
}
void AddressBook::SetupSearch()
{
search.name.Enable(search.oname);
search.surname.Enable(search.osurname);
search.address.Enable(search.oaddress);
search.email.Enable(search.oemail);
}
void AddressBook::Add()
{
array.Add(~modify.name, ~modify.surname, ~modify.address, ~modify.email);
array.GoEnd();
modify.name <<= modify.surname <<= modify.address <<= modify.email <<= Null;
ActiveFocus(modify.name);
}
void AddressBook::Change()
{
if(array.IsCursor()) {
array.Set(0, ~modify.name);
array.Set(1, ~modify.surname);
array.Set(2, ~modify.address);
array.Set(3, ~modify.email);
}
}
bool Contains(const String& text, const String& substr)
{
for(const char *s = text; s <= text.End() - substr.GetLength(); s++)
if(strncmp(s, substr, substr.GetLength()) == 0)
return true;
return false;
}
void AddressBook::Search()
{
if(!array.GetCount()) return;
bool sc = true;
array.ClearSelection();
for(int i = 0; i < array.GetCount(); i++) {
if((!search.oname || Contains(array.Get(i, 0), ~search.name)) &&
(!search.osurname || Contains(array.Get(i, 1), ~search.surname)) &&
(!search.oaddress || Contains(array.Get(i, 2), ~search.address)) &&
(!search.oemail || Contains(array.Get(i, 3), ~search.email))) {
array.Select(i);
if(sc) {
array.SetCursor(i);
array.CenterCursor();
sc = false;
};
}
}
}
void AddressBook::Open()
{
if(!fs.ExecuteOpen()) return;
filename = fs;
array.Clear();
try {
String d = LoadFile(filename);
XmlNode n = ParseXML(d);
if(n.GetCount()==0 || n[0].GetTag() != TAG_ADDRESSBOOK)
throw XmlError("No AddressBook tag");
const XmlNode &ab = n[0];
array.SetCount(ab.GetCount());
for(int i=0; i < ab.GetCount(); i++){
const XmlNode &person = ab[i];
for(int j=0; j < person.GetCount(); j++){
const XmlNode &prop = person[j];
if(prop.IsTag(TAG_NAME))
array.Set(i, TAG_NAME, prop[0].GetText());
else
if(prop.IsTag(TAG_SURNAME))
array.Set(i, TAG_SURNAME, prop[0].GetText());
else
if(prop.IsTag(TAG_ADDRESS))
array.Set(i, TAG_ADDRESS, prop[0].GetText());
else
if(prop.IsTag(TAG_EMAIL))
array.Set(i, TAG_EMAIL, prop[0].GetText());
}
}
}
catch(XmlError &e) {
Exclamation("Error reading the input file:&" + DeQtf(e) );
}
}
void AddressBook::Save()
{
if(IsEmpty(filename)) {
SaveAs();
return;
}
XmlNode n;
XmlNode &ab = n.Add(TAG_ADDRESSBOOK);
for(int i=0; i < array.GetCount(); i++) {
XmlNode &person = ab.Add(TAG_PERSON);
person.Add(TAG_NAME).Add().CreateText(array.Get(i, TAG_NAME));
person.Add(TAG_SURNAME).Add().CreateText(array.Get(i, TAG_SURNAME));
person.Add(TAG_ADDRESS).Add().CreateText(array.Get(i, TAG_ADDRESS));
person.Add(TAG_EMAIL).Add().CreateText(array.Get(i, TAG_EMAIL));
}
if(!SaveFile(filename, AsXML(n)))
Exclamation("Error saving the file!");
}
void AddressBook::SaveAs()
{
if(!fs.ExecuteSaveAs()) return;
filename = fs;
Save();
}
void AddressBook::Print()
{
String qtf;
qtf = "{{1:1:1:1 Name:: Surname:: Address:: Email";
for(int i = 0; i < array.GetCount(); i++)
for(int q = 0; q < 4; q++)
qtf << ":: " << DeQtf((String)array.Get(i, q));
Report report;
report << qtf;
Perform(report);
}
void AddressBook::Quit()
{
Break();
}
void AddressBook::Serialize(Stream& s)
{
int version = 0;
s / version;
s % search.oname % search.osurname % search.oaddress % search.oemail;
s % fs;
SetupSearch();
}
GUI_APP_MAIN
{
AddressBook ab;
LoadFromFile(ab);
ab.Run();
StoreToFile(ab);
}

View file

@ -0,0 +1,30 @@
LAYOUT(AddressBookLayout, 532, 456)
ITEM(MenuBar, menu, LeftPosZ(0, 200).TopPosZ(0, 20))
ITEM(TabCtrl, tab, LeftPosZ(8, 516).TopPosZ(32, 84))
ITEM(ArrayCtrl, array, LeftPosZ(8, 516).TopPosZ(124, 324))
END_LAYOUT
LAYOUT(ModifyLayout, 480, 52)
ITEM(Label, dv___0, SetLabel(t_("&Name")).LeftPosZ(8, 48).TopPosZ(8, 15))
ITEM(EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19))
ITEM(Label, dv___2, SetLabel(t_("&Surname")).LeftPosZ(108, 48).TopPosZ(8, 15))
ITEM(EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19))
ITEM(Label, dv___4, SetLabel(t_("&Address")).LeftPosZ(208, 48).TopPosZ(8, 15))
ITEM(EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19))
ITEM(Label, dv___6, SetLabel(t_("&Email")).LeftPosZ(308, 48).TopPosZ(8, 15))
ITEM(EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19))
ITEM(Button, add, SetLabel(t_("Ad&d")).LeftPosZ(416, 56).TopPosZ(4, 20))
ITEM(Button, change, SetLabel(t_("&Change")).LeftPosZ(416, 56).TopPosZ(28, 20))
END_LAYOUT
LAYOUT(SearchLayout, 480, 56)
ITEM(Option, oname, SetLabel(t_("&Name")).LeftPosZ(8, 56).TopPosZ(8, 18))
ITEM(EditField, name, LeftPosZ(8, 96).TopPosZ(28, 19))
ITEM(Option, osurname, SetLabel(t_("&Surname")).LeftPosZ(108, 64).TopPosZ(8, 18))
ITEM(EditField, surname, LeftPosZ(108, 96).TopPosZ(28, 19))
ITEM(Option, oaddress, SetLabel(t_("&Address")).LeftPosZ(208, 64).TopPosZ(8, 18))
ITEM(EditField, address, LeftPosZ(208, 96).TopPosZ(28, 19))
ITEM(Option, oemail, SetLabel(t_("&Email")).LeftPosZ(308, 52).TopPosZ(8, 18))
ITEM(EditField, email, LeftPosZ(308, 96).TopPosZ(28, 19))
ITEM(Button, search, SetLabel(t_("&Search")).LeftPosZ(416, 56).TopPosZ(28, 20))
END_LAYOUT

View file

@ -0,0 +1,13 @@
description "Address book application, uses XML to store data (using DOM like U++ classes)";
uses
CtrlLib,
Report;
file
AddressBook.cpp,
AddressBook.lay;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,11 @@
description "Animated Hello world example";
uses
CtrlLib;
file
Hello.cpp;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,62 @@
// This is Upp conversion of Qt example, see
// http://doc.trolltech.com/3.0/hello-example.html
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
class HelloWorld : public TopWindow {
public:
virtual void LeftDown(Point, dword);
virtual void Paint(Draw& w);
private:
String text;
void Animate() { Refresh(); }
public:
typedef HelloWorld CLASSNAME;
HelloWorld& Text(const String& t) { text = t; Refresh(); return *this; }
HelloWorld();
};
HelloWorld::HelloWorld()
{
SetTimeCallback(-40, THISBACK(Animate));
BackPaint();
Zoomable().Sizeable();
SetRect(0, 0, 260, 80);
}
void HelloWorld::LeftDown(Point, dword)
{
Close();
}
void HelloWorld::Paint(Draw& w)
{
Size sz = GetSize();
static int sin_tbl[16] = {
0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38
};
w.DrawRect(sz, White);
Size tsz = GetTextSize(text, Roman(32));
Point pos = (sz - tsz) / 2;
for(int i = 0; i < text.GetLength(); i++) {
int q = (i + GetTickCount() / 40) & 15;
w.DrawText(pos.x, pos.y + sin_tbl[q] * (sz.cy - 32) / 200,
~text + i, Roman(32), HsvColorf(q / 15.0, 1, 0.5), 1);
pos.x += Roman(32).Info()[text[i]];
}
}
GUI_APP_MAIN
{
HelloWorld hw;
hw.Title("Hello world example");
hw.Text(Nvl(Join(CommandLine(), " "), "Hello world !"));
hw.Run();
}

13
examples/Bombs/Bombs.upp Normal file
View file

@ -0,0 +1,13 @@
description "Mine sweeping game";
uses
CtrlLib;
file
main.cpp,
bombs.rc,
bombs.iml;
mainconfig
"" = "GUI";

21
examples/Bombs/bombs.iml Normal file
View file

@ -0,0 +1,21 @@
IMAGE_META(icon_file, "icon.ico")
IMAGE_META(icon_large, "Small")
IMAGE_META(icon_bpp, "8")
IMAGE_BEGIN(Small)
IMAGE_SCAN("Ê\1\0\0\377Á\1\0\0\377Â\1\0\0\377")
IMAGE_SCAN("È\1\0\0\377")
IMAGE_SCAN("É‚\0\0\377\0\377\377Á\1\0\0\377")
IMAGE_SCAN("É\2\377\377\377\0\0\377ƒ\0\377\377Á\1\0\0\377")
IMAGE_SCAN("È\1\377\377\377\0\0\0\2\377\377\377\0\377\377")
IMAGE_SCAN("Å„\377\377\377\3\0\0\0\377\377\377\0\0\377Á\1\0\0\377")
IMAGE_SCAN("Â\377\377\377…\0\0\0ƒ\377\377\377Á\1\0\0\377")
IMAGE_SCAN("Â\1\377\377\377ƒ\0\0\0\377\377\377…\0\0\0\1\377\377\377")
IMAGE_SCAN("Á\1\377\377\377\0\0\0\377\377\377ˆ\0\0\0\1\377\377\377")
IMAGE_SCAN("\1\377\377\377\0\0\0\377\377\377‰\0\0\0\1\377\377\377")
IMAGE_SCAN("\1\377\377\377\0\0\0\1\377\377\377\0\0\0\1\377\377\377")
IMAGE_SCAN("\1\377\377\377Ž\0\0\0\1\377\377\377")
IMAGE_SCAN("\1\377\377\377Ž\0\0\0\1\377\377\377")
IMAGE_SCAN("Á\1\377\377\377Œ\0\0\0\1\377\377\377")
IMAGE_SCAN("‚\377\377\377ˆ\0\0\0\377\377\377")
IMAGE_SCAN("Ĉ\377\377\377")
IMAGE_PACKED(Small, "\2\20\0\0\0\20\0\0\0\377\377\377\377\1\0\0\0\0\0\0\0")

1
examples/Bombs/bombs.rc Normal file
View file

@ -0,0 +1 @@
5555 ICON DISCARDABLE "icon.ico"

BIN
examples/Bombs/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

225
examples/Bombs/main.cpp Normal file
View file

@ -0,0 +1,225 @@
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
class Bombs : public TopWindow {
public:
virtual void Paint(Draw& w);
virtual void LeftDown(Point p, dword flags);
virtual void RightDown(Point p, dword flags);
private:
Size level;
int cx, cy;
int normal_cells, bombs;
Buffer<byte> field;
MenuBar menu;
StatusBar status;
byte& Field(int x, int y) { return field[x + y * cx]; }
enum {
HIDDEN = 16,
BOMB = 32,
MARK = 64,
EXPLODED = 128,
UNIT = 30,
};
void About();
void File(Bar& menu);
void Game(Bar& menu);
void Menu(Bar& menu);
void ShowStatus();
void Level(Size sz);
void Uncover(int x, int y);
void Generate();
void UncoverAll();
public:
typedef Bombs CLASSNAME;
Bombs();
};
void Bombs::Generate()
{
cx = level.cx;
cy = level.cy;
field.Alloc(cx * cy);
for(int i = cx * cy - 1; i >= 0; i--)
field[i] = (rand() & 15) < 3 ? HIDDEN|BOMB : HIDDEN;
normal_cells = 0;
for(int x = 0; x < cx; x++)
for(int y = 0; y < cy; y++)
if((Field(x, y) & BOMB) == 0) {
normal_cells++;
for(int xx = -1; xx <= 1; xx++)
for(int yy = -1; yy <= 1; yy++)
if((xx || yy) && x + xx >= 0 && x + xx < cx && y + yy >= 0 && y + yy < cy &&
(Field(x + xx, y + yy) & BOMB))
Field(x, y)++;
}
bombs = cx * cy - normal_cells;
Rect r = GetRect();
r.SetSize(AddFrameSize(UNIT * cx, UNIT * cy));
SetRect(r);
ShowStatus();
Refresh();
}
void Bombs::UncoverAll()
{
for(int i = cx * cy - 1; i >= 0; i--)
field[i] &= ~HIDDEN;
Refresh();
}
void Bombs::Paint(Draw& w)
{
for(int x = 0; x < cx; x++)
for(int y = 0; y < cy; y++) {
byte f = Field(x, y);
w.DrawRect(x * UNIT, y * UNIT + UNIT - 1, UNIT, 1, SBlack);
w.DrawRect(x * UNIT + UNIT - 1, y * UNIT, 1, UNIT, SBlack);
w.DrawRect(x * UNIT, y * UNIT, UNIT - 1, UNIT - 1,
(f & (HIDDEN|MARK)) ? SLtGray : f & BOMB ? SLtRed : SWhite);
String txt;
Color ink = SBlack;
Color cross = Null;
if(f & MARK) {
txt = "M";
ink = SLtRed;
if((f & (HIDDEN|BOMB)) == BOMB) {
ink = SLtBlue;
cross = SLtRed;
}
}
else
if(!(f & HIDDEN))
if(f & BOMB)
txt = "B";
else {
f = f & 15;
txt = String(f + '0', 1);
ink = f == 0 ? SLtGreen : f == 1 ? SLtBlue : SBlack;
}
Size tsz = GetTextSize(txt, Roman(2 * UNIT / 3));
w.DrawText(x * UNIT + (UNIT - tsz.cx) / 2, y * UNIT + (UNIT - tsz.cy) / 2,
txt, Roman(2 * UNIT / 3), ink);
if(f & EXPLODED)
cross = SLtBlue;
w.DrawLine(x * UNIT, y * UNIT, x * UNIT + UNIT - 1, y * UNIT + UNIT - 1, 1, cross);
w.DrawLine(x * UNIT, y * UNIT + UNIT - 1, x * UNIT + UNIT - 1, y * UNIT, 1, cross);
}
}
void Bombs::Uncover(int x, int y)
{
if(x >= 0 && x < cx && y >= 0 && y < cy) {
byte& f = Field(x, y);
if((f & (HIDDEN|MARK)) == HIDDEN) {
if(f & BOMB) {
f |= EXPLODED;
normal_cells = 0;
UncoverAll();
return;
}
if((f &= ~HIDDEN) == 0)
for(int xx = -1; xx <= 1; xx++)
for(int yy = -1; yy <= 1; yy++)
if(xx || yy)
Uncover(x + xx, y + yy);
normal_cells--;
if(normal_cells == 0) {
UncoverAll();
PromptOK("[*@4A6 Nice!]&You have found all the bombs!");
}
}
}
}
void Bombs::LeftDown(Point p, dword flags)
{
if(!normal_cells)
return;
p /= UNIT;
Uncover(p.x, p.y);
Refresh();
ShowStatus();
}
void Bombs::RightDown(Point p, dword flags)
{
if(!normal_cells)
return;
p /= UNIT;
if(Field(p.x, p.y) & HIDDEN) {
Field(p.x, p.y) ^= MARK;
Refresh();
}
}
void Bombs::ShowStatus()
{
status = Format("%d bombs, %d cells remaining", bombs, normal_cells);
}
void Bombs::Level(Size sz)
{
level = sz;
}
void Bombs::About()
{
PromptOK("[*A9/ uBombs]&[A5 Ultimate`+`+ example]");
}
void Bombs::File(Bar& menu)
{
menu.Add("Exit", Breaker(IDOK));
menu.Separator();
menu.Add("About..", THISBACK(About));
}
void Bombs::Game(Bar& menu)
{
menu.Add("Restart", THISBACK(Generate));
menu.Separator();
menu.Add("Easy", THISBACK1(Level, Size(10, 10)))
.Check(level.cx == 10);
menu.Add("Medium", THISBACK1(Level, Size(15, 15)))
.Check(level.cx == 15);
menu.Add("Difficult", THISBACK1(Level, Size(25, 20)))
.Check(level.cx == 25);
}
void Bombs::Menu(Bar& menu)
{
menu.Add("File", THISBACK(File));
menu.Add("Game", THISBACK(Game));
}
#define IMAGECLASS BombsImg
#define IMAGEFILE <Bombs/bombs.iml>
#include <Draw/iml.h>
Bombs::Bombs()
{
level = Size(10, 10);
AddFrame(menu);
menu.Set(THISBACK(Menu));
AddFrame(status);
AddFrame(InsetFrame());
Title("uBombs");
Icon(BombsImg::Small());
Generate();
}
GUI_APP_MAIN
{
Bombs().Run();
}

View file

@ -0,0 +1,40 @@
#include <CtrlLib/CtrlLib.h>
// http://java.sun.com/docs/books/tutorial/uiswing/start/swingTour.html
using namespace Upp;
struct ButtonApp : TopWindow {
int count;
Button button;
Label label;
void RefreshLabel()
{
label = Format("Number of button clicks %d", count);
}
void Click()
{
++count;
RefreshLabel();
}
typedef ButtonApp CLASSNAME;
ButtonApp()
{
count = 0;
button <<= THISBACK(Click);
button.SetLabel("&I'm an Ultimate++ button!");
Add(button.VCenterPos(20).HCenterPos(200));
Add(label.BottomPos(0, 20).HCenterPos(200));
label.SetAlign(ALIGN_CENTER);
Sizeable().Zoomable();
RefreshLabel();
}
};
GUI_APP_MAIN
{
ButtonApp().Run();
}

View file

@ -0,0 +1,11 @@
description "Counting button clicks";
uses
CtrlLib;
file
Button.cpp;
mainconfig
"" = "GUI";

11
examples/Clock/Clock.upp Normal file
View file

@ -0,0 +1,11 @@
description "Analogue / digital clock";
uses
CtrlLib;
file
main.cpp;
mainconfig
"" = "GUI";

63
examples/Clock/main.cpp Normal file
View file

@ -0,0 +1,63 @@
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
struct App : TopWindow {
void PaintPtr(Draw& w, double pos, double m, int d, Color color, Size sz2)
{
w.DrawLine(sz2.cx, sz2.cy,
sz2.cx + int(m * sin(pos * 2 * M_PI) * sz2.cx),
sz2.cy - int(m * cos(pos * 2 * M_PI) * sz2.cy),
d, color);
}
void PaintCenteredText(Draw& w, int x, int y, const char *text, Font fnt, Color c)
{
Size tsz = GetTextSize(text, fnt);
w.DrawText(x - tsz.cx / 2, y - tsz.cy / 2, text, fnt, c);
}
virtual void Paint(Draw& w)
{
Size sz = GetSize();
w.DrawRect(sz, SLtGray);
sz -= 6;
w.Offset(3, 3);
Size sz2 = sz / 2;
w.DrawEllipse(0, 0, sz.cx, sz.cy, SWhite, 3, SBlack);
Font fnt = Arial(min(sz.cx, sz.cy) / 10);
for(int i = 1; i <= 12; i++) {
int d = i % 3 == 0 ? 3 : 2;
PaintCenteredText(w, sz2.cx + int(0.8 * sin(i * M_PI / 6) * sz2.cx),
sz2.cy - int(0.8 * cos(i * M_PI / 6) * sz2.cy),
AsString(i), i % 3 ? fnt : fnt().Bold(), SBlack);
}
Date date = GetSysDate();
PaintCenteredText(w, sz.cx / 2, 3 * sz.cy / 5, GetLanguageInfo().FormatDate(date),
fnt().Bold(), SLtBlue);
double tm = double(GetSysTime() - ToTime(date));
PaintPtr(w, tm / 60, 0.75, 1, SRed, sz2);
PaintPtr(w, tm / 3600, 0.6, 2, SCyan, sz2);
PaintPtr(w, tm / 3600 / 12, 0.5, 4, SBlack, sz2);
w.End();
}
void Timer()
{
Refresh();
}
App()
{
SetRect(0, 0, 150, 150);
Sizeable().Zoomable();
BackPaint();
SetTimeCallback(-1000, callback(this, &App::Timer));
Title("Clock");
}
};
GUI_APP_MAIN
{
App().Run();
}

View file

@ -0,0 +1,120 @@
#include <CppBase/CppBase.h>
#include "Analyse.h"
bool ContainsAt(const String &source, const String &pattern, int pos = 0)
{
return pos >= 0
&& pos + pattern.GetLength() <= source.GetLength()
&& 0 == memcmp(source.Begin() + pos, pattern.Begin(), pattern.GetLength());
}
bool StartsWith(const String &source, const String &pattern)
{
return ContainsAt(source, pattern, 0);
}
bool EndsWith(const String &source, const String &pattern)
{
return ContainsAt(source, pattern, source.GetLength() - pattern.GetLength());
}
String InsertNestingToSignature(String natural, String nesting)
{
if(StartsWith(nesting, "::"))
nesting.Remove(0, 2);
if(nesting.GetCount() && !EndsWith(nesting, "::"))
nesting << "::";
int pos = natural.Find('('); // find the first opening parenthesis
pos--;
while(pos >= 0 && !iscid(natural[pos])) // skip over non-id chars before paren.
pos--;
if(pos < 0) return "";
while(pos >= 0 && iscid(natural[pos])) // skip over last id before paren
pos--;
natural.Insert(pos+1, nesting);
return natural;
}
int BodyPos(const Vector<CppPos> &pos)
{
for(int i = 0; i < pos.GetCount(); i++)
if(pos[i].impl)
return pos[i].line;
return 0;
}
CodeMetric::CodeMetric(const String &fileContent) :
orphanLines(0), blankLines(0), commentLines(0)
{
StringStream stream(fileContent);
CppBase base;
Parser parser;
parser.whenFnEnd = THISBACK(StoreMetric);
parser.Do(stream, Vector<String>(), base, "file", THISBACK(StoreError));
const SrcFile &srcFile = parser.getPreprocessedFile();
commentLines = srcFile.commentLinesRemoved;
blankLines = srcFile.blankLinesRemoved;
orphanLines = parser.symbolsOutsideFunctions.GetStat(';');
totalLLOC = orphanLines;
sumCC1 = sumCC2 = sumDepth = 0;
for(int i = 0; i < functions.GetCount(); i++) {
totalLLOC += functions[i].logicalLinesOfCode;
sumCC1 += functions[i].cyclomaticComplexity1;
sumCC2 += functions[i].cyclomaticComplexity2;
sumDepth += functions[i].scopeDepth;
}
}
String CodeMetric::ToString() const
{
String s;
s << "LLOC: " << totalLLOC
<< ", Blank: " << blankLines
<< ", Comments: " << commentLines;
if(errors != "")
s << "\nErrors:\n" << errors;
return s;
}
void CodeMetric::StoreError(int line, const String &msg)
{
errors << "line " << line << ": " << msg << "\n";
}
int CodeMetric::LogicalLinesOfCode(const LexSymbolStat &symbolStat)
{
static Vector<int> oneLiners(
Vector<int>() << tk_if << tk_else << tk_switch << tk_case
<< tk_for << tk_do << tk_while << tk_try << tk_catch
<< tk_struct << tk_class << tk_namespace
<< tk_public << tk_private << tk_protected
<< ';');
return symbolStat.SumStat( oneLiners );
}
void CodeMetric::StoreMetric(const Parser::FunctionStat & functionStat)
{
static Vector<int> cc1_symbols(
Vector<int>() << tk_if << tk_case << tk_for << tk_while << tk_catch);
static Vector<int> cc2_symbols(
Vector<int>() << t_and << t_or << '?');
FunctionEntry &entry = functions.Add();
entry.pos = BodyPos(functionStat.cppItem.pos);
entry.name = InsertNestingToSignature(functionStat.cppItem.natural,
functionStat.nesting);
int cc1 = 1 + functionStat.symbolStat.SumStat( cc1_symbols );
entry.cyclomaticComplexity1 = cc1;
entry.cyclomaticComplexity2 = cc1 + functionStat.symbolStat.SumStat( cc2_symbols );
entry.logicalLinesOfCode = 2 + LogicalLinesOfCode(functionStat.symbolStat);
entry.scopeDepth = functionStat.maxScopeDepth;
}

View file

@ -0,0 +1,36 @@
#ifndef _CppAnalyse_Analyze_h_
#define _CppAnalyse_Analyze_h_
#include <CppBase/CppBase.h>
using namespace Upp;
struct CodeMetric
{
public:
struct FunctionEntry : public Moveable<FunctionEntry>
{
String name;
int pos;
int cyclomaticComplexity1;
int cyclomaticComplexity2;
int logicalLinesOfCode;
int scopeDepth;
};
int orphanLines, blankLines, commentLines;
int totalLLOC, sumCC1, sumCC2, sumDepth;
Vector<FunctionEntry> functions;
String errors;
explicit CodeMetric(const String &fileContent);
String ToString() const;
private:
typedef CodeMetric CLASSNAME;
void StoreError(int line, const String &msg);
void StoreMetric(const Parser::FunctionStat & functionStat);
int LogicalLinesOfCode(const LexSymbolStat &symbolStat);
};
#endif

View file

@ -0,0 +1,36 @@
#ifndef _CppAnalyse_AnalyseGui_h
#define _CppAnalyse_AnalyseGui_h
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
class WarningDisplay : public Display
{
int limit;
Color warningColor;
public:
WarningDisplay(int limit, Color warningColor = Color(255, 128, 128));
void PaintBackground(Draw& w, const Rect& r, const Value& q,
Color ink, Color paper, dword style) const;
};
class AnalyseGui : public TopWindow
{
public:
typedef AnalyseGui CLASSNAME;
MenuBar menu;
Splitter splitter;
LineEdit source;
ArrayCtrl chart;
LineEdit textMetric;
WarningDisplay ccDisplay, llocDisplay, depthDisplay;
AnalyseGui();
void MainMenu(Bar& menu);
void Open();
void UpdateMetric();
void GotoFunction();
};
#endif

View file

@ -0,0 +1,18 @@
IMAGE_BEGIN(GaugeIcon)
IMAGE_SCAN("Æ„\377\377\377Æ")
IMAGE_SCAN("Ä‚\377\377\377„\0\0\0\377\377\377Ä")
IMAGE_SCAN("Ã\1\377\377\377\0\0\0\2\377\377\377\0\0\0\377\377\377\0\0\0\1\377\377\377Ã")
IMAGE_SCAN("Â\3\377\377\377\0\0\377€€€\377\377\377\1\0\0\0ƒ\377\377\377\3€€€\0\0\0\377\377\377Â")
IMAGE_SCAN("Á\2\377\377\377\0\0\0\0\0\377\1\377„\377\377\377\5ÀÀÀ\0\0\0€€€\0\0\0\377\377\377Á")
IMAGE_SCAN("Á\3\377\377\377\0\0\0\377\377\377\0\0\377\1\377ƒ\377\377\377\5\0\0\0ÀÀÀ\377\377\377\0\0\0\377\377\377Á")
IMAGE_SCAN("\2\377\377\377\0\0\0\377\377\377\1\377\0\0\377\1\377†\377\377\377\1\0\0\0\1\377\377\377")
IMAGE_SCAN("\2\377\377\377\0\0\0ƒ\377\377\377\1\377\0\0\377\1\0\0\0…\377\377\377\1\0\0\0\1\377\377\377")
IMAGE_SCAN("\1\377\377\377ƒ\0\0\0\377\377\377\3\377\0\0\377\0\0\0ƒ\377\377\377ƒ\0\0\0\1\377\377\377")
IMAGE_SCAN("\2\377\377\377\0\0\0\0\377\0\1˜\377˜†\377\377\377\1\377\0\0\377\1\0\0\0\1\377\377\377")
IMAGE_SCAN("Á\2\377\377\377\0\0\0\0\377\0\1˜\377˜„\377\377\377\1\377\0\0\377\2\0\0\0\377\377\377Á")
IMAGE_SCAN("Á\2\377\377\377\0\0\0ƒ\0\377\0„\377\377\377ƒ\0\0\377\2\0\0\0\377\377\377Á")
IMAGE_SCAN("Â\4\377\377\377\0\0\0\0\377\0\0\0\0„\377\377\377\4\0\0\0\0\0\377\0\0\0\377\377\377Â")
IMAGE_SCAN("Ã\3\377\377\377\0\0\0\0\377\0„\377\377\377\3\0\0\377\0\0\0\377\377\377Ã")
IMAGE_SCAN("Ĉ\377\377\377Ä")
IMAGE_SCAN("Æ„\377\377\377Æ")
IMAGE_PACKED(GaugeIcon, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")

View file

@ -0,0 +1,16 @@
description "Investigating C++ cyclometric complexity";
uses
CtrlLib,
CppBase;
file
AnalyseGui.h,
Analyse.h,
AnalyseGui.iml,
Analyse.cpp,
main.cpp;
mainconfig
"" = "GUI";

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 B

View file

@ -0,0 +1,127 @@
#include "AnalyseGui.h"
#include "Analyse.h"
#define IMAGECLASS Images
#define IMAGEFILE <CodeMetric/AnalyseGui.iml>
#include <Draw/iml.h>
String defaultCode =
"/*"
" This tool measures certain source code metrics.\n"
" You can type, paste, or load the code you would like measure into this text area.\n"
" Metrics provided are:\n"
" - Cyclomatic complexity 1: counts the decision points per method, thus estimating the\n"
" number of testcases needed for each method.\n"
" - Cyclomatic complexity 2: CC1 extended with the implicit decisions created by the\n"
" && || and ?: operators. Evaluation:\n"
" CC2 1-10 simple, low risk method\n"
" CC2 10-20 moderate complexity & risk method\n"
" CC2 21-50 high complexity & risk method\n"
" CC2 >50 too complex, untestable method, should be refactored\n"
" - Depth: measures deepest scope embedding level per method. This estimates the human\n"
" memory needed to keep in mind the current context. Any methods with depth > 5 is\n"
" considered too complex, and candidate for refactoring\n"
" - Logical Lines Of Code: estimates the amount of source code per method in a way\n"
" which is mostly independent from code formatting style. Methods longer than 80 LLOC are\n"
" too long, and should be refactored.\n"
"*/\n"
"int main()\n"
"{\n"
" return 0;\n"
"}\n";
String defaultTitle = "CodeMetric GUI";
WarningDisplay::WarningDisplay(int limit, Color warningColor) :
limit(limit), warningColor(warningColor)
{
}
void WarningDisplay::PaintBackground(Draw& w, const Rect& r, const Value& q,
Color ink, Color paper, dword style) const
{
int v = (int)q;
if(v >= limit)
paper = warningColor;
Display::PaintBackground(w, r, q, ink, paper, style);
}
void AnalyseGui::MainMenu(Bar &bar)
{
bar.Add("Load file", THISBACK(Open));
}
void AnalyseGui::Open()
{
FileSelector fsel;
fsel.ExecuteOpen("Select file");
String fileName = fsel.Get();
if(fileName == "")
return;
source <<= LoadFile(fileName);
UpdateMetric();
Title(defaultTitle + " [" + fileName + "]");
}
void AnalyseGui::UpdateMetric()
{
String s = ~source;
CodeMetric metric(s);
chart.Clear();
for(int i = 0; i < metric.functions.GetCount(); i++)
{
CodeMetric::FunctionEntry & entry =
metric.functions[i];
chart.Add(entry.name,
entry.pos,
entry.cyclomaticComplexity1,
entry.cyclomaticComplexity2,
entry.logicalLinesOfCode,
entry.scopeDepth);
}
textMetric.SetData(metric.ToString());
}
void AnalyseGui::GotoFunction()
{
int cursor = chart.GetCursor();
if(cursor >= 0 && cursor < chart.GetCount())
{
int pos = (int)chart.Get(cursor, 1);
source.SetCursor( source.GetPos(pos) );
source.CenterCursor();
}
}
AnalyseGui::AnalyseGui() :
ccDisplay(50), llocDisplay(80), depthDisplay(5)
{
Title(defaultTitle);
Icon(Images::GaugeIcon);
AddFrame(menu);
menu.Set( THISBACK(MainMenu) );
source <<= THISBACK(UpdateMetric);
source <<= defaultCode;
textMetric.SetEditable(false);
chart.AddColumn("Function", 80);
chart.AddColumn("Pos", 15);
chart.AddColumn("CC1", 15).SetDisplay(ccDisplay);
chart.AddColumn("CC2", 15).SetDisplay(ccDisplay);
chart.AddColumn("LLOC", 15).SetDisplay(llocDisplay);
chart.AddColumn("Depth", 15).SetDisplay(depthDisplay);
chart.WhenLeftDouble = THISBACK(GotoFunction);
UpdateMetric();
splitter.Vert() << source << chart << textMetric;
splitter.SetPos(9000, 1);
splitter.SetPos(6500, 0);
Add(splitter.SizePos());
Sizeable().Zoomable();
}
GUI_APP_MAIN
{
AnalyseGui().Run();
}

16
examples/Color/Color.h Normal file
View file

@ -0,0 +1,16 @@
#ifndef _Color_Color_h
#define _Color_Color_h
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
class ColorWindow : public TopWindow {
public:
typedef Color CLASSNAME;
ColorWindow();
virtual void Paint(Draw& draw);
};
#endif

12
examples/Color/Color.upp Normal file
View file

@ -0,0 +1,12 @@
description "Paints text using different colors";
uses
CtrlLib;
file
Color.h,
main.cpp;
mainconfig
"" = "GUI";

21
examples/Color/main.cpp Normal file
View file

@ -0,0 +1,21 @@
#include "Color.h"
ColorWindow::ColorWindow()
{
Sizeable().Zoomable();
SetRect(100, 100, 100, 100);
}
void ColorWindow::Paint(Draw& draw)
{
draw.DrawRect(draw.GetClip(), White());
for(int i = 0; i < 16; i++) {
Color c(i & 1 ? 255 : 0, i & 2 ? 255 : 0, i & 4 ? 255 : 0);
draw.DrawText(0, i * 30, AsString(c), Arial(30).Underline(), c);
}
}
GUI_APP_MAIN
{
ColorWindow().Run();
}

View file

@ -0,0 +1,10 @@
#ifndef _CompDir_CompDir_h
#define _CompDir_CompDir_h
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
#include "textdiff.h"
#endif

View file

@ -0,0 +1,102 @@
IMAGE_BEGIN(a_file)
IMAGE_SCAN("Œ\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0„\0\377\0\0\0\0„\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0ƒ\0\377\0\1\0\0\0\0\377\0\1\0\0\0ƒ\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\0\377\0\1\0\0\0„\0\377\0\1\0\0\0\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\0\377\0†\0\0\0\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\0\377\0\1\0\0\0„\0\377\0\1\0\0\0\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\0\377\0\1\0\0\0„\0\377\0\1\0\0\0\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0†\0\377\0…\0\0\0")
IMAGE_SCAN("Â\1\0\0\0†\0\377\0\1\0\0\0\0Ü\1\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0†\0\377\0\3\0\0\0\0Ü\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0†\0\377\0\0\0\0")
IMAGE_SCAN("ˆ\0\0\0")
IMAGE_PACKED(a_file, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(b_file)
IMAGE_SCAN("Œ\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0…\0\0\0ƒ\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0\1\0\0\0„\377Ú\0\1\0\0\0\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0…\0\0\0ƒ\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0\1\0\0\0„\377Ú\0\1\0\0\0\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0\1\0\0\0„\377Ú\0\1\0\0\0\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0…\0\0\0ƒ\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0†\377Ú\0…\0\0\0")
IMAGE_SCAN("Â\1\0\0\0†\377Ú\0\1\0\0\0\377\0\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0†\377Ú\0\3\0\0\0\377\0\0\0\0\0")
IMAGE_SCAN("Â\1\0\0\0†\377Ú\0\0\0\0")
IMAGE_SCAN("ˆ\0\0\0")
IMAGE_PACKED(b_file, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(ab_file)
IMAGE_SCAN("Œ\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0„\0\377\0\0\0\0„\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0ƒ\0\377\0\1\0\0\0\0\377\0\1\0\0\0ƒ\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\0\377\0†\0\0\0\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\0\377\0\1\0\0\0„\0\377\0\1\0\0\0\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\0\377\0\1\0\0\0")
IMAGE_SCAN("Â\12\0\0\0\0\377\0\0\0\0\0\377\0\0\0\0\0\377\0\0\0\0\0\377\0\0\0\0\0\377\0\0\0\0")
IMAGE_SCAN("‚\0\0\0\12\377Ú\0\0\0\0\377Ú\0\0\0\0\377Ú\0\0\0\0\377Ú\0\0\0\0\377Ú\0\0\0\0")
IMAGE_SCAN("Â\1\0\0\0Š\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0…\0\0\0ƒ\377Ú\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0‰\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0\1\0\0\0ƒ\377Ú\0\1\0\0\0\377\0\0\1\0\0\0")
IMAGE_SCAN("Â\1\0\0\0\377Ú\0…\0\0\0\2\377\0\0\0\0\0")
IMAGE_SCAN("Â\1\0\0\0†\377Ú\0\0\0\0")
IMAGE_SCAN("ˆ\0\0\0")
IMAGE_PACKED(ab_file, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(a_dir)
IMAGE_SCAN("")
IMAGE_SCAN("")
IMAGE_SCAN("Â…\0\0\0")
IMAGE_SCAN("Á\1\0\0\0…\377\377\377\1\0\0\0")
IMAGE_SCAN("Á<>\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\0\377\0Š\377\377\377\2\0\377\0\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\0\377\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\0\377\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\0\377\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\0\377\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\0\377\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\0\377\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\0\377\0\0€€\1\0\0\0")
IMAGE_SCAN("Œ\0\0\0")
IMAGE_PACKED(a_dir, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(b_dir)
IMAGE_SCAN("")
IMAGE_SCAN("")
IMAGE_SCAN("Â…\0\0\0")
IMAGE_SCAN("Á\1\0\0\0…\377\377\377\1\0\0\0")
IMAGE_SCAN("Á<>\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377Ú\0Š\377\377\377\2\377Ú\0\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377Š\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377Ú\0\0€€\1\0\0\0")
IMAGE_SCAN("Œ\0\0\0")
IMAGE_PACKED(b_dir, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(ab_dir)
IMAGE_SCAN("")
IMAGE_SCAN("")
IMAGE_SCAN("Â…\0\0\0")
IMAGE_SCAN("Á\1\0\0\0…\377\377\377\1\0\0\0")
IMAGE_SCAN("Á<>\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\0\377\0Š\377\377\377\2\377Ú\0\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377…\0\377\0\1\0\0\0„\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377„\0\377\0\1\0\0\0…\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377…\0\377\0\1\0\0\0„\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377„\0\377\0\1\0\0\0…\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377…\0\377\0\1\0\0\0„\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\377\377\377„\0\377\0\1\0\0\0…\377Ú\0\2\0€€\0\0\0")
IMAGE_SCAN("Á\2\0\0\0\0\377\0\0€€\1\0\0\0")
IMAGE_SCAN("Œ\0\0\0")
IMAGE_PACKED(ab_dir, "\2\20\0\0\0\20\0\0\0\0\0\0\0\377\377\377\377\0\0\0\0")

View file

@ -0,0 +1,15 @@
#ifdef LAYOUTFILE
LAYOUT(CompareDirLayout, 496, 492)
ITEM(Label, dv___0, SetLabel(t_("Folder &A:")).LeftPosZ(4, 52).TopPosZ(4, 19))
ITEM(EditField, path_a, HSizePosZ(56, 4).TopPosZ(4, 19))
ITEM(Label, dv___2, SetLabel(t_("Folder &B:")).LeftPosZ(4, 52).TopPosZ(26, 19))
ITEM(EditField, path_b, HSizePosZ(56, 4).TopPosZ(26, 19))
ITEM(Label, dv___4, SetLabel(t_("File &mask:")).LeftPosZ(4, 52).TopPosZ(48, 19))
ITEM(EditField, file_mask, HSizePosZ(56, 68).TopPosZ(48, 19))
ITEM(Button, refresh, SetLabel(t_("&Refresh")).RightPosZ(4, 60).TopPosZ(48, 18))
ITEM(Splitter, splitter, HSizePosZ(4, 4).VSizePosZ(70, 4))
END_LAYOUT
#endif

View file

@ -0,0 +1,16 @@
description "Compares directory contents";
uses
CtrlLib;
file
CompDir.h,
textdiff.h,
textdiff.cpp,
main.cpp,
CompDir.lay,
CompDir.iml;
mainconfig
"" = "GUI";

286
examples/CompDir/main.cpp Normal file
View file

@ -0,0 +1,286 @@
#include "CompDir.h"
#pragma hdrstop
#define LAYOUTFILE <CompDir/CompDir.lay>
#include <CtrlCore/lay.h>
#define IMAGEFILE <CompDir/CompDir.iml>
#define IMAGECLASS CompDirImg
#include <Draw/iml.h>
String NormalizePathCase(String fn)
{
#ifdef PLATFORM_WIN32 // !PATH_CASE
return ToLower(fn);
#else
return fn;
#endif
}
static String ExpandTabs(String line, int tabsize = 4)
{
String out;
int pos = 0;
for(const char *p = line; *p; p++)
if(*p == '\t') {
int left = tabsize - pos % tabsize;
out.Cat(' ', left);
pos += left;
}
else {
out.Cat(*p);
pos++;
}
return out;
}
class DlgCompareDir : public WithCompareDirLayout<TopWindow> {
public:
typedef DlgCompareDir CLASSNAME;
DlgCompareDir();
void Run();
void Serialize(Stream& stream);
private:
void CmdRefresh();
void DoTreeCursor();
int Refresh(String rel_path, int parent);
void DoBrowse(Ctrl *field);
void ToolTree(Bar& bar);
String GetTreePath() const;
private:
struct FileInfo : Moveable<FileInfo>
{
FileInfo() {}
FileInfo(String name, int64 size, Time time) : name(name), size(size), time(time) {}
String name;
int64 size;
Time time;
};
bool FetchDir(String dir, VectorMap<String, FileInfo>& files, VectorMap<String, String>& dirs);
FrameRight<Button> browse_a, browse_b;
TreeCtrl tree;
StaticRect editor;
LineEdit lineedit;
RichTextCtrl qtf;
String pa, pb, fm;
};
DlgCompareDir::DlgCompareDir()
{
CtrlLayout(*this, "Compare directories");
Sizeable().Zoomable();
refresh <<= THISBACK(CmdRefresh);
splitter.Vert(tree, editor);
editor << lineedit.SizePos() << qtf.SizePos();
qtf.Background(White());
qtf.SetFrame(InsetFrame());
path_a.AddFrame(browse_a);
browse_a.SetImage(CtrlImg::right_arrow());
browse_a <<= THISBACK1(DoBrowse, &path_a);
path_b.AddFrame(browse_b);
browse_b.SetImage(CtrlImg::right_arrow());
browse_b <<= THISBACK1(DoBrowse, &path_b);
file_mask <<= "*.cpp *.h *.hpp *.c *.C *.cxx *.cc *.lay *.iml *.upp *.sch *.dph";
tree.WhenCursor = THISBACK(DoTreeCursor);
lineedit.SetReadOnly();
lineedit.SetFont(Courier(14));
}
void DlgCompareDir::Run()
{
TopWindow::Run();
}
void DlgCompareDir::Serialize(Stream& stream)
{
int version = 1;
stream / version;
stream % path_a % path_b % file_mask;
SerializePlacement(stream);
stream % splitter;
}
void DlgCompareDir::CmdRefresh()
{
pa = path_a;
pb = path_b;
fm = file_mask;
tree.Clear();
Image icon;
switch(Refresh(Null, 0)) {
case 0: icon = CtrlImg::Dir(); break;
case 1: icon = CompDirImg::a_dir(); break;
case 2: icon = CompDirImg::b_dir(); break;
case 3: icon = CompDirImg::ab_dir(); break;
}
tree.SetRoot(icon, "Root");
}
bool DlgCompareDir::FetchDir(String dir, VectorMap<String, FileInfo>& files, VectorMap<String, String>& dirs)
{
FindFile ff;
if(!ff.Search(AppendFileName(dir, "*")))
return false;
do
if(ff.IsFile() && PatternMatchMulti(fm, ff.GetName()))
files.Add(NormalizePathCase(ff.GetName()), FileInfo(ff.GetName(), ff.GetLength(), ff.GetLastWriteTime()));
else if(ff.IsFolder())
dirs.Add(NormalizePathCase(ff.GetName()), ff.GetName());
while(ff.Next());
return true;
}
int DlgCompareDir::Refresh(String rel_path, int parent)
{
FindFile ff;
VectorMap<String, FileInfo> afile, bfile;
VectorMap<String, String> adir, bdir;
String arel = AppendFileName(pa, rel_path);
String brel = AppendFileName(pb, rel_path);
int done = 0;
if(!FetchDir(arel, afile, adir))
done |= 2;
if(!FetchDir(brel, bfile, bdir))
done |= 1;
Index<String> dir_index;
dir_index <<= adir.GetIndex();
FindAppend(dir_index, bdir.GetKeys());
Vector<String> dirs(dir_index.PickKeys());
Sort(dirs, GetLanguageInfo());
for(int i = 0; i < dirs.GetCount(); i++) {
int fa = adir.Find(dirs[i]), fb = bdir.Find(dirs[i]);
String dn = (fb >= 0 ? bdir[fb] : adir[fa]);
int dirpar = tree.Add(parent, CtrlImg::Dir(), dn);
int dirdone = Refresh(AppendFileName(rel_path, dirs[i]), dirpar);
done |= dirdone;
switch(dirdone) {
case 0: tree.Remove(dirpar); break;
case 1: tree.SetNode(dirpar, TreeCtrl::Node().SetImage(CompDirImg::a_dir()).Set(dn)); break;
case 2: tree.SetNode(dirpar, TreeCtrl::Node().SetImage(CompDirImg::b_dir()).Set(dn)); break;
case 3: tree.SetNode(dirpar, TreeCtrl::Node().SetImage(CompDirImg::ab_dir()).Set(dn)); break;
}
}
Index<String> name_index;
name_index <<= afile.GetIndex();
FindAppend(name_index, bfile.GetKeys());
Vector<String> names(name_index.PickKeys());
Sort(names, GetLanguageInfo());
for(int i = 0; i < names.GetCount(); i++) {
int fa = afile.Find(names[i]), fb = bfile.Find(names[i]);
if(fa < 0) {
tree.Add(parent, CompDirImg::b_file(), NFormat("%s: B (%`, %0n)", bfile[fb].name, bfile[fb].time, bfile[fb].size));
done |= 2;
}
else if(fb < 0) {
tree.Add(parent, CompDirImg::a_file(), NFormat("%s: A (%`, %0n)", afile[fa].name, afile[fa].time, afile[fa].size));
done |= 1;
}
else if(afile[fa].size != bfile[fb].size
|| LoadFile(AppendFileName(arel, names[i])) != LoadFile(AppendFileName(brel, names[i]))) {
tree.Add(parent, CompDirImg::ab_file(), NFormat("%s: A (%`, %0n), B (%`, %0n)",
bfile[fb].name, afile[fa].time, afile[fa].size, bfile[fb].time, bfile[fb].size));
done |= 3;
}
}
return done;
}
String DlgCompareDir::GetTreePath() const
{
int i = tree.GetCursor();
if(i < 0)
return String::GetVoid();
if(i == 0)
return Null;
String s = tree.Get(i);
int f = s.Find(':');
if(f >= 0)
s.Trim(f);
while(i = tree.GetParent(i))
s = AppendFileName(String(tree.Get(i)), s);
return s;
}
void DlgCompareDir::DoTreeCursor()
{
String s = GetTreePath();
if(IsNull(s))
return;
String fa = AppendFileName(pa, s), fb = AppendFileName(pb, s);
String da = LoadFile(fa), db = LoadFile(fb);
if(!IsNull(da) || !IsNull(db))
if(IsNull(da) || IsNull(db)) {
qtf.Hide();
lineedit.Show();
lineedit <<= Nvl(db, da);
}
else {
lineedit.Hide();
qtf.Show();
String comptext = "[C2 ";
Vector<String> la = GetStringLineMap(da), lb = GetStringLineMap(db);
Array<TextSection> sections = CompareLineMaps(la, lb);
for(int s = 0; s < sections.GetCount(); s++) {
const TextSection& sec = sections[s];
if(sec.same) {
comptext << "[@(0.0.0) \1";
if(sec.count1 <= 6)
for(int i = 0; i < sec.count1; i++)
comptext << ExpandTabs(la[i + sec.start1]) << '\n';
else {
for(int i = 0; i < 3; i++)
comptext << ExpandTabs(la[i + sec.start1]) << '\n';
comptext << "...\n";
for(int i = -3; i < 0; i++)
comptext << ExpandTabs(la[i + sec.start1 + sec.count1]) << '\n';
}
comptext << "\1]";
}
else {
if(sec.count1) {
comptext << "[@(0.160.0) \1";
for(int i = 0; i < sec.count1; i++)
comptext << ExpandTabs(la[sec.start1 + i]) << '\n';
comptext << "\1]";
}
if(sec.count2) {
comptext << "[@(0.0.255) \1";
for(int i = 0; i < sec.count2; i++)
comptext << ExpandTabs(lb[sec.start2 + i]) << '\n';
comptext << "\1]";
}
}
}
qtf.SetQTF(comptext);
}
}
void DlgCompareDir::DoBrowse(Ctrl *field)
{
FileSel fsel;
fsel.AllFilesType();
static String recent_dir;
fsel <<= Nvl((String)~*field, recent_dir);
if(fsel.ExecuteSelectDir())
*field <<= recent_dir = ~fsel;
}
void DlgCompareDir::ToolTree(Bar& bar)
{
}
GUI_APP_MAIN
{
DlgCompareDir cmpdlg;
LoadFromFile(cmpdlg, ConfigFile());
cmpdlg.Run();
StoreToFile(cmpdlg, ConfigFile());
}

View file

@ -0,0 +1,209 @@
#include "CompDir.h"
template <class I>
static int CompareGetCount(I a, I b, int max_count)
{
if(max_count <= 0 || *a != *b)
return 0;
int left;
for(left = max_count; --left > 0;)
if(*++a != *++b)
return max_count - left;
return max_count;
}
Vector<String> GetLineMap(Stream& stream)
{
Vector<String> out;
int emp = 0;
if(stream.IsOpen())
while(!stream.IsEof()) {
String s = stream.GetLine();
const char *p = s, *e = s.End(), *f = e;
while(e > p && (byte)e[-1] <= ' ')
e--;
if(e == p)
emp++;
else
{
while(emp-- > 0)
out.Add(Null);
if(e != f)
s.Trim(e - p);
out.Add(s);
emp = 0;
}
}
return out;
}
Vector<String> GetFileLineMap(const String& path)
{
FileIn fi(path);
return GetLineMap(fi);
}
Vector<String> GetStringLineMap(const String& s)
{
StringStream ss(s);
return GetLineMap(ss);
}
class TextComparator
{
public:
TextComparator(const Vector<String>& f1, const Vector<String>& f2);
Array<TextSection> GetSections() const;
private:
bool Find(int start1, int end1, int start2, int end2, int& best_match, int& best_count) const;
void Split(Array<TextSection>& dest, int start1, int end1, int start2, int end2) const;
private:
Vector<HashBase> hash1;
Vector<HashBase> hash2;
const Vector<String>& file1;
const Vector<String>& file2;
};
Array<TextSection> CompareLineMaps(const Vector<String>& s1, const Vector<String>& s2)
{
return TextComparator(s1, s2).GetSections();
}
static void CalcHash(Vector<HashBase>& hash, const Vector<String>& file, int limit)
{
{ // 1st row
HashBase& first = hash.Add();
for(int i = 0; i < file.GetCount(); i++)
first.Add(GetHashValue(file[i]));
}
static const int prime[] =
{
3, 5, 7, 11, 13, 17, 19, 21,
23, 29, 31, 37, 41, 43, 47, 51,
53, 61, 67, 71, 73, 79, 83, 87,
89, 97, 101, 103, 107, 109, 113, 117,
};
const int *pp = prime;
for(int l = 1; l < limit; l <<= 1) {
HashBase& nhash = hash.Add();
const HashBase& ohash = hash[hash.GetCount() - 2];
int pri = *pp++;
int t;
for(t = l; t < ohash.GetCount(); t++)
nhash.Add(ohash[t - l] + pri * ohash[t]);
for(t -= l; t < ohash.GetCount(); t++)
nhash.Add(ohash[t]);
}
}
TextComparator::TextComparator(const Vector<String>& f1, const Vector<String>& f2)
: file1(f1), file2(f2)
{
int limit = min(f1.GetCount(), f2.GetCount());
CalcHash(hash1, f1, limit);
CalcHash(hash2, f2, limit);
}
static bool CompareSection(const TextSection& ta, const TextSection& tb)
{
return ta.start1 < tb.start1 || ta.start1 == tb.start1 && ta.start2 < tb.start2;
}
Array<TextSection> TextComparator::GetSections() const
{
Array<TextSection> output;
Split(output, 0, file1.GetCount(), 0, file2.GetCount());
Sort(output, &CompareSection);
return output;
}
static int GetHashLevel(int min_count, int hash_count)
{
int l = 0;
hash_count--;
while(min_count > 1 && l < hash_count)
{
min_count >>= 1;
l++;
}
return l;
}
bool TextComparator::Find(int start1, int end1, int start2, int end2, int& best_match, int& best_count) const
{
ASSERT(end1 > start1 && end2 > start2);
bool done = false;
const String *f1 = file1.Begin() + start1;
int len1 = end1 - start1;
int lvl = GetHashLevel(best_count + 1, hash1.GetCount());
int chunk = 1 << lvl;
int last = max(best_count - chunk + 1, 0);
const HashBase *hp1 = &hash1[lvl];
const HashBase *hp2 = &hash2[lvl];
const unsigned *h1 = hp1->Begin() + start1;
int i = hp2->Find(*h1);
while(i >= 0)
if(i + best_count >= end2)
return done;
else {
if(i >= start2 && h1[last] == (*hp2)[i + last]) {
int top = min(len1, end2 - i);
int hc = CompareGetCount(h1, hp2->Begin() + i, top) + chunk - 1;
int cnt = CompareGetCount(f1, file2.Begin() + i, min(hc, top));
if(cnt > best_count) {
best_count = cnt;
best_match = i;
done = true;
last = best_count - chunk + 1;
if(best_count + 1 >= 2 * chunk)
{
lvl = GetHashLevel(best_count + 1, hash1.GetCount());
chunk = 1 << lvl;
last = best_count - chunk + 1;
hp1 = &hash1[lvl];
hp2 = &hash2[lvl];
h1 = hp1->Begin() + start1;
int oi = i;
for(i = hp2->Find(*h1); i >= 0 && i <= oi; i = hp2->FindNext(i))
;
continue;
}
}
}
i = hp2->FindNext(i);
}
return done;
}
void TextComparator::Split(Array<TextSection>& dest, int start1, int end1, int start2, int end2) const
{
ASSERT(start1 <= end1 && start2 <= end2);
while(start1 < end1 && start2 < end2) {
int new1 = -1, new2 = -1, count = 0;
for(int i = start1; i + count < end1; i++)
if(Find(i, end1, start2, end2, new2, count))
new1 = i;
if(count == 0)
break; // no match at all
ASSERT(new1 >= start1 && new1 + count <= end1);
ASSERT(new2 >= start2 && new2 + count <= end2);
dest.Add(TextSection(new1, count, new2, count, true));
if(new1 - start1 >= end1 - new1 - count) { // head is longer - recurse for tail
Split(dest, new1 + count, end1, new2 + count, end2);
end1 = new1;
end2 = new2;
}
else { // tail is longer - recurse for head
Split(dest, start1, new1, start2, new2);
start1 = new1 + count;
start2 = new2 + count;
}
ASSERT(start1 <= end1 && start2 <= end2);
}
if(start1 < end1 || start2 < end2)
dest.Add(TextSection(start1, end1 - start1, start2, end2 - start2, false));
}

View file

@ -0,0 +1,23 @@
#ifndef _CompDir_textdiff_h_
#define _CompDir_textdiff_h_
class TextSection
{
public:
TextSection(int start1, int count1, int start2, int count2, bool same)
: start1(start1), count1(count1), start2(start2), count2(count2), same(same) {}
public:
int start1;
int count1;
int start2;
int count2 : 31;
unsigned same : 1;
};
Array<TextSection> CompareLineMaps(const Vector<String>& l1, const Vector<String>& l2);
Vector<String> GetLineMap(Stream& stream);
Vector<String> GetFileLineMap(const String& path);
Vector<String> GetStringLineMap(const String &s);
#endif

View file

@ -0,0 +1,12 @@
description "Converts metric units and U.S. units (meters / feets etc..)";
uses
CtrlLib;
file
main.cpp,
converter.lay;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,11 @@
#ifdef LAYOUTFILE
LAYOUT(ConverterPaneLayout, 244, 76)
ITEM(LabelBox, title, LeftPosZ(8, 228).TopPosZ(4, 64))
ITEM(EditDoubleSpin, value, LeftPosZ(16, 144).TopPosZ(20, 19))
ITEM(SliderCtrl, slider, LeftPosZ(16, 144).TopPosZ(40, 20))
ITEM(DropList, unit, LeftPosZ(164, 64).TopPosZ(20, 19))
END_LAYOUT
#endif

View file

@ -0,0 +1,78 @@
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
// http://www.ictp.trieste.it/~manuals/programming/Java/tutorial/uiswing/overview/anatomy.html
#define LAYOUTFILE <Converter/converter.lay>
#include <CtrlCore/lay.h>
struct ConverterPane : WithConverterPaneLayout<StaticRect> {
ConverterPane *slave;
void AdjustSlave()
{
slave->slider <<= slave->value <<=
IsNull(value) ? 0.0 : (double)~unit * (double)~value / (double)~slave->unit;
}
void ValueChanged()
{
slider <<= ~value;
AdjustSlave();
}
void SliderChanged()
{
value <<= ~slider;
AdjustSlave();
}
typedef ConverterPane CLASSNAME;
ConverterPane()
{
CtrlLayout(*this);
slider.Range(10000);
slider <<= value <<= 0;
value <<= THISBACK(ValueChanged);
slider <<= THISBACK(SliderChanged);
unit <<= THISBACK(AdjustSlave);
}
};
struct Converter : TopWindow
{
ConverterPane metric, us;
typedef Converter CLASSNAME;
Converter()
{
Title("Converter");
Size sz = metric.GetLayoutSize();
SetRect(0, 0, metric.GetSize().cx, metric.GetSize().cy * 2);
Add(metric.HSizePos().TopPos(0, sz.cy));
Add(us.HSizePos().BottomPos(0, sz.cy));
metric.title = "Metric units";
metric.unit.Add(0.01, "Centimeters");
metric.unit.Add(1.0, "Meters");
metric.unit.Add(1000.0, "Kilometers");
metric.unit <<= 1.0;
us.title = "U.S. units";
us.unit.Add(0.0254, "Inches");
us.unit.Add(0.305, "Feet");
us.unit.Add(0.914, "Yards");
us.unit.Add(1613.0, "Miles");
us.unit <<= 0.305;
us.slave = &metric;
metric.slave = &us;
metric.AdjustSlave();
}
};
GUI_APP_MAIN
{
Converter().Run();
}

19
examples/Days/Days.h Normal file
View file

@ -0,0 +1,19 @@
#ifndef _Days_Days_h
#define _Days_Days_h
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
#define LAYOUTFILE <Days/Days.lay>
#include <CtrlCore/lay.h>
class Days : public WithDaysLayout<TopWindow> {
public:
void Compute();
typedef Days CLASSNAME;
Days();
};
#endif

8
examples/Days/Days.lay Normal file
View file

@ -0,0 +1,8 @@
LAYOUT(DaysLayout, 320, 64)
ITEM(EditDate, date1, LeftPosZ(52, 100).TopPosZ(8, 19))
ITEM(Label, dv___1, SetLabel(t_("Date 1")).LeftPosZ(8, 40).TopPosZ(8, 19))
ITEM(EditDate, date2, LeftPosZ(212, 100).TopPosZ(8, 19))
ITEM(Label, dv___3, SetLabel(t_("Date 2")).LeftPosZ(168, 40).TopPosZ(8, 19))
ITEM(Label, result, LeftPosZ(8, 304).TopPosZ(36, 19))
END_LAYOUT

13
examples/Days/Days.upp Normal file
View file

@ -0,0 +1,13 @@
description "Displays a number of days between two dates";
uses
CtrlLib;
file
Days.h,
main.cpp,
Days.lay;
mainconfig
"" = "GUI";

20
examples/Days/main.cpp Normal file
View file

@ -0,0 +1,20 @@
#include "Days.h"
void Days::Compute()
{
result = IsNull(date1) || IsNull(date2) ? "" :
Format("There is %d day(s) between %` and %`", abs(Date(~date1) - Date(~date2)), ~date1, ~date2);
}
Days::Days()
{
CtrlLayout(*this, "Days");
date1 <<= THISBACK(Compute);
date2 <<= THISBACK(Compute);
Compute();
}
GUI_APP_MAIN
{
Days().Run();
}

2
examples/DbfView/AUTHORS Normal file
View file

@ -0,0 +1,2 @@
Mirek Fidler <cxl@ntllib.org>
Tomas Rylek <rylek@volny.cz>

30
examples/DbfView/COPYING Normal file
View file

@ -0,0 +1,30 @@
Copyright (C) 2005 Mirek Fidler, Tomas Rylek and various contributors (see AUTHORS)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies of the Software and its Copyright notices. In addition publicly
documented acknowledgment must be given that this software has been used if no
source code of this software is made available publicly. This includes
acknowledgments in either Copyright notices, Manuals, Publicity and Marketing
documents or any documentation provided with any product containing this
software. This License does not apply to any software that links to the
libraries provided by this software (statically or dynamically), but only to
the software provided.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-----------
Please see the COPYING.PLAIN for a plain-english explanation of this notice
and it's intent.

View file

@ -0,0 +1,33 @@
Plain English Copyright Notice
This file is not intended to be the actual License. The reason this file
exists is that we here are programmers and engineers. We aren't lawyers. We
provide licenses that we THINK say the right things, but we have our own
intentions at heart. This is a plain-english explanation of what those
intentions are, and if you follow them you will be within the "spirit" of
the license.
The intent is for us to enjoy writing software that is useful to us (the
AUTHORS) and allow others to use it freely and also benefit from the work we
put into making it. We don't want to restrict others using it. They should
not *HAVE* to make the source code of the applications they write that
simply link to these libraries (be that statically or dynamically), or for
them to be limited as to what license they choose to use (be it open, closed
or anything else). But we would like to know you are using these libraries.
We simply would like to know that it has been useful to someone. This is why
we ask for acknowledgement of some sort.
You can do what you want with the source of this software - it doesn't
matter. We still have it here for ourselves and it is open and free to use
and download and play with. It can't be taken away. We don't really mind what
you do with the source to your software. We would simply like to know that
you are using it - especially if it makes it to a commerical product. If you
simply e-mail all the AUTHORS (see COPYING and AUTHORS files) telling us, and
then make sure you include a paragraph or page in the manual or in the "About.."
box for the product with the copyright notice and state that you used this
software, we will be very happy. If you want to contribute back modifications
and fixes you may have made we will welcome those too with open arms (generally).
If you want help with changes needed, ports needed or features to be added,
arrangements can be easily made with some dialogue.
Mirek Fidler <cxl@ntllib.org>

View file

@ -0,0 +1,73 @@
#include <CtrlLib/CtrlLib.h>
#include <plugin/dbf/dbf.h>
using namespace Upp;
struct DbfView : public TopWindow {
Splitter s;
ArrayCtrl table;
ArrayCtrl row;
DbfStream dbf;
void EnterRow();
void Perform();
typedef DbfView CLASSNAME;
DbfView();
};
String FormatField(const DbfStream::Field& f)
{
return f.name + Format(" (%c%d)", f.type, f.width);
}
void DbfView::EnterRow()
{
row.Clear();
if(!dbf.Fetch(table.GetCursor()))
return;
for(int i = 0; i < dbf.GetFieldCount(); i++)
row.Add(FormatField(dbf.GetField(i)), dbf[i]);
}
void DbfView::Perform()
{
FileSel fs;
LoadFromFile(fs);
fs.AllFilesType();
fs.Type("*.dbf", "dbf");
if(!fs.ExecuteOpen("DBF..")) return;
StoreToFile(fs);
if(!dbf.Open(~fs))
Exclamation("Can't open input file");
for(int i = 0; i < min(4, dbf.GetFieldCount()); i++)
table.AddColumn(FormatField(dbf.GetField(i)));
while(dbf.Fetch()) {
Vector<Value> v;
for(int i = 0; i < min(4, dbf.GetFieldCount()); i++)
v.Add(dbf[i]);
table.Add(v);
}
Run();
}
DbfView::DbfView()
{
s.Set(table, row);
s.SetPos(7000);
Add(s.SizePos());
Sizeable().Zoomable();
table.WhenEnterRow = THISBACK(EnterRow);
row.AddColumn("Column");
row.AddColumn("Value", 2);
}
GUI_APP_MAIN
{
SetDefaultCharset(CHARSET_WIN1250);
SetLanguage(LNG_CZECH);
Ctrl::NoLayoutZoom();
DbfView().Perform();
}

View file

@ -0,0 +1,16 @@
description "Viewer of DBF files";
uses
plugin\dbf,
CtrlLib;
file
DbfView.cpp,
Info readonly separator,
COPYING,
COPYING-PLAIN,
AUTHORS;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,216 @@
#include "EyeCare.h"
#define IMAGECLASS EyeCareImg
#define IMAGEFILE <EyeCare/EyeCare.iml>
#include <Draw/iml.h>
#define TOPICFILE <EyeCare/app.tpp/all.i>
#include <Core/topic_group.h>
#ifdef _DEBUG
#define MINUTE_M 1000 // to reduce waiting when debugging....
#else
#define MINUTE_M 60 * 1000
#endif
void EyeCare::About()
{
dismiss.Kill();
ignore++;
WithAboutDialogLayout<TopWindow> dlg;
dlg.text = GetTopic("topic://EyeCare/app/about$en-us").text;
CtrlLayoutOK(dlg, "About");
dlg.CenterScreen();
dlg.Run();
ignore--;
Restart();
}
void EyeCare::Restart()
{
relax.KillSet(-(int)~config.relax * MINUTE_M, THISBACK(Relax));
wash.KillSet(-(int)~config.wash * MINUTE_M, THISBACK(Wash));
}
void EyeCare::Perform(int newstate)
{
if(newstate < state)
return;
state = newstate;
String txt1[] = {
t_("Welcome to Eye Care!"),
t_("Eye relaxing time..."),
t_("Eye washing time...")
};
String txt2[] = {
t_("This program will remind you at regular intervals\nto take care of your eyes and relax/wash them."),
t_("Now move your eyes away, from the monitor\nand view some distant object for 15 seconds."),
t_("Now move to the wash room, and gently wash \nyour eyes with water to prevent dryness.")
};
dismiss.KillSet(15000, THISBACK(Dismiss));
text1 = txt1[state];
text2 = txt2[state];
if(!IsOpen())
OpenMain();
Show();
SetForeground();
}
void EyeCare::Launch()
{
Perform(LAUNCH);
}
void EyeCare::Dismiss()
{
state = -1;
Hide();
}
void EyeCare::Relax()
{
if(ignore) return;
Perform(RELAX);
}
void EyeCare::Wash()
{
if(ignore) return;
Perform(WASH);
}
void EyeCare::Sync()
{
#ifdef PLATFORM_WIN32
ExStyle(config.topmost ? GetExStyle() | WS_EX_TOPMOST
: GetExStyle() & ~WS_EX_TOPMOST);
#endif
trayicon.Icon(ignore ? EyeCareImg::off() : EyeCareImg::icon());
if(config.hideicon)
ignore = false;
trayicon.Show(!config.hideicon);
Restart();
}
void EyeCare::Configure()
{
dismiss.Kill();
relax.Kill();
wash.Kill();
config.Execute();
Sync();
}
void EyeCare::Ignore()
{
ignore = !ignore;
Sync();
}
void EyeCare::SettingsMenu(Bar& bar)
{
bar.Add(t_("Configuration"), THISBACK(Configure))
.Help(t_("Change settings"));
bar.Add(t_("Exit"), THISBACK(Exit))
.Help(t_("Exit the application"));
}
void EyeCare::HelpMenu(Bar& bar)
{
bar.Add(t_("About"), THISBACK(About))
.Help(t_("About EyeCare"));
}
void EyeCare::MainMenu(Bar& bar)
{
bar.Add(t_("Settings"), THISBACK(SettingsMenu));
bar.Add(t_("Help"), THISBACK(HelpMenu));
}
void EyeCare::TrayMenu(Bar& bar)
{
bar.Add(t_("Show EyeCare"), THISBACK(Launch));
bar.Add(t_("Ignore eyes"), THISBACK(Ignore))
.Check(ignore);
bar.Add(t_("About.."), THISBACK(About));
bar.Add(t_("Exit"), THISBACK(Exit));
}
void EyeCare::Serialize(Stream& s)
{
int version = 1;
s / version;
s % config.relax % config.wash % config.hideicon % config.topmost;
s % ignore;
SerializePlacement(s);
}
const char regpath[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
const char regname[] = "EyeCareUpp";
void EyeCare::Exit()
{
Break();
trayicon.Break();
#ifdef PLATFORM_WIN32
HKEY hkey;
if(RegOpenKeyEx(HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, &hkey) == ERROR_SUCCESS) {
RegDeleteValue(hkey, regname);
RegCloseKey(hkey);
}
#endif
}
void EyeCare::Do()
{
LoadFromFile(*this);
Sync();
Launch();
Restart();
#ifdef PLATFORM_WIN32
HKEY key;
if(RegCreateKey(HKEY_CURRENT_USER, regpath, &key) == ERROR_SUCCESS) {
RegSetValueEx(key, regname, 0, REG_SZ, GetExeFilePath(), GetExeFilePath().GetLength() + 1);
RegCloseKey(key);
}
#endif
trayicon.Run();
StoreToFile(*this);
}
EyeCare::EyeCare()
{
CtrlLayoutOKCancel(config, t_("Configuration"));
CtrlLayout(*this, t_("EyeCare"));
menu.Set(THISBACK(MainMenu));
image.SetImage(EyeCareImg::eye());
CenterScreen();
hide <<= THISBACK(Hide);
config.relax <<= 5;
config.wash <<= 55;
Icon(EyeCareImg::icon());
state = -1;
trayicon.WhenBar = THISBACK(TrayMenu);
trayicon.WhenLeftDouble = THISBACK(Launch);
trayicon.Icon(EyeCareImg::icon());
trayicon.Tip(t_("EyeCare"));
}
GUI_APP_MAIN
{
#ifdef PLATFORM_WIN32
static const char unique_name[] = "EyeCare_$_$_U++";
if(::FindWindow(NULL, unique_name)) {
Exclamation(t_("EyeCare is already running."));
return;
}
TopWindow singlechk;
singlechk.SetRect(-1, -1, 1, 1);
singlechk.Hide();
singlechk.Title(unique_name);
singlechk.Open();
#endif
EyeCare().Do();
}

View file

@ -0,0 +1,48 @@
#ifndef _EyeCare_EyeCare_h_
#define _EyeCare_EyeCare_h_
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
#define LAYOUTFILE <EyeCare/EyeCare.lay>
#include <CtrlCore/lay.h>
class EyeCare : public WithEyeCareLayout<TopWindow> {
enum { LAUNCH, RELAX, WASH };
int state;
int ignore;
TimeCallback relax, wash, dismiss;
TrayIcon trayicon;
WithConfigurationLayout<TopWindow> config;
void Perform(int newstate);
void Relax();
void Wash();
void Configure();
void Dismiss();
void MainMenu(Bar& menu);
void SettingsMenu(Bar& bar);
void HelpMenu(Bar& bar);
void TrayMenu(Bar& bar);
void Ignore();
void Launch();
void Restart();
void Sync();
void About();
void StartLaunch();
void Exit();
public:
void Serialize(Stream& s);
void Do();
typedef EyeCare CLASSNAME;
EyeCare();
};
#endif

View file

@ -0,0 +1,127 @@
IMAGE_BEGIN(eye)
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\6<><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>顗黹<E9A197><E9BBB9>\5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\1<><EFBFBD><E99AAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBDBE><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD><EFBFBD>\3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\3顗<33><EFBFBD><EFBFBD>レ\5<>メ籌ヒ<E7B18C><EFBFBD><EFBFBD>ヤれンメ\2<><EFBFBD><EFBE9A><EFBFBD><EFBFBD>\1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBDBE><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\1<><31><EFBFBD><EFBFBD><EFBFBD>\2汜<32><E6B19C><EFBFBD><EFBFBD><EFBFBD>\12<31><EFBFBD><E99AAF><EFBFBD><EFBFBD>メユノシワムツユノシモニクユノシモニクのテイ\14トオ「セイ<EFBDBE>サュ峺ェ仆ュ嵌コィモニクロフコ<EFBE8C>モ隯レ<E99AAF><EFBE9A><EFBFBD><EFBFBD><E99AAF>\1<><EFBFBD><E99AAF><EFBFBD><EFBFBD><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBDBE><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\1<><31><EFBFBD><EFBFBD><EFBFBD>\4<><34><EFBFBD>隯隯レ<E99AAF>ヘれワヒ\32耿チンムセロフコンムセ袙ト<E8A299><EFBFBD><EFBFBD><EFBFBD>ミ浯フ<E6B5AF>ヒ袙トロフコヒシェサュ岼<EFBDAD>乾煤檮xシァ篤オ「ヤナイ<EFBE85><EFBFBD><EFBFBD><EFBE94><EFBFBD><EFBFBD>\377<37><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\1<><31>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBDBE><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\6葆ム袙ト耿チンムセ袙ト浯フ<E6B5AF><EFBFBD><E890BC>\2<><32>\377<37><37><EFBFBD><EFBFBD><EFBFBD>\24<32><EFBFBD><EFBFBD>ヘ浯フ衲シヤノオヒサ、テイ惠斧ォ宸エ汪ツャ噸スゥ耒コ<E88092><EFBFBD><EFBE8A>橫蔬<E6A9AB><EFBFBD><E6B19C><EFBFBD><EFBFBD><EFBFBD>\1<><31>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377"
"\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\1<><31><EFBFBD><EFBFBD><EFBFBD>\11汜<31>ロレユヒツユノシンムセンルヌ<EFBE99><EFBFBD><EFBFBD><EFBE9C><EFBFBD>377<37>\2<><32><EFBFBD><EFBFBD><EFBFBD>377<37><37><EFBFBD>\2隯レ<E99AAF><EFBFBD>鰆\10<31>ヘ浯フ衲シ耒コロハエロトウモスゥテョ凾サ、欺10テョ簒シ」ロトウ<EFBE84>ヒ葆ム<E89186><EFBFBD><EFBFBD><E9B586><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377"
"\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\7汜<37>ユミニスコソカイ葆ム<E89186><EFBFBD>蛯顗鷭1\377<37><37><EFBFBD>377<37>\5<><EFBFBD><E99AAF>隯レ<E99AAF><EFBE9A><EFBFBD>ヘょリト\2<>ヒ浯フ<E6B5AF>簣\23<32><EFBFBD><EFBFBD><EFBFBD>ノ衲シルセゥフオ。テョ卉ァ名ァ噸ツャモニクワムツ<EFBE91><EFBFBD><EFBFBD><EFBE9C><EFBFBD><EFBFBD><E99AAF>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377"
"\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\4溿ワヌチコカョァマナセ<EFBE85><EFBDBE>\1汜<31><E6B19C><EFBFBD>\17顗<37><E9A197><EFBFBD><EFBFBD><E99AAF>\377<37>隯レ<E99AAF><EFBE9A><EFBFBD><EFBFBD><EFBFBD>ト衲シ鰌コワヒォロハエロフコ衲シ<E8A1B2>レト\4<>タ衲シ<E8A1B2><EFBFBD><EFBFBD>ンノ\3<>タロトウフオ。づョ兔10トオ「ヤナイワムツ<EFBE91>ミ隯レ<E99AAF><EFBE9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>曾0\0\0ケ<30><EFBDB9><EFBFBD>箪0\0\0ソ<30><EFBDBF><EFBFBD><EFBFBD>"
"<22><>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\5<><35>裙レホフツユヒツ<EFBE8B><EFBFBD>鮏\2顗<32><E9A197><EFBFBD><EFBFBD>\10<31><EFBFBD><EFBFBD><EFBE9A>隯レ\377<37><37><EFBFBD><EFBE84><EFBFBD>オぽテ」\15サ<35>}ヒア凸ャ胎セゥムカ。簓イモスゥシァ薙ヘウ<EFBE8D>ト簓イ耋ウ鰌コろユタ\15鰌コロトウモツャムカ。ハケ榮オ「ヒシェロフコ<EFBE8C><EFBFBD><EFBFBD>ヤ\377<37><37><EFBFBD><E99AAF><EFBFBD>曾0\0\0ク"
"<22><><EFBFBD>能0\0\0ソ<30><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\2<><32><EFBFBD>ゆ瞰\1<><EFBFBD>鮏\12<31><32><EFBFBD><EFBFBD>メンムセ耒コロハエハエ峙嘴サ。┃橘ぅ<E6A998>\2破F<E7A0B4>Vき橘\7ク府コ怐ネァ<EFBE88>ケ憫ト」萍ュ簇ャゆハュ\2鯱イ<E9AFB1><EFBFBD>ヘウ\13ロテ」モシ」ヒサ、モシ」ヤナイ衲シ<E8A1B2><EFBFBD><EFBFBD><EFBE8D><EFBFBD><E9A197><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>Ы0\0\0ク<30><EFBDB8>"
"<22><>0\0\0<><30><EFBFBD><EFBFBD>0\0\0ソ<30><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\25<32><35><EFBFBD><EFBFBD>粭瞰裙レ顗<EFBE9A>隯橫蕘<E6A9AB><EFBFBD><E9A197><EFBFBD>隯隯レ耒コシァ騰奴ウ怱サ。┘<EFBDA1><E29498>V吉Eヱg=\15破F。xL<78>6|V5耀KA。xLテ汞ス嗾ナ「{モッ怠オ屯ク符レス媾2ンチ杳ト」ぽテ」\10モシ」ユテ、簓イ鰌コ<E9B08C>ト隯レ<E99AAF><EFBE9A><EFBFBD><E6B19C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0\0\0"
"<22><><EFBFBD>Ы0\0\0ク<30><EFBDB8><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0ソ<30><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\2<><32><EFBFBD>ょ聚\14<31><34><EFBFBD>隯\377<37><37><EFBFBD><EFBFBD><EFBE98><EFBFBD><EFBFBD><EFBFBD>シレサ「サ、共<EFBDA4>屍SgE\10|V5<56>6vJ%{Q*sG\34j@\27vJ%sG\34[6\11恵;sG\34vJ%組=破F。xLイ掲キ男ス嗾<EFBDBD>「{みチ拿1狷」ぽテ」\10狷」鯱イ<E9AFB1><EFBFBD>ヘ隯レ顗<EFBE9A><E9A197><EFBFBD><EFBFBD>"
"<22><><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>Ы0\0\0\1<><31><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>蚕0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>蚕0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>蚕0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\1<><31>ⅲ觸1顗黷<E9A197><E9BBB7>\15\377<37><37><EFBFBD><EFBFBD><EFBFBD>キモッ足<EFBDAF>吉E|V5b>$Z4\30^1\13e:\23<32>Q*jF\5<>6組=<3D>6d8\17j@\27タ1\13\1d8\17[6\23破F耀K。xL、{Uゥ<55>ウ運ケ瓶ナ孰メョ尉イ芹ス巛チ杳ト」簇ャ衽ェ<E8A1BD><EFBFBD><EFBFBD>"
"萼<>竄顗齒<E9A197><E9BD92><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>Ⅸ0\0\0<><30><EFBFBD>ソ0\0\0<><30><EFBFBD>箪0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>箪0\0\0<><30><EFBFBD>蚕0\0\0<><30><EFBFBD>箪0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隯\22\377<37><37>ヘモスゥサ、境橘組=j@\27Z4\30sG\34{Q*<2A>6耀K破Fゥ<46>、{U耀K恵;<3B>6<EFBFBD>sK\1、{Ub;\5|V5j@\27{Q*j@\27<32>6b;\13組=破F、{Uキ男ナ「{ス嗾ナ「{ホア<EFBE8E>オ頓ス巵ト」ゆハュ\5鰌コ<E9B08C>ヒ"
"<22><EFBFBD><EFBE9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>Ы0\0\0<><30><EFBFBD>能0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>能0\0\0<><30><EFBFBD>圭0\0\0<><30><EFBFBD>能0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\27<32><EFBFBD><EFBFA4>糒鰤隯レ袙トサュ屓郊孺b破F<E7A0B4>6sG\34vJ%破F耀K、{Uナ孰\377ロス<EFBE9B>コルエ祷vVb>$I#\15<31>4\30\10吉Eゥ<45>ォ橘イ掲<EFBDB2>V破FAjG\'[6レb;\2破Fゥ<46>ご掲\14キ男キ碗サ<E7A297>}ハャ態ク補ツ游ト」耋ウ袙"
"ト<><EFBFBD><EFBFBD><E7B3AF><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37>\2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3顗<33><EFBFBD>ワれワヒ\7<>タテョ刮r\\yaK屍Sイ掲。xLb;\11。xLェ~dナ孰<EFBE85>ォ\377ロス<EFBE9B>コレサ「北VZ4\30<33>;\30\2\21J&\21I#\15Aネァ<EFBE88>忿ャ映キ男耀K破F|V5恵;吉E破F吉E<E59089>6恵;組=さ運\11ゥ<31>キ男ナ「"
"{ムイ芹ス帚ツ溘ヘウ耿チ<E880BF><EFBFBD><EFBE94><EFBFBD><EFBFBD><EFBFBD>構0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37>\2<><32><EFBFBD><EFBFBD><EFBFBD>7<EFBFBD><37>栁メ<E6A081><EFBE92>鯱イサ。─<E29480>V氈fイ布ネァ<EFBE88>イ距sK破F、{Uイ掲ナ「{ヒア馴ヘイ鏞ニメエ凖汞ェ~dZ4\30D\31\4U)\24;\30\2D\31\4U)\24エ爽篦濤碗ナ「{ウ運、{Uゥ<55>破Fケ瓶ナ孰、{U<>V<EFBFBD>6d8\17恵;Ъ*、{Uウ運ケ<E9818B>"
"rメョ異エ頓ス幃ヘイ袙ト聘ヒ顗<EFBE8B><E9A197><EFBFBD><EFBFBD><EFBFBD>圭0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37>\34<33><34><EFBFBD><EFBFBD><E9A197><EFBFBD><EFBFBD><EFBFBD>キ狷」ネァ<EFBE88><EFBDA7><EFBFBD>V、<56>テ汞メエ叭サ「ヤク風sK破Fォ橘サ<E6A998>}ネァ<EFBE88>ケ憺リエ<EFBE98><EFBDB4>簇ャハャ走kVU\'\13D\31\4)\24<32>#\15\5|V5ネァ<EFBE88>イ勤ア<E58BA4>「{さ運\7<>Vネァ<EFBE88>エ鴇忿ケ瓶ェ~d恵;[*\13耀Kゥ<4B>ウ運ナ「{ネァ"
"<22>ョ移サ「ロフコワムツ<EFBE91>糒鰤<E7B392><E9B0A4><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>Ⅸ0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD>\34栁メ<E6A081><EFBFBD>オメエ劵<EFBDB4><EFBFBD>ョ壮コ怐ツャ噸スゥ耒コ<E88092>ト狷」耀K屍Sナ「{モオ屯ク保テ」<EFBE83>コサ、級r\\AZ4\30D\31\4U)\24U\'\13U)\24<32>\31\4\33b>$モオ縄ホ・ホア<EFBE8E>ョ以ァ<E4BBA5>瓶ォ<E793B6>モケ懿ムキレサ「メエ卻ァ<E58DBB>男。xL組=。xL、{Uゥ<55>"
"[ナ孰ネァ<EFBE88>ョ位エ嶽ナイワムツ溿ワ<E6BABF><EFBFBD><EFBE9C><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>Ⅸ0\0\0<><30><EFBFBD>能0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>貼0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>能0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377\33顗<33><EFBFBD><EFBFBD><EFBFBD>ハ萍ュウ嘴<EFBDB3>V孺bイ布モケ懊ヘウ耿チ聘ヒ<E88198><EFBFBD><EFBE9A><EFBFBD><EFBFBD>V屍Sメョ遺ツ湃ス帙ヘウ<EFBE8D>チ㌫Q;\30\2=\"\7<>\31\4\1U)\24<32>\31\4\5U)\24;\30\2jG\'衽ェ<E8A1BD>ッびイ欺26ルエ鴇忿エ爽萍ュ<E8908D><EFBFBD>オレトォムッ佇ァ<E4BD87>掲。xL<78>"
"sK恵;破Fャ映ス嗾ハャ駄エ巒ハエ゚ヨフ<EFBE96>褝鮏<E8A49D><E9AE8F><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0\1<><31><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>貼0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>能0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>貼0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37>\"鯱イムッ侈ャ促<EFBDAC>吉E<E59089>Vヒア凸エ巓トォ袙ト<E8A299>ワ顗<EFBE9C><E9A197><EFBFBD><EFBFBD><E99AAF>ヲ砧屍Sネァ<EFBE88>ト」レサ「萪ウ<E890AA>チサ。<EFBDBB>=\"\7I#\15Z4\30I#\15U\'\13D\31\4I#\15U)\24*\10\0}aC<61>オょムェ\25ヤク辺オ峠。┰、虞ワト<EFBE9C><EFBE84><EFBFBD>ヘ袙トレトォレサ「ホア<EFBE8E>男、{"
"U吉E破Fャ映ケ瓶ハャ体オ。ンムセ葆ム<E89186><EFBE91><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>ソ0\0\0\1<><31><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>箪0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>箪0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377\36<33>シ鯱イネァ<EFBE88><EFBFBD>V<EFBFBD>6㌫Qヒア噸ケ憇トォ袙ト<E8A299><EFBFBD><EFBE9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\377<37>ター堅vVコ怐レス巒テ」<EFBE83><EFBFBD><EFBFBD>萢jG\';\30\2J&\21D\31\4J&\21<32>#\15\0251\17\0=\"\7ウ嘴<EFBDB3><E598B4>衽ェ鰄エヘク麺ア撞怱テョ哈<EFBDAE><E59388><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>浯フ鰌コンチ斟"
"ア<>嗾」<E597BE>ョ壮づ汞\6モケ慱ツャ聘ヒ<E88198><EFBFBD><EFBE9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0」<30><EFBDA3><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377\36<33>ォォ橘屍S孺bォ<62>孺bォ橘ヘク面エ帙ホコ<EFBE8E><EFBFBD>隯汜<E99AAF><E6B19C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隯ワヒォヲ砧イ布モケ憬テ」萪ウ<E890AA><EFBFBD><EFBDBA>汞iZ4\30;\30\2D\31\4J&\21<32>#\15\13;\30\2孺b<E5ADBA>ス\377<37>ワヒォリヒ・ヘク鳴ャ撞怱ヒシェ<EFBDBC><EFBFBD><E99AAF>\15<31><EFBFBD>ヘロテ」ムイ興<EFBDB2>}ヲ"
"砧コ怐ヒア凸ャ胎セゥンムセ<EFBE91><EFBFBD><EFBFBD><E9A98D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>Ы0\0\0<><30><EFBFBD><EFBFBD>0\0\0\1<><31><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>ソ\377\377\377<37>"
"\377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377\15ウ嘴屍Sョ壮ヤク弗<EFBDB8>}aCヲ砧モシ」鰌コ耿チ<E880BF><EFBFBD>ワ汜<EFBE9C><E6B19C><EFBFBD><EFBFBD>\2<><32><EFBFBD>トき奴\20モケ憬テ」萪ウ鰄エ<E9B084><EFBFBD>スョ壮b>$D\31\0041\17\0;\30\2J&\21㌫Q鏞ニ\377<37><37>スぶネ、\5ホチ」キィ痕搖モニク<EFBE86><EFBDB8><EFBFBD><EFBFBD><EFBFBD>\7<><37>浯フ<E6B5AF>コロテ」ツャ同嘸ツャ唐"
"レトォ\4<>ト浯フ顗<EFBE8C><E9A197><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>Ы0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377\15萪ウユテ、モシ」萪ウモシ」ォ奴施`操fヤナイロフコ<EFBE8C><EFBFBD>ワ顗黻<E9A197><E9BBBB>\33\377<37>ロトウイ翌サ、琴テ、レトォリヒ・ロテ」<EFBE83><EFBFBD><EFBE81><EFBFBD>シムッ仄怐ツャ呑トウ<EFBE84><EFBDB3><EFBFBD><EFBFBD><EFBFBD>ス聚オレムャホチ」コォ足宸ニコィ<EFBDBA><EFBDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\14<31>褊猯萪ウモケ愍ァ禿ョ簒ツャ耒コ浯フ隯レ\377"
"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>Ы0\0\0<><30><EFBFBD>Ⅸ0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377\3\377<37><37><EFBFBD>\377<37><37>隯\3<>ヤ浯フ<E6B5AF>ヤぽフコ\6ワムツ聘ヒ<E88198>レ顗<EFBE9A><E9A197><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\10栁メフオ。サ、桐ア惇テ、鰄エ<E9B084><EFBFBD><EFBFBD><EFBE81>\6<><EFBFBD><E890A2>隯レ<E99AAF><EFBE9A>鏞ニ<E98F9E>コょルコ\7ヨヒェセイ調・<E8AABF>。喰萼<E596B0><E890BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\14蓊ユヤノオヨヒェヒサ、トオ「フテインムセ<EFBE91><EFBFBD>ヤ\377"
"<22><><EFBFBD><E99AAF><EFBFBD><EFBFBD><EFBFBD>曾0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>箪0\0\0<><30><EFBFBD>箪0\0\0<><30><EFBFBD>箪0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>箪0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377\2<><32><EFBFBD><EFBFBD><E99AAF><EFBFBD>隯\21<32><31>\377<37><37><EFBFBD><EFBFBD>メ聘ヒ<E88198><EFBFBD><EFBFBD><EFBE9A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ノフオ。サ、暁エ比メウまヒォ\35萍ュ<E8908D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>コ聚オンメイツケ劉宸キィ砦ナイ<EFBE85><EFBFBD><E99AAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>溿ワンムセフチャヒサ、ヒシェヤノオ聘ヒ<E88198><EFBFBD>゚\377<37><37><EFBFBD>"
"<22><><EFBFBD>申0\0\0<><30><EFBFBD>Ы0\0\0<><30><EFBFBD><EFBFBD>0\0\0<><30><EFBFBD>申0\0\0<><30><EFBFBD>申0\0\0<><30><EFBFBD>申0\0\0<><30><EFBFBD>Ⅸ0\0\0<><30><EFBFBD>申0\0\0<><30><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD><EFBFBD>\1<><EFBFBD><E99AAF>\16顗<36><E9A197><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBE92><EFBFBD>隯レ耒コツャ峠、暁エ狽ワヒォ\2萍ュ<E8908D>オるモコ\6耒コロハエ鰌コ耋ウヨヒェヌス宸ッヲ<EFBDAF>1耋ウ<E8808B>隯\15<31><35><EFBFBD>瞞ンルヌフテイテシ」フチャヒシェヤノオ聘ヒ溿ワ<E6BABF><EFBE9C><EFBFBD><E99AAF><EFBFBD><EFBDB3><EFBFBD><EFBFBD>0\0\0ソ<30><EFBDBF><EFBFBD>ソ<EFBFBD>"
"<22><><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\2<><32><EFBFBD><EFBFBD>ワ\14<31>レ葆ム<E89186><EFBFBD><EFBFBD>ノレトォター鹸・<E9B9B8>ー固エ晩ケ憇サ「ほセゥ\17モツャヤナイハエ崘エ叛イ勅ュ鏡イ椿ヒェ<EFBE8B><EFBDAA><EFBFBD><EFBFBD>リ橫蔗萼ワムツフチャぜォ曾6ホチ」ロハエ゚ヨフ溿ワ<E6BABF><EFBE9C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBDB4><EFBFBD><EFBFBD>0\0\0ソ<30><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377"
"\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37>\2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\4汜<34><E6B19C><EFBFBD><EFBFBD>ゎ蒂\12汜<32>ワム籌ヒ<E7B18C><EFBFBD><EFBFBD>タワヒォナエ伴ュ興ィ<E88888>サ。рサ、欺15ア。強搖シァ峠、狭ィ債ケ累メイ<EFBE92><EFBFBD>ト耒コ簓ケ醢チロトウふツャ\6ホチ」ヤネ、萪ウ浯フ<E6B5AF><EFBFBD><EFBFBD>砡1<E7A0A1><31><EFBFBD><EFBFBD><EFBFBD><EFBDB3><EFBFBD><EFBFBD>0\0"
"\0ソ<30><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD><EFBFBD>\4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\32<33><32><EFBFBD>鮱碆瞞<E7A286><EFBFBD>タ鰌コ<E9B08C>コレムャ<EFBE91>コ萪ウワヒォロテ」レトォモツャヒシェニコィハケ槎エ嵬ケ樛ムャ<EFBE91>タ衲シユテ、ハエ嶮スゥぽトウ\10モツャ鰌コ<E9B08C><EFBFBD><EFBFBD><EFBDBE>隯レ<E99AAF><EFBFBD><E99AAF><EFBFBD><EFBFBD>\1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBDAA><EFBFBD>構0\0\0ソ<30><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
"ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377\1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\11<31><EFBFBD>鮱磅鮏<E7A385>レロフコロハエ衲シ袢コみメイゆメウ\11衲シ<E8A1B2><EFBFBD>モ隯レモツャモシ」ヨヒェ袢コンメイふスゥ\13醢チ簓イ<E7B093><EFBFBD>ト耿チ<E880BF><EFBFBD><EFBFBD><EFBE8D><EFBFBD><EFBFBD>\377<37><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\1<><31><EFBFBD><EFBDAA><EFBFBD>圭0\0\0ソ<30><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377"
"\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\6<><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>レ\6<><EFBFBD>ヤ隯レ浯フ<E6B5AF>ヘ耿チぶナイ\7モスゥフチャロフコ耿チヤナイフチャロハエゅヤチ\12袙ト<E8A299>ヒ袙ト<E8A299><EFBFBD><EFBFBD><EFBFBD>ヤ隯レ<E99AAF><EFBE9A><EFBFBD><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD>\6<><36><EFBFBD><EFBFBD><EFBFBD>糒鰤<E7B392><E9B0A4>\23<32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ミ袙トンムセ袙ト浯フ袙ト耿チ袙ト浯フ<E6B5AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>竄橫臀1顗黷<E9A197><E9BBB7>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\21<32><31><EFBFBD><EFBFBD><EFBFBD><E9B49F><EFBFBD><E7B3BA>糒鰤橫蔘鰤<E89498><EFBFBD>ヤ葆ム<E89186>メ葆ム聘ヒ葆ム<E89186>蒂\2<>糜鵫<E7B39C><E9B5AB>\1<><31>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\2鮱碆蒂<E7A286>鮏\5<><EFBFBD>粮瞞<E7B2AE><EFBFBD>レゆワム\5鮱碆<E9AEB1>鮱磑<E9AEB1><EFBFBD><E6B19C><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD><EFBFBD>\2<><EFBFBD><E8A581><EFBFBD>\1橫艪顗鷭4<E9B7AD><34><EFBFBD>隯橫蔬<E6A9AB><E894AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\1<><31>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377構377\377\377<37><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\7<><37><EFBFBD><EFBFBD>隯汜<E99AAF><E6B19C><EFBFBD><E9A197>橫艪顗鷭4橫蔬<E6A9AB><EFBFBD><EFBFBD><E99AAF>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD>ソ<EFBFBD><EFBDBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ソ\377\377\377構377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_SCAN("ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377ソ\377\377\377暴377\377\377")
IMAGE_PACKED(eye, "\2申1\0\0<\0\0\0L\0\0\0\14\0\0\0\0\0\0\0")
IMAGE_BEGIN(icon)
IMAGE_SCAN("十0\0\0チ")
IMAGE_SCAN("\1\0\0\0構0\0€\1\0\0\0\1www")
IMAGE_SCAN("\4\0\0\0\0\0€UUUイイイみンン\4イイイwwwUUUBBBソ"\"\"\2\0\0€\0\0\0\1www")
IMAGE_SCAN("\2\0\0\0\0\0€<30>ンン\3タタタイイイwwwUUソ"\"\"\2\0\0€\0\0\0\1www")
IMAGE_SCAN("\6\0\0\0\0\0€ンンンタタタwww\21\21\21ソ"\"\"\1\0\0\0ソ"\"\"\2\0\0€\0\0\0\1www")
IMAGE_SCAN("\6\0\0\0\0\0€<30><C280>BB\"\"\"<22><>\21\21\21\5\0\0\0\21\21\21\"\"\"\0\0€\0\0\0\1www")
IMAGE_SCAN("\4\0\0\0\0\0€BBB\21\21\21Ⅸ0\0\0<>21\21\21\2\0\0€\0\0\0\1www")
IMAGE_SCAN("\7\0\0\0\0\0€\21\21\21\0\0\0UUU\"\"\"<22><>\0\0\0\5\"\"\"\0\0\0\"\"\"\0\0€\0\0\0\1www")
IMAGE_SCAN("\5\0\0\0\0\0€UUUイイイ<EFBDB2><EFBDB2>\0\0\0\1UUU<55>"\"\"\2\0\0€\0\0\0\1www")
IMAGE_SCAN("\3\0\0\0\0\0€ンンンΥイイ<EFBDB2>0\0\0\3\21\21\21\0\0\0www<77>BB\2\0\0€\0\0\0\1www")
IMAGE_SCAN("\4\0\0\0\0\0€<30><C280>タタ<EFBE80>\1イイイФUU\4BBB<42><42>0\0€\0\0\0\1www")
IMAGE_SCAN("\5\0\0\0\0\0€<30><C280>ンンタタタ<EFBE80>\1wwwザUU\4<><34>ンン\0\0€\0\0\0\1www")
IMAGE_SCAN("\2\0\0\0\0\0€<30><C280>\2タタタイイイユ<EFBDB2>\5イイインンン<EFBE9D><EFBE9D>0\0€\0\0\0\1www")
IMAGE_SCAN("\1\0\0\0構0\0€\1\0\0\0\1www")
IMAGE_SCAN("十0\0\0\1www")
IMAGE_SCAN("チ舜ww")
IMAGE_PACKED(icon, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(off)
IMAGE_SCAN("十0\0\0チ")
IMAGE_SCAN("\1\0\0\0構0\0€\1\0\0\0\1www")
IMAGE_SCAN("\1\0\0\0ソ0\0€みンン\5イイイwwwUUUBBB\"\"\"ソ0\0€\1\0\0\0\1www")
IMAGE_SCAN("\1\0\0\0Ы0\0€\3タタタイイイwwwUUЫ0\0€\1\0\0\0\1www")
IMAGE_SCAN("\3\0\0\0\0\0€ンンンソ0\0€ソ"\"\"ソ0\0€\3\"\"\"\0\0€\0\0\0\1www")
IMAGE_SCAN("\4\0\0\0\0\0€<30><C280>BBソ0\0€\1\21\21\21ソ0\0€\4\21\21\21\"\"\"\0\0€\0\0\0\1www")
IMAGE_SCAN("\5\0\0\0\0\0€BBB\21\21\21\0\0\0<>0\0€\1\0\0\0<>21\21\21\2\0\0€\0\0\0\1www")
IMAGE_SCAN("\6\0\0\0\0\0€\21\21\21\0\0\0UUU\"\"\"ソ0\0€\6\0\0\0\"\"\"\0\0\0\"\"\"\0\0€\0\0\0\1www")
IMAGE_SCAN("\5\0\0\0\0\0€UUUイイイ<EFBDB2><EFBDB2>\0\0€\1UUU<55>"\"\"\2\0\0€\0\0\0\1www")
IMAGE_SCAN("\4\0\0\0\0\0€ンンンイイイソ0\0€\1\0\0\0ソ0\0€<30>BB\2\0\0€\0\0\0\1www")
IMAGE_SCAN("\3\0\0\0\0\0€<30><C280>\0\0€\1イイイUUソ0\0€\3<><33>0\0€\0\0\0\1www")
IMAGE_SCAN("\1\0\0\0Ы0\0€<C280>\1wwwUUЫ0\0€\1\0\0\0\1www")
IMAGE_SCAN("\1\0\0\0ソ0\0€\3<><33>タタイイイユ<EFBDB2>\1イイイソ0\0€\1\0\0\0\1www")
IMAGE_SCAN("\1\0\0\0構0\0€\1\0\0\0\1www")
IMAGE_SCAN("十0\0\0\1www")
IMAGE_SCAN("チ舜ww")
IMAGE_PACKED(off, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")

View file

@ -0,0 +1,28 @@
LAYOUT(EyeCareLayout, 270, 216)
ITEM(MenuBar, menu, LeftPosZ(0, 256).TopPosZ(0, 24))
ITEM(ImageCtrl, image, LeftPosZ(10, 253).TopPosZ(32, 40))
ITEM(LabelBox, dv___2, LeftPosZ(8, 257).TopPosZ(24, 162))
ITEM(Label, text1, SetLabel(t_("text1")).SetFont(Roman(16).Bold()).LeftPosZ(16, 241).TopPosZ(75, 25))
ITEM(Label, text2, LeftPosZ(16, 241).TopPosZ(105, 35))
ITEM(Button, hide, SetLabel(t_("HIDE")).SetFont(Arial(25).Bold()).LeftPosZ(15, 242).TopPosZ(143, 35))
ITEM(StatusBar, status, LeftPosZ(0, 256).TopPosZ(192, 24))
END_LAYOUT
LAYOUT(ConfigurationLayout, 216, 144)
ITEM(LabelBox, dv___0, SetLabel(t_("EyeCare")).LeftPosZ(8, 200).TopPosZ(4, 132))
ITEM(Label, dv___1, SetLabel(t_("Relaxing time (minutes):")).LeftPosZ(16, 121).TopPosZ(24, 19))
ITEM(EditInt, relax, LeftPosZ(148, 48).TopPosZ(24, 19))
ITEM(Label, dv___3, SetLabel(t_("Washing time (Minutes):")).LeftPosZ(16, 125).TopPosZ(48, 19))
ITEM(EditInt, wash, LeftPosZ(148, 48).TopPosZ(48, 19))
ITEM(Option, topmost, SetLabel(t_("Stay on top")).LeftPosZ(16, 84).TopPosZ(76, 19))
ITEM(Option, hideicon, SetLabel(t_("Hide try icon")).RightPosZ(16, 84).TopPosZ(76, 19))
ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(28, 72).TopPosZ(104, 24))
ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(112, 72).TopPosZ(104, 24))
END_LAYOUT
LAYOUT(AboutDialogLayout, 304, 196)
ITEM(LabelBox, dv___0, SetLabel(t_("EyeCare")).LeftPosZ(4, 296).TopPosZ(0, 160))
ITEM(RichTextCtrl, text, LeftPosZ(12, 280).TopPosZ(20, 132))
ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(228, 72).TopPosZ(168, 24))
END_LAYOUT

View file

@ -0,0 +1,15 @@
description "Tray application that reminds user to take care about his eyes";
uses
CtrlLib;
file
EyeCare.h,
EyeCare.cpp,
icon.rc,
EyeCare.lay,
EyeCare.iml;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,5 @@
TITLE("EyeCare/u++ 1.0")
COMPRESSED
120,156,173,145,75,111,220,32,20,133,255,10,82,166,85,155,135,135,123,1,131,237,77,95,89,69,106,163,84,81,23,150,167,48,54,201,208,248,37,27,107,102,84,53,191,189,56,211,42,170,162,40,155,178,0,113,225,124,231,30,200,145,44,22,244,148,30,209,23,70,250,201,222,152,169,246,69,238,56,87,153,65,145,221,93,124,73,178,227,119,111,98,254,118,166,64,160,48,9,76,9,6,28,227,48,1,3,20,200,56,40,76,184,98,76,209,180,172,205,56,22,121,141,74,101,179,8,79,241,8,165,64,144,92,113,5,76,42,12,90,164,20,169,68,1,156,41,20,105,101,199,178,200,141,98,217,241,85,28,68,108,118,10,112,10,49,114,201,145,50,138,60,88,129,82,28,164,80,44,137,227,180,52,189,119,93,251,199,203,1,32,100,107,144,89,232,249,254,254,62,2,78,15,29,240,0,3,202,67,171,16,106,148,163,4,145,208,68,40,80,148,5,184,144,84,164,189,25,76,243,124,116,241,98,116,73,83,231,109,64,28,159,0,200,32,137,79,227,35,224,50,4,85,140,11,37,
105,48,71,68,198,16,24,38,9,138,88,200,116,99,77,101,135,34,255,249,253,23,201,71,250,16,63,127,117,254,249,236,250,43,57,223,219,143,102,176,203,73,159,232,19,2,17,45,94,23,243,29,70,14,235,106,227,125,175,83,189,212,203,169,239,117,52,118,211,80,218,155,110,184,181,58,106,173,215,75,19,202,11,87,89,189,120,191,238,38,175,23,182,213,103,211,168,163,141,111,234,21,201,87,43,114,57,173,107,87,146,170,107,140,107,201,122,79,138,235,7,59,111,77,243,159,108,14,24,114,101,93,211,215,182,177,173,55,243,191,145,238,38,116,240,8,223,110,183,58,218,238,182,174,186,181,62,136,131,129,94,174,200,118,247,237,80,41,158,222,46,187,202,246,67,247,195,150,126,222,52,122,89,187,245,96,134,125,56,127,4,153,177,95,17,187,51,179,123,49,71,124,194,233,7,183,55,237,157,142,92,59,91,94,30,182,228,67,87,59,83,144,105,116,237,45,241,27,251,143,240,153,183,112,109,101,119,127,147,95,215,222,53,198,219,249,69,139,168,248,13,86,169,13,138,

View file

@ -0,0 +1,4 @@
TOPIC("about$en-us")
#include "about$en-us.tpp"
END_TOPIC

BIN
examples/EyeCare/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 B

1
examples/EyeCare/icon.rc Normal file
View file

@ -0,0 +1 @@
9999 ICON "icon.ico"

Binary file not shown.

View file

@ -0,0 +1,11 @@
description "Rudimentary HelloWorld application with menu and status bar";
uses
CtrlLib;
file
hello.cpp;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,48 @@
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
class HelloWorld : public TopWindow {
MenuBar menu;
StatusBar status;
void FileMenu(Bar& bar);
void MainMenu(Bar& bar);
void About();
public:
typedef HelloWorld CLASSNAME;
HelloWorld();
};
void HelloWorld::About()
{
PromptOK("{{1@5 [@9= This is the]::@2 [A5@0 Ultimate`+`+ Hello world sample}}");
}
void HelloWorld::FileMenu(Bar& bar)
{
bar.Add("About..", THISBACK(About));
bar.Separator();
bar.Add("Exit", THISBACK(Close));
}
void HelloWorld::MainMenu(Bar& bar)
{
menu.Add("File", THISBACK(FileMenu));
}
HelloWorld::HelloWorld()
{
AddFrame(menu);
AddFrame(status);
menu.Set(THISBACK(MainMenu));
status = "Welcome to the Ultimate++ !";
}
GUI_APP_MAIN
{
SetLanguage(LNG_ENGLISH);
HelloWorld().Run();
}

View file

@ -0,0 +1,873 @@
#include <CtrlLib/CtrlLib.h>
#include <DropGrid/DropGrid.h>
#include <GridCtrl/GridCtrl.h>
#include <plugin/sqlite3/lib/sqlite3.h>
#include <plugin/sqlite3/Sqlite3.h>
using namespace Upp;
#define IMAGEFILE <HomeBudget/HomeBudget.iml>
#define IMAGECLASS Images
#include <Draw/iml.h>
#define SCHEMADIALECT <plugin/sqlite3/Sqlite3Schema.h>
#define MODEL <HomeBudget/HomeBudget.sch>
#include <Sql/sch_schema.h>
#include <Sql/sch_header.h>
#include <Sql/sch_source.h>
#define LAYOUTFILE <HomeBudget/HomeBudget.lay>
#include <CtrlCore/lay.h>
#define TOPICFILE <HomeBudget/src.tpp/all.i>
#include <Core/topic_group.h>
#define TOPICFILE <HomeBudget/help.tpp/all.i>
#include <Core/topic_group.h>
#define TFILE <HomeBudget/HomeBudget.t>
#include <Core/t.h>
#include "HomeBudget.h"
struct ConvMonth : Convert
{
Value Format(const Value &q) const
{
Date dt = (Date) q;
return q.IsNull() ? "" : ::Format("%Month %.4d", dt.month, dt.year);
}
};
struct ConvDouble : Convert
{
Value Format(const Value &q) const
{
return q.IsNull() ? Null : ::Format("%.2f", q);
}
};
struct DispPM : GridDisplay
{
virtual void Paint(Draw &w, int x, int y, int cx, int cy, const Value &val, dword style,
Color &fg, Color &bg, Font &fnt, bool found, int fs, int fe)
{
if(!val.IsNull())
{
int t = int(val) < 0 ? 0 : 1;
SetCenterImage(t ? Images::Plus : Images::Minus);
}
else
SetCenterImage(Null);
GridDisplay::Paint(w, x, y, cx, cy, Value(""), style, fg, bg, fnt, found, fs, fe);
}
};
HomeBudget::HomeBudget()
{
lang = 0;
}
void HomeBudget::Setup()
{
CtrlLayout(*this, String(t_("Home budget")) + " 1.0");
Icon(Images::SmallIcon());
LargeIcon(Images::LargeIcon());
tab.Add(money.SizePos(), t_("Expenses"));
tab.Add(spl.Horz(groups, categories), t_("Categories"));
spl.SetPos(2000);
money.AddIndex(ID);
money.AddColumn(CAT_ID, t_("Category")).Edit(category).SetConvert(category);
money.AddColumn(PM, t_("Plus / Minus")).SetDisplay(Single<DispPM>()).Edit(plusminus);
money.AddColumn(VALUE, t_("Value")).Edit(val).Default(0).SetConvert(Single<ConvDouble>());
money.AddColumn(DT, t_("When")).Edit(dt).Default(GetSysDate());
money.AddColumn(DESC, t_("Describe")).Edit(es);
money.Appending().Removing().Editing().Accepting().Canceling();
money.RejectNullRow();
money.WhenInsertRow = THISBACK(InsertMoney);
money.WhenUpdateRow = THISBACK(UpdateMoney);
money.WhenRemoveRow = THISBACK(RemoveMoney);
money.SetToolBar();
Date dt = GetSysDate();
dt.day = 1;
month.AddIndex(ID);
month.AddColumn(DT, t_("Month")).Edit(months).SetConvert(Single<ConvMonth>()).Default(dt);
month.Appending().Removing().Editing().Accepting().Canceling();
month.WhenInsertRow = THISBACK(InsertDate);
month.WhenUpdateRow = THISBACK(UpdateDate);
month.WhenRemoveRow = THISBACK(RemoveDate);
month.WhenChangeRow = THISBACK(ChangeDate);
month.WhenAcceptRow = THISBACK(AcceptDate);
month.WhenNewRow = THISBACK(NewDate);
month.SetToolBar();
groups.AddIndex(ID);
groups.AddColumn(NAME, t_("Name")).Edit(eg);
groups.Appending().Removing().Editing().Accepting().Canceling();
groups.RejectNullRow();
groups.SetToolBar();
groups.WhenInsertRow = THISBACK(InsertGroup);
groups.WhenUpdateRow = THISBACK(UpdateGroup);
groups.WhenRemoveRow = THISBACK(RemoveGroup);
groups.WhenChangeRow = THISBACK(ChangeGroup);
categories.AddIndex(ID);
categories.AddColumn(NAME, t_("Name")).Edit(ec);
categories.AddColumn(DEFVALUE, t_("Default value")).Edit(defval).SetConvert(Single<ConvDouble>());
categories.AddColumn(PM, t_("Plus / Minus")).Edit(dlpm).SetConvert(dlpm).Default(-1);
categories.AddColumn(INNEWMONTH, t_("Default for a new month")).Edit(yesno).SetConvert(yesno).Default(0);
categories.WhenInsertRow = THISBACK(InsertCategory);
categories.WhenUpdateRow = THISBACK(UpdateCategory);
categories.WhenRemoveRow = THISBACK(RemoveCategory);
categories.WhenAcceptRow = THISBACK(UpdateCategories);
categories.Appending().Removing().Editing();
categories.RejectNullRow();
categories.SetToolBar();
mostpr.AddColumn(t_("Name"));
mostpr.AddColumn(t_("Amount")).SetConvert(Single<ConvDouble>()).AlignCenter();
mostcat.AddColumn(t_("Name"));
mostcat.AddColumn(t_("Amount")).SetConvert(Single<ConvDouble>()).AlignCenter();
tabmost.Add(mostpr.SizePos(), t_("Product"));
tabmost.Add(mostcat.SizePos(), t_("Category"));
dlpm.Add(-1, t_("Minus")).Add(1, t_("Plus"));
plusminus.Add(-1, t_("Minus")).Add(1, t_("Plus"));
yesno.Add(0, t_("No")).Add(1, t_("Yes"));
GenMonthList(dt.year);
SQL * Delete(MONEY).Where(IsNull(CAT_ID));
LoadDates();
LoadGroups();
UpdateCategories();
if(month.GetCount() > 0)
{
month.GoEnd();
UpdateSummary();
}
EnableMoney();
Sizeable().Zoomable();
category <<= THISBACK(UpdateValue);
exit <<= THISBACK(Close);
options <<= THISBACK(Options);
about <<= THISBACK(About);
help <<= THISBACK(Help);
category.AlwaysDrop().Resizeable(false).Header(false);
category.AddPlus(THISBACK(NewCategory));
dosummary = true;
}
void HomeBudget::Serialize(Stream &s)
{
int version = 1;
s / version;
SerializePlacement(s);
s % spl;
s % lang;
//s % categories;
//s % money;
}
void HomeBudget::GenMonthList(int year)
{
months.Clear();
for(int i = 0; i < 12; i++)
months.Add(Date(year, i + 1, 1), Format("%Month %.4d", i + 1, year));
}
void HomeBudget::LoadMoney(int dtid)
{
money.Clear();
SQL * Select(ID, CAT_ID, PM, VALUE, DT, DESC).From(MONEY).Where(DT_ID == dtid);
while(SQL.Fetch())
{
money.Add();
money(ID) = SQL[ID];
money(CAT_ID) = SQL[CAT_ID];
money(PM) = SQL[PM];
money(VALUE) = SQL[VALUE];
money(DT) = SQL[DT];
money(DESC) = SQL[DESC];
}
}
void HomeBudget::LoadDates()
{
month.Clear();
SQL * Select(ID, DT).From(DATES);
while(SQL.Fetch())
month.Add(SQL);
}
void HomeBudget::LoadGroups()
{
groups.Clear();
SQL * Select(ID, NAME).From(GROUPS);
while(SQL.Fetch())
groups.Add(SQL);
if(!groups.IsEmpty())
groups.SetCursor(0);
else
categories.Disable();
}
void HomeBudget::LoadCategories(int group_id)
{
categories.Clear();
SQL * Select(ID, NAME, DEFVALUE, PM, INNEWMONTH).From(CATEGORIES).Where(GR_ID == group_id);
while(SQL.Fetch())
categories.Add(SQL);
}
int HomeBudget::GetCategorySign()
{
SQL * Select(PM).From(CATEGORIES).Where(ID == money.Get(CAT_ID));
Value v = SQL.Fetch() ? SQL[0] : Value(0);
return v;
}
void HomeBudget::UpdateCategories()
{
category.Clear();
SQL & Select(ID.Of(CATEGORIES), NAME.Of(CATEGORIES), NAME.Of(GROUPS))
.From(CATEGORIES, GROUPS)
.Where(GR_ID == ID.Of(GROUPS))
.OrderBy(NAME.Of(GROUPS), NAME.Of(CATEGORIES));
while(SQL.Fetch())
category.Add(SQL[0], Format("%s - %s", SQL[2], SQL[1]));
}
void HomeBudget::InsertGroup()
{
try
{
SQL & Insert(GROUPS)
(NAME, groups(1));
groups(0) = SQL.GetInsertedId();
categories.Clear();
categories.Enable();
}
catch(SqlExc &e)
{
groups.CancelInsert();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::UpdateGroup()
{
try
{
SQL & ::Update(GROUPS)
(NAME, groups(1))
.Where(ID == groups(0));
}
catch(SqlExc &e)
{
groups.CancelUpdate();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::RemoveGroup()
{
if(categories.IsEmpty())
{
SQL & Delete(GROUPS).Where(ID == groups(ID));
}
else
{
PromptOK(t_("You can't remove this group. It is not empty."));
groups.CancelRemove();
}
if(groups.GetCount() == 1)
categories.Disable();
}
struct AddNewCat : WithNewCategoryLayout<TopWindow>
{
typedef AddNewCat CLASSNAME;
bool newgroup;
AddNewCat()
{
newgroup = false;
CtrlLayoutOKCancel(*this, t_("New item"));
addgroup.SetImage(Images::SmallPlus());
addgroup <<= THISBACK(NewGroup);
groups <<= THISBACK(SelGroup);
addgroup.NoWantFocus();
int cnt = 0;
SQL * Select(ID, NAME).From(GROUPS);
while(SQL.Fetch())
{
groups.Add(SQL[ID], SQL[NAME]);
cnt++;
}
bool isgroup = cnt > 0;
if(isgroup)
groups.SetIndex(0);
else
ok.Disable();
pm = 1;
}
void SelGroup()
{
ok.Enable();
}
void NewGroup()
{
WithNewGroupLayout<TopWindow> dlg;
CtrlLayoutOKCancel(dlg, t_("New category"));
if(dlg.Execute() == IDOK)
{
try
{
SQL & ::Insert(GROUPS)(NAME, ~dlg.name);
int64 id = SQL.GetInsertedId();
groups.Add(id, ~dlg.name);
groups <<= id;
ok.Enable();
newgroup = true;
}
catch(SqlExc &e)
{
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
}
bool IsNewGroup() { return newgroup; }
};
void HomeBudget::NewCategory()
{
AddNewCat dlg;
if(dlg.Execute() == IDOK)
{
try
{
SQL & ::Insert(CATEGORIES)
(GR_ID, ~dlg.groups)
(NAME, ~dlg.name)
(DEFVALUE, 0)
(PM, dlg.pm == 0 ? 1 : -1)
(INNEWMONTH, 0);
int64 id = SQL.GetInsertedId();
UpdateCategories();
money.Set(CAT_ID, id);
UpdateValue();
int gid = ~dlg.groups;
if(dlg.IsNewGroup())
{
groups.Add(Value(gid), dlg.groups.GetValue());
groups.GoEnd();
categories.Enable();
}
int c = groups.GetCursor();
if(c >= 0 && gid == groups(c, 0))
LoadCategories(gid);
}
catch(SqlExc &e)
{
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
}
void HomeBudget::InsertCategory()
{
try
{
SQL & Insert(CATEGORIES)
(GR_ID, groups(ID))
(NAME, categories(NAME))
(DEFVALUE, categories(DEFVALUE))
(PM, categories(PM))
(INNEWMONTH, categories(INNEWMONTH));
categories(0) = SQL.GetInsertedId();
}
catch(SqlExc &e)
{
categories.CancelInsert();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::UpdateCategory()
{
try
{
SQL & ::Update(CATEGORIES)
(NAME, categories(NAME))
(DEFVALUE, categories(DEFVALUE))
(PM, categories(PM))
(INNEWMONTH, categories(INNEWMONTH))
.Where(ID == categories(ID));
UpdateSummary();
}
catch(SqlExc &e)
{
categories.CancelUpdate();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::ChangeGroup()
{
LoadCategories(groups(ID));
}
void HomeBudget::RemoveCategory()
{
try
{
SQL * ::Select(CAT_ID, NAME)
.From(MONEY, CATEGORIES)
.Where(CAT_ID == categories(ID) && ID.Of(CATEGORIES) == categories(ID))
.Limit(1);
if(SQL.Fetch())
{
PromptOK(Format(t_("Item '%s' can't be removed. It is used in calculations."), AsString(SQL[1])));
categories.CancelRemove();
}
else
SQL & ::Delete(CATEGORIES).Where(ID == categories(ID));
}
catch(SqlExc &e)
{
categories.CancelRemove();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::InsertMoney()
{
try
{
SQL & ::Insert(MONEY)
(DT_ID, dtid)
(CAT_ID, money(CAT_ID))
(PM, money(PM))
(VALUE, money(VALUE))
(DT, money(DT))
(DESC, money(DESC));
money(ID) = SQL.GetInsertedId();
if(dosummary)
UpdateSummary();
}
catch(SqlExc &e)
{
money.CancelInsert();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::UpdateMoney()
{
try
{
SQL & ::Update(MONEY)
(DT_ID, dtid)
(CAT_ID, money(CAT_ID))
(PM, money(PM))
(VALUE, money(VALUE))
(DT, money(DT))
(DESC, money(DESC))
.Where(ID == money(ID));
UpdateSummary();
}
catch(SqlExc &e)
{
money.CancelUpdate();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::RemoveMoney()
{
try
{
SQL & ::Delete(MONEY).Where(ID == money(ID));
UpdateSummary();
}
catch(SqlExc &e)
{
money.CancelRemove();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::InsertDate()
{
try
{
SQL & ::Insert(DATES)(DT, month(DT));
month(ID) = dtid = (int) SQL.GetInsertedId();
EnableMoney();
}
catch(SqlExc &e)
{
month.CancelInsert();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::EnableMoney(int cnt)
{
money.Enable(cnt < 0 ? month.GetCount() > 0 : cnt);
}
void HomeBudget::UpdateDate()
{
try
{
SQL & ::Update(DATES)(DT, month(DT)).Where(ID == month(ID));
}
catch(SqlExc &e)
{
month.CancelUpdate();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::RemoveDate()
{
try
{
SQL.Begin();
SQL & ::Delete(MONEY).Where(DT_ID == month(ID));
SQL & ::Delete(DATES).Where(ID == month(ID));
SQL.Commit();
bool en = month.GetCount() <= 1 ? false : true;
EnableMoney(en);
if(!en)
money.Clear();
}
catch(SqlExc &e)
{
month.CancelRemove();
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::ChangeDate()
{
dtid = month(ID);
LoadMoney(dtid);
UpdateSummary();
GenMonthList(((Date) month(DT)).year);
}
void HomeBudget::NewDate()
{
money.Clear();
UpdateSummary();
}
void HomeBudget::AcceptDate()
{
if(!month.IsNewRow())
return;
dosummary = false;
SQL.Begin();
SQL * Select(ID, DEFVALUE, PM).From(CATEGORIES).Where(INNEWMONTH == 1);
while(SQL.Fetch())
{
money.Add();
money(CAT_ID) = SQL[ID];
money(VALUE) = SQL[DEFVALUE];
money(PM) = SQL[PM];
InsertMoney();
money.RefreshNewRow();
}
SQL.Commit();
dosummary = true;
UpdateSummary();
}
void HomeBudget::UpdateSummary()
{
if(!month.IsCursor())
return;
float p = 0, tp = 0;
float m = 0, tm = 0;
float r = 0, tr = 0;
mostcat.Clear();
mostpr.Clear();
try
{
SQL & ::Select(PM, SqlSum(VALUE))
.From(MONEY, DATES)
.Where(DT.Of(DATES) < month(DT) && DT_ID == ID.Of(DATES) && NotNull(VALUE))
.GroupBy(PM);
while(SQL.Fetch())
{
int pm = SQL[PM];
float v = (float) int(SQL[1]);
if(pm < 0)
tm = v;
else
tp = v;
}
tr = tp - tm;
SQL & ::Select(PM, SqlSum(VALUE))
.From(MONEY)
.Where(DT_ID == dtid && NotNull(VALUE))
.GroupBy(PM);
while(SQL.Fetch())
{
int pm = SQL[PM];
float v = (float) int(SQL[1]);
if(pm < 0)
m = v;
else
p = v;
}
SQL & ::Select(NAME, SqlId("sum(value) as val"))
.From(MONEY, CATEGORIES)
.Where(DT_ID == dtid && CAT_ID == ID.Of(CATEGORIES) && PM.Of(MONEY) < 0)
.GroupBy(CAT_ID)
.OrderBy(Descending(SqlId("val")));
while(SQL.Fetch())
mostpr.Add(SQL);
SQL & ::Select(NAME.Of(GROUPS), SqlId("sum(value) as val"))
.From(MONEY, GROUPS, CATEGORIES)
.Where(DT_ID == dtid && PM.Of(MONEY) < 0 && CAT_ID == ID.Of(CATEGORIES) && GR_ID == ID.Of(GROUPS))
.GroupBy(GR_ID)
.OrderBy(Descending(SqlId("val")));
while(SQL.Fetch())
mostcat.Add(SQL);
}
catch(SqlExc &e)
{
Exclamation("[* " + DeQtfLf(e) + "]");
}
r = p - m;
plus.SetText(Format("%.2f", p));
minus.SetText(Format("%.2f", m));
SetRest(rest, r);
SetRest(prev_month, tr);
SetRest(real_rest, r + tr);
}
void HomeBudget::ClearSummary()
{
plus.SetText("");
minus.SetText("");
rest.SetText("");
prev_month.SetText("");
real_rest.SetText("");
mostpr.Clear();
mostcat.Clear();
}
void HomeBudget::SetRest(StaticText &rest, float r)
{
if(r == 0)
{
rest.SetText("0.00");
rest.SetInk(Black);
}
else if(r > 0)
{
rest.SetText(Format("+%.2f", r));
rest.SetInk(Green);
}
else
{
rest.SetText(Format("%.2f", r));
rest.SetInk(LtRed);
}
}
void HomeBudget::UpdateValue()
{
try
{
SQL & Select(DEFVALUE).From(CATEGORIES).Where(ID == money.Get(CAT_ID));
Value v = SQL.Fetch() ? SQL[0] : Value(0);
money.Set(VALUE, v);
money.Set(PM, GetCategorySign());
}
catch(SqlExc &e)
{
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::Options()
{
WithOptionsLayout<TopWindow> dlg;
CtrlLayoutOK(dlg, t_("Options"));
dlg.lang.Add(0, "English").Add(1, "Polski").SetIndex(lang);
dlg.clear <<= THISBACK(ClearAll);
if(dlg.Execute() != IDOK)
return;
lang = ~dlg.lang;
}
void HomeBudget::ClearAll()
{
try
{
SQL & ::Delete(CATEGORIES);
SQL & ::Delete(GROUPS);
SQL & ::Delete(MONEY);
SQL & ::Delete(DATES);
//SQL.ExecuteX("VACUUM");
LoadDates();
LoadGroups();
UpdateCategories();
money.Clear();
categories.Clear();
EnableMoney();
PromptOK(t_("Database was cleared"));
}
catch(SqlExc &e)
{
Exclamation("[* " + DeQtfLf(e) + "]");
}
}
void HomeBudget::About()
{
WithAboutLayout<TopWindow> dlg;
CtrlLayoutCancel(dlg, t_("O programie"));
dlg.info.NoSb();
Size sz = dlg.info.GetSize();
dlg.info.SetQTF(GetTopic(String("HomeBudget/src/About$") + (lang == 0 ? "en-us" : "pl-pl")), Zoom(150, 1400));
dlg.info.SetZoom(Zoom(1, 1));
dlg.Execute();
}
void HomeBudget::Help()
{
PromptOK(t_("No help available yet"));
/* HomeBudgetHelp dlg;
dlg.AddTree(0, Images::Plus(), "HomeBudget/help/Introduction$pl-pl", "Wprowadzenie");
dlg.AddTree(0, Images::Plus(), "HomeBudget/help/T0$pl-pl", "Instrukcja");
dlg.AddTree(0, Images::Plus(), "HomeBudget/src/About$pl-pl", "ala");
dlg.Execute();
*/
}
HomeBudgetHelp::HomeBudgetHelp()
{
}
Topic HomeBudgetHelp::AcquireTopic(const String& topic)
{
Topic t;
t = GetTopic(topic);
t.text = (const char *) GetTopic(topic);
//String path = topic;
//if(FileExists(path))
// t.text = ReadTopic(LoadFile(path)) .text;
return t;
}
GUI_APP_MAIN
{
bool nodb = false;
Sqlite3Session db;
db.LogErrors(true);
#ifdef flagDEBUG
db.SetTrace();
nodb = true;
#endif
FileIn fi("HomeBudget.db3");
if(fi.IsError() || fi.GetSize() <= 0)
nodb = true;
fi.Close();
if(!db.Open(ConfigFile("HomeBudget.db3")))
{
Exclamation(t_("Can't create or open database file"));
return;
}
SQL = db;
if(nodb)
{
SqlSchema sch(SQLITE3);
StdStatementExecutor se(db);
All_Tables(sch);
if(sch.ScriptChanged(SqlSchema::UPGRADE))
Sqlite3PerformScript(sch.Upgrade(), se);
if(sch.ScriptChanged(SqlSchema::ATTRIBUTES))
{
Sqlite3PerformScript(sch.Attributes(), se);
}
if(sch.ScriptChanged(SqlSchema::CONFIG))
{
Sqlite3PerformScript(sch.ConfigDrop(), se);
Sqlite3PerformScript(sch.Config(), se);
}
sch.SaveNormal();
}
HomeBudget hb;
LoadFromFile(hb);
if(hb.lang == 0)
SetLanguage(LNGC_('E','N','U','S', CHARSET_UNICODE));
else
SetLanguage(LNGC_('P','L','P','L', CHARSET_UNICODE));
hb.Setup();
hb.Run();
StoreToFile(hb);
}

View file

@ -0,0 +1,85 @@
#ifndef _HomeBudget_HomeBudget_h
#define _HomeBudget_HomeBudget_h
class HomeBudgetHelp : public HelpWindow
{
public:
HomeBudgetHelp();
virtual Topic AcquireTopic(const String& topic);
};
class HomeBudget : public WithHomeBudgetLayout<TopWindow>
{
public:
typedef HomeBudget CLASSNAME;
GridCtrl groups;
GridCtrl categories;
GridCtrl money;
GridCtrl mostpr;
GridCtrl mostcat;
Splitter spl;
DropDate dt;
DropGrid dlpm, category, months, yesno, plusminus;
EditDouble defval, val;
EditStringNotNull eg, ec;
EditString es;
//FrameRight<Button> newcat;
int dtid;
bool dosummary;
int lang;
HomeBudget();
void NewGroup();
void NewCategory();
void InsertGroup();
void UpdateGroup();
void RemoveGroup();
void ChangeGroup();
void InsertCategory();
void UpdateCategory();
void RemoveCategory();
void LoadCategories(int group_id);
void UpdateCategories();
void InsertMoney();
void UpdateMoney();
void RemoveMoney();
void InsertDate();
void UpdateDate();
void RemoveDate();
void ChangeDate();
void NewDate();
void AcceptDate();
void LoadDates();
void LoadGroups();
void UpdateSummary();
void ClearSummary();
void UpdateValue();
void GenMonthList(int year);
void Serialize(Stream &s);
void Options();
void About();
void Setup();
void Help();
void SetRest(StaticText &rest, float r);
int GetCategorySign();
void ClearAll();
void LoadMoney(int did);
void EnableMoney(int cnt = -1);
};
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View file

@ -0,0 +1,106 @@
IMAGE_BEGIN(SmallIcon)
IMAGE_SCAN("Ð")
IMAGE_SCAN("<22>\0\0\0")
IMAGE_SCAN("\1\0\0\0†üþü\2ûýüûþü†üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0„üþü\6£¶Ñ#^¬\34]«!`¦7fûýû„üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0„üþü\6¬¿Ú\15H£\24P™&VŽ\31L€íñð„üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0„üþü\6eÅ\21S¶\30Z«.bž»ËÚíïïìíí\2ëèæüþü\1\0\0\0")
IMAGE_SCAN("\17\0\0\0üþüóûû¾çù£ÝùWžÕ\27g½\33Wž@mž…𮝥¨Ù·«ñ¿ªÛ©—üþü\1\0\0\0")
IMAGE_SCAN("\17\0\0\0üþüO®é\'±ù*µú-µö(¡Ù\27X%Y•a…¨¯¤¨âº¬ðµžÚª™üþü\1\0\0\0")
IMAGE_SCAN("\17\0\0\0ûþüWм\33n§\'ƒ§=‘¬+ \34`œ5fœq˜º±±¹ß¾²óŲ߷©üýû\1\0\0\0")
IMAGE_SCAN("\17\0\0\0üþüNŽÃ\34o¥$zš<…—*y\31Y—Cp }ž»<C2BB>šÊ—‰í{ඦüþü\1\0\0\0")
IMAGE_SCAN("\17\0\0\0üþüœ·Ó\32dš#v”7Œ¤,Œ©SŠ«o²wš¸¼±±á°Ÿé²<C3A9>åÍÂüþü\1\0\0\0")
IMAGE_SCAN("\17\0\0\0üþü®Îä\35v´&‡¯8—¯2}ÐÜÜåíñw•±²ª¯â·¦ç¥êØÏüþü\1\0\0\0")
IMAGE_SCAN("\7\0\0\0üþüùüú¬¿ÍЬ¹¢½ÁÝèçüþü\4òõôÚÕÓêÑÈôåÞüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0Žüþü\1\0\0\0")
IMAGE_SCAN("<22>\0\0\0")
IMAGE_SCAN("Ð")
IMAGE_PACKED(SmallIcon, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(LargeIcon)
IMAGE_SCAN("à")
IMAGE_SCAN("à")
IMAGE_SCAN(" \0\0\0")
IMAGE_SCAN("\1\0\0\0žüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0žüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0Œüþü\5úþüóùúðöøòøùùýü<C3BD>üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0‰üþü\13ûýûn—É3r½\36b³\25\\±\25\\²\25\\±\32`³.o»b޼úýûŠüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0‰üþü\13ûýü\33;|\13B—\20K<30>\24R \35\\¦!]<5D>\33UŽ\27J{\27:VùûúŠüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0‰üþü\13üþûaƒ¼\17M¬\22Qª\24T¥\31X &]Ÿ#[œ\30U™\26NŒÐÙÝŠüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0‰üþü\13ûýû\\}´\12:”\14Dœ\20H“\26M<36>!R‡,Q|\26Do\36DdçëêŠüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0‰üþü\22ïö÷/V¢\20S½\23ZÀ\25\\·\34a² a¨%]Ÿj“¤·Èîðñìîðëíîìîíìîïîññõöõûýûƒüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0‰üþü\13~ Î\23X¼\16L©\17IŸ\21J\22K<32>+UˆOrÙãéïððïïïƒîîî\4íííëììêëëÞÚØƒüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0‰üþü\22§´Ë\21>”\16K©\23S©\32[§&^,W‡1]ˆ?`ƒ€”©°²¹ÏÅÇãÕÐìÜÖïÖËð˻鱟Çwƒüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0„üþü\27ùýûÑîø¦Þ÷ŠÔ÷}Îø{Îø@—Ù\33wÑ\25`½\26Y®\"c­)f¯y¤Ì´ÅÐ<C385>™¦Ž‡Ž ƒ<C2A0>¸‰|Ö’{ð©Šï¦Šâ§‘Ù¿³ƒüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0ƒüþü\2Çé÷J»ö\'°ø\24\'±ú(±ú)²ù(³ù)²ù(¯ö\27Yž\23I†\'P\177,YŽV\177©š­ÀÄÄÉÝÔÔìàÜñá×ô×ÉòÅ´Ý…Ø»±ƒüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0üþü\5ûþü\\«ã&°ú\'²û\'³û‚(´ú\22)µù*µú*´ö)šÌ\26[™\30a¼ f¸*d¥Yˆ³{¦<E28099><EFBFBD>¥„\177À‰zä—{ñ©Šé£ŠÜ¤’Ø¿µƒüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0üþü\32ûþûsº\26`®\36~Ã!ŽÉ(˜Ì2¢Ì=£Æ=•±+x<>\"i|!w¬\31V \36U<36>&RƒLz¥[€§<E282AC>𬼰³Ø¾´ë²õÀ§ï§<C3AF>ׇkÛÆ½üýüüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0üþü\32ûþû»Õæ\26^¬\33k¦\34j“\36l‰&uŽ7‡Ÿ>—´.›Å*–¿\34Wu\24KŒ\"Q‡Sx d“½¹ÕäÃÈÎǺ¹Ñ³«è¹§ôɶñÏÂóéâØº°úûøüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0üþü\31ûþûm¿î\24X<34>\25W™\33o¨\37€®)¬9«F‰œ3u…$es\25N‡\33X<33>&WŽCm™{¥ÄLw z­°¯·Ñ¿åËÀòʸó»¤å|Ï—ƒƒüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0üþü\31ûþük”Â#Œ×$<24>Ð\"…º%…­.Žª6”­;’«.‚œ\"gy v»\34_®$b¦…©ËLx¥ƒ§Ä£´¨Ÿ£¼”Ñ—…îŸ\177îuÌ{^òîéƒüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0ƒüþü\27Ì×á\24N“\25Qƒ\27]†\34g„%n<>8u=€‘-<2D>°,˜Á\36g<36>\34[¡\37[<5B>G{®ÁÛ誹Æ<C2B9><C386>¦©<C2A6><C2A9>ÀŽ€â—|兀櫖ң’„üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0ƒüþü\27÷ûú1`œ\35rµ ¸&<26>¹0šÀ:§ÉCŸ»0}$t‰)‚§/Y†@bHlŽCqžƒ´½¿ÆßÒÏíÙÐ÷ÖÅô¬ßwËœ„üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0ƒüþü\27ûþûiÆ\27U˜\34e—\36j%r‰2…—=˜­3œ½+©W<C2A9>‡üþüüþû¯ÉÛM{¦x”°žœ¥»Ÿ˜Ô¡ê­ê¯™ç®™Î•<C38E>„üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0ƒüþü\13ûýûT§Ý\34n«\24R‡\32e s”)y<>6v„7{Œ)|–ƒ¡¦‚üþü\12³ÅÕ|¥Æ<C2A5>¥·<C2A5>Œ¥ˆ…Ç<E280A6>\177ã}ߤŒÕ«š„üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0„üþü\12ˆ¢À\32o³%˜Ñ&–Ç,™¾5¡¼B¢»5ˆžN~‡åìê‚üþü\12úýû¨¼iŸ§¬¶Ð¿à÷ðƳò¹¢ÛŽtæÓÈ„üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0„üþü\11úýûªºÈ[\177™;l„7n}N€Š{Ÿ¤¸ÌÍøûù…üþü\7îòòÍÌÍÉ·²Õ±¥æº©ëÎÁ÷óî…üþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0žüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0žüþü\1\0\0\0")
IMAGE_SCAN("\1\0\0\0žüþü\1\0\0\0")
IMAGE_SCAN(" \0\0\0")
IMAGE_SCAN("à")
IMAGE_SCAN("à")
IMAGE_PACKED(LargeIcon, "\2 \0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(Plus)
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ç‚\0€\0Ç")
IMAGE_SCAN("Ç‚\0€\0Ç")
IMAGE_SCAN("Ç‚\0€\0Ç")
IMAGE_SCAN("Ç‚\0€\0Ç")
IMAGE_SCAN("Ê\0€\0Ã")
IMAGE_SCAN("Ê\0€\0Ã")
IMAGE_SCAN("Ç‚\0€\0Ç")
IMAGE_SCAN("Ç‚\0€\0Ç")
IMAGE_SCAN("Ç‚\0€\0Ç")
IMAGE_SCAN("Ç‚\0€\0Ç")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_PACKED(Plus, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(SmallPlus)
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ç‚\0\0\0Ç")
IMAGE_SCAN("Ç‚\0\0\0Ç")
IMAGE_SCAN("Ç‚\0\0\0Ç")
IMAGE_SCAN("Ĉ\0\0\0Ä")
IMAGE_SCAN("Ĉ\0\0\0Ä")
IMAGE_SCAN("Ç‚\0\0\0Ç")
IMAGE_SCAN("Ç‚\0\0\0Ç")
IMAGE_SCAN("Ç‚\0\0\0Ç")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_PACKED(SmallPlus, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
IMAGE_BEGIN(Minus)
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ê\0\0\377Ã")
IMAGE_SCAN("Ê\0\0\377Ã")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_SCAN("Ð")
IMAGE_PACKED(Minus, "\2\20\0\0\0\20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")

View file

@ -0,0 +1,51 @@
LAYOUT(HomeBudgetLayout, 748, 530)
ITEM(GridCtrl, month, LeftPosZ(4, 124).VSizePosZ(4, 34))
ITEM(TabCtrl, tab, HSizePosZ(132, 2).VSizePosZ(4, 186))
ITEM(Button, about, SetLabel(t_("About")).LeftPosZ(4, 76).BottomPosZ(4, 26))
ITEM(Button, help, SetLabel(t_("Help")).LeftPosZ(84, 76).BottomPosZ(4, 26))
ITEM(Button, options, SetLabel(t_("Options")).LeftPosZ(164, 76).BottomPosZ(4, 26))
ITEM(Button, exit, SetLabel(t_("Exit")).RightPosZ(6, 76).BottomPosZ(4, 26))
ITEM(LabelBox, dv___6, SetLabel(t_("Summary")).HSizePosZ(132, 224).BottomPosZ(34, 148))
ITEM(StaticText, dv___7, SetText(t_("Income:")).SetFont(StdFont(18).Bold()).LeftPosZ(140, 88).BottomPosZ(144, 22))
ITEM(StaticText, plus, SetFont(StdFont(18).Bold()).HSizePosZ(232, 376).BottomPosZ(144, 22))
ITEM(StaticText, dv___9, SetText(t_("Spent:")).SetFont(StdFont(18).Bold()).LeftPosZ(140, 88).BottomPosZ(118, 24))
ITEM(StaticText, minus, SetFont(StdFont(18).Bold()).HSizePosZ(232, 376).BottomPosZ(120, 22))
ITEM(StaticText, rest_label, SetText(t_("Rest:")).SetFont(StdFont(18).Bold()).LeftPosZ(140, 88).BottomPosZ(96, 22))
ITEM(StaticText, rest, SetFont(StdFont(18).Bold()).HSizePosZ(232, 376).BottomPosZ(96, 22))
ITEM(StaticText, dv___13, SetText(t_("Amount from prev. month:")).SetFont(StdFont(18).Bold()).LeftPosZ(140, 246).BottomPosZ(72, 22))
ITEM(StaticText, prev_month, SetFont(StdFont(18).Bold()).HSizePosZ(388, 232).BottomPosZ(72, 22))
ITEM(StaticText, dv___15, SetText(t_("Final rest:")).SetFont(StdFont(18).Bold()).LeftPosZ(140, 246).BottomPosZ(48, 22))
ITEM(StaticText, real_rest, SetFont(StdFont(18).Bold()).HSizePosZ(388, 232).BottomPosZ(48, 22))
ITEM(LabelBox, dv___17, SetLabel(t_("Most expensive")).RightPosZ(4, 216).BottomPosZ(34, 148))
ITEM(TabCtrl, tabmost, RightPosZ(12, 200).BottomPosZ(42, 124))
END_LAYOUT
LAYOUT(OptionsLayout, 216, 86)
ITEM(StaticText, dv___0, SetText(t_("Language")).LeftPosZ(4, 60).TopPosZ(4, 18))
ITEM(DropList, lang, LeftPosZ(68, 144).TopPosZ(4, 19))
ITEM(Button, ok, SetLabel(t_("OK")).RightPosZ(4, 74).BottomPosZ(4, 24))
ITEM(Button, clear, SetLabel(t_("Clear all data from database")).RightPosZ(4, 208).BottomPosZ(34, 24))
END_LAYOUT
LAYOUT(AboutLayout, 456, 288)
ITEM(RichTextView, info, SetFrame(BlackFrame()).HSizePosZ(4, 4).TopPosZ(4, 252))
ITEM(Button, cancel, SetLabel(t_("OK")).HCenterPosZ(72, 0).TopPosZ(260, 24))
END_LAYOUT
LAYOUT(NewCategoryLayout, 244, 108)
ITEM(StaticText, dv___0, SetText(t_("Category")).LeftPosZ(4, 60).TopPosZ(4, 19))
ITEM(DropList, groups, LeftPosZ(68, 146).TopPosZ(4, 20))
ITEM(Button, addgroup, LeftPosZ(218, 20).TopPosZ(4, 20))
ITEM(StaticText, dv___3, SetText(t_("Name")).LeftPosZ(4, 60).TopPosZ(26, 19))
ITEM(EditString, name, LeftPosZ(68, 172).TopPosZ(26, 19))
ITEM(Switch, pm, SetLabel(t_("Plus\nMinus")).LeftPosZ(68, 100).TopPosZ(50, 15))
ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(88, 74).TopPosZ(80, 24))
ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(166, 74).TopPosZ(80, 24))
END_LAYOUT
LAYOUT(NewGroupLayout, 204, 56)
ITEM(StaticText, dv___0, SetText(t_("Name")).LeftPosZ(4, 60).TopPosZ(4, 19))
ITEM(EditString, name, LeftPosZ(68, 130).TopPosZ(4, 19))
ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(48, 74).TopPosZ(28, 24))
ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(126, 74).TopPosZ(28, 24))
END_LAYOUT

View file

@ -0,0 +1 @@
5555 ICON DISCARDABLE "HomeBudget.ico"

View file

@ -0,0 +1,28 @@
TABLE_(DATES)
INT_ (ID) PRIMARY_KEY
DATE_ (DT)
END_TABLE
TABLE_(GROUPS)
INT (ID) PRIMARY_KEY
STRING_ (NAME, 500)
END_TABLE
TABLE_(CATEGORIES)
INT (ID) PRIMARY_KEY
INT_ (GR_ID)
STRING (NAME, 500)
DOUBLE_ (DEFVALUE)
INT_ (PM)
INT_ (INNEWMONTH)
END_TABLE
TABLE_(MONEY)
INT (ID) PRIMARY_KEY
INT_ (DT_ID)
INT_ (CAT_ID)
INT (PM)
DOUBLE_ (VALUE)
DATE (DT)
STRING_ (DESC, 1024)
END_TABLE

View file

@ -0,0 +1,92 @@
T_("Exit")
plPL("Zakończ")
T_("Options")
plPL("Ustawienia")
T_("About")
plPL("O programie")
T_("Home budget")
plPL("Budżet domowy")
T_("Expenses")
plPL("Wydatki")
T_("Categories")
plPL("Kategorie")
T_("Summary")
plPL("Podsumowanie")
T_("Category")
plPL("Kategoria")
T_("Product")
plPL("Produkt")
T_("Value")
plPL("Ile")
T_("When")
plPL("Kiedy")
T_("Describe")
plPL("Opis")
T_("Month")
plPL("Miesiąc")
T_("Default value")
plPL("Wartość domyślna")
T_("Plus / Minus")
plPL("Plus / Minus")
T_("Default for a new month")
plPL("Domyślnie w nowym miesiącu")
T_("Minus")
plPL("Minus")
T_("Plus")
plPL("Plus")
T_("No")
plPL("Nie")
T_("Yes")
plPL("Tak")
T_("Name")
plPL("Nazwa")
T_("Language")
plPL("Język")
T_("Income:")
plPL("Dochód:")
T_("Spent:")
//T_("Laid out:")
plPL("Wydano:")
T_("Rest:")
plPL("Zostało:")
T_("Amount from prev. month:")
plPL("Kwota z poprz. miesiąca:")
T_("Final rest:")
plPL("Realnie zostało:")
T_("Most expensive")
plPL("Najwięcej wydano na")
T_("Product")
plPL("Produkt")
T_("Category")
plPL("Kategoria")
T_("Amount")
plPL("Ile")
T_("New item")
plPL("Nowa pozycja")
T_("New category")
plPL("Nowa kategoria")
T_("No help available yet")
plPL("Pomoc nie jest obecnie dostępna")
T_("You can't remove this group. It is not empty.")
plPL("Nie można usunąc tej grupy. Nie jest pusta.")
T_("Item '%s' can't be removed. It is used in calculations.")
plPL("Nie można usunąć pozycji '%s'. Jest wykorzystywana w rozliczeniach.")
T_("Clear all data from database")
plPL("Usuń wszystkie dane z bazy danych")
T_("Database was cleared")
plPL("Baza danych została wyczyszczona")
T_("Can't create or open database file")
plPL("Nie można utworzyć lub otworzyć bazy danych")
T_("Database file is corrupted")
plPL("Plik bazy danych jest uszkodzony")

View file

@ -0,0 +1,20 @@
description "Demonstrates using of GridCtrl and Sqlite3 database";
charset "UTF-8";
uses
CtrlLib,
plugin\sqlite3,
GridCtrl,
DropGrid;
file
HomeBudget.t,
HomeBudget.sch,
HomeBudget.h,
HomeBudget.cpp,
HomeBudget.iml,
HomeBudget.lay;
mainconfig
"" = "GUI";

View file

@ -0,0 +1,3 @@
TITLE("Welcome to Home Budget - the world of expenses...")
COMPRESSED
120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,3,124,116,3,124,20,162,139,13,172,21,194,83,115,146,243,115,83,21,74,242,21,60,64,180,83,105,74,122,106,137,66,130,174,66,73,70,170,66,121,126,81,78,138,66,126,154,66,106,69,65,106,94,113,106,177,158,158,158,90,44,88,99,44,0,156,96,35,16,

View file

@ -0,0 +1,3 @@
TITLE("T9!!!!")
COMPRESSED
120,156,139,86,80,81,49,208,49,80,54,32,0,172,92,82,211,18,75,115,74,98,163,171,227,107,85,3,124,116,3,124,20,162,139,13,172,21,98,1,212,39,15,225,

View file

@ -0,0 +1,7 @@
TOPIC("Introduction$pl-pl")
#include "Introduction$pl-pl.tpp"
END_TOPIC
TOPIC("T0$pl-pl")
#include "T0$pl-pl.tpp"
END_TOPIC

7
examples/HomeBudget/init Normal file
View file

@ -0,0 +1,7 @@
#ifndef _HomeBudget_icpp_init_stub
#define _HomeBudget_icpp_init_stub
#include "CtrlLib/init"
#include "plugin\sqlite3/init"
#include "GridCtrl/init"
#include "DropGrid/init"
#endif

View file

@ -0,0 +1,105 @@
TITLE("")
COMPRESSED
120,156,148,187,247,143,68,75,118,30,246,175,60,64,150,96,89,18,249,222,211,219,192,93,8,160,108,209,178,96,217,2,40,10,254,97,65,153,180,189,34,23,94,145,4,119,101,24,16,44,116,156,206,57,77,231,52,157,115,206,57,231,52,211,57,231,156,123,58,119,123,104,1,134,13,24,54,124,112,235,214,189,168,58,161,46,78,157,250,190,31,238,47,190,249,79,254,147,111,255,254,183,127,235,219,255,15,249,217,63,249,229,191,249,211,127,247,235,223,254,241,47,126,251,253,239,253,232,231,127,248,251,255,233,247,63,253,157,239,190,255,201,239,124,255,163,31,253,221,159,126,25,249,238,239,127,247,183,190,255,246,187,239,126,239,219,127,248,211,31,126,239,187,31,127,251,195,15,223,253,228,135,239,127,252,211,239,191,186,111,127,248,209,63,252,238,39,223,253,236,143,126,245,219,95,255,242,143,127,241,127,83,254,210,253,254,239,127,255,183,126,244,211,239,126,244,221,79,191,255,241,15,63,252,232,167,63,249,233,15,223,126,255,123,63,252,248,247,190,92,125,255,237,79,190,251,
238,251,31,253,240,179,127,254,171,191,248,159,255,248,23,255,254,191,255,223,254,246,31,252,183,255,224,95,253,203,111,126,241,205,191,255,247,223,253,77,104,255,230,219,159,255,249,119,63,255,245,239,126,255,227,191,254,106,191,253,221,239,126,248,31,190,218,151,143,31,126,250,119,255,240,251,111,126,241,155,239,126,254,143,254,222,151,251,111,254,171,127,241,223,252,193,55,255,249,191,250,39,255,244,15,254,232,155,255,229,119,190,251,157,111,255,206,31,255,226,55,223,254,252,31,253,225,223,251,238,107,244,191,248,203,127,251,87,255,238,183,191,252,235,111,254,250,151,127,246,171,223,124,61,252,234,47,254,236,155,191,252,55,223,252,249,95,254,219,95,126,243,203,255,245,175,126,249,23,191,249,229,111,254,248,103,63,251,253,239,255,240,219,111,254,70,239,215,223,255,232,199,63,255,15,255,225,63,124,247,221,143,190,255,249,15,223,124,25,251,138,232,39,95,33,255,236,251,159,124,251,163,175,168,254,236,219,159,255,63,77,252,199,255,238,183,127,254,151,127,253,179,111,254,255,202,
127,140,246,215,63,252,244,219,159,255,234,187,31,125,251,243,127,241,237,255,197,232,63,249,211,191,248,213,47,127,253,205,127,253,151,191,249,127,153,246,159,253,235,63,255,237,111,255,234,79,126,246,39,191,251,39,191,251,63,253,217,111,254,228,119,254,234,79,255,199,175,219,175,255,245,151,254,63,251,167,255,236,143,254,241,63,255,230,95,254,139,255,242,143,254,187,127,252,135,127,240,31,173,252,240,205,215,130,255,143,53,124,243,139,191,253,237,183,255,224,219,111,191,249,253,223,255,213,191,253,211,63,251,229,207,126,242,195,63,252,59,63,254,209,143,1,224,35,96,2,248,63,229,4,99,205,217,208,247,250,100,101,87,151,236,6,54,246,173,59,176,190,89,131,141,248,186,4,39,66,142,146,16,79,106,68,74,165,113,239,26,135,87,150,225,75,33,30,242,134,143,194,241,89,81,220,207,162,233,227,48,168,219,17,205,28,47,153,116,221,145,174,30,135,155,189,125,183,60,212,158,131,234,181,132,77,113,46,207,233,181,181,162,53,64,77,19,176,253,156,61,95,37,39,207,26,
136,128,222,2,29,70,86,74,134,3,46,207,39,174,251,92,12,45,171,75,225,185,123,22,11,221,205,147,128,16,246,41,235,71,7,94,58,205,166,179,155,169,227,193,143,31,164,115,231,150,121,152,100,207,90,204,250,2,151,124,226,183,16,16,22,159,169,82,215,54,0,4,164,62,143,223,223,154,12,252,177,132,194,95,21,101,238,97,57,122,14,159,247,96,175,163,145,128,221,87,76,134,7,122,35,107,129,42,68,184,2,112,115,193,68,56,48,136,135,151,65,192,72,156,215,71,150,68,229,107,128,203,209,157,252,28,60,8,6,128,67,137,50,188,130,235,108,1,246,113,18,243,230,167,62,252,117,146,36,11,97,13,176,103,195,165,247,73,57,239,132,103,163,197,226,113,205,174,235,163,102,114,31,223,251,169,140,188,84,138,183,176,228,154,107,172,160,143,53,236,205,88,113,62,28,186,76,234,108,64,178,200,221,232,123,233,97,45,93,6,149,150,9,26,203,81,52,56,80,113,212,218,142,13,126,169,250,144,242,226,213,64,121,236,69,113,131,70,205,205,155,26,126,123,226,79,
41,111,139,154,160,110,79,100,255,11,215,149,105,156,211,166,157,224,184,120,230,104,133,184,53,39,136,72,72,113,59,240,97,228,175,151,37,97,6,171,224,108,173,170,165,62,165,206,151,66,233,0,179,209,78,1,206,0,112,105,66,245,76,18,37,148,218,27,42,27,196,10,99,140,114,9,53,106,234,102,74,151,139,8,77,31,25,135,226,230,245,94,5,131,44,118,100,8,151,130,178,218,71,162,21,22,156,147,116,206,136,160,248,232,3,43,47,81,143,128,235,222,102,36,27,13,161,217,138,14,54,244,249,208,178,157,241,21,247,211,206,150,114,79,85,106,189,170,171,206,22,75,107,20,211,252,110,81,4,53,168,254,130,166,176,54,40,197,37,85,93,27,32,39,91,96,243,104,7,216,27,60,239,50,148,243,93,40,109,227,118,116,71,174,171,139,203,226,78,126,239,9,42,189,176,32,55,66,50,214,96,205,158,67,155,239,160,123,145,221,91,171,15,24,117,220,91,45,19,107,110,74,150,5,58,127,125,39,135,169,173,179,151,182,13,86,159,189,93,241,244,164,178,238,192,126,
124,128,135,237,20,32,135,147,124,169,183,95,26,75,109,154,32,24,47,184,40,227,138,245,22,25,66,171,51,36,244,180,159,130,149,117,31,120,201,235,187,45,177,199,81,182,202,47,60,176,177,23,108,53,11,14,247,87,235,169,17,185,47,121,156,99,148,22,102,26,75,24,16,222,125,24,98,39,71,240,222,177,14,92,26,222,187,186,29,116,151,100,28,220,154,59,115,188,127,208,22,139,101,39,158,26,211,212,204,120,159,6,168,76,216,250,53,52,51,218,102,104,163,148,69,123,91,124,188,136,230,184,85,44,85,106,120,45,171,186,47,176,36,130,57,120,162,139,211,109,184,137,132,6,0,131,155,60,112,187,50,0,70,230,189,143,188,216,44,20,140,6,190,121,90,31,199,251,9,166,16,131,57,2,230,5,232,113,141,161,139,3,96,127,86,248,47,0,39,167,221,164,102,214,0,9,128,177,95,124,128,243,11,73,109,249,162,104,77,177,10,23,134,141,212,82,239,183,71,23,148,138,82,15,72,193,211,177,29,25,206,18,148,132,223,127,220,236,100,99,65,133,94,175,37,200,
157,106,157,146,136,174,44,158,197,80,31,68,92,131,213,249,152,192,157,99,173,3,140,132,61,249,86,215,24,14,119,141,161,47,254,200,141,193,155,129,112,23,127,216,120,227,7,220,237,154,151,230,80,215,30,94,217,56,86,166,221,18,145,105,148,88,154,126,2,198,159,188,198,254,147,183,95,120,233,198,142,215,183,181,128,200,11,245,75,244,120,74,20,11,108,24,197,238,213,22,179,188,39,24,81,112,117,83,199,176,102,115,78,118,222,47,175,207,154,24,213,116,51,86,53,148,195,61,237,49,133,166,103,188,126,15,23,194,124,76,232,194,92,203,83,230,134,174,90,62,221,167,59,92,160,232,14,239,186,165,250,219,202,198,7,47,175,129,136,139,175,5,124,122,113,224,62,119,3,147,187,34,82,55,146,157,187,49,121,59,245,68,117,132,205,129,199,50,24,163,209,93,195,61,83,4,214,142,131,125,91,48,112,169,191,3,183,108,183,222,166,114,235,49,203,188,201,52,234,136,210,218,186,1,175,15,58,94,171,113,251,160,74,238,30,235,221,100,23,24,235,49,186,199,165,30,
189,133,214,31,26,17,183,207,205,244,185,184,10,59,218,58,237,253,129,154,82,95,31,140,94,49,41,61,194,238,17,173,30,9,75,115,131,193,20,107,151,37,91,84,77,71,139,181,244,66,165,175,230,59,166,154,201,95,20,196,211,74,238,144,220,23,145,136,7,234,232,109,202,246,30,176,180,118,120,167,87,53,227,167,59,191,26,216,192,94,32,58,137,90,194,154,32,96,57,213,58,171,182,73,166,133,62,58,241,9,16,15,29,113,60,107,160,147,152,68,186,79,45,217,180,175,41,161,115,178,108,142,119,3,163,87,8,185,231,155,198,20,46,158,112,218,189,145,50,97,136,192,189,218,180,168,250,44,54,71,243,121,46,220,15,236,71,211,76,86,153,161,178,251,174,116,75,115,11,199,85,52,80,106,213,23,162,71,110,232,87,102,251,51,115,135,106,38,242,173,49,72,16,105,164,240,232,177,97,57,26,29,84,128,187,57,47,88,49,227,149,204,177,157,108,178,6,168,140,37,76,155,246,64,5,108,80,23,180,240,78,62,245,101,71,126,162,100,43,43,47,72,141,254,37,88,
243,10,84,1,145,64,9,240,9,208,97,62,255,194,211,220,181,139,66,14,191,0,226,249,22,53,100,195,161,87,86,190,213,217,105,46,1,200,111,118,65,242,105,198,63,13,238,147,87,222,87,135,43,92,23,65,224,36,200,238,118,32,255,94,178,178,47,204,222,254,201,112,174,176,146,185,143,187,142,88,102,29,236,50,204,169,17,165,151,58,90,33,161,79,229,111,64,19,1,66,158,18,149,132,161,156,130,100,229,193,42,168,53,4,130,28,116,160,72,5,208,83,5,251,89,179,28,97,150,67,55,159,85,132,228,208,195,207,63,131,149,184,80,133,111,195,81,210,58,154,193,235,130,16,90,200,245,21,5,200,112,105,214,67,249,30,191,105,200,124,115,25,112,38,177,169,247,28,89,20,243,198,212,228,199,117,237,167,30,44,172,163,38,203,165,94,170,145,213,115,153,0,21,159,254,201,205,192,210,238,122,55,117,10,55,190,215,136,216,101,234,98,215,218,206,235,98,31,35,172,145,112,139,0,87,211,34,190,121,84,49,47,81,25,243,58,43,101,226,219,66,73,25,11,160,230,
23,40,63,201,219,12,179,181,55,219,158,108,99,249,199,85,246,249,50,126,35,125,234,186,202,92,159,14,126,239,20,107,194,228,192,15,72,181,249,98,173,167,199,124,149,16,246,78,55,252,14,184,13,121,167,10,184,209,205,93,186,20,14,3,93,8,208,78,32,106,100,19,5,35,215,143,106,117,197,77,247,185,106,142,180,12,193,111,161,232,146,234,60,1,143,6,51,165,69,70,121,93,198,108,110,32,231,121,210,200,96,143,248,197,189,55,12,163,226,62,83,200,212,70,204,157,52,20,46,153,198,222,232,81,40,31,35,202,134,243,210,55,82,150,37,123,43,146,199,196,30,18,99,38,97,213,122,210,11,51,17,80,33,251,29,51,3,46,1,215,32,138,6,90,161,202,139,54,86,127,85,152,15,2,24,75,1,189,35,32,64,6,74,160,30,218,81,189,180,43,18,30,173,65,126,97,56,205,199,139,108,15,186,70,135,87,110,71,75,163,217,60,128,150,92,221,91,181,8,250,72,116,212,66,186,223,246,226,49,243,6,116,108,96,110,109,36,247,208,227,110,162,136,179,199,251,
218,214,246,12,144,198,100,123,49,18,159,73,248,217,70,206,178,50,12,73,26,173,202,91,121,65,44,19,23,212,226,202,70,55,206,26,171,124,90,170,45,88,137,117,149,34,120,221,187,53,147,98,78,211,210,117,189,61,156,184,30,44,196,137,196,235,199,86,211,233,16,14,157,121,215,66,49,55,72,110,18,73,198,15,160,229,15,153,16,218,199,245,110,129,230,76,242,29,48,172,5,26,216,119,175,219,245,76,147,48,180,245,230,169,138,132,108,102,191,186,77,227,29,123,15,178,141,73,93,54,138,151,190,113,115,234,83,35,246,101,187,212,204,175,64,188,190,36,208,111,66,163,198,12,36,238,220,208,238,177,185,230,152,129,93,74,111,176,109,4,182,173,49,137,198,190,232,80,160,233,23,99,140,123,8,182,13,141,138,123,35,114,17,211,46,243,104,225,66,117,36,33,169,85,136,233,70,90,222,239,253,151,219,91,228,110,111,31,65,162,191,41,180,173,35,205,69,226,57,218,172,183,163,48,170,78,188,100,248,49,76,117,91,37,234,99,44,50,15,102,162,231,169,215,221,77,
253,212,222,201,85,35,241,50,226,252,77,53,119,188,220,228,49,32,77,193,243,190,56,132,59,210,164,253,130,108,220,85,24,49,243,170,18,152,49,246,249,181,43,96,126,38,27,55,40,110,44,242,211,182,246,236,48,149,133,207,245,245,225,194,154,74,58,32,55,114,126,179,220,57,167,150,96,74,211,66,84,185,185,106,1,65,173,146,16,211,85,110,10,35,233,106,173,144,194,253,8,71,91,224,4,230,165,16,107,161,115,86,234,91,45,59,209,180,186,194,90,167,173,174,157,139,246,19,192,8,89,161,124,21,223,38,144,234,44,35,162,185,226,136,96,231,200,220,11,82,23,38,173,207,2,212,51,242,40,208,111,133,80,148,188,5,174,190,32,22,73,158,5,110,166,30,73,109,250,8,150,29,178,85,33,59,76,92,152,75,78,243,197,115,160,221,241,98,210,58,202,190,37,124,221,69,214,39,207,228,156,79,138,178,191,178,201,154,165,233,88,195,220,95,23,117,194,74,104,120,125,187,73,176,151,145,208,72,34,5,51,164,107,44,2,35,56,8,140,27,69,99,139,181,164,78,
73,99,14,79,28,125,47,3,91,156,148,65,41,111,13,129,105,207,18,33,149,117,200,116,132,222,6,61,226,193,26,208,53,226,153,183,44,202,168,117,116,98,148,3,222,219,189,144,45,172,27,36,15,205,100,162,61,181,238,162,17,35,124,31,150,208,120,30,221,85,92,182,69,38,99,35,194,158,219,216,74,195,158,83,61,135,242,114,169,117,84,242,109,183,44,124,211,239,76,208,54,199,82,156,85,225,31,213,24,181,6,72,52,156,178,220,103,190,166,15,54,245,253,55,107,236,100,180,174,140,210,209,27,217,122,37,27,3,88,113,92,15,197,207,69,27,166,121,59,49,111,95,21,126,105,149,72,28,97,177,40,29,32,196,136,129,211,85,97,212,235,79,121,243,153,141,150,220,104,202,238,51,118,87,28,49,141,247,143,243,242,130,254,240,136,54,95,168,64,222,102,151,253,254,106,89,104,142,207,6,146,242,1,35,85,97,192,175,141,218,250,106,25,134,185,117,252,115,28,232,148,116,24,232,133,137,218,231,45,3,250,50,110,169,80,24,35,189,170,148,20,196,106,117,65,161,
174,111,116,147,196,62,86,192,0,199,99,212,44,11,106,12,249,137,172,57,52,14,193,27,171,138,47,100,198,70,60,36,199,72,109,129,53,72,223,67,213,104,232,53,22,128,209,227,48,166,239,62,198,240,56,17,81,134,37,7,212,216,47,149,249,203,140,93,150,81,124,240,145,109,67,247,46,206,43,36,150,30,141,43,156,230,133,237,177,40,69,129,69,67,11,239,7,51,11,251,39,151,168,220,149,222,27,30,156,100,213,98,61,218,133,107,152,160,162,71,44,120,54,118,149,204,182,146,122,112,153,184,84,134,181,68,102,132,25,237,166,188,229,175,122,196,160,191,125,160,59,140,41,54,161,135,134,232,76,127,47,233,139,162,116,149,177,226,208,151,5,120,58,53,85,167,54,231,118,216,112,206,236,240,167,114,253,175,4,244,137,179,115,64,0,207,117,151,123,105,72,191,78,80,45,175,117,203,153,139,143,165,62,227,35,195,100,214,163,221,252,207,82,165,196,131,229,35,231,58,237,142,41,45,42,161,214,139,127,121,77,144,27,71,168,145,251,242,145,123,93,42,220,58,221,21,
22,205,208,35,230,62,171,87,193,159,231,129,33,66,133,129,184,82,16,240,2,59,185,212,180,97,162,215,119,128,189,223,94,123,136,96,80,136,120,43,172,157,125,130,53,12,209,38,241,229,175,140,129,152,138,111,11,82,135,108,49,228,35,84,211,212,169,170,127,106,16,245,164,187,14,135,88,116,100,239,107,34,204,8,216,116,18,10,42,19,55,106,236,137,17,167,24,126,177,150,17,65,18,204,147,49,175,159,147,228,163,37,234,49,162,36,27,146,103,236,130,146,196,108,103,83,238,222,210,209,123,39,214,73,96,44,115,139,123,11,11,62,208,132,59,9,78,191,174,97,238,79,130,173,87,198,48,247,148,233,142,136,152,91,69,205,174,38,231,157,72,114,83,225,195,39,142,59,189,126,103,41,25,87,6,146,232,190,250,229,102,160,4,24,72,9,35,133,232,164,130,121,229,27,90,91,204,203,36,31,121,93,134,205,59,51,7,231,32,157,102,99,203,93,26,237,199,249,51,98,112,228,93,92,218,87,202,207,179,11,64,158,171,217,187,152,85,99,26,59,85,224,14,26,125,37,
51,216,88,111,110,14,51,209,217,90,231,69,44,51,53,212,149,147,252,85,87,79,71,135,229,177,236,131,182,86,163,172,7,160,194,206,197,71,241,39,120,16,252,230,92,113,225,132,172,22,41,94,156,143,179,238,46,68,162,120,10,51,15,85,207,85,92,162,236,160,46,64,65,150,175,2,254,118,24,29,248,211,125,21,55,129,93,216,229,93,251,34,251,168,185,154,52,68,233,209,198,249,102,120,92,39,139,235,228,227,220,54,114,229,167,52,43,16,105,26,226,109,66,162,113,15,230,197,133,4,249,176,48,63,23,18,199,73,206,129,37,36,222,66,32,168,76,12,153,142,2,104,88,218,91,163,45,114,192,124,241,163,159,194,129,148,18,88,152,20,13,139,57,221,72,32,6,26,197,229,97,177,22,10,191,58,68,139,114,143,38,185,205,11,163,107,123,149,181,202,215,216,164,181,98,133,100,119,236,201,47,95,70,61,192,152,225,107,190,228,137,52,26,173,95,215,202,106,213,26,223,242,93,130,223,185,118,122,180,184,49,220,10,52,194,235,218,181,53,210,108,242,240,180,233,248,
125,16,150,67,125,29,193,238,164,84,115,83,78,210,186,72,131,223,38,116,60,84,32,9,54,90,175,50,62,36,238,250,224,235,104,178,182,203,83,133,115,74,45,170,216,160,219,161,86,25,26,110,57,181,152,90,219,200,100,6,243,214,162,165,246,90,226,149,45,44,238,46,233,193,59,182,128,121,18,63,123,236,8,243,43,225,192,19,150,218,31,136,210,153,193,51,51,217,111,38,146,126,39,190,44,86,245,11,159,142,46,7,90,240,107,75,60,19,56,177,121,14,134,194,76,162,243,227,67,97,178,33,23,39,251,162,218,6,219,203,119,47,3,110,65,41,14,59,234,51,13,231,12,191,63,15,29,210,253,204,127,137,55,223,10,84,153,50,177,123,167,156,121,80,135,81,111,117,232,157,0,56,160,85,127,133,190,130,200,160,52,141,58,12,86,17,172,90,157,213,2,101,119,153,140,10,144,186,205,159,249,91,50,222,77,110,159,183,253,214,191,247,215,159,37,40,180,98,59,79,44,103,40,157,210,142,228,119,52,250,92,12,139,156,221,205,30,188,250,244,171,171,7,215,179,131,
28,194,166,33,69,250,21,52,220,123,230,61,115,179,111,128,247,76,24,4,195,35,154,158,31,162,93,75,44,0,191,120,74,179,197,171,83,69,220,180,216,159,37,202,197,85,200,221,166,49,21,24,39,9,93,88,222,251,232,157,127,31,121,93,106,192,235,199,203,129,3,219,95,129,209,253,85,81,199,228,150,92,244,251,34,50,159,55,225,37,245,174,209,156,66,228,79,31,34,191,127,137,17,119,113,106,95,3,43,24,104,169,207,252,52,145,14,36,157,246,72,139,147,145,16,105,128,181,8,181,51,234,253,4,132,211,121,138,54,42,98,34,48,240,50,136,199,137,7,168,21,212,120,83,106,0,92,32,96,48,232,156,55,212,177,39,150,216,121,41,3,145,154,48,29,136,206,109,161,25,111,218,237,18,40,148,43,1,88,87,232,148,1,176,61,103,156,104,99,218,121,56,2,180,189,35,163,194,233,132,192,211,146,141,199,234,201,63,190,248,112,156,15,67,189,233,248,220,163,99,251,72,243,91,31,121,128,200,151,129,146,85,1,79,112,186,244,206,238,78,209,162,148,121,107,120,
44,163,121,107,221,25,103,180,131,11,83,142,182,212,183,198,106,189,99,55,229,205,126,103,189,46,240,231,107,242,122,85,95,15,235,27,245,226,22,132,9,18,68,170,119,55,91,26,225,32,200,19,9,101,9,19,55,42,9,73,53,42,174,4,229,146,234,42,227,84,189,209,71,10,206,194,36,228,118,208,105,84,103,40,22,156,25,97,113,33,74,46,51,0,36,158,69,189,141,32,199,137,116,243,169,162,41,61,81,65,53,65,246,242,174,128,51,192,123,7,70,192,250,243,100,64,39,226,241,210,175,5,233,235,64,108,209,196,169,80,3,192,160,0,249,224,9,207,73,181,50,153,74,165,164,32,29,206,232,45,107,56,160,51,204,233,239,235,238,165,81,248,57,48,158,9,179,66,218,27,110,35,34,214,204,180,16,14,237,234,123,98,192,173,95,96,79,91,47,134,40,61,148,24,228,6,166,204,246,16,62,62,23,81,235,126,55,156,116,48,149,136,121,56,110,46,210,197,22,113,102,213,139,50,227,26,7,113,170,97,101,65,177,172,79,213,217,222,205,109,74,74,132,92,15,137,
50,106,62,70,162,18,199,137,88,112,246,40,179,82,159,99,210,213,135,31,97,132,117,165,223,204,62,180,205,85,54,84,28,13,231,105,185,113,30,32,5,36,120,241,82,81,6,232,233,41,113,126,214,94,148,190,111,91,174,47,166,119,15,108,86,146,103,250,152,217,182,154,128,254,228,240,185,153,172,232,183,246,245,21,124,162,21,73,199,115,189,235,92,135,231,153,125,242,86,47,169,185,176,157,134,67,106,181,86,39,89,85,24,20,167,223,99,103,246,121,10,99,236,68,149,75,169,54,127,207,84,47,217,204,96,75,159,76,65,46,213,4,6,232,142,46,26,136,139,137,128,5,205,4,220,82,204,106,176,226,78,29,230,77,147,6,129,154,122,178,16,160,87,80,131,12,228,203,90,87,17,231,99,98,30,36,39,61,233,223,194,104,144,54,89,130,91,42,164,77,218,44,247,71,20,245,150,71,225,15,169,243,225,209,163,9,166,154,78,47,97,186,74,148,141,37,200,85,228,128,254,2,128,194,81,128,125,65,246,126,40,122,76,117,128,23,57,54,240,158,139,22,255,249,9,42,
63,204,159,55,182,214,251,112,120,58,173,124,232,2,3,208,121,84,209,57,102,89,197,75,209,196,19,170,160,149,79,51,144,25,31,225,10,238,236,153,200,51,229,5,30,241,210,69,15,184,164,252,165,173,14,55,78,26,113,206,46,206,49,16,86,106,215,166,253,252,38,77,85,227,130,224,126,198,137,60,194,201,158,103,192,73,148,33,30,29,29,247,234,239,223,23,175,96,29,250,131,127,34,142,235,28,178,177,141,198,234,136,72,221,235,139,48,197,35,136,145,162,14,213,14,151,24,202,74,220,136,76,35,85,43,114,77,168,105,34,173,204,78,211,39,212,182,70,198,104,108,81,1,224,55,34,243,7,122,92,168,33,137,103,183,23,178,55,196,191,165,47,151,154,239,137,158,55,60,142,211,6,12,88,15,212,17,139,244,124,43,102,212,87,82,136,66,152,246,43,60,131,243,250,216,140,134,89,246,211,212,89,109,13,171,189,119,247,5,104,47,250,1,204,178,175,109,144,174,61,208,115,0,67,30,112,194,157,11,186,122,217,240,11,1,112,153,155,37,7,111,100,203,209,16,251,
73,156,121,42,52,84,186,42,203,92,165,109,83,197,165,158,188,240,73,173,94,66,136,122,27,46,63,185,132,143,137,241,36,162,26,136,31,88,94,28,70,205,218,132,253,84,165,124,184,159,69,97,13,91,197,126,92,107,224,207,79,40,98,181,68,189,203,48,86,110,158,179,188,26,21,79,238,242,99,61,245,195,176,230,5,208,199,43,140,5,239,113,65,155,92,61,190,221,246,118,182,253,113,193,186,150,150,234,204,114,231,55,36,55,207,9,183,141,102,52,120,224,231,245,253,249,201,137,161,200,94,130,179,121,58,138,212,147,142,207,21,50,55,61,95,104,227,162,130,118,239,250,48,159,167,14,49,103,146,217,156,37,181,26,249,197,83,47,195,109,132,175,234,154,228,21,196,107,129,120,134,206,87,82,7,6,158,96,212,253,68,146,233,160,128,251,51,24,117,161,104,108,72,34,225,66,128,211,225,56,205,137,33,62,49,239,55,51,91,181,103,240,215,122,123,124,82,121,187,25,224,69,47,18,39,160,112,2,28,74,184,131,60,10,223,133,75,152,12,13,75,28,60,215,88,201,
22,23,57,184,242,225,133,45,77,175,167,243,76,160,57,241,172,27,203,71,166,46,145,40,20,253,204,60,172,39,197,188,173,198,0,128,6,250,151,94,170,56,55,17,168,201,4,171,228,62,74,145,52,161,139,38,135,237,175,242,250,53,142,215,70,2,42,11,199,123,78,36,242,142,184,74,165,242,30,185,230,217,59,125,229,221,147,238,32,218,26,240,73,182,202,187,137,43,207,41,95,233,108,121,140,171,137,94,14,69,9,183,153,176,66,110,171,31,21,238,123,95,47,219,44,169,58,198,19,117,21,58,116,61,239,48,31,21,50,237,41,139,107,147,3,220,208,165,19,89,80,56,229,97,246,37,255,160,42,39,166,54,207,190,2,0,236,5,229,161,224,189,241,25,130,204,103,227,208,165,164,147,147,16,12,110,97,115,29,238,14,35,212,23,76,27,77,60,201,70,222,241,146,101,175,63,198,153,61,213,49,87,55,22,70,249,61,71,103,140,164,8,140,71,68,154,162,18,27,93,33,109,23,178,135,229,135,212,242,110,119,230,98,10,155,227,82,100,79,110,185,214,0,85,99,115,
225,45,103,253,98,15,85,38,244,145,65,54,231,145,117,109,109,89,25,158,202,33,94,142,182,97,124,185,191,124,64,168,2,144,108,234,112,75,90,241,227,99,135,161,35,215,98,128,249,42,237,132,222,163,128,38,16,114,186,210,147,80,55,242,126,65,66,109,218,36,43,69,31,185,175,193,231,77,7,178,159,70,124,245,110,168,119,116,15,201,203,107,187,246,254,188,248,90,30,20,67,59,174,54,120,16,37,210,197,193,127,124,209,208,151,210,21,161,178,241,155,31,215,81,210,85,219,6,113,115,219,169,27,96,3,99,173,154,210,98,169,245,23,11,61,105,101,108,216,170,183,184,243,140,14,206,72,224,62,138,36,141,153,125,206,74,108,139,52,144,198,91,91,244,126,46,215,40,138,185,12,181,223,204,207,101,32,105,142,5,235,231,151,73,69,0,214,75,150,201,207,247,235,25,162,172,133,32,34,165,191,142,180,251,201,212,47,204,230,159,137,94,143,113,212,128,124,3,244,38,100,232,241,44,141,239,103,81,196,220,169,138,45,92,175,185,103,70,38,213,216,166,39,158,103,209,
137,182,131,194,171,107,213,242,188,62,110,19,248,99,248,162,237,189,235,197,11,74,186,171,181,37,89,84,166,84,87,97,137,79,217,34,56,100,146,78,121,205,1,224,96,198,196,54,66,45,93,161,152,219,204,148,226,30,52,219,177,30,187,237,108,74,58,26,85,14,141,172,196,85,239,235,232,220,236,74,77,48,87,35,131,220,211,65,182,212,33,137,103,147,112,143,4,180,114,229,221,176,213,196,91,18,136,149,230,110,119,117,214,185,251,218,105,112,10,198,16,103,204,102,58,72,31,207,240,226,102,187,46,188,226,27,159,107,136,96,111,172,231,124,215,4,35,82,231,112,13,149,76,89,40,175,40,90,21,238,165,149,227,228,106,108,248,86,139,14,43,241,65,149,15,54,168,124,244,98,214,199,18,161,103,136,152,105,64,77,232,139,161,202,44,22,182,178,145,27,51,26,191,117,114,38,66,122,23,161,70,91,40,88,11,84,21,177,206,131,142,89,176,194,140,9,85,150,72,229,117,34,204,172,80,158,231,20,212,27,145,177,150,76,7,115,84,68,177,118,188,239,69,42,20,23,
251,61,191,102,56,108,202,101,138,145,70,105,203,31,69,174,167,205,225,232,93,76,138,224,113,213,188,233,245,159,173,225,38,88,178,112,105,56,119,82,149,86,27,168,126,233,60,36,31,13,161,141,251,129,112,152,162,70,119,31,115,152,37,125,60,140,186,234,72,43,26,136,3,231,173,105,123,208,12,110,126,135,72,138,33,54,62,140,65,121,205,91,76,110,66,148,27,54,195,218,39,19,151,25,228,85,183,115,216,243,187,25,165,221,170,58,99,162,109,204,239,139,106,110,28,156,164,189,107,158,250,54,220,194,22,43,75,193,24,227,210,60,23,45,49,86,240,215,121,70,183,244,89,77,226,163,63,52,108,32,227,57,73,58,243,64,225,198,112,45,255,146,10,109,196,68,171,1,137,47,146,201,93,100,122,110,4,134,24,95,84,46,197,211,13,183,240,196,162,60,142,128,223,96,1,244,66,67,187,41,239,175,7,196,18,96,160,100,3,240,115,61,124,222,198,62,34,28,240,71,174,88,35,80,67,200,117,130,189,102,54,14,240,194,85,192,198,6,195,151,87,222,109,78,2,139,
88,249,128,171,224,7,193,11,66,97,190,75,66,112,17,19,186,85,144,236,2,38,203,98,202,247,216,173,31,185,82,167,242,33,216,109,153,52,53,134,250,222,107,106,230,151,226,199,86,34,144,47,14,31,215,62,231,48,146,32,63,51,3,210,162,32,90,24,104,246,126,17,89,155,64,23,138,150,109,177,159,83,63,242,183,129,221,141,125,81,240,39,162,119,53,63,62,20,172,118,110,40,201,125,145,132,220,123,196,121,74,171,235,87,221,170,235,12,21,116,203,215,76,102,123,159,106,164,80,192,138,130,9,49,0,97,244,56,7,185,141,204,235,43,242,179,121,185,95,92,185,7,118,165,96,115,31,53,77,144,84,65,162,219,99,12,24,98,52,112,51,4,125,165,143,123,161,44,195,80,152,133,146,230,84,94,13,199,64,122,244,192,76,96,230,14,22,185,12,1,205,169,213,174,198,104,82,89,62,42,171,183,161,190,187,98,104,206,152,92,197,161,205,120,44,200,2,9,209,3,130,212,190,221,9,35,249,195,234,108,93,184,16,150,216,28,160,185,36,140,148,2,37,121,239,71,
147,253,232,55,131,130,196,174,24,53,117,238,101,27,92,20,223,86,212,222,27,69,238,159,94,107,86,87,58,26,3,19,28,233,23,194,72,37,112,126,176,186,119,103,15,116,211,146,252,194,44,97,131,240,69,201,123,165,76,198,23,3,80,178,104,74,149,216,5,44,237,24,187,156,52,62,252,62,60,127,140,173,233,250,64,126,159,46,91,220,40,252,46,102,147,127,139,248,23,201,203,189,203,8,247,144,50,66,124,74,30,226,25,116,171,24,105,49,3,169,121,7,227,29,16,139,73,69,17,90,254,85,176,29,250,225,5,95,72,182,74,75,156,86,232,194,58,234,52,152,228,108,61,60,52,156,158,182,40,104,158,75,131,249,187,148,47,90,105,201,53,144,91,0,4,16,117,149,228,133,236,29,191,32,17,82,137,244,246,36,88,48,247,88,50,30,143,17,190,109,161,104,178,154,155,164,40,193,95,59,173,100,5,81,56,219,39,66,88,238,238,70,163,169,63,77,229,18,167,61,45,225,213,141,115,205,240,98,199,30,91,189,15,57,53,85,202,140,26,118,5,231,75,183,34,9,
70,245,18,115,55,105,225,165,138,150,8,115,137,208,53,200,140,133,221,20,222,39,80,44,104,159,76,151,50,128,209,215,145,209,208,192,26,41,167,49,133,221,42,205,38,130,115,37,37,43,248,91,131,243,129,55,58,251,69,224,208,72,43,35,7,206,178,90,138,6,231,231,177,190,17,22,6,244,17,230,39,244,166,8,217,44,154,230,120,3,49,25,32,233,11,46,26,237,231,129,59,136,40,196,172,54,7,13,110,55,143,243,65,197,188,230,185,144,89,74,64,217,191,137,90,129,62,238,41,233,127,117,24,9,153,236,14,145,61,73,185,225,140,175,187,113,170,202,40,252,65,66,164,20,144,36,245,133,15,141,141,219,240,246,236,36,37,166,231,74,32,137,238,32,211,77,39,122,252,178,162,125,54,205,166,137,105,151,36,25,238,124,11,62,168,88,13,101,209,57,32,247,212,191,6,9,91,232,108,78,168,53,77,159,12,124,168,209,3,25,32,32,245,58,20,197,19,144,84,136,50,166,222,14,88,166,43,102,179,33,235,123,250,249,33,38,87,221,31,183,233,43,209,237,39,154,
237,196,32,123,99,16,96,78,192,197,180,193,104,85,203,235,238,73,249,113,158,196,79,216,51,110,104,49,214,42,243,118,114,97,230,75,84,25,87,16,228,134,248,220,252,190,27,29,81,184,113,249,27,187,192,95,59,235,203,14,128,91,127,213,36,225,184,185,239,29,55,30,44,175,177,22,250,18,195,93,100,77,254,166,192,193,124,81,22,186,192,73,149,95,120,193,198,121,35,173,27,178,227,3,56,75,215,129,54,91,25,201,14,236,145,152,41,62,223,64,223,155,97,225,109,131,126,187,72,132,32,5,0,181,199,172,77,136,244,65,7,115,216,66,182,145,35,124,130,134,47,1,79,0,220,107,119,100,132,39,97,66,136,58,225,175,60,98,240,102,210,235,248,121,181,72,133,173,49,97,91,46,90,136,141,72,112,55,81,31,27,25,57,225,180,216,25,34,23,139,139,180,108,126,90,129,40,230,251,60,138,185,134,2,85,92,161,48,46,139,118,183,196,242,210,191,46,238,165,248,141,25,96,88,176,61,204,9,234,2,137,61,155,166,130,253,195,114,67,171,214,125,208,70,122,203,
156,65,125,206,24,178,184,51,218,239,94,90,72,120,159,196,166,123,216,226,131,127,183,62,148,139,44,187,62,184,36,87,246,248,188,30,161,46,74,195,163,84,231,216,127,26,106,71,67,213,136,59,47,170,78,51,230,113,128,81,53,13,82,75,205,142,81,76,83,150,249,35,94,132,153,21,51,154,225,145,128,125,136,66,147,236,101,248,62,83,145,165,26,97,95,170,18,173,184,97,96,252,129,6,167,160,137,253,3,11,125,96,241,79,42,67,180,199,200,140,76,147,66,143,203,179,67,227,74,186,119,24,110,28,35,38,194,1,76,117,142,105,146,100,122,139,189,159,72,40,197,30,207,223,155,234,21,133,237,118,60,65,143,53,138,78,255,232,238,120,17,166,72,87,162,179,188,77,122,150,190,23,125,76,13,93,139,134,187,68,163,145,150,247,102,60,157,74,137,0,194,182,143,208,225,179,117,29,254,120,189,238,226,251,239,110,129,93,169,239,152,237,200,15,38,251,253,19,79,170,18,48,11,220,88,132,14,245,86,17,241,168,133,74,159,136,164,235,86,230,94,139,116,104,142,160,
24,16,152,180,121,13,171,128,56,244,223,167,195,178,31,65,161,91,0,153,208,13,146,185,48,107,183,79,129,102,115,207,68,105,73,75,43,186,26,21,171,21,181,91,169,153,180,90,207,209,153,59,247,156,156,8,211,7,118,36,156,61,12,128,79,116,196,213,137,139,38,230,183,79,206,219,145,62,239,238,165,6,251,59,226,181,49,77,170,49,225,3,77,44,44,144,42,34,97,104,154,237,129,167,239,247,222,94,190,179,155,202,100,118,149,149,94,28,38,49,157,227,80,94,216,157,81,106,99,57,82,47,37,107,172,247,213,235,170,170,136,208,219,198,205,251,100,7,150,148,6,234,60,197,249,64,124,11,75,244,194,90,189,125,113,61,180,29,160,94,217,192,48,23,223,242,126,227,129,31,90,166,207,131,180,16,24,66,169,203,34,140,193,86,161,197,10,139,203,41,215,121,181,75,160,33,29,211,162,214,199,196,1,125,244,139,212,81,109,198,73,110,19,159,105,95,158,196,153,165,251,47,60,91,242,165,214,247,191,34,102,15,244,122,244,142,124,44,46,181,121,112,87,90,89,96,
171,227,190,33,117,168,38,74,71,153,83,128,101,65,137,121,82,108,234,138,68,71,49,254,218,181,192,75,189,168,165,171,183,47,35,195,22,46,118,143,209,203,122,82,209,68,154,31,206,106,107,143,239,92,30,205,159,151,122,224,128,171,96,59,34,38,174,216,228,120,4,110,238,48,253,158,183,37,148,69,22,244,98,63,111,68,187,75,13,76,158,115,186,77,97,34,31,60,225,122,9,111,56,221,104,1,163,173,90,79,137,12,58,32,214,186,105,70,5,68,134,133,200,228,35,19,219,207,36,197,235,25,103,112,0,1,117,223,27,69,247,222,62,202,13,115,199,59,157,61,85,126,10,23,245,244,71,90,34,111,88,80,60,121,12,188,84,76,178,101,154,216,82,16,145,48,172,79,48,36,36,128,205,213,152,52,142,113,119,36,40,53,97,120,209,45,14,62,103,91,187,9,81,105,84,231,234,197,210,100,193,74,106,108,195,99,69,104,152,103,5,247,86,67,49,116,7,84,60,146,200,140,134,174,58,253,245,115,109,99,7,233,174,190,19,122,149,249,73,237,185,242,138,159,188,189,
95,98,122,89,93,70,55,130,25,149,248,132,27,239,0,114,197,138,37,248,97,178,223,110,167,72,156,158,35,226,159,49,247,252,28,81,161,145,26,161,50,62,83,143,48,28,77,95,123,82,98,185,220,88,87,251,58,7,108,29,76,177,222,199,250,168,183,36,172,242,254,227,51,140,132,234,146,157,47,10,146,29,210,164,133,221,251,92,179,123,199,25,250,25,199,206,168,217,237,39,34,197,208,34,42,42,233,22,146,195,95,173,12,242,197,178,237,221,14,246,181,115,182,177,151,16,120,43,208,91,9,212,30,199,157,88,50,171,76,201,152,18,13,116,216,107,164,149,113,159,98,20,76,80,47,45,221,52,28,210,121,118,157,65,22,51,44,208,33,110,111,17,180,51,202,34,19,198,124,70,117,128,23,44,213,158,71,61,80,59,175,251,202,147,2,108,172,179,191,183,109,13,128,5,195,27,220,64,132,218,193,97,101,59,25,130,52,155,193,194,58,49,77,154,120,252,178,188,171,90,31,194,216,34,119,63,165,88,203,86,171,171,58,0,88,192,227,135,181,211,0,60,217,203,18,199,
116,86,92,103,245,47,215,41,203,136,190,136,105,215,20,73,217,187,161,230,67,50,170,182,143,162,27,23,208,36,139,158,116,218,204,93,178,200,220,69,111,106,70,88,1,100,233,233,71,129,38,171,176,13,169,189,211,16,48,162,9,209,63,142,164,76,234,61,152,228,31,59,163,72,66,204,189,153,51,30,171,105,59,177,76,166,55,71,113,42,96,195,82,157,205,43,11,171,96,6,6,134,178,34,169,10,203,103,87,148,20,156,5,174,89,230,44,104,173,0,82,213,200,167,24,222,148,144,76,113,49,80,80,49,20,75,21,175,142,137,8,183,53,133,83,139,74,180,106,60,134,136,88,42,97,91,104,114,135,103,240,250,254,244,14,60,136,228,43,125,7,31,43,167,244,11,73,212,235,84,113,248,184,205,3,40,67,111,185,6,53,109,6,108,58,3,165,123,35,58,90,21,59,226,23,28,150,8,123,22,50,140,87,135,66,20,222,207,50,172,161,246,111,217,43,3,188,163,153,127,0,60,212,150,202,183,42,66,12,193,25,145,189,46,234,40,106,240,45,189,117,140,62,83,77,123,
144,112,179,196,112,222,125,198,126,110,223,56,105,218,152,92,18,226,237,135,14,55,55,159,197,244,252,183,88,84,16,130,148,149,149,50,107,240,182,120,209,83,225,38,42,156,170,39,32,181,68,172,9,83,128,27,74,168,227,65,136,93,59,105,199,11,190,146,43,242,239,198,248,203,108,166,102,105,192,33,96,34,50,237,169,94,244,117,254,170,9,63,103,153,198,105,157,182,233,109,115,11,190,57,33,4,171,112,225,157,198,115,219,174,26,179,13,173,229,185,179,238,159,111,24,233,81,218,191,200,27,108,21,40,221,91,159,148,117,44,55,2,189,240,176,28,92,170,167,63,223,244,12,102,164,179,25,74,239,74,13,42,121,44,160,227,37,238,43,174,89,128,41,184,121,216,50,199,92,10,137,138,139,12,154,74,60,79,213,80,95,63,25,47,88,56,224,43,98,20,125,101,22,151,7,11,247,145,6,117,63,87,124,48,80,171,2,60,220,176,204,169,226,50,178,108,229,235,107,41,39,10,193,244,99,216,5,43,12,96,106,162,120,17,236,30,122,197,139,210,185,13,98,23,91,254,
19,203,209,7,44,142,218,230,12,118,131,221,57,97,15,35,126,133,221,59,170,230,78,243,18,21,84,25,160,97,51,101,194,98,182,3,128,80,52,226,75,93,178,4,153,95,102,241,165,85,16,28,173,133,68,24,126,139,31,227,245,133,121,188,108,129,254,36,13,240,53,127,67,55,194,118,89,159,173,206,194,60,42,199,122,205,140,188,157,150,18,210,218,41,193,133,35,221,82,2,67,32,211,240,178,148,160,128,173,17,197,200,68,227,183,247,190,248,99,244,117,40,81,105,117,181,114,170,83,46,230,147,249,120,78,155,173,102,116,187,125,205,125,22,215,9,7,78,18,139,72,220,206,139,231,57,89,26,206,83,197,125,97,182,84,153,43,227,136,11,153,224,154,249,149,179,34,92,218,2,11,182,192,188,173,75,234,12,30,245,216,203,34,29,175,231,20,250,171,12,191,184,25,156,252,201,23,147,114,80,241,11,242,149,172,239,16,92,195,45,247,189,247,105,222,14,82,14,40,31,207,103,64,59,183,192,65,76,86,173,247,4,45,149,59,210,51,233,71,80,140,82,194,88,225,64,
140,24,223,184,190,35,207,108,199,169,49,5,144,251,75,26,67,146,184,183,93,146,217,13,151,62,212,178,119,130,242,130,203,139,78,56,200,225,145,229,22,173,187,11,32,90,189,101,57,13,128,222,147,97,211,42,150,93,1,92,108,168,0,65,166,98,59,178,93,39,159,187,54,213,208,126,40,210,237,23,67,59,60,220,181,135,187,188,74,29,195,167,113,116,96,43,116,231,3,160,58,237,226,136,8,28,209,39,57,217,250,140,73,56,77,206,80,137,129,30,154,136,157,205,187,222,123,210,112,173,23,58,227,4,195,172,4,106,251,153,194,97,120,193,176,88,39,44,232,243,121,3,28,18,178,209,41,103,219,161,3,133,170,160,161,6,20,37,42,33,227,75,106,73,212,144,169,232,26,213,217,89,205,61,229,210,199,224,145,235,57,64,9,238,238,168,78,142,204,170,190,209,158,53,212,38,116,21,186,220,69,145,74,193,168,74,61,18,21,213,98,170,198,41,169,191,34,210,79,134,133,245,136,209,174,69,147,163,131,232,245,95,109,25,27,172,149,108,101,163,144,20,46,49,124,110,
224,216,161,164,141,164,78,10,146,241,112,134,177,53,24,183,147,250,3,184,166,172,222,115,253,227,24,180,240,160,43,249,86,207,52,194,93,12,1,135,55,61,190,55,114,78,183,106,169,49,107,154,153,145,195,234,170,10,192,51,1,4,244,6,99,199,211,92,170,36,146,200,122,84,137,85,177,115,156,44,115,53,19,108,251,94,128,166,99,46,116,225,70,3,200,45,116,228,149,141,246,222,233,144,59,1,205,36,194,95,92,168,23,55,14,248,146,134,4,154,144,192,187,216,47,106,189,68,93,97,44,180,129,205,51,131,93,134,69,84,235,91,167,151,54,251,64,98,31,37,53,251,180,227,68,231,111,205,57,17,204,34,6,190,114,178,227,123,149,246,167,115,52,3,229,239,145,244,148,66,30,181,177,198,89,62,55,54,51,229,15,15,16,194,78,67,64,46,241,56,212,178,141,226,224,19,17,78,55,209,234,40,154,41,209,71,70,92,175,134,241,38,80,219,118,42,82,37,110,40,98,213,149,152,238,218,28,37,105,37,126,60,165,32,10,124,62,105,175,246,199,166,53,118,12,70,
74,88,2,46,253,210,120,129,163,87,220,179,189,85,205,21,34,18,141,246,124,243,202,34,103,93,175,55,187,251,43,12,6,61,94,202,117,44,147,237,213,92,219,217,129,139,246,225,73,97,96,30,25,252,25,48,112,113,131,180,123,197,52,41,214,82,143,35,250,73,6,234,179,160,46,56,58,3,214,46,239,103,215,244,227,230,110,71,22,196,206,199,226,99,84,255,168,76,27,121,182,141,71,193,208,186,88,11,229,202,150,125,42,109,151,136,197,26,154,48,201,219,186,254,34,40,154,175,8,237,12,107,156,57,168,218,221,11,239,138,41,72,118,178,208,49,64,84,84,103,167,1,211,55,85,150,252,159,104,154,45,229,60,138,48,84,232,48,132,44,243,156,88,201,137,241,41,190,86,222,206,156,240,241,100,123,131,92,120,254,96,32,75,128,147,137,80,58,50,17,16,234,179,177,182,72,154,252,232,78,41,248,254,237,72,228,227,164,137,35,209,0,35,25,34,96,162,158,43,162,58,51,40,231,90,45,219,99,165,96,150,14,163,236,10,77,79,5,148,83,241,123,75,44,131,150,
146,44,119,227,196,254,178,91,190,236,95,103,19,210,115,202,228,190,81,104,28,93,198,213,91,142,41,245,199,103,31,89,36,238,70,103,180,186,251,233,60,87,140,235,65,4,136,16,180,78,245,214,43,215,195,221,163,253,34,25,101,90,117,98,219,43,85,124,53,107,248,22,31,189,67,227,214,115,122,228,165,217,98,101,59,222,47,208,235,234,152,191,176,215,158,101,248,24,189,113,14,75,238,248,133,247,224,98,159,242,86,122,234,77,31,75,159,234,102,166,193,38,40,8,147,174,252,154,142,58,143,92,229,59,15,213,87,89,232,8,62,46,139,167,237,77,209,218,240,19,224,31,63,33,83,225,169,209,27,199,193,71,210,39,46,52,21,127,94,98,141,45,69,174,255,36,43,92,154,38,129,113,216,63,30,103,141,203,45,219,35,236,147,77,226,81,98,194,161,101,222,155,165,189,219,60,150,155,7,242,161,227,119,116,157,220,58,106,181,51,128,40,196,34,29,12,15,66,194,132,65,144,51,233,98,41,93,226,53,93,158,123,149,75,109,145,213,81,190,156,180,68,113,143,160,223,
125,212,125,143,155,95,134,41,4,238,254,22,191,171,193,23,156,12,25,226,163,95,38,2,226,101,172,234,173,167,35,2,142,58,252,85,252,58,217,25,85,215,205,206,171,115,88,90,178,149,164,180,210,52,47,104,149,117,129,193,142,95,133,186,224,236,142,125,0,156,238,42,236,120,63,132,214,166,123,113,177,121,29,136,80,211,122,84,188,200,133,1,2,219,75,100,247,4,85,250,8,196,3,94,129,208,162,236,227,140,159,0,54,23,215,188,142,19,58,61,169,25,3,195,249,72,45,1,234,218,108,170,46,30,238,125,25,240,206,101,30,34,241,232,129,145,55,69,9,12,15,191,89,203,112,200,110,186,8,38,55,149,235,67,174,238,32,24,152,227,53,132,108,203,148,109,29,107,21,2,35,205,98,89,163,7,44,165,35,197,140,36,142,176,26,23,115,242,225,174,109,158,254,180,190,78,82,210,98,151,255,105,219,178,163,166,91,108,116,88,235,182,99,245,78,78,240,184,159,224,199,33,93,139,240,44,203,189,165,101,95,59,249,76,46,129,140,167,110,192,201,128,0,17,45,63,
149,227,147,127,12,217,130,95,131,151,126,126,70,14,137,97,132,173,74,190,32,127,146,31,28,208,158,27,32,60,4,226,163,91,60,130,163,213,32,171,65,199,55,37,231,38,145,109,111,5,54,180,224,248,53,126,85,158,222,43,7,254,211,210,220,239,50,138,86,177,14,89,73,38,22,110,134,240,97,126,166,19,103,246,1,191,142,152,222,160,190,107,111,13,21,164,182,158,213,168,127,192,148,140,116,227,177,242,146,55,73,222,122,75,104,44,51,146,231,247,138,207,53,227,3,178,240,48,64,135,38,230,168,176,102,84,15,238,231,113,13,162,152,4,158,151,50,40,215,126,103,226,45,45,114,191,113,190,87,235,188,251,21,107,201,144,10,146,152,112,81,234,130,25,217,97,25,55,222,104,166,112,117,109,53,192,45,7,216,229,70,216,114,105,11,230,35,53,197,78,103,117,83,5,200,119,16,196,29,166,122,213,85,207,248,2,177,135,141,108,51,174,247,159,241,249,136,14,202,13,5,57,115,88,176,25,10,42,230,154,179,98,102,85,204,74,40,253,53,156,36,46,176,38,164,1,
204,75,137,2,212,133,169,51,82,17,235,190,133,22,59,133,68,108,245,238,74,197,200,130,27,122,169,1,118,86,115,47,12,252,62,98,83,90,48,79,227,241,158,156,192,146,51,168,101,190,181,84,183,207,249,124,191,103,150,86,106,110,157,107,125,220,59,196,235,168,124,47,68,43,177,84,244,49,24,15,39,153,197,158,232,160,15,122,109,58,141,59,44,121,98,36,5,83,177,144,188,55,142,66,19,86,121,196,105,72,104,231,27,184,210,222,78,168,134,68,79,165,222,102,71,37,107,75,108,203,160,154,217,235,42,55,189,130,199,244,15,212,230,188,98,129,214,199,12,228,32,52,100,217,78,62,56,69,75,187,110,29,24,16,105,222,123,141,251,68,76,151,11,197,13,205,247,93,126,107,17,227,146,125,80,119,75,161,34,85,239,208,71,44,3,173,189,197,22,224,56,28,210,88,182,210,75,77,44,187,3,230,224,222,226,3,127,110,30,176,232,2,78,19,88,150,134,141,90,172,116,104,124,30,26,233,5,166,161,228,187,88,157,210,157,149,19,214,29,17,247,249,184,183,29,177,
59,110,24,155,135,225,212,13,183,235,83,118,104,239,18,42,71,24,105,186,26,140,22,102,254,61,65,34,27,124,194,227,27,116,34,112,86,77,183,58,133,157,142,109,42,12,89,19,157,179,6,184,38,212,174,187,35,246,154,230,126,32,70,6,154,251,32,96,159,197,239,163,140,192,55,127,22,185,132,163,17,134,23,40,51,209,132,49,20,176,50,7,245,190,209,194,61,54,195,98,129,238,138,13,113,32,108,148,14,241,132,38,66,24,193,142,21,3,103,117,70,60,235,104,170,133,230,158,53,200,236,169,110,214,124,127,186,75,142,211,73,195,170,89,73,134,30,103,75,200,225,86,42,77,49,136,13,229,210,50,125,84,197,123,203,69,68,196,214,94,138,231,80,185,184,215,26,247,147,129,15,247,85,249,156,173,69,173,144,12,73,209,136,59,233,105,164,22,83,88,182,8,244,237,15,72,117,147,136,95,192,54,130,105,206,55,143,102,128,237,210,175,123,36,253,150,79,225,204,143,225,9,70,30,68,209,245,92,118,1,101,152,228,34,64,182,77,118,93,213,182,27,103,42,236,23,
102,66,101,49,219,250,11,230,30,230,65,82,211,79,182,116,237,78,157,247,224,216,100,214,252,172,36,242,139,4,237,93,118,232,50,222,195,169,48,234,147,58,165,45,167,153,116,216,244,92,182,21,25,247,38,6,48,237,225,215,8,206,232,24,6,185,150,190,219,162,27,56,55,125,231,54,58,116,239,196,238,245,43,150,169,167,207,205,172,85,208,121,51,204,51,25,31,142,51,68,179,15,147,234,233,67,102,135,110,24,21,91,174,42,235,76,165,248,187,73,234,89,240,151,113,79,19,187,197,126,106,181,230,8,20,183,136,52,75,42,57,1,29,34,97,23,144,152,85,167,74,103,156,190,162,151,56,129,35,63,46,48,40,3,224,71,243,194,252,23,60,15,28,5,168,8,73,45,69,238,47,234,45,190,7,110,210,199,138,242,19,209,158,182,64,127,161,84,168,47,34,247,43,209,51,252,16,51,46,108,83,50,206,98,194,87,153,207,186,5,77,187,160,120,108,108,211,160,129,193,40,75,181,154,230,43,145,174,43,207,97,22,118,241,17,132,200,49,220,114,95,60,155,205,132,57,
161,113,171,84,0,228,186,69,29,82,19,88,245,244,118,223,87,161,170,21,58,231,14,86,199,214,184,235,29,119,106,247,227,75,152,200,129,233,112,30,103,202,17,65,149,223,8,84,110,6,23,133,62,25,240,235,78,221,185,215,237,123,108,206,86,157,240,97,92,201,72,98,45,178,94,218,176,168,255,241,206,56,98,80,228,171,69,203,216,234,96,150,118,250,117,30,179,84,169,51,117,182,57,149,28,98,132,58,253,139,67,30,160,159,47,105,223,181,173,229,64,140,112,203,139,25,207,187,154,64,177,229,75,122,160,77,249,30,98,95,199,186,187,46,163,216,41,251,134,201,109,187,236,43,229,26,145,151,112,117,215,190,155,86,9,31,170,68,228,37,129,59,225,234,214,60,221,229,209,218,122,207,70,184,131,76,248,9,122,103,83,151,230,107,121,31,26,199,102,76,12,223,248,245,119,55,186,125,163,201,179,168,137,230,65,24,171,134,3,123,111,112,155,64,79,199,53,211,18,190,39,31,236,17,84,57,93,60,244,25,161,113,204,21,26,151,17,41,206,242,178,176,210,245,66,141,
62,168,146,68,77,137,39,49,2,227,242,62,138,220,24,133,234,249,24,114,15,111,225,35,102,155,49,1,85,196,251,203,81,221,181,165,84,2,75,3,234,142,152,53,144,215,38,92,43,211,161,108,71,157,79,242,182,149,105,141,42,57,249,117,91,103,248,228,137,180,130,18,213,40,228,106,149,230,50,145,43,87,114,169,123,221,44,26,110,186,207,165,38,244,2,19,97,112,241,188,218,35,157,176,228,246,193,205,228,233,232,44,192,43,241,227,109,27,171,168,118,73,52,149,42,67,64,153,142,100,220,21,140,171,219,189,55,178,154,111,144,60,3,121,207,169,211,180,175,4,28,54,208,163,61,36,233,94,241,33,95,174,115,62,46,249,100,73,227,73,99,131,170,213,71,103,173,177,214,161,33,89,93,134,107,244,193,204,66,122,174,10,48,144,164,164,72,207,84,190,233,231,162,45,251,193,131,166,179,2,67,182,220,181,148,9,146,189,46,166,153,231,0,243,142,182,86,135,226,43,250,53,84,157,183,250,67,81,81,254,12,217,230,246,88,255,216,201,134,230,228,33,29,67,22,218,
48,68,210,5,10,142,176,211,136,88,178,72,203,85,36,77,241,64,141,54,234,206,119,249,244,80,242,86,109,147,82,218,205,254,18,131,7,164,218,198,120,227,3,116,216,157,102,75,222,89,198,117,75,226,29,83,54,217,212,194,100,71,241,133,57,63,139,130,227,135,129,253,22,6,189,165,185,47,81,92,100,206,197,193,11,244,32,231,18,240,59,55,175,187,211,171,173,102,105,100,84,241,130,173,18,109,216,142,245,79,226,0,92,175,78,178,84,195,113,14,123,188,111,175,105,205,50,255,58,7,160,208,102,141,139,5,232,205,219,162,4,203,26,88,146,175,160,79,229,170,232,31,127,174,187,117,55,149,75,162,38,8,80,77,52,166,201,100,226,210,76,124,153,202,208,23,41,141,147,222,68,147,78,125,93,119,210,171,159,99,167,106,172,96,212,219,44,147,143,130,149,65,113,214,73,236,108,60,58,254,24,245,141,155,117,233,21,248,154,216,239,233,66,241,130,203,224,60,68,175,123,122,24,229,232,112,140,27,8,246,124,188,5,51,225,89,108,97,219,202,97,158,92,188,179,225,
214,153,163,220,230,121,164,1,70,195,145,82,119,114,114,80,153,175,253,244,32,173,20,47,126,155,145,126,175,163,133,12,13,80,87,101,116,177,216,184,1,210,89,180,223,32,87,120,14,232,183,75,234,169,53,80,100,243,21,248,206,182,149,43,245,209,34,200,29,140,0,26,108,140,190,109,25,79,33,183,29,131,119,60,197,184,102,119,173,86,187,46,14,131,71,234,40,156,45,236,165,19,136,68,149,129,56,55,128,137,236,117,44,45,139,93,63,99,155,151,113,20,92,209,117,174,194,155,73,40,189,127,16,220,72,4,48,161,77,200,226,92,230,145,179,185,28,215,23,211,112,107,255,60,146,199,193,203,94,14,97,122,21,105,64,77,158,142,82,184,47,20,2,231,165,177,6,12,28,182,40,49,243,69,249,242,209,196,198,14,177,143,32,128,79,221,23,163,227,205,149,159,97,122,66,92,145,175,48,125,91,86,226,40,142,203,5,5,106,21,182,215,19,10,221,131,222,145,192,17,124,236,91,180,148,151,189,193,16,147,12,58,20,104,119,179,39,35,150,107,33,2,35,212,183,142,
188,160,131,188,160,117,42,186,165,204,36,235,94,95,15,125,135,251,186,236,166,11,220,96,189,52,118,102,188,64,101,87,110,157,96,140,251,46,9,124,130,66,61,164,164,175,222,13,214,203,61,108,180,134,228,165,46,54,162,251,220,109,217,222,122,174,117,244,53,145,118,165,143,171,73,93,30,137,118,134,6,168,255,5,236,107,45,103,30,151,54,248,136,52,252,119,80,255,228,141,124,232,32,94,156,244,45,216,136,105,23,7,80,239,5,243,64,218,228,132,85,31,30,102,198,69,12,224,46,55,36,198,138,53,34,120,30,36,102,226,98,59,2,144,77,243,130,37,233,164,250,193,88,168,185,237,57,159,59,146,189,174,84,71,244,150,26,56,71,133,129,27,153,8,122,207,2,29,242,216,90,69,134,187,168,50,120,160,252,150,155,202,148,21,100,28,139,219,90,188,17,206,91,152,33,22,8,177,162,32,11,142,98,22,253,144,40,37,168,184,97,168,203,107,85,21,25,57,221,180,107,138,89,113,121,102,211,120,179,56,15,164,200,235,80,171,166,157,208,220,111,31,68,164,201,7,
234,40,59,49,106,30,62,222,73,171,32,214,10,143,13,149,231,56,251,221,236,12,55,248,197,130,110,145,140,181,34,83,154,38,17,195,218,149,163,66,176,177,28,29,8,104,203,253,226,47,142,176,0,127,175,130,167,185,61,54,79,217,149,203,18,9,52,120,50,134,66,166,81,129,110,111,76,42,144,242,249,108,16,70,14,58,251,201,80,62,26,103,219,15,113,167,25,34,51,171,132,12,15,30,31,96,132,251,245,72,63,238,4,143,220,33,114,18,22,161,170,196,197,66,193,52,163,203,14,201,254,148,23,190,209,93,2,220,23,122,171,194,191,216,106,170,121,166,178,158,221,252,179,215,47,224,250,72,102,34,79,86,110,33,10,47,23,28,27,108,60,207,154,124,42,93,220,159,155,229,49,184,231,87,21,242,203,26,196,152,209,56,17,239,2,158,177,26,230,10,75,72,246,126,122,85,229,167,2,17,125,238,134,14,244,38,126,51,136,92,240,217,237,79,4,214,2,140,212,2,198,110,58,17,102,19,67,6,22,148,87,231,19,150,58,237,250,56,177,74,234,181,87,102,254,141,
54,125,19,89,24,254,146,48,158,1,24,196,81,5,127,126,228,248,203,238,96,84,56,142,245,17,123,37,65,156,142,130,72,61,6,99,244,58,162,107,45,252,123,107,81,64,6,90,14,156,94,83,101,247,27,173,8,183,110,73,217,197,142,134,250,10,126,10,46,208,180,203,244,210,117,60,43,20,24,41,111,163,245,242,155,176,23,48,82,17,122,60,66,207,47,133,2,236,110,161,172,220,238,173,121,186,27,190,1,93,74,23,4,60,51,28,240,81,237,205,112,13,191,211,249,90,220,150,130,242,153,159,121,153,201,119,149,79,214,251,96,85,19,123,243,138,192,111,107,161,203,91,123,149,134,109,59,199,249,220,16,193,105,142,213,166,235,38,211,105,45,45,16,192,129,39,230,169,139,215,58,29,95,231,226,27,121,6,106,130,76,219,244,28,146,153,8,244,112,125,216,39,40,243,100,210,69,59,149,120,44,114,247,163,208,66,58,92,84,118,56,234,52,94,46,65,213,92,30,115,131,97,219,221,208,131,33,33,0,186,209,227,45,163,2,175,129,60,110,10,22,22,16,234,40,221,
15,182,216,244,233,196,120,16,142,219,103,207,143,35,76,252,198,86,156,228,34,196,176,90,53,247,186,214,137,105,170,55,152,179,51,70,201,182,239,118,118,197,16,118,145,66,140,187,244,124,150,183,100,73,3,209,41,27,5,123,115,51,95,182,120,195,127,242,78,19,66,12,30,201,190,146,172,177,189,82,121,98,41,189,111,41,117,52,192,47,7,204,156,165,144,60,17,178,224,152,224,1,160,23,7,97,20,200,187,42,237,62,185,109,189,113,27,218,203,24,103,184,244,126,41,2,154,151,253,225,99,153,114,205,156,252,6,171,230,144,230,75,199,199,178,113,240,16,243,18,91,65,33,205,101,13,162,164,59,94,40,62,39,100,187,200,141,44,217,117,178,87,151,42,39,145,153,5,25,120,104,18,3,67,184,120,156,14,0,21,211,1,183,116,20,250,154,139,134,25,138,112,85,74,106,43,251,187,180,244,86,190,158,6,231,153,33,175,63,127,228,91,139,102,153,4,142,208,156,67,88,161,114,226,218,139,175,171,51,27,52,104,86,229,237,84,110,15,16,228,96,154,170,178,35,102,
152,219,122,43,6,165,48,226,90,180,214,213,201,126,236,111,187,70,106,131,179,44,83,13,199,218,112,88,236,167,213,134,241,235,245,233,218,172,247,143,61,200,252,224,220,146,151,225,97,167,223,209,67,177,209,26,58,7,72,253,217,40,5,67,216,89,185,158,117,17,86,10,206,116,205,115,29,8,77,95,49,231,135,204,182,66,166,94,110,227,118,203,157,24,214,158,230,56,221,241,114,114,251,134,114,124,102,240,68,8,221,124,52,233,56,44,191,206,229,186,250,37,80,174,204,65,42,107,89,186,12,122,222,226,147,143,206,236,48,175,45,92,198,44,246,209,46,80,238,164,143,167,99,73,27,215,211,185,179,59,158,93,133,100,166,215,222,113,223,254,176,195,155,114,23,93,94,218,125,168,35,72,99,88,113,76,134,141,115,238,220,225,108,204,143,221,71,21,81,77,237,132,202,218,213,26,184,74,108,66,216,249,136,219,2,87,172,1,150,91,5,134,145,174,226,61,51,61,126,52,164,249,105,34,235,225,190,190,17,176,239,126,232,105,22,60,201,78,44,104,162,92,150,113,76,0,
203,206,154,56,94,162,102,187,198,175,102,193,204,28,218,220,37,84,55,40,213,94,80,97,105,75,60,12,229,228,166,77,14,114,228,52,59,49,86,73,164,46,101,134,215,229,165,251,151,213,73,104,91,105,246,205,138,14,110,125,24,238,251,247,119,197,237,16,115,183,197,237,72,148,73,219,54,85,145,205,8,2,178,63,49,177,16,69,95,162,25,224,216,48,206,38,184,91,156,21,224,152,67,74,145,244,57,155,63,135,178,214,213,254,241,138,255,116,189,151,16,150,87,224,203,60,101,188,154,146,224,139,225,64,194,28,216,85,175,203,155,185,71,160,232,125,34,147,220,60,174,138,80,138,180,113,219,50,78,225,146,141,34,170,133,59,168,199,55,220,33,205,199,236,216,123,79,239,22,70,119,15,69,67,126,74,216,87,69,243,217,76,232,42,226,139,129,119,243,181,38,146,77,156,107,203,127,80,145,102,146,98,255,94,156,125,84,82,12,23,203,204,11,214,82,236,107,57,198,174,135,92,58,21,202,226,164,41,242,190,90,115,156,75,71,9,77,81,121,243,0,223,211,66,162,235,
81,8,52,13,189,150,15,66,111,155,48,199,69,42,182,132,176,15,234,196,217,50,11,103,106,56,10,166,94,125,154,78,71,80,226,101,201,94,150,100,128,184,80,19,54,153,234,107,145,122,28,129,104,228,48,139,162,58,25,125,68,182,51,153,92,115,62,191,191,185,250,74,51,212,179,123,66,173,40,162,142,75,44,31,214,182,107,54,127,169,185,161,198,70,37,168,194,225,8,113,156,159,188,250,155,223,29,161,83,141,51,160,232,239,104,47,113,33,65,39,161,232,211,83,202,219,133,107,125,221,42,85,204,88,119,185,177,101,26,159,209,45,27,29,39,201,49,31,22,182,162,21,174,32,21,154,51,122,229,231,240,82,210,54,32,23,107,245,184,232,90,237,137,92,44,46,52,174,197,173,218,152,81,128,189,35,118,56,147,70,7,151,117,86,243,103,78,179,27,221,233,166,176,67,21,158,182,117,27,166,154,87,93,213,156,116,125,100,99,190,98,42,60,216,167,79,66,46,103,227,216,18,160,139,225,189,77,18,132,152,70,232,220,123,210,37,235,152,254,113,53,176,30,185,26,109,
133,124,107,247,191,62,250,140,58,137,137,187,51,196,20,38,187,81,143,50,5,16,207,44,174,203,236,215,179,142,60,185,89,139,155,138,125,187,12,186,227,10,148,156,180,24,48,86,114,99,171,116,154,222,199,249,123,221,157,58,22,34,192,21,56,82,145,192,48,18,152,210,141,196,212,110,182,129,231,112,77,45,7,150,193,61,33,186,4,6,145,203,14,23,53,141,216,10,62,71,21,5,57,13,159,217,71,183,5,84,90,93,86,41,91,213,95,171,172,94,213,186,203,253,192,175,6,45,131,118,187,148,80,178,146,182,253,238,214,91,92,62,161,197,173,37,0,42,185,118,44,116,133,31,174,27,251,38,128,176,91,8,140,70,216,39,55,45,229,162,145,192,100,168,239,245,153,233,144,202,250,120,228,112,253,87,181,171,44,114,74,147,68,43,198,35,98,95,139,93,85,107,182,170,172,115,3,121,52,160,24,51,221,238,36,141,159,95,59,14,242,216,177,250,191,183,245,30,173,22,109,233,185,222,95,57,224,230,189,8,95,55,46,24,225,134,241,95,176,91,70,70,178,116,44,21,
148,85,69,213,169,107,220,184,176,114,216,123,229,156,115,206,57,167,189,114,206,57,231,156,247,202,209,91,66,200,110,24,102,99,50,97,142,249,141,193,24,239,251,126,157,249,24,185,167,210,214,197,156,63,143,221,242,57,66,29,116,164,237,228,44,243,18,106,85,90,77,47,111,111,106,112,2,193,143,123,35,44,153,61,80,162,123,53,10,85,224,182,79,206,95,23,137,164,217,165,77,52,99,90,23,21,184,177,159,165,229,141,11,40,58,161,212,149,179,26,71,53,107,8,74,10,81,147,160,244,102,29,151,110,78,148,226,207,169,140,85,85,50,181,159,187,153,106,181,29,200,252,29,155,9,134,229,126,156,191,239,103,216,247,237,228,78,86,210,31,14,23,191,135,179,197,72,27,101,185,74,24,2,157,113,29,108,196,134,144,92,206,4,213,30,39,221,83,241,226,37,90,132,199,237,37,72,162,2,143,153,46,2,18,67,56,212,6,167,138,230,87,194,202,27,85,25,122,133,57,22,55,215,105,228,121,18,163,64,13,195,165,143,245,40,190,150,126,144,158,35,57,60,241,40,160,
63,10,170,111,189,100,178,207,167,39,226,170,156,72,72,229,251,88,41,135,127,138,64,22,97,88,100,234,119,31,2,174,18,10,236,26,186,217,67,63,55,245,69,47,235,12,139,16,210,192,92,81,151,34,249,199,42,52,240,95,79,57,220,210,137,136,81,88,197,177,146,61,53,178,87,203,139,238,171,165,104,55,44,158,23,203,51,54,165,5,214,250,254,102,35,70,12,108,169,198,173,254,186,53,113,108,179,33,189,24,81,29,243,225,125,163,69,218,204,154,80,149,42,108,186,230,249,231,2,129,175,220,246,89,117,232,130,217,123,253,28,135,98,157,64,183,43,13,167,246,216,242,118,245,54,195,227,254,88,39,192,21,44,247,117,219,79,198,139,79,236,119,70,42,163,72,61,26,23,83,80,244,94,204,166,253,65,190,220,44,229,35,139,189,167,129,153,13,212,102,57,180,148,207,133,227,159,96,114,153,203,229,228,98,48,175,37,203,150,53,220,163,66,217,28,238,70,132,148,226,254,10,148,219,230,141,23,164,126,218,62,164,164,85,16,216,16,190,153,239,207,119,39,189,248,209,
19,9,60,190,238,92,141,109,186,239,251,64,252,144,205,142,75,171,152,142,16,51,144,13,105,213,175,59,117,93,97,48,169,11,73,156,241,174,216,153,152,58,64,70,203,219,151,241,57,52,60,139,61,59,208,48,251,50,180,102,252,253,140,31,191,32,178,98,191,205,224,241,195,241,136,234,151,127,62,217,4,215,49,132,147,134,68,150,51,25,139,168,159,22,225,117,152,89,76,154,231,17,84,196,1,170,47,216,3,252,14,60,112,142,167,189,156,56,206,62,231,241,199,17,60,244,89,106,22,0,158,106,154,48,54,20,5,162,6,189,44,4,193,67,244,64,41,195,79,160,37,121,187,48,206,38,60,77,77,248,37,100,135,137,103,19,207,109,1,134,151,157,110,189,242,221,191,90,146,18,15,211,90,194,109,215,109,148,48,147,62,2,233,36,220,3,121,2,123,178,120,246,85,250,216,84,82,55,223,46,94,85,145,199,174,139,164,65,142,21,196,101,25,40,109,234,179,169,20,75,200,146,9,73,61,34,145,71,21,10,185,80,34,119,150,246,106,174,90,168,95,221,162,185,140,104,
27,175,99,207,203,14,219,50,130,234,149,16,154,195,221,47,128,249,141,38,166,124,217,141,59,179,146,10,101,215,194,153,105,11,25,234,192,20,132,112,115,42,135,230,116,56,202,113,169,198,157,211,210,235,136,107,159,70,164,129,72,154,0,43,154,177,174,225,158,9,208,66,207,103,187,231,154,51,150,170,197,12,54,126,123,240,139,138,212,122,83,106,61,94,173,7,48,199,230,198,79,100,27,32,159,139,88,36,211,21,122,104,196,97,141,192,16,3,19,19,168,190,166,141,108,172,31,139,230,233,83,65,208,40,138,65,37,134,164,96,221,21,101,104,113,38,145,210,21,254,244,119,84,252,66,203,165,242,32,50,157,62,9,38,11,136,52,164,71,107,223,111,9,254,40,150,56,33,147,38,212,33,97,65,100,76,62,49,58,67,36,194,224,249,177,174,48,124,30,188,41,9,22,124,35,145,47,126,19,35,230,159,110,141,165,26,57,144,154,56,82,194,4,162,34,120,173,213,92,222,140,27,38,143,13,132,227,19,134,54,190,172,10,96,201,5,240,143,44,248,206,92,203,47,52,25,
132,38,211,222,24,50,202,32,51,122,57,148,165,235,202,65,239,191,198,171,137,107,208,26,146,61,223,246,227,44,182,51,135,253,28,63,166,75,88,145,240,83,38,126,106,38,18,123,73,144,115,12,12,67,198,146,32,129,0,34,34,105,44,189,90,58,3,31,244,236,42,158,28,204,69,226,83,201,248,120,195,125,175,187,123,184,94,6,61,23,62,57,82,82,204,155,214,48,226,26,182,33,165,108,243,139,5,3,148,65,163,171,147,125,37,229,179,18,76,43,198,65,13,153,16,48,80,64,136,73,231,161,231,186,114,90,114,51,151,97,225,207,63,142,0,143,112,94,227,189,40,196,60,93,189,154,141,1,175,134,224,246,177,2,12,122,194,77,162,208,249,192,76,217,118,185,27,201,24,179,185,173,199,19,61,139,122,117,206,31,195,44,53,204,20,162,190,114,62,16,137,238,235,171,248,250,163,37,175,151,138,113,82,131,47,106,204,138,136,166,154,191,38,217,171,84,123,181,235,96,82,186,242,45,11,176,199,167,205,228,36,111,79,141,216,54,128,40,122,49,12,219,96,62,189,0,
26,220,203,96,238,92,115,126,28,7,53,161,176,99,23,6,198,141,126,22,89,242,68,126,149,246,218,40,121,135,214,187,217,230,174,132,83,18,1,130,11,165,31,104,252,178,195,56,249,87,50,19,71,102,63,14,222,132,237,163,208,220,253,36,199,136,53,196,174,2,8,187,229,103,115,179,160,94,144,169,220,173,65,168,38,197,121,181,88,203,114,83,54,8,61,231,126,209,193,223,167,13,159,216,95,167,162,64,101,149,137,228,214,187,100,56,20,180,63,115,113,247,45,121,127,0,206,178,9,182,156,195,5,175,33,232,83,242,243,152,249,10,184,183,57,190,220,183,219,201,145,52,212,135,146,4,210,248,68,148,254,54,255,99,13,76,162,222,234,142,217,152,72,200,23,206,52,147,241,159,237,229,251,86,176,45,99,83,16,183,118,33,140,134,31,243,102,29,77,204,250,226,170,113,13,173,237,134,135,248,109,192,72,5,35,59,174,121,161,115,229,123,29,161,113,154,133,190,117,39,21,202,237,60,114,117,51,0,176,108,241,169,126,69,169,211,133,11,176,215,178,196,164,230,100,37,
113,166,50,97,33,127,216,71,107,186,155,154,102,51,196,44,12,9,184,153,6,134,83,234,7,172,55,86,89,32,136,215,212,153,24,224,52,81,19,75,155,50,5,163,45,35,170,159,3,139,112,32,95,190,76,34,98,83,64,8,246,4,204,30,240,55,195,35,80,107,24,112,13,67,93,206,30,177,9,137,82,216,62,202,155,79,242,150,245,228,116,109,10,122,192,143,203,51,69,135,89,251,74,172,119,237,60,89,90,153,131,96,20,204,234,197,99,49,232,52,86,97,230,184,43,80,99,72,91,18,31,229,112,182,114,132,59,58,164,169,251,163,252,180,112,149,123,2,127,143,106,104,14,16,205,1,167,1,30,100,254,145,32,191,18,25,226,79,97,126,240,121,203,15,190,85,117,233,101,177,250,102,71,205,107,234,12,134,178,181,219,226,174,91,53,54,119,248,99,218,196,200,180,115,180,117,92,87,153,209,234,188,86,125,247,71,151,102,68,19,29,60,201,132,239,117,45,57,50,146,240,243,125,92,12,165,71,198,244,242,216,110,245,115,116,174,200,169,191,48,29,10,68,18,16,189,
184,167,35,87,216,228,42,5,28,104,3,59,33,255,126,217,225,250,159,188,36,124,166,115,141,130,122,181,81,130,194,55,210,40,13,84,28,25,22,2,198,10,16,20,251,124,205,184,15,164,94,251,212,107,31,186,107,134,45,220,176,14,106,250,61,78,65,211,62,66,27,103,252,10,242,38,81,136,109,80,40,111,222,216,181,186,177,177,153,36,44,143,198,250,14,246,246,201,176,138,210,100,91,57,175,71,247,253,2,190,219,42,206,211,110,189,156,52,109,181,32,195,229,41,62,31,156,103,171,183,19,184,43,188,152,179,174,223,155,119,232,252,8,143,235,219,84,0,105,85,34,45,74,148,190,164,132,201,175,224,164,160,42,69,213,136,100,231,181,68,142,169,168,91,219,211,253,97,158,221,190,48,34,241,53,121,123,85,135,111,197,162,122,17,63,193,101,232,93,219,61,151,130,42,110,20,93,252,186,108,124,216,67,225,180,43,90,22,70,130,20,38,211,107,0,236,231,17,15,80,90,247,68,239,147,162,182,208,180,2,55,164,145,138,185,112,73,165,165,170,49,181,92,26,227,133,
165,223,200,231,245,193,88,150,247,106,137,125,235,66,164,233,246,234,187,241,17,198,205,213,57,116,243,227,155,49,242,248,239,10,97,186,153,54,117,220,248,193,237,146,191,176,63,57,121,101,195,92,216,98,239,20,73,68,214,41,182,245,19,111,38,237,94,95,79,219,118,247,93,226,194,234,99,1,40,1,65,244,161,14,187,0,214,178,144,161,138,136,128,41,204,228,216,219,224,235,178,119,101,167,123,119,182,56,105,243,131,214,173,42,131,136,185,102,195,156,63,25,147,236,139,208,208,112,23,143,38,245,118,207,193,238,129,92,240,116,43,51,120,179,143,88,207,78,125,114,243,235,20,104,29,191,9,188,79,249,229,78,197,254,84,181,203,159,156,82,26,230,81,80,249,225,126,80,24,99,34,36,141,248,50,244,170,167,63,208,48,127,219,208,37,77,62,75,49,179,160,110,162,160,111,88,138,93,217,169,12,209,64,132,213,107,39,58,77,159,206,130,9,235,60,224,238,119,139,108,113,66,158,100,192,250,98,73,155,188,144,101,17,248,121,26,16,79,70,142,178,252,73,116,85,48,
13,80,37,13,162,166,147,5,248,73,105,77,73,27,133,227,166,200,157,169,235,210,14,73,93,8,100,101,132,116,94,36,48,235,182,173,86,213,187,234,121,226,87,142,198,153,110,196,195,132,203,215,216,137,221,223,160,231,102,170,172,246,136,99,229,27,166,190,167,212,83,115,69,99,42,248,14,149,91,158,118,128,255,129,83,51,31,122,99,63,109,47,177,77,214,193,172,125,203,13,212,16,206,194,8,239,68,104,108,7,23,104,221,132,216,165,216,174,16,131,159,91,76,238,58,207,65,140,206,246,87,115,49,247,101,43,229,229,166,22,247,166,110,205,94,57,126,231,62,213,3,171,198,243,212,92,38,169,4,149,184,57,118,222,15,219,125,55,56,39,39,153,79,109,59,61,66,121,239,135,243,163,112,70,59,55,55,120,199,188,196,164,75,167,151,108,170,126,52,243,150,102,51,60,85,47,39,195,179,238,91,227,176,207,212,44,63,25,151,142,155,221,252,3,223,98,184,43,55,245,162,61,85,20,222,113,250,197,249,13,91,51,181,213,69,9,153,242,86,29,114,197,200,107,83,153,
205,215,115,38,148,243,193,95,211,1,195,140,167,125,197,5,217,114,67,16,166,55,135,200,149,5,11,69,7,3,28,9,79,153,194,145,218,19,197,60,73,94,191,179,250,193,122,225,30,91,195,232,171,167,220,130,166,91,159,79,241,189,162,225,214,92,199,229,227,90,164,61,50,12,207,227,125,232,187,11,157,244,166,225,114,142,237,109,220,220,85,28,100,219,135,145,200,114,190,28,41,109,66,136,208,195,167,101,82,224,140,166,185,109,62,250,195,74,19,17,46,250,48,128,109,198,204,61,147,173,175,9,84,165,251,209,22,156,111,117,217,90,174,239,168,37,239,14,71,5,1,81,83,85,104,10,10,121,251,199,148,95,39,49,250,107,57,210,130,11,210,193,41,129,154,220,147,98,225,95,92,115,230,224,56,128,215,7,204,157,223,241,137,221,250,235,178,68,214,178,109,87,36,164,34,156,113,42,112,131,11,59,129,48,44,64,137,128,87,127,246,113,123,159,92,162,98,113,49,21,58,212,91,172,102,125,141,122,174,209,190,139,51,30,183,125,54,255,78,188,213,148,147,158,146,142,
40,213,45,45,227,222,182,212,142,175,233,242,222,108,156,159,106,195,55,95,196,126,53,243,177,228,130,55,238,159,181,227,179,62,223,0,211,47,148,113,159,108,70,242,15,100,124,10,35,132,39,175,210,215,54,253,80,12,177,44,51,218,246,53,179,109,23,100,105,125,214,85,41,102,65,253,35,242,249,166,2,179,216,215,155,158,118,45,228,98,155,93,121,227,5,243,61,95,122,27,37,160,197,5,117,16,5,92,48,38,16,181,77,130,181,79,213,141,145,22,209,162,42,10,56,204,226,254,1,57,6,99,230,16,51,102,17,71,205,82,121,200,210,35,213,11,37,205,181,91,212,72,87,178,72,77,222,137,23,84,241,194,93,225,155,147,7,39,18,82,196,214,132,233,36,28,63,249,29,147,126,111,39,50,3,240,147,218,101,19,18,66,42,160,195,37,154,8,206,120,198,153,111,136,103,193,148,190,76,108,18,205,226,152,125,236,243,236,110,93,241,189,115,68,173,56,252,137,37,128,22,101,113,55,194,244,41,191,60,99,177,169,27,89,5,199,170,178,231,206,6,44,210,68,64,81,
214,39,201,70,11,177,70,208,152,44,202,147,150,203,230,142,49,97,173,15,148,51,60,64,158,40,89,93,219,237,108,197,68,168,248,206,243,117,48,166,146,40,83,20,115,142,91,1,206,113,240,62,22,213,32,19,169,208,184,11,2,154,253,118,59,92,91,3,78,171,211,122,49,254,122,100,202,185,163,170,207,223,184,62,7,181,81,198,0,210,120,210,218,119,72,70,228,250,43,170,254,124,10,12,134,111,99,41,28,199,149,163,209,206,228,87,235,49,20,124,79,249,181,79,238,11,146,121,201,55,110,2,129,99,15,119,190,131,1,20,164,23,190,175,61,220,238,171,91,123,165,23,76,1,38,115,208,173,49,13,106,172,205,86,198,183,178,32,151,140,117,91,204,177,53,66,22,15,42,98,63,251,44,87,55,28,73,96,200,20,33,116,4,162,2,13,46,137,141,90,168,117,81,4,206,90,96,83,101,52,33,141,130,140,161,234,248,16,150,24,67,148,84,49,92,137,243,159,113,89,161,41,150,115,136,134,162,117,62,201,239,171,56,89,228,234,203,87,195,101,43,210,237,180,64,187,
40,11,85,25,81,191,13,68,169,60,55,2,176,138,122,23,35,90,23,202,0,205,107,17,142,251,148,18,170,0,76,248,24,142,105,107,201,69,9,204,199,94,245,136,232,105,224,226,92,33,8,110,61,226,185,211,129,95,49,159,235,186,0,63,225,135,47,207,45,239,249,73,68,158,27,1,40,21,197,5,152,77,226,84,94,207,252,213,135,39,62,76,69,189,109,34,174,182,16,108,75,171,135,228,185,80,34,156,108,234,174,134,160,18,154,221,89,190,122,5,13,154,92,26,90,26,12,43,7,253,194,54,38,50,69,147,22,205,209,207,120,29,242,10,61,146,152,163,111,72,53,34,203,77,163,165,221,12,218,147,199,223,64,126,98,251,242,129,183,219,123,2,181,156,194,41,43,189,140,114,38,170,105,51,209,110,31,112,162,130,159,165,222,179,244,185,57,165,60,70,69,236,56,187,123,43,119,182,161,53,47,147,29,60,16,2,33,64,64,44,36,103,247,43,43,151,11,120,110,200,33,31,147,249,21,72,254,121,246,65,249,200,147,4,160,3,30,61,227,33,0,160,15,208,67,16,
213,2,15,93,166,4,126,190,191,38,236,35,247,244,106,78,26,94,236,101,65,241,18,200,100,230,169,199,161,47,198,28,123,99,12,86,42,55,152,167,155,173,148,163,153,15,9,212,219,163,208,43,173,122,171,128,14,218,59,89,195,7,138,102,162,42,107,146,46,4,22,8,170,175,122,131,188,114,14,179,159,159,210,73,181,179,157,12,37,119,17,202,169,133,121,101,246,229,121,196,228,30,79,181,252,81,76,96,27,106,167,175,90,39,134,94,138,92,241,83,173,55,145,164,223,251,230,108,98,38,78,115,226,52,100,134,123,152,248,81,28,219,144,196,162,164,141,201,102,17,63,185,211,254,47,198,157,152,38,166,17,210,40,228,27,146,12,207,88,90,58,231,5,72,76,213,116,88,78,137,30,148,159,205,219,252,74,134,211,101,233,104,113,164,131,19,188,94,219,24,75,93,57,225,67,209,107,244,120,143,37,182,64,201,212,242,99,181,242,113,85,41,178,180,107,156,174,152,208,109,136,25,107,33,105,32,61,51,54,188,252,90,81,179,1,202,155,192,92,234,248,84,136,46,211,10,
172,185,101,168,122,200,176,50,4,237,243,129,195,180,130,28,66,0,68,138,102,131,14,123,86,94,10,175,218,131,100,197,199,189,157,9,149,2,198,120,57,36,240,21,127,245,138,241,150,225,202,226,92,133,41,14,46,203,6,161,101,62,125,167,231,179,169,17,107,167,202,118,129,227,45,32,20,43,140,110,182,194,17,45,145,56,190,70,163,246,203,208,228,63,111,105,182,46,46,76,97,137,224,239,164,134,126,157,49,27,171,155,137,114,198,157,115,108,118,225,176,189,101,5,196,23,133,176,0,50,231,93,23,1,221,74,65,251,192,155,116,71,166,146,153,56,7,91,214,121,154,26,94,157,250,5,9,123,172,244,239,53,51,113,234,159,30,100,40,104,101,38,244,24,31,39,70,223,16,46,147,103,74,8,220,33,7,109,139,95,14,114,12,200,132,53,67,228,193,136,207,167,118,50,108,64,117,179,66,85,177,240,103,11,59,45,84,72,8,132,39,30,102,22,240,17,146,109,43,20,25,98,185,171,40,118,126,33,107,117,142,17,68,133,139,205,112,68,185,195,98,200,204,171,114,166,
193,37,202,152,31,149,28,204,57,175,183,11,106,157,231,92,24,114,106,150,142,127,13,196,164,15,13,219,215,1,242,85,52,181,102,195,36,159,94,21,174,232,211,129,124,27,200,80,150,45,236,80,93,238,196,216,193,251,8,215,56,34,238,221,129,221,125,30,21,249,149,182,155,164,54,235,162,65,176,191,166,234,6,159,33,155,222,33,34,219,17,65,80,251,82,157,234,238,223,137,221,87,225,14,137,205,190,190,118,201,241,92,133,100,109,34,118,236,83,234,241,103,247,89,211,65,96,18,130,82,42,40,194,216,232,169,52,144,137,12,64,54,193,48,116,65,48,152,188,132,94,189,32,233,137,180,91,41,101,19,161,150,179,184,183,199,222,33,39,99,181,9,166,35,73,37,29,97,253,118,54,180,188,182,187,159,133,252,160,54,223,200,175,224,46,225,9,214,34,120,107,34,72,131,57,125,167,87,247,211,229,57,57,13,211,114,203,69,184,51,9,45,58,115,0,53,76,175,83,171,248,80,153,186,36,188,189,141,202,34,208,42,120,170,20,25,95,33,247,172,164,72,247,164,64,68,
142,213,135,26,141,51,74,172,9,70,26,209,108,172,247,165,216,198,127,157,15,124,142,56,68,135,73,84,172,156,250,250,98,10,139,220,137,213,50,1,173,197,221,242,142,110,199,19,229,138,205,246,1,114,222,79,47,177,55,31,115,120,134,240,183,175,157,9,236,240,99,23,11,201,104,46,189,28,243,62,140,162,218,104,190,30,148,213,82,211,199,213,149,183,166,251,83,158,131,22,182,247,128,101,45,165,123,130,2,6,217,135,226,56,199,116,145,131,22,118,50,124,123,54,86,183,52,249,95,108,19,209,133,218,35,11,19,198,160,9,87,218,141,74,238,231,48,145,50,196,191,184,197,71,73,49,168,199,196,15,252,163,215,162,201,54,175,205,164,70,180,171,212,26,45,10,149,42,120,23,220,197,140,166,216,175,167,218,231,206,35,123,239,159,196,189,167,249,193,203,100,230,30,170,135,241,86,46,127,94,97,46,46,236,22,135,62,202,236,48,16,229,222,38,33,34,110,162,60,148,115,89,73,189,228,135,35,148,69,33,5,193,109,132,153,108,153,47,217,219,61,66,91,70,90,227,
7,116,225,99,64,109,136,198,32,61,227,18,55,106,107,209,182,186,71,185,117,51,205,194,237,76,125,42,149,211,208,24,158,58,187,92,79,114,121,138,197,252,187,129,230,36,34,42,243,93,149,157,147,149,64,91,209,220,84,23,114,18,106,122,60,123,11,22,124,87,198,48,75,94,85,223,56,69,229,124,201,86,128,147,125,138,67,176,112,242,4,11,139,106,230,18,247,7,14,238,204,233,155,245,180,76,153,189,78,152,129,154,140,35,139,147,96,225,120,7,63,168,38,52,219,152,161,233,43,93,183,102,52,114,123,93,241,136,246,189,158,114,175,25,205,237,248,237,82,212,84,163,196,167,102,117,57,44,246,23,195,246,108,24,58,19,174,150,27,245,236,29,32,49,46,119,85,185,246,241,92,173,104,189,143,58,47,21,195,232,34,236,106,102,112,50,21,233,160,176,57,76,9,102,94,253,112,177,81,168,63,124,242,205,66,186,67,88,5,148,116,66,196,82,50,195,97,234,61,4,228,129,113,178,229,58,171,108,190,51,165,202,73,25,124,155,117,215,15,128,43,214,17,249,250,146,
179,72,146,159,41,170,14,163,130,65,103,144,76,7,53,213,235,102,96,19,76,177,88,148,20,128,60,54,130,51,171,226,107,99,192,140,50,220,54,109,197,94,211,58,43,130,81,104,136,125,192,144,43,6,188,80,230,230,141,209,63,70,57,243,202,50,226,52,28,15,178,247,21,90,50,156,90,39,69,48,241,105,13,36,10,51,246,57,79,66,142,18,255,178,34,17,192,132,32,24,64,40,176,71,215,22,42,209,202,198,159,89,228,163,158,67,60,119,112,46,175,68,58,243,138,56,46,13,136,101,151,179,78,184,199,66,199,92,88,25,106,83,97,153,246,148,126,86,87,19,51,197,2,188,65,112,16,254,210,121,133,176,77,119,45,88,90,65,162,5,118,101,104,180,190,216,187,116,74,61,202,225,123,234,80,110,74,153,225,130,137,198,66,69,24,185,64,215,149,74,48,86,25,198,174,147,161,143,18,28,88,160,218,249,90,194,133,56,25,248,183,211,173,58,180,50,193,5,65,101,22,174,23,22,72,179,74,95,254,244,2,249,128,9,211,231,124,188,205,73,126,157,12,185,238,138,
162,2,211,40,108,135,72,163,131,197,203,92,71,159,102,123,222,237,125,202,102,199,43,76,219,5,19,137,44,38,121,208,153,85,188,229,145,156,30,52,245,190,236,194,26,156,225,91,83,175,6,100,104,231,83,218,116,3,68,231,57,150,216,55,165,126,60,182,100,84,79,172,69,155,229,97,221,24,254,215,50,248,202,158,161,181,115,77,173,197,43,78,46,161,243,209,139,31,87,17,18,138,102,28,14,143,135,167,250,40,178,40,18,67,173,169,224,5,124,171,45,145,198,38,246,182,116,88,35,193,165,88,111,216,97,202,118,176,241,46,133,75,75,76,121,77,200,228,56,15,221,196,118,186,111,170,131,128,22,186,135,79,18,201,113,2,67,78,150,216,85,153,219,90,235,108,103,138,220,205,149,88,239,183,226,208,230,203,25,163,160,140,113,17,177,112,205,73,141,1,245,250,11,94,147,66,26,33,131,65,13,158,78,102,182,65,93,36,146,135,35,184,113,117,13,248,206,193,29,10,228,229,254,47,127,33,170,65,22,58,198,125,94,39,5,187,32,115,229,100,247,224,232,207,62,49,
191,252,116,6,31,212,170,60,133,75,124,171,187,223,234,117,4,102,117,210,149,54,118,69,110,49,86,140,110,57,114,227,22,80,49,46,60,166,110,139,239,170,169,99,29,68,93,158,68,132,135,38,8,155,145,163,135,36,63,125,109,79,46,227,80,78,194,137,192,221,119,92,125,64,96,183,106,197,189,224,217,31,181,18,20,201,184,98,93,177,185,206,91,56,212,126,210,110,94,211,119,115,125,121,181,162,253,202,51,251,72,248,226,159,26,97,137,64,105,175,91,241,87,56,21,7,199,237,162,76,223,62,125,144,215,20,20,75,244,157,61,79,122,243,30,177,189,204,164,73,155,245,66,54,86,242,8,88,93,145,97,229,94,129,190,94,200,248,233,181,129,124,10,66,236,218,71,122,197,114,30,126,27,199,239,31,15,226,117,216,153,78,132,86,157,234,133,52,148,29,104,99,1,227,16,227,188,27,9,109,40,222,226,6,26,22,166,242,156,42,39,28,100,225,18,44,70,95,146,77,82,178,76,242,69,179,81,238,60,201,30,164,5,185,67,94,124,14,249,140,181,161,228,37,191,8,
58,250,203,132,121,25,226,26,159,2,180,226,38,53,167,97,86,163,143,81,145,207,173,116,187,29,176,90,85,192,72,252,121,168,228,37,54,133,171,55,207,132,60,54,123,126,163,187,54,146,34,87,158,134,170,219,6,223,233,82,171,142,104,207,204,157,201,30,152,233,43,239,95,229,159,139,43,241,88,51,56,159,101,200,127,113,232,63,225,129,158,135,115,111,204,123,219,230,66,158,235,103,214,26,85,227,142,72,31,214,207,152,103,192,152,191,36,213,216,125,175,75,90,32,43,7,97,14,255,20,245,250,94,250,107,7,108,58,249,83,253,89,184,17,183,83,213,68,242,193,160,229,41,132,131,215,34,119,235,229,51,161,153,255,125,244,11,11,28,90,4,172,175,5,132,252,154,145,127,77,240,35,118,215,246,241,21,4,146,100,2,46,151,33,29,207,68,200,173,62,33,219,46,229,209,44,2,254,29,48,177,247,86,161,39,198,65,149,40,220,154,199,36,182,37,181,28,48,209,88,169,93,188,195,112,254,216,235,49,146,188,119,157,18,212,125,134,240,67,69,45,115,23,9,189,87,
118,19,22,246,186,201,251,222,231,115,148,47,223,74,80,137,250,131,145,248,34,63,19,246,86,182,134,92,8,72,195,149,134,181,20,179,230,66,4,3,146,235,249,75,96,0,111,14,212,161,45,77,51,17,92,35,35,178,152,155,111,1,235,158,140,91,49,188,22,44,168,250,208,190,228,37,32,190,233,160,173,61,229,227,68,190,48,33,158,235,220,119,157,241,1,23,137,179,63,122,41,115,214,196,202,64,206,81,49,216,71,138,27,97,232,53,79,243,166,89,180,186,106,82,171,169,26,232,112,96,16,216,190,60,46,95,139,5,65,207,208,21,2,201,76,30,178,184,6,143,78,126,14,202,219,190,127,208,238,207,140,0,222,163,195,239,243,187,234,16,145,56,44,236,126,98,231,162,169,167,79,246,234,155,9,101,127,15,239,254,218,37,25,230,213,184,1,236,208,40,23,128,192,68,176,189,198,109,226,252,128,46,33,253,21,252,28,7,217,66,131,26,137,255,134,49,10,153,111,228,53,24,163,73,196,113,141,129,187,247,239,203,125,191,161,2,230,236,159,35,98,69,143,55,34,120,
225,28,23,240,162,134,185,167,79,113,134,94,0,141,148,229,202,33,253,96,80,96,228,114,90,104,115,35,194,117,203,54,82,11,14,23,87,179,43,67,209,106,82,218,227,16,18,110,55,151,148,129,157,125,122,108,36,193,111,46,114,98,233,191,51,79,144,91,134,210,27,242,161,134,242,218,201,74,68,181,151,127,95,77,79,60,226,238,185,1,28,186,85,65,135,17,60,84,124,102,90,166,221,186,94,5,96,87,168,32,23,173,7,250,252,104,125,118,192,130,230,33,96,71,212,199,189,127,221,57,33,33,102,48,196,75,183,184,2,193,218,45,139,78,145,89,211,99,253,154,140,19,169,241,66,146,146,20,200,18,54,246,130,25,194,103,6,188,19,237,211,204,203,149,226,230,195,201,105,246,212,64,106,134,253,158,155,0,114,163,33,233,111,80,51,199,74,33,12,198,124,47,15,4,167,11,253,41,163,252,88,96,246,122,26,230,40,65,42,225,126,193,177,136,104,224,58,29,242,205,100,42,8,59,193,39,216,139,251,15,81,200,139,73,38,36,177,130,49,170,242,19,156,3,80,244,
202,143,68,109,72,223,201,100,165,178,13,62,196,39,51,20,206,240,215,131,73,78,159,152,210,32,163,106,17,164,234,3,117,12,215,39,230,178,12,33,23,240,28,83,150,91,221,70,41,34,119,18,116,59,185,148,159,134,178,39,168,220,151,56,51,95,78,6,129,106,88,121,141,3,92,91,214,78,234,208,37,87,191,64,17,94,129,201,53,53,75,42,216,130,124,153,46,34,157,78,216,240,248,209,193,158,49,188,103,222,199,4,193,203,96,216,136,74,226,161,121,36,107,78,151,37,254,201,217,197,88,20,136,198,60,219,152,127,233,156,12,29,245,72,82,79,210,40,169,37,188,34,88,191,6,218,242,194,43,140,71,16,159,238,46,220,222,74,68,214,159,71,175,251,162,234,77,125,223,196,15,101,106,220,47,23,94,214,196,151,60,30,88,171,228,129,73,238,78,156,221,20,7,146,165,185,170,172,64,119,180,146,122,30,143,18,193,248,87,101,35,167,203,176,205,99,124,7,58,168,117,114,233,153,206,158,123,189,240,5,143,56,157,5,72,104,103,3,191,87,218,165,52,103,133,24,
231,150,148,156,181,74,169,142,243,93,92,50,37,202,207,231,182,40,2,159,228,251,112,250,113,125,221,75,46,251,136,91,180,110,200,215,29,2,155,144,252,211,18,110,25,22,210,118,140,224,186,10,134,63,65,208,39,80,15,79,241,4,18,94,207,66,204,118,191,58,89,77,100,237,230,72,205,29,216,49,92,150,94,251,109,253,166,52,65,43,207,198,49,94,135,231,178,145,108,74,66,131,253,84,222,131,134,61,119,212,198,37,122,241,194,237,145,175,124,61,142,154,221,26,202,5,101,150,41,199,230,251,28,223,64,95,64,205,14,46,35,162,231,73,162,11,82,22,25,5,132,86,26,184,48,67,243,35,51,244,118,164,70,135,102,232,22,45,198,177,189,31,86,176,194,10,254,200,92,36,31,25,181,25,49,34,74,154,33,246,74,83,142,195,20,240,222,73,60,209,31,226,4,140,39,101,176,50,31,71,96,103,119,106,63,198,34,239,119,208,179,4,215,186,223,194,21,109,22,38,227,97,88,186,244,238,223,194,68,52,204,170,24,136,4,102,86,182,27,173,168,46,76,0,47,255,
237,140,180,192,115,157,101,255,141,63,80,194,25,169,57,236,121,4,249,54,22,13,210,46,98,191,141,152,20,156,29,23,215,42,166,224,197,236,22,156,75,89,73,242,64,73,162,173,28,21,234,136,57,156,207,76,147,165,68,170,120,30,174,34,139,202,202,32,47,193,36,58,45,133,185,2,73,163,50,107,154,155,220,16,14,53,155,254,120,4,242,216,197,71,98,150,73,213,153,41,57,87,53,103,22,95,78,151,203,194,99,231,235,20,76,102,219,184,115,42,31,115,202,218,211,158,143,69,26,95,32,194,2,70,159,21,222,145,186,222,72,189,179,183,226,181,42,212,67,94,166,49,233,8,184,60,150,66,152,84,25,50,188,192,89,22,251,242,152,187,135,76,142,106,173,78,28,75,53,64,238,226,141,22,105,17,61,57,145,208,83,99,198,59,101,172,51,227,182,58,121,222,36,147,134,7,193,203,55,35,46,191,38,250,240,232,140,192,150,165,116,203,136,5,94,164,189,134,234,245,148,17,204,250,254,6,179,221,0,168,183,7,201,176,104,249,186,197,210,219,244,252,204,31,61,178,
49,36,229,27,30,73,244,177,35,136,128,109,167,110,101,140,229,154,214,117,194,1,109,180,96,95,1,218,23,118,199,83,230,108,40,137,8,11,198,23,73,109,0,252,238,71,77,237,51,105,230,242,22,106,137,56,15,223,114,166,58,129,21,180,44,24,187,235,200,235,167,249,213,251,198,24,147,41,103,36,191,211,222,12,206,64,194,135,66,232,186,214,192,152,80,125,178,233,88,159,243,219,253,124,92,38,154,73,175,223,223,159,63,12,219,232,58,100,75,16,147,218,58,66,114,245,215,204,187,34,171,99,144,17,212,72,122,101,114,33,32,161,175,205,219,198,91,129,181,55,115,42,222,78,180,221,121,81,187,186,222,251,234,4,158,101,76,32,24,150,201,243,202,3,156,123,134,71,19,41,46,159,46,30,170,217,181,18,74,191,103,196,172,152,224,233,88,12,183,205,148,34,10,95,92,190,147,234,146,236,200,37,76,225,52,98,133,214,95,4,199,74,253,120,75,242,131,10,118,53,138,66,199,10,106,157,233,99,63,115,117,62,183,128,146,112,227,199,237,218,81,24,254,88,164,57,
187,31,229,218,9,34,99,129,158,80,234,26,205,229,220,110,173,29,158,172,107,228,124,222,110,209,4,85,201,201,39,142,53,170,39,78,204,140,131,156,103,22,247,148,155,131,10,142,235,41,79,118,88,24,107,141,207,59,60,124,115,15,128,195,224,81,87,90,123,7,7,158,230,187,240,199,99,119,242,102,182,222,47,220,26,190,13,154,202,174,80,50,200,230,200,63,73,200,148,25,237,150,99,66,162,230,167,125,196,152,190,124,50,200,18,143,57,34,50,95,206,150,248,42,53,92,145,114,62,10,101,139,86,154,247,243,135,113,255,241,254,230,82,168,69,18,85,101,174,148,14,197,10,90,238,154,178,52,139,123,189,214,112,20,26,142,108,237,233,168,230,77,143,225,8,155,23,42,174,145,210,231,88,78,78,32,201,174,232,174,79,94,107,176,12,79,7,133,166,67,97,175,157,123,136,178,95,206,213,94,160,174,245,119,178,126,70,82,144,255,217,53,239,135,168,39,254,20,19,240,62,176,163,200,25,203,101,122,17,201,76,63,73,151,131,111,230,59,232,57,24,189,232,107,230,96,
108,128,212,109,178,95,69,22,172,200,77,226,90,46,177,201,37,250,187,204,235,87,12,123,219,210,103,108,14,125,197,67,153,234,60,3,54,125,160,108,206,79,208,137,12,251,156,253,248,201,248,251,208,53,218,111,51,160,227,44,173,222,137,160,100,31,4,72,7,191,85,130,154,21,235,151,97,190,134,78,201,185,12,2,25,2,129,19,141,255,64,249,56,119,188,76,83,63,100,216,246,166,49,0,111,18,117,66,6,155,141,28,191,215,51,113,216,119,119,184,228,196,83,193,66,10,219,87,90,233,145,205,149,99,200,105,239,180,246,211,178,62,8,190,109,184,61,186,176,135,160,131,22,2,102,131,248,237,216,215,229,98,243,242,65,141,47,84,31,30,134,68,82,161,160,40,24,28,5,217,33,114,40,72,141,72,55,94,132,189,67,35,182,69,248,221,123,53,188,249,8,211,186,206,250,76,108,99,167,199,180,29,31,190,250,245,32,113,183,197,64,174,116,137,36,188,195,243,15,137,110,154,106,5,120,8,141,3,198,233,197,192,31,254,103,147,216,54,132,77,35,219,49,150,137,196,
136,51,172,252,42,140,133,211,18,146,218,221,109,160,193,225,77,253,221,227,205,85,14,219,193,167,74,206,199,196,89,181,131,136,188,77,105,219,183,113,230,167,104,227,163,148,105,193,156,226,45,31,170,8,25,32,141,149,124,214,82,87,107,46,118,181,37,220,134,253,5,242,204,191,178,104,205,114,40,101,42,232,136,78,202,14,154,195,125,199,170,140,245,180,164,113,80,235,143,72,39,159,200,137,12,34,50,14,155,114,193,13,162,3,94,105,224,198,228,243,229,0,156,178,194,155,44,235,69,154,47,204,193,137,100,74,118,184,170,241,183,45,36,52,192,174,88,53,216,243,22,60,0,76,251,104,244,166,110,199,166,207,249,200,105,45,165,188,44,213,247,81,7,82,178,22,54,66,34,76,29,135,219,0,215,157,20,7,233,249,163,83,114,171,134,21,63,233,200,32,180,251,160,67,4,22,34,139,227,195,162,215,93,137,161,90,83,249,186,254,250,86,110,118,125,88,8,175,184,214,21,210,226,31,104,126,31,128,115,139,194,73,150,84,252,45,67,200,93,251,56,75,211,139,50,240,
250,30,209,181,230,199,232,199,209,209,153,61,58,90,72,244,114,88,198,142,129,215,178,135,99,13,136,55,14,217,170,143,73,99,85,145,39,63,241,202,105,134,189,18,34,131,148,102,78,35,120,56,95,95,14,106,159,189,254,40,86,255,152,183,37,161,140,173,78,100,238,164,228,103,70,40,191,212,21,4,173,140,149,93,146,162,21,114,12,112,250,16,221,161,239,136,129,28,95,149,12,68,70,103,134,97,112,157,176,48,43,64,28,136,161,208,25,185,231,171,7,117,24,164,76,117,70,220,46,92,48,229,181,13,84,135,61,211,215,28,129,217,33,224,245,83,230,144,71,30,11,170,97,74,207,208,232,55,153,184,157,64,84,101,66,83,104,107,151,181,223,199,25,221,49,196,247,157,174,247,171,20,90,127,6,247,166,87,213,192,90,110,194,22,104,41,117,180,200,71,77,236,50,21,208,188,46,162,85,239,28,13,18,5,102,238,232,101,213,126,27,137,31,129,233,235,53,237,128,66,4,95,216,16,187,104,84,92,125,19,75,194,10,141,173,72,225,59,107,242,43,72,223,118,86,14,
218,85,152,253,224,122,87,165,193,201,38,0,194,3,74,161,57,160,88,38,44,168,154,223,224,73,48,8,238,238,87,55,238,41,219,243,69,98,203,175,92,167,71,83,126,178,201,38,107,6,94,145,160,90,124,207,41,226,30,34,1,178,51,179,132,180,189,203,134,162,172,26,164,30,135,226,96,171,46,172,195,138,181,11,79,233,191,203,165,107,3,222,28,102,49,181,158,50,149,255,162,78,248,8,99,21,5,115,73,187,247,47,224,42,32,239,222,99,192,149,16,140,50,229,252,205,74,240,171,46,231,179,138,56,76,79,177,231,193,79,101,64,207,49,243,183,206,254,230,212,148,227,212,167,216,22,135,134,227,104,43,109,148,186,138,27,8,51,176,25,48,146,59,40,9,152,151,72,225,54,23,223,227,132,118,166,119,12,193,103,186,248,78,211,185,121,149,86,217,170,42,109,234,92,118,186,193,232,190,53,103,37,185,41,77,232,165,128,233,106,66,68,187,22,146,26,128,9,115,210,68,23,86,47,38,105,62,232,147,107,133,255,225,52,177,180,99,174,155,130,140,140,166,117,159,168,
78,103,50,103,170,240,38,153,126,176,136,116,75,92,24,233,35,115,178,160,31,148,215,178,211,113,50,180,240,209,35,237,185,203,61,58,232,5,46,59,139,105,106,122,238,159,0,211,42,56,155,230,65,26,251,8,226,198,165,231,206,88,209,188,192,196,126,26,199,74,1,189,212,171,72,39,163,165,98,52,206,147,134,159,79,31,40,31,67,202,94,154,12,70,212,121,117,156,156,7,54,2,99,92,92,161,124,173,94,57,7,82,36,227,28,171,121,153,221,28,141,141,40,18,18,228,13,229,162,174,93,67,204,4,11,171,185,178,117,30,199,107,174,18,131,133,232,162,21,14,11,237,207,142,41,153,114,181,77,24,63,218,21,178,75,69,206,251,42,37,215,176,175,68,207,71,218,241,179,0,189,60,18,248,181,0,97,195,11,125,135,202,152,119,174,136,116,39,82,144,61,29,170,76,204,181,195,88,94,94,111,230,216,67,113,57,69,239,110,48,180,119,203,227,69,238,33,141,227,151,132,38,99,52,89,153,248,168,147,201,181,190,188,147,123,128,77,158,14,245,226,140,231,158,1,163,
51,120,116,62,129,152,187,176,213,196,136,175,156,68,175,122,173,72,4,78,46,20,69,59,142,181,40,119,189,81,166,227,63,38,98,3,103,57,108,113,242,31,212,202,231,101,80,248,118,63,133,126,53,27,44,214,222,246,228,248,221,144,104,143,73,217,147,87,113,163,214,154,118,106,197,126,88,150,162,183,65,102,152,217,230,135,57,80,55,198,27,199,188,15,245,71,37,50,9,106,109,94,64,40,141,104,138,41,254,135,42,226,131,47,110,197,167,221,186,156,164,202,1,255,38,97,122,103,223,4,47,50,216,17,249,217,37,123,25,13,254,138,176,223,202,112,159,234,170,72,67,149,3,251,115,118,255,8,137,195,2,71,32,198,47,120,240,60,137,224,214,44,228,2,248,82,37,178,240,80,216,143,162,206,43,113,183,120,252,154,85,50,125,157,67,172,83,168,213,106,105,251,231,162,116,129,180,78,24,71,183,153,89,83,219,221,223,245,190,89,123,86,116,91,165,217,253,161,252,138,64,103,117,34,192,13,141,40,243,216,17,31,202,77,118,89,221,174,234,184,195,181,60,235,251,165,
201,62,119,108,150,123,247,165,40,8,106,148,73,157,215,247,6,49,202,225,212,236,74,72,236,155,17,184,153,71,239,60,28,172,215,195,130,89,18,252,59,143,26,196,41,57,48,75,144,34,245,46,100,140,53,81,195,229,60,173,38,107,47,221,104,128,170,5,113,188,207,39,77,77,20,141,85,187,21,187,240,40,237,134,180,171,136,92,175,155,178,206,72,26,4,20,77,104,59,26,124,230,237,31,176,197,122,66,182,170,93,113,25,23,155,110,73,164,184,36,95,232,1,79,159,125,107,110,69,125,114,136,97,127,130,18,236,227,117,11,201,3,94,152,35,151,19,38,205,170,105,16,17,3,229,26,74,72,189,253,14,221,189,33,27,89,46,131,133,58,180,142,167,32,105,54,24,239,156,24,14,154,10,103,142,84,156,145,55,6,10,170,150,244,79,167,65,31,67,236,167,137,218,62,70,216,183,70,68,148,77,42,228,150,6,159,170,73,8,76,21,5,202,87,66,142,89,131,184,151,171,132,58,134,248,212,78,18,167,202,79,116,11,81,201,11,14,75,134,178,222,101,184,155,3,54,
74,243,105,204,2,238,174,227,181,222,16,56,198,41,164,24,43,45,14,28,107,19,228,190,151,97,74,148,135,62,38,34,100,21,238,29,52,244,13,213,28,7,228,76,6,15,142,228,209,67,94,71,123,116,176,243,71,92,102,148,96,164,141,221,39,248,118,102,113,235,213,155,94,78,169,193,38,146,24,222,22,61,95,173,118,91,27,247,103,116,227,27,118,172,221,125,150,246,30,208,10,239,192,228,181,193,121,87,3,183,247,133,214,186,60,35,179,13,79,61,239,243,114,247,67,175,153,66,3,76,119,60,93,243,67,247,90,64,64,194,154,109,182,236,45,123,255,24,167,68,50,38,187,6,180,81,205,67,201,46,66,17,34,241,21,177,235,42,106,210,222,19,27,39,200,124,150,126,226,76,135,46,181,236,68,90,121,184,83,137,29,14,121,205,161,44,15,43,93,22,125,209,233,55,193,58,253,51,74,50,123,166,184,121,118,170,194,85,233,193,12,141,205,213,248,126,188,79,226,107,82,89,48,70,208,19,41,83,229,245,230,116,151,206,222,161,223,148,171,177,64,192,142,132,71,13,
253,180,56,84,111,251,209,230,143,81,7,125,144,90,69,87,142,36,112,168,234,121,108,200,125,157,125,168,87,136,134,222,49,23,36,241,211,154,170,183,113,103,155,218,79,239,19,232,238,151,115,142,166,59,42,16,239,93,253,249,101,102,128,69,184,7,232,188,183,251,130,117,48,144,58,108,197,115,131,30,143,192,236,93,68,0,186,81,94,245,77,219,22,33,213,228,240,45,242,7,135,6,209,93,174,37,112,45,162,201,161,45,30,31,194,19,76,51,148,98,126,60,76,28,186,200,201,60,14,53,134,41,140,191,175,229,47,64,239,86,22,9,166,123,124,129,112,210,235,21,178,101,169,233,28,231,10,249,37,142,168,21,71,47,24,116,188,31,1,160,67,129,217,29,243,170,7,229,194,32,76,165,230,104,46,98,162,189,157,103,116,238,240,171,217,10,105,183,144,31,151,119,13,151,94,239,140,89,81,180,42,135,180,179,24,227,179,195,217,40,72,83,126,6,55,23,178,48,149,120,59,168,28,246,75,251,167,237,228,146,108,146,226,105,118,92,56,141,242,39,241,44,123,146,224,204,
27,130,241,216,151,193,5,15,172,18,150,195,64,13,105,136,43,175,53,70,43,179,32,132,105,24,179,128,87,210,106,53,64,236,13,219,211,46,11,191,51,194,17,255,66,42,241,110,197,157,115,49,21,5,44,178,94,219,110,227,131,145,198,162,61,92,150,234,84,205,102,231,208,156,199,225,169,0,79,61,176,59,241,128,173,135,129,191,54,137,80,64,97,207,24,101,81,212,172,216,12,53,222,175,245,224,61,157,198,31,29,178,138,91,245,162,54,11,232,172,23,27,70,40,97,63,105,18,3,224,185,249,36,145,204,32,127,95,97,233,33,241,83,55,28,73,135,232,225,173,22,109,195,138,182,210,1,72,101,90,30,92,159,53,169,249,122,33,120,15,230,197,66,112,236,158,210,173,219,0,184,225,6,49,42,63,117,226,29,66,123,182,174,148,220,139,88,4,180,140,188,159,81,226,84,62,178,188,66,154,90,26,238,161,141,222,147,37,15,143,124,207,46,211,181,74,248,106,123,190,196,57,224,27,213,215,41,215,5,149,208,207,30,227,165,91,125,204,131,112,88,39,2,220,16,207,
223,102,9,31,75,244,63,83,219,232,55,171,159,165,193,250,170,138,46,136,90,105,253,5,145,5,164,61,121,206,208,160,225,3,191,173,191,137,239,154,139,46,32,240,64,223,21,74,197,107,41,187,189,212,20,102,116,243,71,117,52,188,26,40,189,228,163,16,28,79,165,255,72,196,253,89,145,81,143,122,160,132,52,114,234,130,233,121,130,186,1,19,15,220,116,85,86,31,34,237,21,76,73,241,6,27,2,203,128,65,222,252,205,16,118,79,159,107,36,41,157,121,151,111,201,102,163,246,156,92,71,72,210,5,220,88,30,250,177,123,208,187,230,221,207,152,189,2,31,133,248,75,181,8,150,93,218,137,206,91,215,204,60,149,175,116,223,155,15,220,119,227,169,85,76,248,90,89,119,85,204,121,43,165,236,105,238,177,190,206,188,141,236,222,174,193,129,14,35,120,55,129,35,243,169,194,26,152,109,151,239,56,142,195,195,140,142,209,43,55,22,220,158,164,22,43,192,193,226,3,108,206,129,175,48,169,63,50,70,236,252,78,164,243,81,135,16,251,177,125,216,145,132,36,35,47,
57,131,194,89,15,193,190,58,72,63,236,8,200,17,90,59,223,107,38,207,147,73,111,0,7,69,117,85,47,232,51,5,198,30,67,17,225,86,23,67,248,97,36,18,252,41,33,129,228,98,14,105,24,215,190,29,214,119,37,176,54,105,176,55,43,130,91,90,164,230,80,157,67,162,7,170,115,216,182,135,116,55,215,189,122,139,150,65,208,198,161,123,29,124,164,58,95,225,24,22,58,177,240,191,225,29,54,109,192,199,197,43,64,74,32,127,164,95,70,243,66,132,79,52,105,144,195,222,113,29,75,12,150,167,45,244,177,194,37,86,109,170,133,118,109,172,190,45,185,195,196,43,24,95,87,210,8,192,156,210,54,212,90,56,72,157,85,155,185,210,163,159,59,97,103,169,104,153,88,41,9,166,224,235,43,14,128,245,50,253,251,103,235,102,91,15,124,11,125,240,18,123,61,144,64,191,202,164,207,182,68,173,170,1,127,151,26,204,175,219,240,45,109,208,98,184,59,133,219,229,202,238,48,93,90,163,214,168,95,156,247,187,190,179,120,5,150,193,35,182,43,184,147,48,39,244,
204,16,18,58,33,81,212,20,150,90,35,238,169,42,121,107,18,27,185,14,186,174,203,239,215,227,41,96,124,204,9,26,96,25,44,54,186,244,82,2,114,117,197,202,95,158,132,83,231,253,102,1,158,96,56,3,194,248,26,173,115,60,10,30,33,2,233,167,61,208,124,120,188,31,195,235,38,65,78,24,67,224,108,223,151,141,251,147,208,28,155,154,194,81,85,116,244,172,194,206,45,31,223,18,231,194,2,163,143,71,88,9,136,157,20,222,93,113,253,184,74,150,185,188,53,221,219,107,157,149,140,144,194,81,53,6,17,37,153,59,126,74,80,123,183,247,220,221,194,248,45,149,95,13,66,207,82,165,160,188,116,210,33,113,147,237,196,152,222,152,101,205,3,170,89,64,171,212,176,1,103,73,0,43,128,196,219,145,89,159,162,125,101,180,1,135,136,54,3,218,99,245,173,1,162,78,89,12,136,78,201,124,24,69,18,239,69,196,211,140,1,9,184,105,213,159,229,183,214,45,133,110,239,194,115,90,5,235,58,232,144,189,78,231,16,24,140,54,175,231,251,232,152,62,190,59,
212,204,179,53,232,220,164,82,79,42,170,125,213,122,169,79,136,72,201,44,4,8,128,97,60,112,106,113,5,93,82,179,33,161,190,143,40,66,14,253,99,237,49,107,76,193,5,17,223,218,218,246,66,99,122,23,249,247,245,76,217,128,163,128,103,244,101,177,209,0,218,123,231,85,241,124,30,238,198,55,245,233,243,69,73,221,103,226,121,7,144,154,65,64,29,254,146,144,185,133,211,41,117,218,56,122,239,168,226,61,244,238,185,215,20,244,186,137,144,139,208,191,249,155,255,250,95,255,5,53,248,223,253,245,255,240,239,144,194,127,165,49,254,255,62,252,159,255,233,119,127,254,229,239,254,248,199,223,255,238,239,255,238,183,223,253,225,159,127,249,203,159,127,253,243,47,255,235,255,135,106,248,151,63,254,241,111,255,234,207,127,248,203,159,254,254,215,255,227,15,127,250,199,95,255,246,175,254,249,215,223,254,183,95,254,151,223,255,246,187,255,243,239,126,251,245,111,255,195,223,254,135,191,249,229,183,95,255,254,159,254,249,15,191,255,195,63,254,223,255,6,128,252,247,175,252,
59,238,240,191,249,253,127,255,159,255,250,79,255,233,63,253,191,236,196,127,45,224,127,252,253,239,127,249,211,239,254,241,159,126,251,243,47,127,250,245,207,191,254,233,191,252,250,15,127,245,203,255,244,135,63,254,238,159,255,241,63,254,242,15,191,251,243,111,127,250,221,255,254,151,223,254,21,28,249,167,159,226,254,229,230,255,250,221,111,255,244,135,191,252,246,203,223,253,242,95,254,238,247,191,251,135,95,126,106,255,23,146,228,47,63,51,249,135,95,255,248,167,95,127,102,242,51,200,191,45,195,127,251,215,255,70,121,252,229,111,254,31,65,81,106,104,

View file

@ -0,0 +1,105 @@
TITLE("")
COMPRESSED
120,156,148,187,247,175,68,203,150,22,246,175,92,9,140,140,193,51,247,94,238,11,243,158,144,6,107,176,133,140,61,210,48,8,89,79,15,207,51,243,128,49,3,131,152,135,71,8,25,117,60,157,115,58,157,211,233,156,115,206,57,167,115,58,231,156,115,159,206,221,62,99,97,11,75,200,150,151,118,237,210,150,170,190,85,171,180,106,213,247,253,176,127,241,205,95,253,171,223,254,205,111,255,202,183,255,31,246,179,223,251,245,63,253,213,191,253,211,223,252,242,23,191,249,254,119,126,244,243,63,248,221,255,242,251,159,254,214,119,223,255,228,183,190,255,209,143,254,250,79,191,64,190,251,155,223,253,149,239,191,253,238,187,223,249,246,111,253,244,135,223,249,238,199,223,254,240,195,119,63,249,225,251,31,255,244,251,175,238,219,31,126,244,183,190,251,201,119,63,251,195,63,249,205,159,254,250,151,191,248,127,76,254,154,251,253,223,252,254,175,252,232,167,223,253,232,187,159,126,255,227,31,126,248,209,79,127,242,211,31,190,253,254,119,126,248,241,239,124,185,250,254,219,159,124,247,
221,247,63,250,225,103,127,255,79,254,213,191,248,229,47,254,253,255,252,191,127,243,139,111,254,253,191,255,238,47,23,245,79,191,253,249,63,255,238,231,127,250,219,223,255,248,223,124,181,223,252,246,119,63,252,47,95,237,11,253,135,159,254,245,63,248,254,155,95,252,249,119,63,255,219,127,227,203,241,55,191,248,47,254,238,255,248,95,255,195,127,240,205,127,243,15,127,47,228,248,187,127,248,205,239,253,254,255,240,251,255,232,127,250,230,127,251,173,239,126,235,219,95,254,181,95,254,226,207,191,253,249,223,254,131,191,241,221,127,50,242,191,255,179,127,249,175,255,237,111,126,253,111,254,236,47,126,245,205,175,255,226,79,254,248,215,255,234,159,252,175,191,250,230,47,254,221,31,255,234,55,255,34,96,248,139,111,254,248,207,254,229,159,253,197,191,251,39,255,252,151,191,252,217,207,126,247,251,63,248,246,155,191,196,248,211,239,127,244,227,159,255,135,255,240,31,190,251,238,71,223,255,252,135,111,190,128,191,86,250,147,175,32,126,246,253,79,190,253,209,215,106,255,217,183,63,
255,207,13,252,191,156,254,157,127,251,155,63,251,55,63,251,230,255,175,253,199,8,254,244,135,159,126,251,243,63,249,238,71,223,254,252,247,191,253,207,128,255,222,175,254,213,159,252,250,79,191,2,251,243,255,183,241,255,213,63,254,231,191,249,205,191,254,163,159,253,209,111,255,209,111,255,241,63,251,243,63,250,173,127,253,171,127,242,245,250,211,127,252,159,0,253,189,255,238,239,253,225,223,249,251,223,252,131,223,255,111,255,240,31,253,157,63,248,187,255,17,238,135,111,190,182,226,255,140,238,155,223,253,221,63,249,151,191,250,103,191,254,217,79,126,248,91,127,237,199,63,250,49,0,124,4,76,0,255,183,157,96,172,57,27,250,94,159,172,236,234,146,221,192,198,190,117,7,214,55,107,176,17,95,151,224,68,200,81,18,226,73,141,72,169,52,238,93,227,240,202,50,124,41,196,67,222,240,81,56,62,43,138,251,89,52,125,28,6,117,59,162,153,227,37,147,174,59,210,213,227,112,179,183,239,150,135,218,115,80,189,150,176,41,206,229,57,189,182,86,180,6,168,105,2,182,
159,179,231,171,228,228,89,3,17,208,91,160,195,200,74,201,112,192,229,249,196,117,159,139,161,101,117,41,60,119,207,98,161,187,121,18,16,194,62,101,253,232,192,75,167,217,116,118,51,117,60,248,241,131,116,238,220,50,15,147,236,89,139,89,95,224,146,79,252,22,2,194,226,51,85,234,218,6,128,128,212,231,241,251,91,147,129,63,150,80,248,171,162,204,61,44,71,207,225,243,30,236,117,52,18,176,251,138,201,240,64,111,100,45,80,133,8,87,0,110,46,152,8,7,6,241,240,50,8,24,137,243,250,200,146,168,124,13,112,57,186,147,159,131,7,193,0,112,40,81,134,87,112,157,45,192,62,78,98,222,252,212,135,191,78,146,100,33,172,1,246,108,184,244,62,41,231,157,240,108,180,88,60,174,217,117,125,212,76,238,227,123,63,149,145,151,74,241,22,150,92,115,141,21,244,177,134,189,25,43,206,135,67,151,73,157,13,72,22,185,27,125,47,61,172,165,203,160,210,50,65,99,57,138,6,7,42,142,90,219,177,193,47,85,31,82,94,188,26,40,143,189,40,110,208,168,
185,121,83,195,111,79,252,41,229,109,81,19,212,237,137,236,127,225,186,50,141,115,218,180,19,28,23,207,28,173,16,183,230,4,17,9,41,110,7,62,140,252,245,178,36,204,96,21,156,173,85,181,212,167,212,249,82,40,29,96,54,218,41,192,25,0,46,77,168,158,73,162,132,82,123,67,101,131,88,97,140,81,46,161,70,77,221,76,233,114,17,161,233,35,227,80,220,188,222,171,96,144,197,142,12,225,82,80,86,251,72,180,194,130,115,146,206,25,17,20,31,125,96,229,37,234,17,112,221,219,140,100,163,33,52,91,209,193,134,62,31,90,182,51,190,226,126,218,217,82,238,169,74,173,87,117,213,217,98,105,141,98,154,223,45,138,160,6,213,95,208,20,214,6,165,184,164,170,107,3,228,100,11,108,30,237,0,123,131,231,93,134,114,190,11,165,109,220,142,238,200,117,117,113,89,220,201,239,61,65,165,23,22,228,70,72,198,26,172,217,115,104,243,29,116,47,178,123,107,245,1,163,142,123,171,101,98,205,77,201,178,64,231,175,239,228,48,181,117,246,210,182,193,234,179,183,
43,158,158,84,214,29,216,143,15,240,176,157,2,228,112,146,47,245,246,75,99,169,77,19,4,227,5,23,101,92,177,222,34,67,104,117,134,132,158,246,83,176,178,238,3,47,121,125,183,37,246,56,202,86,249,133,7,54,246,130,173,102,193,225,254,106,61,53,34,247,37,143,115,140,210,194,76,99,9,3,194,187,15,67,236,228,8,222,59,214,129,75,195,123,87,183,131,238,146,140,131,91,115,103,142,247,15,218,98,177,236,196,83,99,154,154,25,239,211,0,149,9,91,191,134,102,70,219,12,109,148,178,104,111,139,143,23,209,28,183,138,165,74,13,175,101,85,247,5,150,68,48,7,79,116,113,186,13,55,145,208,0,96,112,147,7,110,87,6,192,200,188,247,145,23,155,133,130,209,192,55,79,235,227,120,63,193,20,98,48,71,192,188,0,61,174,49,116,113,0,236,207,10,255,5,224,228,180,155,212,204,26,32,1,48,246,139,15,112,126,33,169,45,95,20,173,41,86,225,194,176,145,90,234,253,246,232,130,82,81,234,1,41,120,58,182,35,195,89,130,146,240,251,143,155,157,
108,44,168,208,235,181,4,185,83,173,83,18,209,149,197,179,24,234,131,136,107,176,58,31,19,184,115,172,117,128,145,176,39,223,234,26,195,225,174,49,244,197,31,185,49,120,51,16,238,226,15,27,111,252,128,187,93,243,210,28,234,218,195,43,27,199,202,180,91,34,50,141,18,75,211,79,192,248,147,215,216,127,242,246,11,47,221,216,241,250,182,22,16,121,161,126,137,30,79,137,98,129,13,163,216,189,218,98,150,247,4,35,10,174,110,234,24,214,108,206,201,206,251,229,245,89,19,163,154,110,198,170,134,114,184,167,61,166,208,244,140,215,239,225,66,152,143,9,93,152,107,121,202,220,208,85,203,167,251,116,135,11,20,221,225,93,183,84,127,91,217,248,224,229,53,16,113,241,181,128,79,47,14,220,231,110,96,114,87,68,234,70,178,115,55,38,111,167,158,168,142,176,57,240,88,6,99,52,186,107,184,103,138,192,218,113,176,111,11,6,46,245,119,224,150,237,214,219,84,110,61,102,153,55,153,70,29,81,90,91,55,224,245,65,199,107,53,110,31,84,201,221,99,189,155,236,
2,99,61,70,247,184,212,163,183,208,250,67,35,226,246,185,153,62,23,87,97,71,91,167,189,63,80,83,234,235,131,209,43,38,165,71,216,61,162,213,35,97,105,110,48,152,98,237,178,100,139,170,233,104,177,150,94,168,244,213,124,199,84,51,249,139,130,120,90,201,29,146,251,34,18,241,64,29,189,77,217,222,3,150,214,14,239,244,170,102,252,116,231,87,3,27,216,11,68,39,81,75,88,19,4,44,167,90,103,213,54,201,180,208,71,39,62,1,226,161,35,142,103,13,116,18,147,72,247,169,37,155,246,53,37,116,78,150,205,241,110,96,244,10,33,247,124,211,152,194,197,19,78,187,55,82,38,12,17,184,87,155,22,85,159,197,230,104,62,207,133,251,129,253,104,154,201,42,51,84,118,223,149,110,105,110,225,184,138,6,74,173,250,66,244,200,13,253,202,108,127,102,238,80,205,68,190,53,6,9,34,141,20,30,61,54,44,71,163,131,10,112,55,231,5,43,102,188,146,57,182,147,77,214,0,149,177,132,105,211,30,168,128,13,234,130,22,222,201,167,190,236,200,79,148,108,
101,229,5,169,209,191,4,107,94,129,42,32,18,40,1,62,1,58,204,231,95,120,154,187,118,81,200,225,23,64,60,223,162,134,108,56,244,202,202,183,58,59,205,37,0,249,205,46,72,62,205,248,167,193,125,242,202,251,234,112,133,235,34,8,156,4,217,221,14,228,223,75,86,246,133,217,219,63,25,206,21,86,50,247,113,215,17,203,172,131,93,134,57,53,162,244,82,71,43,36,244,169,252,13,104,34,64,200,83,162,146,48,148,83,144,172,60,88,5,181,134,64,144,131,14,20,169,0,122,170,96,63,107,150,35,204,114,232,230,179,138,144,28,122,248,249,103,176,18,23,170,240,109,56,74,90,71,51,120,93,16,66,11,185,190,162,0,25,46,205,122,40,223,227,55,13,153,111,46,3,206,36,54,245,158,35,139,98,222,152,154,252,184,174,253,212,131,133,117,212,100,185,212,75,53,178,122,46,19,160,226,211,63,185,25,88,218,93,239,166,78,225,198,247,26,17,187,76,93,236,90,219,121,93,236,99,132,53,18,110,17,224,106,90,196,55,143,42,230,37,42,99,94,103,165,76,
124,91,40,41,99,1,212,252,2,229,39,121,155,97,182,246,102,219,147,109,44,255,184,202,62,95,198,111,164,79,93,87,153,235,211,193,239,157,98,77,152,28,248,1,169,54,95,172,245,244,152,175,18,194,222,233,134,223,1,183,33,239,84,1,55,186,185,75,151,194,97,160,11,1,218,9,68,141,108,162,96,228,250,81,173,174,184,233,62,87,205,145,150,33,248,45,20,93,82,157,39,224,209,96,166,180,200,40,175,203,152,205,13,228,60,79,26,25,236,17,191,184,247,134,97,84,220,103,10,153,218,136,185,147,134,194,37,211,216,27,61,10,229,99,68,217,112,94,250,70,202,178,100,111,69,242,152,216,67,98,204,36,172,90,79,122,97,38,2,42,100,191,99,102,192,37,224,26,68,209,64,43,84,121,209,198,234,175,10,243,65,0,99,41,160,119,4,4,200,64,9,212,67,59,170,151,118,69,194,163,53,200,47,12,167,249,120,145,237,65,215,232,240,202,237,104,105,52,155,7,208,146,171,123,171,22,65,31,137,142,90,72,247,219,94,60,102,222,128,142,13,204,173,141,228,30,
122,220,77,20,113,246,120,95,199,218,158,1,210,152,108,47,70,226,51,9,63,219,200,89,86,134,33,73,163,85,121,43,47,136,101,226,130,90,92,217,232,198,89,99,149,79,75,181,5,43,177,174,82,4,175,123,183,102,82,204,105,90,186,174,183,135,19,215,131,133,56,145,120,253,216,106,58,29,194,161,51,239,90,40,230,6,201,77,34,201,248,1,180,252,33,19,66,251,184,222,45,208,156,73,190,3,134,181,64,3,251,238,117,187,158,105,18,134,182,222,60,85,145,144,205,236,87,183,105,188,99,239,65,182,49,169,203,70,241,210,55,110,78,125,106,196,190,108,151,154,249,21,136,215,151,4,250,77,104,212,152,129,196,157,27,218,61,54,215,28,51,176,75,233,13,182,141,192,182,53,38,209,216,23,29,10,52,253,98,140,113,15,193,182,161,81,113,111,68,46,98,218,101,30,45,92,168,142,36,36,181,10,49,221,72,203,251,189,255,114,123,139,220,237,237,35,72,244,151,133,182,117,164,185,72,60,71,155,245,118,20,70,213,137,151,12,63,134,169,110,171,68,125,140,69,230,
193,76,244,60,245,186,187,169,159,218,59,185,106,36,94,70,156,191,172,230,142,151,155,60,6,164,41,120,222,23,135,112,71,154,180,95,144,141,187,10,35,102,94,85,2,51,198,62,191,118,5,204,207,100,227,6,197,141,69,126,218,214,158,29,166,178,240,185,190,62,92,88,83,73,7,228,70,206,111,150,59,231,212,18,76,105,90,136,42,55,87,45,32,168,85,18,98,186,202,77,97,36,93,173,21,82,184,31,225,104,11,156,192,188,20,98,45,116,206,74,125,171,101,39,154,86,87,88,235,180,213,181,115,209,126,2,24,33,43,148,175,226,219,4,82,157,101,68,52,87,28,17,236,28,153,123,65,234,194,164,245,89,128,122,70,30,5,250,173,16,138,146,183,192,213,23,197,34,201,179,192,205,212,35,169,77,31,193,178,67,182,42,100,135,137,11,115,201,105,190,120,14,180,59,94,76,90,71,217,183,132,175,187,200,250,228,153,156,243,73,81,246,87,54,89,179,52,29,107,152,251,235,162,78,88,9,13,175,111,55,9,246,50,18,26,73,164,96,134,116,141,69,96,4,7,129,
113,163,104,108,177,150,212,41,105,204,225,137,163,239,101,96,139,147,50,40,229,173,33,48,237,89,34,164,178,14,153,142,208,219,160,71,60,88,3,186,70,60,243,150,69,25,181,142,78,140,114,192,123,187,23,178,133,117,131,228,161,153,76,180,167,214,93,52,98,132,239,195,18,26,207,163,187,138,203,182,200,100,108,68,216,115,27,91,105,216,115,170,231,80,94,46,181,142,74,190,237,150,133,111,250,157,9,218,230,88,138,179,42,252,163,26,163,214,0,137,134,83,150,251,204,215,244,193,166,190,255,102,141,157,140,214,149,81,58,122,35,91,175,100,99,0,43,142,235,161,248,185,104,195,52,111,39,230,237,171,194,47,173,18,137,35,44,22,165,3,132,24,49,112,186,42,140,122,253,41,111,62,179,209,146,27,77,217,125,198,238,138,35,166,241,254,113,94,94,208,31,30,209,230,139,21,200,219,236,178,223,95,45,11,205,241,217,64,82,62,96,164,42,12,248,181,81,91,95,45,195,48,183,142,127,142,3,157,146,14,3,189,48,81,251,188,101,64,95,198,45,21,10,99,164,87,
149,146,130,88,173,46,40,212,245,141,110,146,216,199,10,24,224,120,140,154,101,65,141,33,63,145,53,135,198,33,120,99,85,241,197,204,216,136,135,228,24,169,45,176,6,233,123,168,26,13,189,198,2,48,122,28,198,244,221,199,24,30,39,34,202,176,228,128,26,251,165,50,127,153,177,203,50,138,15,62,178,109,232,222,197,121,133,196,210,163,113,133,211,188,176,61,22,165,40,176,104,104,225,253,96,102,97,255,228,18,149,187,210,123,195,131,147,172,90,172,71,187,112,13,19,84,244,136,5,207,198,174,146,217,86,82,15,46,19,151,202,176,150,200,140,48,163,221,148,183,252,85,143,24,244,183,15,116,135,49,197,38,244,208,16,157,233,239,37,125,81,148,174,50,86,28,250,178,0,79,167,166,234,212,230,220,14,27,206,153,29,254,84,174,255,149,128,62,113,118,14,8,224,185,238,114,47,13,233,215,9,170,229,181,110,57,115,241,177,212,103,124,100,152,204,122,180,155,255,89,170,148,120,176,124,228,92,167,221,49,165,69,37,212,122,241,47,175,9,114,227,8,53,114,95,62,
114,175,75,133,91,167,187,194,162,25,122,196,220,103,245,42,248,243,60,48,68,168,48,16,87,10,2,94,96,39,151,154,54,76,244,250,14,176,247,219,107,15,17,12,10,17,111,133,181,179,79,176,134,33,218,36,190,252,149,49,16,83,241,109,65,234,144,45,134,124,132,106,154,58,85,245,79,13,162,158,116,215,225,16,139,142,236,125,77,132,25,1,155,78,66,65,101,226,70,141,61,49,226,20,195,47,214,50,34,72,130,121,50,230,245,115,146,124,180,68,61,70,148,100,67,242,140,93,80,146,152,237,108,202,221,91,58,122,239,196,58,9,140,101,110,113,111,97,193,7,154,112,39,193,233,215,53,204,253,73,176,245,202,24,230,158,50,221,17,17,115,171,168,217,213,228,188,19,73,110,42,124,248,196,113,167,215,239,44,37,227,202,64,18,221,87,191,220,12,148,0,3,41,97,164,16,157,84,48,175,124,67,107,139,121,153,228,35,175,203,176,121,103,230,224,28,164,211,108,108,185,75,163,253,56,127,70,12,142,188,139,75,251,74,249,121,118,1,200,115,53,123,23,179,106,76,
99,167,10,220,65,163,175,100,6,27,235,205,205,97,38,58,91,235,188,136,101,166,134,186,114,146,191,234,234,233,232,176,60,150,125,208,214,106,148,245,0,84,216,185,248,40,254,4,15,130,223,156,43,46,156,144,213,34,197,139,243,113,214,221,133,72,20,79,97,230,161,234,185,138,75,148,29,212,5,40,200,242,85,192,223,14,163,3,127,186,175,226,38,176,11,187,188,107,95,100,31,53,87,147,134,40,61,218,56,223,12,143,235,100,113,157,124,156,219,70,174,252,148,102,5,34,77,67,188,77,72,52,238,193,188,184,144,32,31,22,230,231,66,226,56,201,57,176,132,196,91,8,4,149,137,33,211,81,0,13,75,123,107,180,69,14,152,47,126,244,83,56,144,82,2,11,147,162,97,49,167,27,9,196,64,163,184,60,44,214,66,225,87,135,104,81,238,209,36,183,121,97,116,109,175,178,86,249,26,155,180,86,172,144,236,142,61,249,229,203,168,7,24,51,124,205,151,61,145,70,163,245,235,89,89,173,90,227,91,190,75,240,59,215,78,143,22,55,134,91,129,70,120,93,187,182,
70,154,77,30,158,54,29,191,15,194,114,168,175,35,216,157,148,106,110,202,73,90,23,105,240,219,132,142,135,10,36,193,70,235,85,198,135,196,93,31,124,29,77,214,118,121,170,112,78,169,69,21,27,116,59,212,42,67,195,45,167,22,83,107,27,153,204,96,222,90,180,212,94,75,188,178,133,197,221,37,61,120,199,22,48,79,226,103,143,29,97,126,37,28,120,194,82,251,3,81,58,51,120,102,38,251,205,68,210,239,196,151,197,170,126,225,211,209,229,64,11,126,109,137,103,2,39,54,207,193,80,152,73,116,126,124,40,76,54,228,226,100,95,84,219,96,123,249,238,101,192,45,40,197,97,71,125,166,225,156,225,247,231,161,67,186,159,249,47,241,230,91,129,42,83,38,118,239,148,51,15,234,48,234,173,14,189,19,0,7,180,234,175,208,87,16,25,148,166,81,135,193,42,130,85,171,179,90,160,236,46,147,81,1,82,183,249,51,127,75,198,187,201,237,243,182,223,250,247,254,250,179,4,133,86,108,231,137,229,12,165,83,218,145,252,142,70,159,139,97,145,179,187,217,131,87,
159,126,117,245,224,122,118,144,67,216,52,164,72,191,130,134,123,207,188,103,110,246,13,240,158,9,131,96,120,68,211,243,67,180,107,137,5,224,23,79,105,182,120,117,170,136,155,22,251,179,68,185,184,10,185,219,52,166,2,227,36,161,11,203,123,31,189,243,239,35,175,75,13,120,253,120,57,112,96,251,43,48,186,191,42,234,152,220,146,139,126,95,68,230,243,38,188,164,222,53,154,83,136,252,233,67,228,247,47,49,226,46,78,237,107,96,5,3,45,245,153,159,38,210,129,164,211,30,105,113,50,18,34,13,176,22,161,118,70,189,159,128,112,58,79,209,70,69,76,4,6,94,6,241,56,241,0,181,130,26,111,74,13,128,11,4,12,6,157,243,134,58,246,196,18,59,47,101,32,82,19,166,3,209,185,45,52,227,77,187,93,2,133,114,37,0,235,10,157,50,0,182,231,140,19,109,76,59,15,71,128,182,119,100,84,56,157,16,120,90,178,241,88,61,249,199,151,30,142,243,97,168,55,29,159,123,116,108,31,105,126,235,35,15,16,249,50,80,178,42,224,9,78,151,222,217,
221,41,90,148,50,111,13,143,101,52,111,173,59,227,140,118,112,97,202,209,150,250,214,88,173,119,236,166,188,217,239,172,215,5,254,124,77,94,175,234,235,97,125,163,94,220,130,48,65,130,72,245,238,102,75,35,28,4,121,34,161,44,97,226,70,37,33,169,70,197,149,160,92,82,93,101,156,170,55,250,72,193,89,152,132,220,14,58,141,234,12,197,130,51,35,44,46,68,201,101,6,128,196,179,168,183,17,228,56,145,110,62,85,52,165,39,42,168,38,200,94,222,21,112,6,120,239,192,8,88,127,158,12,232,68,60,94,250,21,144,190,14,196,22,77,156,10,53,0,12,10,144,15,158,240,156,84,43,147,169,84,74,10,210,225,140,222,178,134,3,58,195,156,254,190,238,94,26,133,159,3,227,153,48,43,164,189,225,54,34,98,205,76,11,225,208,174,190,39,6,220,250,5,246,180,245,98,136,210,67,137,65,110,96,202,108,15,225,227,115,17,181,238,119,195,73,7,83,137,152,135,227,230,34,93,108,17,103,86,189,40,51,174,113,16,167,26,86,22,20,203,250,84,157,237,221,
220,166,164,68,200,245,144,40,163,230,99,36,42,113,156,136,5,103,143,50,43,245,57,38,93,125,248,17,70,88,87,250,205,236,67,219,92,101,67,197,209,112,158,150,27,231,1,82,64,130,23,47,21,101,128,158,158,18,231,103,237,69,233,251,182,229,250,82,122,247,192,102,37,121,166,143,153,109,171,9,232,79,14,159,155,201,138,126,107,95,95,193,39,90,145,116,60,215,187,206,117,120,158,217,39,111,245,146,154,11,219,105,56,164,86,107,117,146,85,133,65,113,250,61,118,102,159,167,48,198,78,84,185,148,106,243,247,76,245,146,205,12,182,244,201,20,228,82,77,96,128,238,232,162,129,184,152,8,88,208,76,192,45,197,172,6,43,238,212,97,222,52,105,16,168,169,39,11,1,122,5,53,200,64,190,172,117,21,113,62,38,230,65,114,210,147,254,45,140,6,105,147,37,184,165,66,218,164,205,114,127,68,81,111,121,20,254,144,58,31,30,61,154,96,170,233,244,18,166,171,68,217,88,130,92,69,14,232,47,0,40,28,5,216,23,100,239,135,162,199,84,7,120,145,99,3,
239,185,104,241,159,159,160,242,195,252,121,99,107,189,15,135,167,211,202,135,46,48,0,157,71,21,157,99,150,85,188,20,77,60,161,10,90,249,52,3,153,241,17,174,224,206,158,137,60,83,94,224,17,47,93,244,128,75,202,95,218,234,112,227,164,17,231,236,226,28,3,97,165,118,109,218,207,111,210,84,53,46,8,238,103,156,200,35,156,236,121,6,156,68,25,226,209,209,113,175,254,254,125,241,10,214,161,63,248,39,226,184,206,33,27,219,104,172,142,136,212,189,190,8,83,60,130,24,41,234,80,237,112,137,161,172,196,141,200,52,82,181,34,215,132,154,38,210,202,236,52,125,66,109,107,100,140,198,22,21,0,126,35,50,127,160,199,133,26,146,120,118,123,33,123,67,252,91,250,114,169,249,158,232,121,195,227,56,109,192,128,245,64,29,177,72,207,183,98,70,125,37,133,40,132,105,191,194,51,56,175,143,205,104,152,101,63,77,157,213,214,176,218,123,119,95,132,246,162,31,192,44,251,218,6,233,218,3,61,7,48,228,1,39,220,185,160,171,151,13,191,16,0,151,185,89,
114,240,70,182,28,13,177,159,196,153,167,66,67,165,171,178,204,85,218,54,85,92,234,201,11,159,212,234,37,132,168,183,225,242,147,75,248,152,24,79,34,170,129,248,129,229,197,97,212,172,77,216,79,85,202,135,251,89,20,214,176,85,236,199,181,6,254,252,132,34,86,75,212,187,12,99,229,230,57,203,171,81,241,228,46,63,214,83,63,12,107,94,0,125,188,194,88,240,30,23,180,201,213,227,219,109,111,103,219,31,23,172,107,105,169,206,44,119,126,67,114,243,156,112,219,104,70,131,7,126,94,223,159,159,156,24,138,236,37,56,155,167,163,72,61,233,248,92,33,115,211,243,197,54,46,42,104,247,174,15,243,121,234,16,115,38,153,205,89,82,171,145,95,60,245,50,220,70,248,170,174,73,94,65,188,22,136,103,232,124,37,117,96,224,9,70,221,79,36,153,14,10,184,63,131,81,23,138,198,134,36,18,46,4,56,29,142,211,156,24,226,19,243,126,51,179,85,123,6,127,173,183,199,39,149,183,155,1,94,244,34,113,2,10,39,192,161,132,59,200,163,240,93,184,132,201,
208,176,196,193,115,141,149,108,113,145,131,43,31,94,216,210,244,122,58,207,4,154,19,207,186,177,124,100,234,18,137,66,209,207,204,195,122,82,204,219,106,12,0,104,160,127,233,165,138,115,19,129,154,76,176,74,238,163,20,73,19,186,104,114,216,254,42,175,95,227,120,109,36,160,178,112,188,231,68,34,239,136,171,84,42,239,145,107,158,189,211,87,222,61,233,14,162,173,1,159,100,171,188,155,184,242,156,242,149,206,150,199,184,154,232,229,80,148,112,155,9,43,228,182,250,81,225,190,247,245,178,205,146,170,99,60,81,87,161,67,215,243,14,243,81,33,211,158,178,184,54,57,192,13,93,58,145,5,133,83,30,102,95,242,15,170,114,98,106,243,236,43,0,192,94,80,30,10,222,27,159,33,200,124,54,14,93,74,58,57,9,193,224,22,54,215,225,238,48,66,125,209,180,209,196,147,108,228,29,47,89,246,250,99,156,217,83,29,115,117,99,97,148,223,115,116,198,72,138,192,120,68,164,41,42,177,209,21,210,118,33,123,88,126,72,45,239,118,103,46,166,176,57,46,69,246,
228,150,107,13,80,53,54,23,222,114,214,47,246,80,101,66,31,25,100,115,30,89,215,214,150,149,225,169,28,226,229,104,27,198,151,251,203,7,132,42,0,201,166,14,183,164,21,63,62,118,24,58,114,45,6,152,175,210,78,232,61,10,104,2,33,167,43,61,9,117,35,239,23,36,212,166,77,178,82,244,145,251,26,124,222,116,32,251,105,196,87,239,134,122,71,247,144,188,188,182,107,239,207,139,175,229,65,49,180,227,106,131,7,81,34,93,28,252,199,151,12,125,41,93,17,42,27,191,249,113,29,37,93,181,109,16,55,183,157,186,1,54,48,214,170,41,45,150,90,127,177,208,147,86,198,134,173,122,139,59,207,232,224,140,4,238,163,72,210,152,217,231,172,196,182,72,3,105,188,181,69,239,231,114,141,162,152,203,80,251,205,252,92,6,146,230,88,176,126,126,153,84,4,96,189,100,153,252,124,191,158,33,202,90,8,34,82,250,235,72,187,159,76,253,226,108,254,153,232,245,24,71,13,200,55,64,111,66,134,30,207,210,248,126,22,69,204,157,170,216,194,245,154,123,102,100,
82,141,109,122,226,121,22,157,104,59,40,188,186,86,45,207,235,227,54,129,63,134,47,218,222,187,94,188,160,164,187,90,91,146,69,101,74,117,21,150,248,148,45,130,67,38,233,148,215,28,0,14,102,76,108,35,212,210,21,138,185,205,76,41,238,65,179,29,235,177,219,206,166,164,163,81,229,208,200,74,92,245,190,142,206,205,174,212,4,115,53,50,200,61,29,100,75,29,146,120,54,9,247,72,64,43,87,222,13,91,77,188,37,129,88,105,238,118,87,103,157,187,175,157,6,167,96,12,113,198,108,166,131,244,241,12,47,110,182,235,194,43,190,241,185,134,8,246,198,122,206,119,77,48,34,117,14,215,80,201,148,133,242,138,162,85,225,94,90,57,78,174,198,134,111,181,232,176,18,31,84,249,96,131,202,71,47,102,125,44,17,122,134,136,153,6,212,132,190,24,170,204,98,97,43,27,185,49,163,241,91,39,103,34,164,119,17,106,180,133,130,181,64,85,17,235,60,232,152,5,43,204,152,80,101,137,84,94,39,194,204,10,229,121,78,65,189,17,25,107,201,116,48,71,69,20,
107,199,251,94,164,66,113,177,223,243,107,134,195,166,92,166,24,105,148,182,252,81,228,122,218,28,142,222,197,164,8,30,87,205,155,94,255,217,26,110,130,37,11,151,134,115,39,85,105,181,129,234,151,206,67,242,209,16,218,184,31,8,135,41,106,116,247,49,135,89,210,199,195,168,171,142,180,162,129,56,112,222,154,182,7,205,224,230,119,136,164,24,98,227,195,24,148,215,188,197,228,38,68,185,97,51,172,125,50,113,153,65,94,117,59,135,61,191,155,81,218,173,170,51,38,218,198,252,190,168,230,198,193,73,218,187,230,169,111,195,45,108,177,178,20,140,49,46,205,115,209,18,99,5,127,221,103,116,75,159,213,36,62,250,67,195,6,50,158,147,164,51,15,20,110,12,215,242,47,169,208,70,76,180,26,144,248,34,153,220,69,166,231,70,96,136,241,37,229,82,60,221,112,11,79,44,202,227,8,248,13,22,64,47,52,180,155,242,254,122,64,44,1,6,74,54,0,63,215,195,231,109,236,35,194,1,127,228,138,53,2,53,132,92,39,216,107,102,227,0,47,92,5,108,108,48,
124,121,229,221,230,36,176,136,149,15,184,10,126,16,188,32,20,230,187,36,4,23,49,161,91,5,201,46,96,178,44,166,124,143,221,250,145,43,117,42,31,130,221,150,73,83,99,168,239,189,166,102,126,41,126,108,37,2,249,226,240,113,237,115,14,35,9,242,51,51,32,45,10,162,133,129,102,239,23,145,181,9,116,161,104,217,22,251,57,245,35,127,27,216,221,216,23,5,127,34,122,87,243,227,67,193,106,231,134,146,220,23,73,200,189,71,156,167,180,186,126,213,173,186,206,80,65,183,124,205,100,182,247,169,70,10,5,172,40,152,16,3,16,70,143,115,144,219,200,188,190,34,63,155,151,251,197,149,123,96,87,10,54,247,81,211,4,73,21,36,186,61,198,128,33,70,3,55,67,208,87,250,184,23,202,50,12,133,89,40,105,78,229,213,112,12,164,71,15,204,4,102,238,96,145,203,16,208,156,90,237,106,140,38,149,229,163,178,122,27,234,187,43,134,230,140,201,85,28,218,140,199,130,44,144,16,61,32,72,237,219,157,48,146,63,172,206,214,133,11,97,137,205,1,154,75,
194,72,41,80,146,247,126,52,217,143,126,51,40,72,236,138,81,83,231,94,182,193,69,241,109,69,237,189,81,228,254,233,181,102,117,165,163,49,48,193,145,126,33,140,84,2,231,7,171,123,119,246,64,55,45,201,47,204,18,54,8,95,148,188,87,202,100,124,49,0,37,139,166,84,137,93,192,210,142,177,203,73,227,195,239,195,243,199,216,154,174,15,228,247,233,178,197,141,194,239,98,54,249,183,136,127,145,188,220,187,140,112,15,41,35,196,167,228,33,158,65,183,138,145,22,51,144,154,119,48,222,1,177,152,84,20,161,229,95,5,219,161,31,94,240,133,100,171,180,196,105,133,46,172,163,78,131,73,206,214,195,67,195,233,105,139,130,230,185,52,152,191,75,249,162,149,150,92,3,185,5,64,0,81,87,73,94,200,222,241,11,18,33,149,72,111,79,130,5,115,143,37,227,241,24,225,219,22,138,38,171,185,73,138,18,252,117,210,74,86,16,133,179,125,34,132,229,238,110,52,154,250,211,84,46,113,218,211,18,94,221,56,215,12,47,118,236,177,213,251,144,83,83,165,204,168,
97,87,112,190,116,43,146,96,84,47,49,119,147,22,94,170,104,137,48,151,8,93,131,204,88,216,77,225,125,2,197,130,246,201,116,41,3,24,125,29,25,13,13,172,145,114,26,83,216,173,210,108,34,56,87,82,178,130,191,53,56,31,120,163,179,95,4,14,141,180,50,114,224,44,171,165,104,112,126,30,235,27,97,97,64,31,97,126,66,111,138,144,205,162,105,142,55,16,147,1,146,190,224,162,209,126,30,184,131,136,66,204,106,115,208,224,118,243,56,31,84,204,107,158,11,153,165,4,148,253,155,168,21,232,227,158,146,254,87,135,145,144,201,238,16,217,147,148,27,206,248,186,27,167,170,140,194,31,36,68,74,1,73,82,95,248,208,216,184,13,111,207,78,82,98,122,174,4,146,232,14,50,221,116,162,199,47,43,218,103,211,108,154,152,118,73,146,225,206,183,224,131,138,213,80,22,157,3,114,79,253,107,144,176,133,206,230,132,90,211,244,201,192,135,26,61,144,1,2,82,175,67,81,60,1,73,133,40,99,234,237,128,101,186,98,54,27,178,190,167,159,31,98,114,213,253,
113,155,190,18,221,126,162,217,78,12,178,55,6,1,230,4,92,76,27,140,86,181,188,238,158,148,31,231,73,252,132,61,227,134,22,99,173,50,111,39,23,102,190,68,149,113,5,65,110,136,207,205,239,187,209,17,133,27,151,191,177,11,252,181,179,190,236,0,184,245,87,77,18,142,155,251,222,113,227,193,242,26,107,161,47,49,220,69,214,228,111,10,28,204,151,100,161,11,156,84,249,133,23,108,156,55,210,186,33,59,62,128,179,116,29,104,179,149,145,236,192,30,137,153,226,243,13,244,189,25,22,222,54,232,183,139,68,8,82,0,80,123,204,218,132,72,31,116,48,135,45,100,27,57,194,39,104,248,18,240,4,192,189,118,71,70,120,18,38,132,168,19,254,202,35,6,111,38,189,142,159,87,139,84,216,26,19,182,229,162,133,216,136,4,119,19,245,177,145,145,19,78,139,157,33,114,177,184,72,203,230,167,21,136,98,190,207,163,152,107,40,80,197,21,10,227,178,104,119,75,44,47,253,235,226,94,138,223,152,1,134,5,219,195,156,160,46,144,216,179,105,42,216,63,44,55,
180,106,221,7,109,164,183,204,25,212,231,140,33,139,59,163,253,238,165,133,132,247,73,108,186,135,45,62,248,119,235,67,185,200,178,235,131,75,114,101,143,207,235,17,234,162,52,60,74,117,142,253,167,161,118,52,84,141,184,243,162,234,52,99,30,7,24,85,211,32,181,212,236,24,197,52,101,153,63,226,69,152,89,49,163,25,30,9,216,135,40,52,201,94,134,239,51,21,89,170,17,246,165,42,209,138,27,6,198,31,104,112,10,154,216,63,176,208,7,22,255,164,50,68,123,140,204,200,52,41,244,184,60,59,52,174,164,123,135,225,198,49,98,34,28,192,84,231,152,38,73,166,183,216,251,137,132,82,236,241,252,189,169,94,81,216,110,199,19,244,88,163,232,244,143,238,142,23,97,138,116,37,58,203,219,164,103,233,123,209,199,212,208,181,104,184,75,52,26,105,121,111,198,211,169,148,8,32,108,251,8,29,62,91,215,225,143,215,235,46,190,255,238,22,216,149,250,142,217,142,252,96,178,223,63,241,164,42,1,179,192,141,69,232,80,111,21,17,143,90,168,244,137,72,186,110,
101,238,181,72,135,230,8,138,1,129,73,155,215,176,10,136,67,255,125,58,44,251,17,20,186,5,144,9,221,32,153,11,179,118,251,20,104,54,247,76,148,150,180,180,162,171,81,177,90,81,187,149,154,73,171,245,28,157,185,115,207,201,137,48,125,96,71,194,217,195,0,248,68,71,92,157,184,104,98,126,251,228,188,29,233,243,238,94,106,176,191,35,94,27,211,164,26,19,62,208,196,194,2,169,34,18,134,166,217,30,120,250,126,239,237,229,59,187,169,76,102,87,89,233,197,97,18,211,57,14,229,133,221,25,165,54,150,35,245,82,178,198,122,95,189,174,170,138,8,189,109,220,188,79,118,96,73,105,160,206,83,156,15,196,183,176,68,47,172,213,219,151,214,67,219,1,234,149,13,12,115,241,45,239,55,30,248,161,101,250,60,72,11,129,33,148,186,44,194,24,108,21,90,172,176,184,156,114,157,87,187,4,26,210,49,45,106,125,76,28,208,71,191,72,29,213,102,156,228,54,241,153,246,229,73,156,89,186,255,194,179,37,95,106,125,255,43,98,246,64,175,71,239,200,199,226,
82,155,7,119,165,149,5,182,58,238,27,82,135,106,162,116,148,57,5,88,22,148,152,39,197,166,174,72,116,20,227,175,93,11,188,212,139,90,186,122,251,50,50,108,225,98,247,24,189,172,39,21,77,164,249,225,172,182,246,248,206,229,209,252,121,169,7,14,184,10,182,35,98,226,138,77,142,71,224,230,14,211,239,121,91,66,89,100,65,47,246,243,70,180,187,212,192,228,57,167,219,20,38,242,193,19,174,151,240,134,211,141,22,48,218,170,245,148,200,160,3,98,173,155,102,84,64,100,88,136,76,62,50,177,253,76,82,188,158,113,6,7,16,80,247,189,81,116,239,237,163,220,48,119,188,211,217,83,229,167,112,81,79,127,164,37,242,134,5,197,147,199,192,75,197,36,91,166,137,45,5,17,9,195,250,4,67,66,2,216,92,141,73,227,24,119,71,130,82,19,134,23,221,226,224,115,182,181,155,16,149,70,117,174,94,44,77,22,172,164,198,54,60,86,132,134,121,86,112,111,53,20,67,119,64,197,35,137,204,104,232,170,211,95,63,215,54,118,144,238,234,59,161,87,153,159,
212,158,43,175,248,201,219,251,37,166,151,213,101,116,35,152,81,137,79,184,241,14,32,87,172,88,130,31,38,251,237,118,138,196,233,57,34,254,25,115,207,207,17,21,26,169,17,42,227,51,245,8,195,209,244,181,39,37,150,203,141,117,181,175,115,192,214,193,20,235,125,172,143,122,75,194,42,239,63,62,195,72,168,46,217,249,146,32,217,33,77,90,216,189,207,53,187,119,156,161,159,113,236,140,154,221,126,34,82,12,45,162,162,146,110,33,57,252,213,202,32,95,44,219,222,237,96,95,59,103,27,123,9,129,183,2,189,149,64,237,113,220,137,37,179,202,148,140,41,209,64,135,189,70,90,25,247,41,70,193,4,245,210,210,77,195,33,157,103,215,25,100,49,195,2,29,226,246,22,65,59,163,44,50,97,204,103,84,7,120,193,82,237,121,212,3,181,243,186,175,60,41,192,198,58,251,123,219,214,0,88,48,188,193,13,68,168,29,28,86,182,147,33,72,179,25,44,172,19,211,164,137,199,47,203,187,170,245,33,140,45,114,247,83,138,181,108,181,186,170,3,128,5,60,126,88,
59,13,192,147,189,44,113,76,103,197,117,86,255,114,157,178,140,232,139,152,118,77,145,148,189,27,106,62,36,163,106,251,40,186,113,1,77,178,232,73,167,205,220,37,139,204,93,244,166,102,132,21,64,150,158,126,20,104,178,10,219,144,218,59,13,1,35,154,16,253,227,72,202,164,222,131,73,254,177,51,138,36,196,220,155,57,227,177,154,182,19,203,100,122,115,20,167,2,54,44,213,217,188,178,176,10,102,96,96,40,43,146,170,176,124,118,69,73,193,89,224,154,101,206,130,214,10,32,85,141,124,138,225,77,9,201,20,23,3,5,21,67,177,84,241,234,152,136,112,91,83,56,181,168,68,171,198,99,136,136,165,18,182,133,38,119,120,6,175,239,79,239,192,131,72,190,210,119,240,177,114,74,191,144,68,189,78,21,135,143,219,60,128,50,244,150,107,80,211,102,192,166,51,80,186,55,162,163,85,177,35,126,209,97,137,176,103,33,195,120,117,40,68,225,253,44,195,26,106,255,150,189,50,192,59,154,249,7,192,67,109,169,124,171,34,196,16,156,17,217,235,162,142,162,6,223,
210,91,199,232,51,213,180,7,9,55,75,12,231,221,103,236,231,246,141,147,166,141,201,37,33,222,126,232,112,115,243,89,76,207,127,139,69,5,33,72,89,89,41,179,6,111,139,23,61,21,110,162,194,169,122,2,82,75,196,154,48,5,184,161,132,58,30,132,216,181,147,118,188,224,43,185,34,255,110,140,191,204,102,106,150,6,28,2,38,34,211,158,234,69,95,231,175,154,240,115,150,105,156,214,105,155,222,54,183,224,155,19,66,176,10,23,222,105,60,183,237,170,49,219,208,90,158,59,235,254,249,134,145,30,165,253,139,188,193,86,129,210,189,245,73,89,199,114,35,208,11,15,203,193,165,122,250,243,77,207,96,70,58,155,161,244,174,212,160,146,199,2,58,94,226,190,226,154,5,152,130,155,135,45,115,204,165,144,168,184,200,160,169,196,243,84,13,245,245,147,241,130,133,3,190,34,70,209,87,102,113,121,176,112,31,105,80,247,115,197,7,3,181,42,192,195,13,203,156,42,46,35,203,86,190,190,150,114,162,16,76,63,134,93,176,194,0,166,38,138,23,193,238,161,87,188,
40,157,219,32,118,177,229,63,177,28,125,192,226,168,109,206,96,55,216,157,19,246,48,226,87,216,189,163,106,238,52,47,81,65,149,1,26,54,83,38,44,102,59,0,8,69,35,190,212,37,75,144,249,101,22,95,90,5,193,209,90,72,132,225,183,248,49,94,95,152,199,203,22,232,79,210,0,95,243,55,116,35,108,151,245,217,234,44,204,163,114,172,215,204,200,219,105,41,33,173,157,18,92,56,210,45,37,48,4,50,13,47,75,9,10,216,26,81,140,76,52,126,123,239,139,63,70,95,151,18,149,86,87,43,167,58,229,98,62,153,143,231,180,217,106,70,183,219,215,220,103,113,157,112,224,36,177,136,196,237,188,120,158,147,165,225,60,85,220,23,102,75,149,185,50,142,184,144,9,174,153,95,57,43,194,165,45,176,96,11,204,219,186,164,206,224,81,143,189,44,210,241,122,78,161,191,202,240,139,155,193,201,159,124,49,41,7,21,191,32,95,201,250,14,193,53,220,114,223,123,159,230,237,32,229,128,242,241,124,6,180,115,11,28,196,100,213,122,79,208,82,185,35,61,147,126,
4,197,40,37,140,21,14,196,136,241,141,235,59,242,204,118,156,26,83,0,185,191,164,49,36,137,123,219,37,153,221,112,233,67,45,123,39,40,47,184,188,232,132,131,28,30,89,110,209,186,187,0,162,213,91,150,211,0,232,61,25,54,173,98,217,21,192,197,134,10,16,100,42,182,35,219,117,242,185,107,83,13,237,135,34,221,126,49,180,195,195,93,123,184,203,171,212,49,124,26,71,7,182,66,119,62,0,170,211,46,142,136,192,17,125,146,147,173,207,152,132,211,228,12,149,24,232,161,137,216,217,188,235,189,39,13,215,122,161,51,78,48,204,74,160,182,159,41,28,134,23,12,139,117,194,130,62,159,55,192,33,33,27,157,114,182,29,58,80,168,10,26,106,64,81,162,18,50,190,164,150,68,13,153,138,174,81,157,157,213,220,83,46,125,12,30,185,158,3,148,224,238,142,234,228,200,172,234,27,237,89,67,109,66,87,161,203,93,20,169,20,140,170,212,35,81,81,45,166,106,156,146,250,43,34,253,100,88,88,143,24,237,90,52,57,58,136,94,255,213,150,177,193,90,201,86,
54,10,73,225,18,195,231,6,142,29,74,218,72,234,164,32,25,15,103,24,91,131,113,59,169,63,128,107,202,234,61,215,63,142,65,11,15,186,146,111,245,76,35,220,197,16,112,120,211,227,123,35,231,116,171,150,26,179,166,153,25,57,172,174,170,0,60,19,64,64,111,48,118,60,205,165,74,34,137,172,71,149,88,21,59,199,201,50,87,51,193,182,239,5,104,58,230,66,23,110,52,128,220,66,71,94,217,104,239,157,14,185,19,208,76,34,252,197,133,122,113,227,128,47,105,72,160,9,9,188,139,253,162,214,75,212,21,198,66,27,216,60,51,216,101,88,68,181,190,117,122,105,179,15,36,246,81,82,179,79,59,78,116,254,214,156,19,193,44,98,224,43,39,59,190,87,105,127,58,71,51,80,254,30,73,79,41,228,81,27,107,156,229,115,99,51,83,254,240,0,33,236,52,4,228,18,143,67,45,219,40,14,62,17,225,116,19,173,142,162,153,18,125,100,196,245,106,24,111,2,181,109,167,34,85,226,134,34,86,93,137,233,174,205,81,146,86,226,199,83,10,162,192,231,147,246,
106,127,108,90,99,199,96,164,132,37,224,210,47,141,23,56,122,197,61,219,91,213,92,33,34,209,104,207,55,175,44,114,214,245,122,179,187,191,194,96,208,227,165,92,199,50,217,94,205,181,157,29,184,104,31,158,20,6,230,145,193,159,1,3,23,55,72,187,87,76,147,98,45,245,56,162,159,100,160,62,11,234,130,163,51,96,237,242,126,118,77,63,110,238,118,100,65,236,124,44,62,70,245,143,202,180,145,103,219,120,20,12,173,139,181,80,174,108,217,167,210,118,137,88,172,161,9,147,188,173,235,47,130,162,249,138,208,206,176,198,153,131,170,221,189,240,174,152,130,100,39,11,29,3,68,69,117,118,26,48,125,83,101,201,255,137,166,217,82,206,163,8,67,133,14,67,200,50,207,137,149,156,24,159,226,107,229,237,204,9,31,79,182,55,200,133,231,15,6,178,4,56,153,8,165,35,19,1,161,62,27,107,139,164,201,143,238,148,130,239,223,142,68,62,78,154,56,18,13,48,146,33,2,38,234,185,34,170,51,131,114,174,213,178,61,86,10,102,233,48,202,174,208,244,84,64,
57,21,191,183,196,50,104,41,201,114,55,78,236,47,187,229,203,254,117,54,33,61,167,76,238,27,133,198,209,101,92,189,229,152,82,127,124,246,145,69,226,110,116,70,171,187,159,206,115,197,184,30,68,128,8,65,235,84,111,189,114,61,220,61,218,47,146,81,166,85,39,182,189,82,197,87,179,134,111,241,209,59,52,110,61,167,71,94,154,45,86,182,227,253,2,189,174,142,249,11,123,237,89,134,143,209,27,231,176,228,142,95,120,15,46,246,41,111,165,167,222,244,177,244,169,110,102,26,108,130,130,48,233,202,175,233,168,243,200,85,190,243,80,125,149,133,142,224,227,178,120,218,222,20,173,13,63,1,254,241,19,50,21,158,26,189,113,28,124,36,125,226,66,83,241,231,37,214,216,82,228,250,79,178,194,165,105,18,24,135,253,227,113,214,184,220,178,61,194,62,217,36,30,37,38,28,90,230,189,89,218,187,205,99,185,121,32,31,58,126,71,215,201,173,163,86,59,3,136,66,44,210,193,240,32,36,76,24,4,57,147,46,150,210,37,94,211,229,185,87,185,212,22,89,29,229,
203,73,75,20,247,8,250,221,71,221,247,184,249,101,152,66,224,238,111,241,187,26,124,193,201,144,33,62,250,101,34,32,94,198,170,222,122,58,34,224,168,195,95,197,175,147,157,81,117,221,236,188,58,135,165,37,91,73,74,43,77,243,130,86,89,23,24,236,248,85,168,11,206,238,216,7,192,233,174,194,142,247,67,104,109,186,23,23,155,215,129,8,53,173,71,197,139,92,24,32,176,189,68,118,79,80,165,143,64,60,224,21,8,45,202,62,206,248,9,96,115,113,205,235,56,161,211,147,154,49,48,156,143,212,18,160,174,205,166,234,226,225,222,151,1,239,92,230,33,18,143,30,24,121,83,148,192,240,240,155,181,12,135,236,166,139,96,114,83,185,62,228,234,14,130,129,57,94,67,200,182,76,217,214,177,86,33,48,210,44,150,53,122,192,82,58,82,204,72,226,8,171,113,49,39,31,238,218,230,233,79,235,235,36,37,45,118,249,159,182,45,59,106,186,197,70,135,181,110,59,86,239,228,4,143,251,9,126,28,210,181,8,207,178,220,91,90,246,181,147,207,228,18,200,120,234,
6,156,12,8,16,209,242,83,57,62,249,199,144,45,248,53,120,233,231,103,228,144,24,70,216,170,228,11,242,39,249,193,1,237,185,1,194,67,32,62,186,197,35,56,90,13,178,26,116,124,83,114,110,18,217,246,86,96,67,11,142,95,227,87,229,233,189,114,224,63,45,205,253,46,163,104,21,235,144,149,100,98,225,102,8,31,230,103,58,113,102,31,240,235,136,233,13,234,187,246,214,80,65,106,235,89,141,250,7,76,201,72,55,30,43,47,121,147,228,173,183,132,198,50,35,121,126,175,248,92,51,62,32,11,15,3,116,104,98,142,10,107,70,245,224,126,30,215,32,138,73,224,121,41,131,114,237,119,38,222,210,34,247,27,231,123,181,206,187,95,177,150,12,169,32,137,9,23,165,46,152,145,29,150,113,227,141,102,10,87,215,86,3,220,114,128,93,110,132,45,151,182,96,62,82,83,236,116,86,55,85,128,124,7,65,220,97,170,87,93,245,140,47,16,123,216,200,54,227,122,255,25,159,143,232,160,220,80,144,51,135,5,155,161,160,98,174,57,43,102,86,197,172,132,210,95,
195,73,226,2,107,66,26,192,188,148,40,64,93,152,58,35,21,177,238,91,104,177,83,72,196,86,239,174,84,140,44,184,161,151,26,96,103,53,247,194,192,239,35,54,165,5,243,52,30,239,201,9,44,57,131,90,230,91,75,117,251,156,207,247,123,102,105,165,230,214,185,214,199,189,67,188,142,202,247,66,180,18,75,69,31,131,241,112,146,89,236,137,14,250,160,215,166,211,184,195,146,39,70,82,48,21,11,201,123,227,40,52,97,149,71,156,134,132,118,190,129,43,237,237,132,106,72,244,84,234,109,118,84,178,182,196,182,12,170,153,189,174,114,211,43,120,76,255,64,109,206,43,22,104,125,204,64,14,66,67,150,237,228,131,83,180,180,235,214,129,1,145,230,189,215,184,79,196,116,185,80,220,208,124,223,229,183,22,49,46,217,7,117,183,20,42,82,245,14,125,196,50,208,218,91,108,1,142,195,33,141,101,43,189,212,196,178,59,96,14,238,45,62,240,231,230,1,139,46,224,52,129,101,105,216,168,197,74,135,198,231,161,145,94,96,26,74,190,139,213,41,221,89,57,97,221,
17,113,159,143,123,219,17,187,227,134,177,121,24,78,221,112,187,62,101,135,246,46,161,114,132,145,166,171,193,104,97,230,223,19,36,178,193,39,60,190,65,39,2,103,213,116,171,83,216,233,216,166,194,144,53,209,57,107,128,107,66,237,186,59,98,175,105,238,7,98,100,160,185,15,2,246,89,252,62,202,8,124,243,103,145,75,56,26,97,120,129,50,19,77,24,67,1,43,115,80,239,27,45,220,99,51,44,22,232,174,216,16,7,194,70,233,16,79,104,34,132,17,236,88,49,112,86,103,196,179,142,166,90,104,238,89,131,204,158,234,102,205,247,167,187,228,56,157,52,172,154,149,100,232,113,182,132,28,110,165,210,20,131,216,80,46,45,211,71,85,188,183,92,68,68,108,237,165,120,14,149,139,123,173,113,63,25,248,112,95,149,207,217,90,212,10,201,144,20,141,184,147,158,70,106,49,133,101,139,64,223,254,128,84,55,137,248,5,108,35,152,230,124,243,104,6,216,46,253,186,71,210,111,249,20,206,252,24,158,96,228,65,20,93,207,101,23,80,134,73,46,2,100,219,100,215,
85,109,187,113,166,194,126,97,38,84,22,179,173,191,96,238,97,30,36,53,253,100,75,215,238,212,121,15,142,77,102,205,207,74,34,191,72,208,222,101,135,46,227,61,156,10,163,62,169,83,218,114,154,73,135,77,207,101,91,145,113,111,98,0,211,30,126,141,224,140,142,97,144,107,233,187,45,186,129,115,211,119,110,163,67,247,78,236,94,191,98,153,122,250,220,204,90,5,157,55,195,60,147,241,225,56,67,52,251,48,169,158,62,100,118,232,134,81,177,229,170,178,206,84,138,191,155,164,158,5,127,25,247,52,177,91,236,167,86,107,142,64,113,139,72,179,164,146,19,208,33,18,118,1,137,89,117,170,116,198,233,43,122,137,19,56,242,227,2,131,50,0,126,52,47,204,127,193,243,192,81,128,138,144,212,82,228,254,162,222,226,123,224,38,125,172,40,63,17,237,105,11,244,23,75,133,250,34,114,191,18,61,195,15,49,227,194,54,37,227,44,38,124,149,249,172,91,208,180,11,138,199,198,54,13,26,24,140,178,84,171,105,190,18,233,186,242,28,102,97,23,31,65,136,28,195,
45,247,197,179,217,76,152,19,26,183,74,5,64,174,91,212,33,53,129,85,79,111,247,125,21,170,90,161,115,238,96,117,108,141,187,222,113,167,118,63,190,132,137,28,152,14,231,113,166,28,17,84,249,141,64,229,102,112,81,232,147,1,191,238,212,157,123,221,190,199,230,108,213,9,31,198,149,140,36,214,34,235,165,13,139,250,31,239,140,35,6,69,190,90,180,140,173,14,102,105,167,95,231,49,75,149,58,83,103,155,83,201,33,70,168,211,191,52,228,1,250,249,146,246,93,219,90,14,196,8,183,188,152,241,188,171,9,20,91,190,164,7,218,148,239,33,246,117,172,187,235,50,138,157,178,111,152,220,182,203,190,82,174,17,121,9,87,119,237,187,105,149,240,161,74,68,94,18,184,19,174,110,205,211,93,30,173,173,247,108,132,59,200,132,159,160,119,54,117,105,190,150,247,161,113,108,198,196,240,141,95,127,119,163,219,55,154,60,139,154,104,30,132,177,106,56,176,247,6,183,9,244,116,92,51,45,225,123,242,193,30,65,149,211,197,67,159,17,26,199,92,161,113,25,145,226,
44,47,11,43,93,47,212,232,131,42,73,212,148,120,18,35,48,46,239,163,200,141,81,168,158,143,33,247,240,22,62,98,182,25,19,80,69,188,191,28,213,93,91,74,37,176,52,160,238,136,89,3,121,109,194,181,50,29,202,118,212,249,36,111,91,153,214,168,146,147,95,183,117,134,79,158,72,43,40,81,141,66,174,86,105,46,19,185,114,37,151,186,215,205,162,225,166,251,92,106,66,47,48,17,6,23,207,171,61,210,9,75,110,31,220,76,158,142,206,2,188,18,63,222,182,177,138,106,151,68,83,169,50,4,148,233,72,198,93,193,184,186,221,123,35,171,249,6,201,51,144,247,156,58,77,251,74,192,97,3,61,218,67,146,238,21,31,242,229,58,231,227,146,79,150,52,158,52,54,168,90,125,116,214,26,107,29,26,146,213,101,184,70,31,204,44,164,231,170,0,3,73,74,138,244,76,229,155,126,46,218,178,31,60,104,58,43,48,100,203,93,75,153,32,217,235,98,154,121,14,48,239,104,107,117,40,190,162,95,67,213,121,171,63,20,21,229,207,144,109,110,143,245,143,157,108,
104,78,30,210,49,100,161,13,67,36,93,160,224,8,59,141,136,37,139,180,92,69,210,20,15,212,104,163,238,124,151,79,15,37,111,213,54,41,165,221,236,47,49,120,64,170,109,140,55,62,64,135,221,105,182,228,157,101,92,183,36,222,49,101,147,77,45,76,118,20,95,156,243,179,40,56,126,24,216,111,97,208,91,154,251,18,197,69,230,92,28,188,64,15,114,46,1,191,115,243,186,59,189,218,106,150,70,70,21,47,216,42,209,134,237,88,255,36,14,192,245,234,36,75,53,28,231,176,199,251,246,154,214,44,243,175,115,0,10,109,214,184,88,128,222,188,45,74,176,172,129,37,249,10,250,84,174,138,254,241,231,186,91,119,83,185,36,106,130,0,213,68,99,154,76,38,46,205,196,151,169,12,125,145,210,56,233,77,52,233,212,215,117,39,189,250,57,118,170,198,10,70,189,205,50,249,40,88,25,20,103,157,196,206,198,163,227,143,81,223,184,89,151,94,129,175,137,253,158,46,20,47,184,12,206,67,244,186,167,135,81,142,14,199,184,129,96,207,199,91,48,19,158,197,22,182,
173,28,230,201,197,59,27,110,157,57,202,109,158,71,26,96,52,28,41,117,39,39,7,149,249,58,79,15,210,74,241,226,183,25,233,247,58,90,200,208,0,117,85,70,23,139,141,27,32,157,69,251,13,114,133,231,128,126,187,164,158,90,3,69,54,95,129,239,108,91,185,82,31,45,130,220,193,8,160,193,198,232,219,150,241,20,114,219,49,120,199,83,140,107,118,215,106,181,235,226,48,120,164,142,194,217,194,94,58,129,72,84,25,136,115,3,152,200,94,199,210,178,216,245,51,182,121,25,71,193,21,93,231,42,188,153,132,210,251,7,193,141,68,0,19,218,132,44,206,101,30,57,155,203,113,125,49,13,183,246,207,35,121,28,188,236,229,16,166,87,145,6,212,228,233,40,133,251,66,33,112,94,26,107,192,192,97,139,18,51,95,146,47,31,77,108,236,16,251,8,2,248,212,125,41,58,222,92,249,25,166,39,196,21,249,10,211,183,101,37,142,226,184,92,80,160,86,97,123,61,161,208,61,232,29,9,28,193,199,190,69,75,121,217,27,12,49,201,160,67,129,118,55,123,50,98,
185,22,34,48,66,125,235,200,11,58,200,11,90,167,162,91,202,76,178,238,245,245,208,119,184,175,203,110,186,192,13,214,75,99,103,198,11,84,118,229,214,9,198,184,239,146,192,39,40,212,67,74,250,234,221,96,189,220,195,70,107,72,94,234,98,35,186,207,221,150,237,173,231,90,71,95,19,105,87,250,184,154,212,229,145,104,103,104,128,250,95,192,190,214,114,230,113,105,131,143,72,195,127,7,245,79,222,200,135,14,226,197,73,223,130,141,152,118,113,0,245,94,48,15,164,77,78,88,245,225,97,102,92,196,0,238,114,67,98,172,88,35,130,231,65,98,38,46,182,35,0,217,52,47,88,146,78,170,31,140,133,154,219,158,243,185,35,217,235,74,117,68,111,169,129,115,84,24,184,145,137,160,247,44,208,33,143,173,85,100,184,139,42,131,7,202,111,185,169,76,89,65,198,177,184,173,197,27,225,188,133,25,98,129,16,43,10,178,224,40,102,209,15,137,82,130,138,27,134,186,188,86,85,145,145,211,77,187,166,152,21,151,103,54,141,55,139,243,64,138,188,14,181,106,218,9,
205,253,246,65,68,154,124,160,142,178,19,163,230,225,227,157,180,10,98,173,240,216,80,121,142,179,223,205,206,112,131,95,44,232,22,201,88,43,50,165,105,18,49,172,93,57,42,4,27,203,209,129,128,182,220,47,254,226,8,11,240,247,42,120,154,219,99,243,148,93,185,44,145,64,131,39,99,40,100,26,21,232,246,198,164,2,41,159,207,6,97,228,160,179,159,12,229,163,113,182,253,16,119,154,33,50,179,74,200,240,224,241,1,70,184,95,143,244,227,78,240,200,29,34,39,97,17,170,74,92,44,20,76,51,186,236,144,236,79,121,225,27,221,37,192,125,177,183,42,252,75,173,166,154,103,42,235,217,205,63,123,253,2,174,143,100,38,242,100,229,22,162,240,114,193,177,193,198,243,172,201,167,210,197,253,185,89,30,131,123,126,85,33,191,172,65,140,25,141,19,241,46,224,25,171,97,174,176,132,100,239,167,87,85,126,42,16,209,231,110,232,64,111,226,55,131,200,5,159,221,254,68,96,45,192,72,45,96,236,166,19,97,54,49,100,96,65,121,117,62,97,169,211,174,143,19,
171,164,94,123,101,230,223,104,211,55,145,133,225,47,9,227,25,128,65,28,85,240,231,71,142,191,236,14,70,133,227,88,31,177,87,18,196,233,40,136,212,99,48,70,175,35,186,214,194,191,183,22,5,100,160,229,192,233,53,85,118,191,209,138,112,235,150,148,93,236,104,168,175,224,167,224,2,77,187,76,47,93,199,179,66,129,145,242,54,90,47,191,9,123,1,35,21,161,199,35,244,252,82,40,192,238,22,202,202,237,222,154,167,187,225,27,208,165,116,65,192,51,195,1,31,213,222,12,215,240,59,157,175,197,109,41,40,159,249,153,151,153,124,87,249,100,189,15,86,53,177,55,175,8,252,182,22,186,188,181,87,105,216,182,115,156,207,13,17,156,230,88,109,186,110,50,157,214,210,2,1,28,120,98,158,186,120,173,211,241,117,46,190,145,103,160,38,200,180,77,207,33,153,137,64,15,215,135,125,130,50,79,38,93,180,83,137,199,34,119,63,10,45,164,195,69,101,135,163,78,227,229,18,84,205,229,49,55,24,182,221,13,61,24,18,2,160,27,61,222,50,42,240,26,200,227,
166,96,97,1,161,142,210,253,96,139,77,159,78,140,7,225,184,125,246,252,56,194,196,111,108,197,73,46,66,12,171,85,115,175,107,157,152,166,122,131,57,59,99,148,108,251,110,103,87,12,97,23,41,196,184,75,207,103,121,75,150,52,16,157,178,81,176,55,55,243,101,139,55,252,39,239,52,33,196,224,145,236,43,201,26,219,43,149,39,150,210,251,150,82,71,3,252,114,192,204,89,10,201,19,33,11,142,9,30,0,122,113,16,70,129,188,171,210,238,147,219,214,27,183,161,189,140,113,134,75,239,151,34,160,121,217,31,62,150,41,215,204,201,111,176,106,14,105,190,116,124,44,27,7,15,49,47,177,21,20,210,92,214,32,74,186,227,133,226,115,66,182,139,220,200,146,93,39,123,117,169,114,18,153,89,144,129,135,38,49,48,132,139,199,233,0,80,49,29,112,75,71,161,175,185,104,152,161,8,87,165,164,182,178,191,75,75,111,229,235,105,112,158,25,242,250,243,71,190,181,104,150,73,224,8,205,57,132,21,42,39,174,189,248,186,58,179,65,131,102,85,222,78,229,246,0,
65,14,166,169,42,59,98,134,185,173,183,98,80,10,35,174,69,107,93,157,236,199,254,182,107,164,54,56,203,50,213,112,172,13,135,197,126,90,109,24,191,62,159,174,205,122,255,216,131,204,15,206,45,121,25,30,118,250,29,61,20,27,173,161,115,128,212,159,141,82,48,132,157,149,235,89,23,97,165,224,76,215,60,215,129,208,244,21,115,126,200,108,43,100,234,229,54,110,183,220,137,97,237,105,142,211,29,47,39,183,111,40,199,103,6,79,132,208,205,71,147,142,195,242,235,92,174,171,95,2,229,202,28,164,178,150,165,203,160,231,45,62,249,232,204,14,243,218,194,101,204,98,31,237,2,229,78,250,120,58,150,180,113,61,157,59,187,227,217,85,72,102,122,237,29,247,237,15,59,188,41,119,209,229,165,221,135,58,130,52,134,21,199,100,216,56,231,206,29,206,198,252,216,125,84,17,213,212,78,168,172,93,173,129,171,196,38,132,157,143,184,45,112,197,26,96,185,85,96,24,233,42,222,51,211,227,71,67,154,159,38,178,30,238,235,27,1,251,238,135,158,102,193,147,236,196,
130,38,202,101,25,199,4,176,236,172,137,227,37,106,182,107,252,106,22,204,204,161,205,93,66,117,131,82,237,5,21,150,182,196,195,80,78,110,218,228,32,71,78,179,19,99,149,68,234,82,102,120,93,94,186,127,89,157,132,182,149,102,223,172,232,224,214,135,225,190,127,127,87,220,14,49,119,91,220,142,68,153,180,109,83,21,217,140,32,32,251,19,19,11,81,244,37,154,1,142,13,227,108,130,187,197,89,1,142,57,164,20,73,159,179,249,115,40,107,93,237,31,175,248,79,215,123,9,97,121,5,190,204,83,198,171,41,9,190,24,14,36,204,129,93,245,186,188,153,123,4,138,222,39,50,201,205,227,170,8,165,72,27,183,45,227,20,46,217,40,162,90,184,131,122,124,195,29,210,124,204,142,189,247,244,110,97,116,247,80,52,228,167,132,125,85,52,159,205,132,174,34,190,24,120,55,95,107,34,217,196,185,182,252,7,21,105,38,41,246,239,197,217,71,37,197,112,177,204,188,96,45,197,190,150,99,236,122,200,165,83,161,44,78,154,34,239,171,53,199,185,116,148,208,20,149,
55,15,240,61,45,36,186,30,133,64,211,208,107,249,32,244,182,9,115,92,164,98,75,8,251,160,78,156,45,179,112,166,134,163,96,234,213,167,233,116,4,37,94,150,236,101,73,6,136,11,53,97,147,169,190,22,169,199,17,136,70,14,179,40,170,147,209,71,100,59,147,201,53,231,243,251,155,171,175,52,67,61,187,39,212,138,34,234,184,196,242,97,109,187,102,243,151,154,27,106,108,84,130,42,28,142,16,199,249,201,171,191,252,221,17,58,213,56,3,138,254,142,246,18,23,18,116,18,138,62,61,165,188,93,184,214,215,173,82,197,140,117,151,27,91,166,241,25,221,178,209,113,146,28,243,97,97,43,90,225,10,82,161,57,163,87,126,14,47,37,109,3,114,177,86,143,139,174,213,158,200,197,226,66,227,90,220,170,141,25,5,216,59,98,135,51,105,116,112,89,103,53,127,230,52,187,209,157,110,10,59,84,225,105,91,183,97,170,121,213,85,205,73,215,71,54,230,43,166,194,131,125,250,36,228,114,54,142,45,1,186,24,222,219,36,65,136,105,132,206,189,39,93,178,142,233,
31,87,3,235,145,171,209,86,200,183,118,255,107,211,103,212,73,76,220,157,33,166,48,217,141,122,148,41,128,120,102,113,93,102,191,158,117,228,201,205,90,220,84,236,219,101,208,29,87,160,228,164,197,128,177,146,27,91,165,211,244,62,206,223,235,238,212,177,16,1,174,192,145,138,4,134,145,192,148,110,36,166,118,179,13,60,135,107,106,57,176,12,238,9,209,37,48,136,92,118,184,168,105,196,86,240,57,170,40,200,105,248,204,62,186,45,160,210,234,178,74,217,170,254,90,101,245,170,214,93,238,7,126,53,104,25,180,219,165,132,146,149,180,237,119,183,222,226,242,9,45,110,45,1,80,201,181,99,161,43,252,112,221,216,55,1,132,221,66,96,52,194,62,185,105,41,23,141,4,38,67,125,175,207,76,135,84,214,199,35,135,235,191,170,93,101,145,83,154,36,90,49,30,17,251,90,236,170,90,179,85,101,157,27,200,163,1,197,152,233,118,39,105,252,252,218,113,144,199,254,143,174,222,163,85,154,52,77,211,252,43,31,204,178,135,130,158,69,195,208,204,31,152,213,108,134,
89,85,81,81,217,49,85,81,149,21,145,68,102,146,100,66,131,107,113,142,107,173,253,184,214,90,107,63,174,181,214,90,107,125,92,203,254,178,155,174,238,25,48,12,211,143,241,242,218,125,223,207,198,174,83,205,192,61,22,55,78,230,236,113,232,148,78,97,106,191,45,105,37,166,233,167,64,163,212,168,187,57,91,67,141,227,243,191,187,55,194,156,222,1,197,218,103,61,95,1,110,122,228,220,101,30,79,152,156,154,120,35,170,113,82,129,107,219,73,82,90,59,129,194,35,74,85,62,169,112,84,147,154,160,160,16,213,113,74,119,218,118,106,103,68,9,254,148,76,91,148,69,99,235,177,157,42,151,155,190,212,215,182,26,97,88,238,219,233,235,118,130,125,93,143,174,68,57,245,102,119,242,186,56,107,148,180,86,148,42,132,1,208,17,211,194,134,108,8,201,233,136,83,109,49,210,45,25,43,156,35,5,120,204,86,132,196,203,240,168,241,204,39,49,4,3,77,96,34,111,124,198,45,31,195,10,67,39,55,69,99,166,26,141,60,75,96,228,168,65,168,248,182,26,198,86,
146,55,210,99,40,131,199,239,121,244,91,94,249,165,19,143,119,185,212,88,84,145,17,9,201,92,15,43,225,240,142,97,200,60,4,11,79,124,174,189,223,89,68,129,157,3,23,123,224,227,38,63,233,37,173,126,30,68,234,153,75,234,66,40,123,91,6,251,190,203,49,139,91,56,16,81,10,171,48,82,176,39,6,246,114,113,214,126,54,229,173,186,217,253,100,185,71,198,20,223,82,219,93,173,196,176,158,45,81,187,84,159,215,6,142,109,210,167,230,67,170,125,54,184,173,53,72,171,73,29,172,80,5,13,231,44,247,152,35,240,229,235,46,163,10,158,49,59,143,143,99,151,175,226,232,86,185,238,208,28,154,158,142,206,170,191,223,238,171,56,184,140,229,62,175,187,241,104,254,142,253,74,75,164,20,137,91,237,100,242,11,158,179,201,184,219,203,22,235,133,108,104,182,117,213,48,147,158,218,40,5,23,178,153,96,244,61,152,156,103,50,25,185,16,200,105,200,210,69,21,119,47,83,214,251,155,1,33,161,184,62,253,165,150,105,237,1,169,30,214,55,9,105,25,0,214,
5,47,230,235,253,213,78,205,191,235,137,24,30,91,181,47,134,22,221,251,181,39,190,73,167,135,133,69,68,71,136,24,200,186,164,226,211,30,59,206,16,152,212,129,196,79,120,103,244,68,76,238,33,195,197,245,211,240,24,232,31,133,174,13,168,159,126,234,155,83,222,110,202,139,157,17,25,145,207,170,119,251,224,120,68,229,211,55,27,175,3,171,40,194,65,67,34,75,233,180,89,216,75,9,241,90,204,52,42,201,125,16,148,196,62,170,199,223,1,124,118,60,112,134,167,61,29,56,206,46,235,246,197,16,31,232,147,196,196,7,60,84,52,65,116,32,244,71,244,58,105,16,130,135,232,128,18,134,143,64,75,124,108,67,56,171,224,56,49,226,23,144,45,38,150,137,63,54,121,24,94,122,188,118,75,55,223,114,65,138,223,141,43,49,183,85,179,82,66,76,250,16,164,21,115,247,228,49,236,193,250,176,45,83,135,134,130,186,254,114,126,84,228,57,236,170,64,234,103,89,1,92,134,129,210,36,223,27,10,145,152,44,30,147,84,67,18,121,88,166,144,243,69,114,123,97,
171,100,43,249,218,197,37,156,73,137,214,209,42,250,56,111,177,77,3,168,86,14,162,57,220,221,28,152,91,171,163,138,167,205,176,53,41,168,80,118,53,148,158,52,145,193,54,76,78,8,53,38,50,104,86,139,163,28,22,42,220,41,37,185,12,185,182,73,88,226,15,167,8,176,130,9,235,28,236,152,0,13,244,116,178,185,47,89,67,177,82,72,99,99,215,59,175,32,79,174,214,197,230,253,217,188,3,179,108,110,236,72,182,2,114,217,176,89,60,89,162,7,6,28,214,0,12,50,48,81,190,242,115,82,207,68,123,209,72,142,62,225,7,12,194,40,84,172,79,240,87,29,97,154,22,99,18,41,29,193,247,254,142,138,159,107,184,212,15,136,84,171,75,128,201,124,34,13,233,214,216,118,27,130,47,130,37,142,201,164,49,117,64,152,19,25,227,119,140,86,31,14,51,62,124,88,103,8,62,11,92,21,4,51,190,30,207,21,190,136,97,211,247,110,141,165,28,218,145,234,24,82,204,4,162,194,120,141,197,84,90,143,234,70,183,21,132,227,17,6,86,158,180,2,96,201,
248,240,183,12,248,198,92,201,206,52,41,132,38,213,92,25,82,74,63,61,124,218,21,197,203,210,78,239,61,71,203,177,179,223,28,144,221,95,182,195,52,186,53,133,124,28,31,166,67,88,146,240,19,38,126,98,34,18,187,9,144,99,4,12,65,70,226,0,129,0,34,34,105,44,157,74,50,5,239,117,236,10,158,28,200,134,99,19,241,232,112,197,125,173,58,59,184,78,10,61,229,223,57,18,82,212,147,82,51,98,106,182,62,169,104,241,10,121,61,148,65,163,171,18,61,5,229,189,28,72,201,71,1,53,153,224,215,83,64,136,113,251,174,227,58,179,26,114,35,155,102,225,79,223,29,1,30,230,60,71,59,97,144,121,188,120,212,107,61,94,5,193,237,162,121,24,244,136,27,71,160,179,190,137,178,233,112,215,226,17,102,125,93,141,198,58,22,245,226,152,221,7,25,106,136,41,64,125,102,189,32,18,221,219,83,242,116,7,115,78,39,17,225,36,122,111,196,144,17,18,141,85,95,85,188,83,42,119,42,231,222,168,112,230,154,102,96,151,71,155,202,72,158,174,10,177,
169,3,81,244,66,8,182,198,188,123,0,52,184,135,193,220,58,103,188,24,14,106,68,97,71,78,12,140,27,121,47,176,100,241,220,50,229,177,82,114,118,141,103,189,201,94,8,199,4,2,4,23,72,222,208,248,69,155,113,244,45,165,70,142,212,118,232,191,8,155,123,190,177,253,158,28,195,150,32,187,2,32,108,23,239,141,245,156,122,70,38,179,215,58,161,146,16,229,84,34,13,203,69,89,35,116,156,219,89,11,127,29,215,60,98,111,149,140,0,21,21,38,146,91,235,144,225,80,208,238,196,197,221,54,228,221,30,56,205,196,217,50,14,23,188,130,160,143,137,247,67,250,211,239,218,100,121,50,239,118,43,67,210,80,111,10,18,72,237,21,82,122,155,220,119,107,96,18,117,22,87,212,202,68,66,62,113,198,169,148,247,104,45,94,215,188,117,17,157,128,184,213,51,97,56,120,155,53,106,104,98,198,27,83,142,170,104,77,39,52,192,111,252,6,42,24,217,118,206,242,237,11,207,99,15,142,82,44,244,181,51,46,83,174,167,161,179,147,6,128,165,243,119,213,51,66,
157,204,157,128,157,134,37,34,53,198,75,177,35,153,14,9,120,131,30,90,221,89,87,213,235,1,102,174,143,195,77,52,48,156,82,219,99,61,209,242,28,65,188,36,79,68,63,167,129,26,155,91,148,9,24,109,30,82,125,28,88,152,3,249,244,166,227,97,171,28,66,176,197,97,54,191,175,17,26,130,154,3,191,115,16,236,112,118,136,117,80,152,196,246,80,158,92,226,99,81,75,76,86,198,128,27,124,63,63,146,116,152,165,167,192,122,86,142,163,185,153,222,243,135,129,140,78,52,18,129,142,35,37,102,134,187,0,213,250,148,57,254,86,10,101,202,7,184,189,77,154,184,222,74,15,51,87,177,35,240,118,168,186,122,15,81,239,113,106,224,94,234,27,242,115,75,161,62,246,16,228,250,239,215,92,255,75,89,147,156,231,203,47,118,196,180,162,78,97,40,107,171,37,234,184,148,35,83,155,55,162,141,13,76,27,71,83,195,117,20,105,141,214,99,209,117,190,235,210,148,104,164,131,199,233,208,173,166,33,135,135,98,94,174,135,139,162,116,200,168,78,22,221,46,191,127,
58,23,228,196,151,159,12,248,66,49,136,94,216,209,145,75,108,98,153,4,246,53,254,173,128,119,59,111,113,189,247,143,4,124,170,117,14,3,58,149,65,140,194,215,83,40,53,84,20,30,228,253,134,50,16,20,125,127,78,185,119,164,78,243,208,105,238,218,75,154,45,88,179,246,42,250,45,70,65,211,222,130,107,71,236,2,242,36,80,136,77,64,32,107,92,217,213,154,161,190,30,199,205,247,250,234,6,246,244,200,176,178,194,104,93,58,46,7,215,237,12,190,89,203,142,227,118,181,24,55,172,213,0,195,233,46,60,238,156,71,179,187,229,187,202,31,81,71,77,183,51,109,209,185,33,30,215,179,42,1,146,138,88,82,16,43,188,9,49,147,87,198,73,64,21,138,178,30,206,204,170,241,44,83,94,179,180,38,187,253,44,179,121,98,132,162,75,226,250,172,12,94,242,121,229,44,122,128,75,208,155,166,115,42,6,148,220,8,186,240,121,94,123,177,251,252,113,91,48,207,13,4,9,76,170,83,3,216,143,3,30,160,176,236,136,158,7,69,101,166,105,248,46,72,61,25,
117,226,18,10,115,69,109,108,58,213,134,51,75,183,150,205,106,253,145,52,231,209,16,123,150,185,80,221,233,214,182,163,3,140,155,173,113,232,166,251,23,99,232,246,221,228,130,84,35,101,108,187,240,253,235,57,119,102,191,115,114,138,186,41,191,193,222,40,226,176,180,93,104,233,198,158,116,202,181,186,28,55,173,206,171,200,133,213,70,124,80,28,130,232,65,237,54,62,172,105,38,67,229,97,62,83,144,206,178,55,129,231,121,231,204,76,118,174,76,97,220,226,5,44,27,101,26,17,117,78,7,89,95,34,42,222,21,160,193,193,54,22,73,232,108,238,189,205,13,57,227,233,22,102,224,106,27,178,30,237,218,248,234,211,202,209,90,94,3,120,155,240,74,237,178,237,161,108,149,222,57,197,20,204,45,167,242,66,189,128,32,202,68,136,235,177,69,240,89,75,189,161,97,190,150,190,67,26,191,23,163,38,126,205,72,65,95,177,20,155,162,93,30,160,129,8,139,199,70,116,24,223,29,121,35,214,177,199,221,110,102,233,252,136,60,74,129,181,249,130,54,126,34,75,66,240,
227,216,39,30,13,28,69,233,157,232,44,99,234,160,114,10,68,77,37,242,240,163,194,146,148,212,243,135,117,129,59,85,213,36,109,146,42,239,207,72,9,169,156,144,111,210,110,154,205,138,103,217,117,199,46,28,181,35,85,143,133,8,231,207,145,3,187,187,66,79,141,100,73,229,22,69,75,87,76,109,71,169,37,103,242,250,132,255,21,44,53,221,45,63,239,13,167,98,222,117,134,94,202,86,100,27,45,253,105,235,154,237,171,32,156,185,1,222,14,211,216,118,46,208,178,14,178,139,209,109,62,10,63,53,153,220,85,142,131,24,158,108,207,198,124,230,205,148,75,139,117,53,230,73,94,27,221,82,236,198,125,168,250,22,181,251,161,62,143,147,113,42,113,125,104,191,238,214,219,182,127,74,140,211,239,154,86,106,136,242,220,246,167,123,254,132,118,172,175,240,182,105,129,73,21,143,79,233,68,117,111,228,204,141,70,104,162,90,140,7,39,237,151,218,110,155,170,88,62,50,46,21,51,185,120,123,158,89,127,83,172,107,5,91,178,32,184,225,116,243,211,11,182,98,106,42,
243,34,50,233,169,216,101,242,161,199,170,52,153,46,167,116,48,235,133,63,39,125,134,9,79,251,140,241,51,165,58,63,68,111,12,144,75,51,22,138,14,248,57,226,15,69,18,71,106,141,229,179,4,121,245,202,232,250,171,185,107,100,9,161,47,238,82,19,154,106,190,63,68,183,178,154,91,117,30,22,247,75,129,118,79,51,220,247,215,190,231,202,183,83,235,186,211,49,178,181,112,51,103,161,159,105,237,135,66,243,233,124,160,180,8,65,66,23,159,146,74,128,83,154,250,186,126,235,13,202,13,68,168,224,197,0,54,105,19,247,68,182,60,199,80,165,246,187,182,224,188,203,243,198,124,121,69,204,57,87,40,194,247,11,27,202,124,131,159,207,217,222,38,188,26,137,209,91,201,144,102,92,128,14,78,242,85,228,174,4,11,255,228,154,210,123,251,30,188,218,99,110,188,182,87,228,210,93,22,69,178,134,109,189,32,33,101,193,148,83,134,235,157,216,49,132,97,6,138,249,31,181,71,15,183,243,202,196,74,22,23,83,166,67,61,133,74,198,91,175,101,235,173,155,40,237,
118,217,166,179,175,248,75,69,57,234,40,169,176,66,213,212,48,110,45,115,245,240,156,44,110,141,250,233,161,210,127,241,132,236,103,35,23,77,204,63,70,189,147,102,116,210,229,234,96,250,153,50,234,145,77,72,222,158,140,79,98,4,240,196,69,242,220,164,238,242,1,150,101,66,91,63,167,214,205,156,44,169,77,59,74,249,52,160,187,135,223,95,84,96,6,251,124,209,83,206,185,76,100,181,41,174,31,129,92,215,155,218,68,8,104,81,94,21,64,1,231,140,49,68,101,21,99,109,19,85,125,168,65,52,169,242,60,14,51,191,189,65,14,129,168,41,200,140,154,69,17,147,68,22,52,119,73,181,124,81,125,233,20,212,146,165,52,92,149,181,99,121,101,44,127,147,123,103,228,254,145,132,20,178,213,33,58,9,199,75,124,69,37,95,155,177,84,15,124,167,118,216,132,184,128,10,104,115,137,70,130,35,150,118,228,234,162,105,32,169,43,17,27,68,147,40,106,27,121,221,219,107,71,116,107,31,80,75,14,111,108,246,163,133,25,220,149,48,121,200,206,143,104,116,226,66,
86,192,209,138,244,177,181,2,11,52,33,80,152,241,138,51,145,124,180,30,48,36,10,178,132,249,188,190,97,140,88,203,29,229,8,245,145,71,74,70,219,114,57,154,81,33,42,182,117,127,238,13,201,4,202,24,193,156,98,22,128,99,20,184,141,132,85,200,88,34,48,108,3,128,70,175,213,10,85,87,128,227,242,184,154,143,62,239,233,82,246,160,236,241,214,206,247,126,117,152,214,131,212,238,148,230,21,148,18,185,190,178,178,55,155,0,3,161,235,72,2,199,113,101,104,180,35,241,217,188,15,248,95,19,94,245,157,251,132,164,159,178,181,139,64,224,216,66,237,175,128,31,5,233,134,110,43,55,183,243,236,84,159,169,57,147,143,73,239,181,43,76,157,26,109,177,21,177,141,52,192,37,99,93,102,83,116,133,144,198,2,242,232,247,121,150,173,233,15,36,48,100,130,16,216,253,17,190,26,151,192,70,204,212,154,48,12,103,205,177,201,18,154,144,66,65,70,80,85,108,0,139,143,32,10,170,8,174,192,249,78,184,140,192,24,205,218,133,3,225,42,151,224,245,148,156,
12,114,249,233,173,226,50,101,201,102,146,167,157,21,249,138,148,168,219,248,35,212,15,23,2,176,140,120,230,67,90,7,202,0,205,170,97,142,235,152,20,40,1,76,248,8,142,105,105,200,5,49,204,203,94,118,137,232,137,255,236,88,34,8,46,29,226,177,213,130,159,81,175,243,50,7,63,224,251,79,247,53,231,254,158,136,220,87,2,80,34,140,241,49,235,248,177,180,154,250,42,119,119,108,144,140,120,90,68,92,117,206,223,20,151,119,241,99,174,64,56,216,212,109,21,65,37,52,58,211,92,229,2,234,55,184,52,180,36,16,82,244,123,249,77,84,104,140,36,204,234,131,143,241,220,231,228,58,36,49,75,95,147,170,68,150,139,70,75,185,24,180,199,7,111,13,249,30,219,23,119,188,205,214,229,171,100,20,78,73,225,97,148,210,17,117,139,137,118,121,129,99,37,252,36,241,156,36,143,245,49,233,54,200,163,135,233,205,83,190,177,245,205,89,137,108,255,0,33,16,124,4,196,76,114,116,62,51,50,25,255,195,5,217,231,162,82,159,28,201,59,77,223,40,111,57,
18,31,180,199,163,167,31,8,0,232,13,116,231,71,52,192,125,135,41,134,159,110,207,49,251,192,61,62,27,227,186,7,123,158,83,60,4,50,153,121,236,114,232,243,17,199,86,31,129,21,138,53,230,225,98,43,100,104,230,93,12,245,116,41,244,114,179,214,204,163,3,182,118,70,255,134,162,25,169,138,170,184,3,129,249,3,170,139,78,47,43,159,66,236,199,187,100,92,105,111,198,3,241,77,136,114,104,96,30,169,109,113,26,50,185,135,99,53,119,16,17,216,250,234,241,179,218,142,162,23,66,103,236,88,237,142,197,169,215,174,49,29,155,136,147,172,40,5,153,226,238,70,94,4,199,214,39,176,40,73,125,188,158,199,142,174,148,239,147,113,35,166,136,41,132,36,2,249,130,36,66,83,150,134,206,121,2,226,19,21,29,150,85,160,251,165,71,227,58,187,144,225,116,105,42,82,24,106,225,4,143,199,58,194,82,151,14,248,64,248,28,222,95,35,177,213,95,52,54,125,88,141,108,84,81,8,205,173,42,167,35,34,116,234,34,198,74,64,234,75,78,140,245,71,110,37,
175,90,1,165,181,127,38,177,191,203,133,231,73,25,214,216,48,148,93,100,72,17,132,246,120,192,65,74,78,14,34,0,66,121,163,78,135,61,202,79,185,71,229,70,178,98,163,238,214,136,74,2,163,31,89,36,240,25,123,118,11,177,166,254,194,226,92,4,73,14,46,195,6,161,165,94,93,187,235,181,170,16,43,135,210,122,134,227,205,32,20,43,132,110,52,67,97,13,145,56,186,68,34,182,243,192,232,59,109,104,214,14,46,68,97,9,225,175,132,154,126,153,50,235,203,171,145,114,194,157,178,108,118,126,191,185,102,248,196,39,133,48,7,50,103,29,39,1,221,76,66,123,192,171,100,75,166,146,153,56,59,91,218,126,24,235,30,173,234,9,9,185,45,244,175,21,51,126,236,29,239,100,40,104,105,34,116,25,111,71,70,79,31,42,145,167,10,8,220,46,3,109,10,159,118,114,20,200,132,53,130,228,254,144,199,163,182,211,108,64,101,189,68,85,176,240,71,19,59,201,151,73,8,132,59,22,98,230,241,97,146,117,35,16,234,163,217,139,48,122,122,34,171,53,142,1,
68,133,139,76,112,68,169,205,98,72,77,203,82,186,206,37,74,153,111,229,44,204,49,171,181,242,42,173,251,148,31,112,170,230,182,111,5,196,164,246,117,235,231,30,242,89,48,54,167,131,4,143,94,17,44,233,147,190,108,227,79,83,22,77,236,64,85,106,71,217,129,219,16,87,63,32,110,157,190,205,117,26,22,120,229,150,139,164,50,105,35,1,176,175,170,236,4,30,65,171,206,46,36,219,16,1,80,235,92,153,104,111,95,241,237,103,254,6,137,78,63,63,183,137,209,76,137,100,173,195,54,236,67,226,246,101,118,25,227,158,111,20,128,146,74,40,194,80,239,42,213,144,177,20,64,54,194,48,116,126,32,144,56,7,159,221,0,233,129,180,89,40,37,35,161,154,53,187,54,135,238,62,43,101,181,8,198,3,73,41,25,98,125,54,54,180,180,178,185,30,249,92,191,58,91,203,46,224,14,225,1,214,32,62,86,68,144,26,115,252,74,45,111,199,243,99,124,28,164,100,230,179,96,107,20,152,181,38,63,106,144,90,37,151,177,129,34,121,142,123,186,107,165,153,175,145,
127,40,147,100,124,153,220,181,144,194,157,163,28,17,62,84,238,42,52,206,32,182,196,25,41,68,163,190,218,21,163,107,223,101,214,247,218,99,16,45,38,94,182,112,106,171,179,49,36,116,197,151,139,56,180,26,115,201,218,218,237,135,48,91,104,180,246,144,211,110,114,142,190,120,152,253,35,136,191,126,110,141,96,187,15,59,159,139,135,51,201,249,144,243,98,228,149,122,227,121,167,44,23,234,30,174,166,184,54,92,239,178,44,52,191,185,249,205,43,9,221,29,224,51,200,94,20,199,49,162,11,237,180,144,131,225,221,177,177,218,133,209,247,100,27,137,78,212,14,153,31,51,250,13,184,194,102,80,112,223,7,241,164,62,246,201,45,220,139,242,126,45,42,186,227,239,221,38,77,186,126,174,199,85,162,77,169,82,107,80,168,100,222,51,231,206,167,52,249,110,53,209,60,182,110,233,107,247,32,238,220,141,183,143,116,122,230,166,186,25,47,197,226,251,45,204,249,153,221,228,208,135,233,45,6,162,216,89,197,68,196,85,152,131,114,206,75,137,135,124,183,7,51,40,36,63,
176,9,51,19,77,211,57,115,189,133,105,139,112,115,116,135,206,189,12,168,21,81,239,167,166,92,226,90,101,41,88,151,183,8,183,102,162,153,185,237,137,87,169,116,232,235,131,99,123,155,237,138,207,15,145,136,119,211,211,28,68,68,121,182,173,176,179,210,34,104,35,156,25,107,2,78,92,69,143,101,174,129,188,247,194,24,100,200,203,202,11,39,47,159,206,153,50,112,188,75,114,8,102,78,142,96,102,81,77,92,226,110,207,193,157,56,61,147,142,150,46,177,87,113,19,80,157,182,103,112,98,44,28,111,231,5,84,132,70,11,51,48,126,166,106,150,180,90,102,171,201,239,145,158,199,93,234,54,34,217,45,175,85,140,24,171,148,216,196,164,42,133,68,190,66,200,150,9,65,167,130,229,98,173,154,190,252,36,198,249,166,44,85,223,30,203,37,173,251,86,251,72,70,49,218,48,187,146,238,31,141,5,58,40,100,10,81,2,233,103,47,84,168,231,107,119,175,108,61,151,108,17,22,62,37,21,23,178,20,204,80,136,122,11,2,63,192,56,233,98,149,81,52,94,233,98,
249,168,8,188,76,218,203,27,192,25,109,11,189,61,241,73,40,206,77,229,21,187,65,206,160,51,72,198,189,138,234,113,49,176,113,166,72,36,76,240,65,110,43,193,145,81,242,52,81,96,90,17,106,25,55,34,143,113,149,17,194,40,52,196,206,175,207,22,252,30,40,115,253,194,232,238,195,172,105,105,30,114,234,246,59,217,243,12,46,24,14,141,131,194,31,123,53,122,18,133,25,125,159,37,32,7,177,111,81,22,243,97,2,16,12,32,224,219,34,43,51,149,104,97,227,79,44,242,65,199,33,158,218,56,167,71,44,153,122,132,28,167,26,196,178,201,88,71,220,125,174,101,206,45,12,149,49,191,72,185,139,223,71,87,29,53,70,253,31,253,64,63,244,169,245,8,96,235,206,138,191,176,128,132,115,236,82,95,111,126,178,183,169,164,106,152,197,119,85,193,236,132,50,197,5,226,245,185,146,48,116,130,46,75,37,127,164,212,143,156,71,125,15,197,223,179,64,213,211,165,136,11,114,210,240,47,135,75,185,111,166,3,115,130,210,36,88,205,205,144,70,133,190,248,222,11,
228,252,70,76,143,243,246,50,37,120,53,50,228,178,45,8,243,76,131,160,21,36,13,247,102,15,115,21,121,152,108,57,151,231,33,157,30,46,48,77,7,76,36,178,152,228,126,123,90,246,148,134,50,122,192,216,253,180,9,170,112,134,119,69,189,232,145,193,173,87,97,213,246,17,237,199,72,108,91,23,123,177,232,130,81,57,178,230,45,150,155,117,101,248,158,139,192,51,115,130,86,79,85,149,6,47,63,58,5,142,123,55,118,88,134,73,40,154,97,48,56,236,31,170,131,208,44,143,15,52,198,188,7,240,165,50,135,235,235,232,203,220,102,13,249,231,66,173,110,131,41,90,129,250,171,24,42,46,48,165,21,33,157,229,220,181,99,235,241,182,174,244,253,26,232,14,62,142,39,70,113,12,57,81,100,87,164,46,75,181,189,153,202,179,87,103,124,181,219,136,130,235,79,71,148,130,50,196,132,196,252,37,43,49,248,85,171,79,120,85,2,169,7,245,122,21,120,50,158,90,251,53,161,80,22,10,227,70,149,21,224,43,11,183,203,145,231,219,95,255,66,84,133,204,181,140,
219,172,70,10,116,64,166,242,209,230,198,209,31,61,98,110,241,238,8,220,169,21,89,18,23,255,82,117,190,84,171,48,204,226,160,43,172,236,178,204,108,40,27,92,50,228,218,197,167,98,156,120,76,205,26,219,86,146,135,26,136,186,56,10,9,119,117,0,54,37,71,246,9,94,234,210,26,159,71,193,172,152,19,134,187,110,184,90,159,192,110,86,11,59,254,163,55,108,198,41,226,81,217,178,100,115,29,215,80,176,245,160,93,61,198,175,198,234,252,108,70,122,229,71,230,30,247,198,222,213,130,34,129,210,90,53,99,207,80,50,6,142,217,132,233,158,109,114,39,175,40,40,150,240,43,115,26,119,103,93,98,107,145,78,145,214,171,185,116,164,248,32,96,181,5,134,133,123,1,122,187,65,195,187,199,10,242,202,9,209,75,15,233,17,201,62,240,155,24,126,119,191,19,47,131,246,100,44,176,104,149,79,164,190,100,71,27,242,24,187,8,231,89,139,105,3,209,6,215,87,179,48,229,199,68,49,230,32,243,231,64,33,242,20,175,19,226,69,130,39,156,14,179,167,113,102,
47,201,203,236,178,194,99,192,99,172,244,69,15,249,73,208,210,159,70,204,83,31,83,123,229,160,37,55,161,62,14,50,106,93,148,138,124,108,36,155,77,159,213,172,0,134,162,247,125,57,39,182,202,157,221,89,58,232,182,218,114,107,237,165,158,16,58,115,52,84,205,218,255,74,21,155,53,68,107,106,106,143,119,192,116,79,113,251,44,125,95,184,98,183,37,141,243,154,7,188,39,135,254,61,60,208,115,112,238,149,121,107,89,157,200,83,237,196,90,161,170,220,33,233,205,242,30,117,247,25,179,167,184,18,189,237,180,9,51,100,105,39,204,224,239,194,110,207,67,127,110,129,13,7,111,162,59,9,214,162,86,178,18,79,220,25,180,28,133,176,247,152,101,46,157,108,42,48,241,190,14,62,65,158,67,11,131,117,85,191,128,87,53,240,46,113,94,216,230,220,220,63,3,64,146,148,207,229,50,36,163,169,16,185,209,197,165,155,133,44,146,65,192,191,252,70,246,206,34,112,71,57,168,34,133,91,117,27,69,214,132,134,3,38,26,202,213,179,103,16,202,29,186,93,70,226,
227,85,163,4,180,239,65,252,64,94,77,223,132,2,207,133,221,128,133,60,46,242,174,251,254,24,230,74,215,34,84,172,122,99,196,63,201,143,184,173,153,169,34,231,124,210,96,169,102,45,68,172,153,0,193,128,100,187,190,34,24,240,49,3,106,209,230,134,137,8,174,146,17,25,204,213,59,135,117,142,134,141,8,94,13,228,149,61,104,79,252,228,19,95,116,208,198,150,244,114,194,159,152,224,135,243,212,115,158,240,126,39,137,179,59,120,40,51,214,216,194,64,206,80,81,216,91,146,27,102,232,212,15,211,186,81,176,56,171,18,139,177,226,111,115,96,16,216,174,52,42,93,10,121,126,87,223,17,0,201,204,15,100,97,5,30,30,125,28,148,167,117,123,163,221,30,105,62,188,75,135,223,102,55,229,62,44,182,155,217,189,248,214,73,83,77,30,236,229,23,19,202,254,26,220,124,213,115,34,244,81,229,250,177,3,131,140,15,2,19,193,182,42,183,129,243,1,58,132,212,103,224,125,20,96,11,244,42,36,254,11,198,200,167,191,144,151,64,148,38,22,197,212,122,238,206,
183,43,245,124,250,50,152,179,123,12,137,101,29,222,128,248,8,101,185,128,39,53,196,61,190,139,210,244,60,104,168,40,149,247,169,59,131,2,35,151,82,2,171,11,17,170,153,55,225,106,96,48,191,152,156,105,138,70,157,212,28,6,144,80,171,177,160,244,109,236,227,125,45,14,124,113,145,99,115,239,149,126,128,92,82,148,78,159,11,214,21,151,118,70,44,172,62,125,187,74,106,236,22,117,78,117,224,192,165,12,216,13,224,129,252,61,221,52,110,87,181,10,0,187,68,5,184,104,29,208,235,67,235,50,125,22,52,7,1,219,35,94,238,237,243,198,9,10,48,253,1,94,178,193,229,9,150,78,73,120,12,79,27,110,203,231,120,20,79,142,230,226,164,56,79,22,179,177,103,204,0,62,213,227,29,104,175,122,86,42,23,214,111,14,78,163,171,2,82,211,236,215,204,8,144,25,244,9,95,157,154,62,148,243,33,48,230,107,177,39,56,156,232,119,41,229,187,5,102,46,199,65,150,18,160,18,110,103,28,139,136,6,174,82,65,239,84,170,132,176,227,60,130,173,176,123,
19,6,61,152,68,92,28,205,27,34,74,31,193,209,7,69,46,188,112,196,138,244,30,141,22,42,91,239,69,188,51,131,161,52,111,213,31,103,117,241,9,13,50,172,20,64,202,30,80,203,112,190,99,206,139,32,114,14,207,50,165,217,229,117,152,36,114,199,1,151,131,75,249,222,80,118,249,229,219,2,103,226,201,200,32,80,21,43,171,114,128,43,243,202,65,29,56,101,170,39,40,252,145,103,114,141,141,162,18,54,39,159,39,243,112,187,29,210,223,191,235,96,215,16,218,49,111,35,2,255,169,215,175,133,69,209,192,52,148,54,38,139,34,239,232,232,96,204,114,68,125,150,169,207,62,181,14,134,150,122,32,169,198,41,148,196,28,90,18,44,159,125,77,105,238,17,196,194,136,119,87,7,110,107,198,195,171,247,131,199,117,86,118,39,222,47,226,155,34,57,234,149,242,79,75,252,83,22,243,175,148,50,255,56,123,35,78,175,242,61,201,220,88,150,151,160,27,90,65,61,141,134,241,64,236,179,188,150,209,165,216,198,33,182,5,237,85,90,153,228,68,103,207,60,30,248,
252,131,56,153,250,73,104,71,29,191,83,216,36,52,71,153,24,227,22,21,156,149,82,161,138,241,156,92,50,37,194,203,101,55,40,2,143,228,125,115,248,112,61,237,83,38,125,139,153,53,46,200,231,13,2,27,147,124,147,34,110,17,18,208,182,140,192,170,2,134,63,64,208,7,80,7,79,126,240,197,31,93,51,49,211,249,108,103,212,225,149,139,35,49,181,97,135,80,73,114,233,181,116,235,226,24,173,56,25,70,120,45,158,203,70,178,41,113,53,246,93,113,11,232,119,220,97,11,23,239,198,242,215,123,174,252,121,63,168,183,43,40,23,148,94,36,237,235,175,83,108,13,125,2,213,91,184,148,136,158,37,136,78,72,73,104,224,19,154,41,224,220,4,205,13,77,208,235,129,26,25,152,160,27,180,8,199,246,188,89,192,114,11,248,45,125,22,191,165,85,38,196,144,40,110,4,217,75,117,41,6,147,195,187,71,209,88,183,143,17,48,238,164,222,194,188,31,128,237,237,177,117,31,9,61,95,1,247,2,92,237,124,9,150,180,105,136,140,135,97,233,146,155,111,3,19,
210,48,203,130,63,236,159,90,216,46,180,188,50,55,2,60,188,151,35,220,4,207,180,230,221,23,126,79,9,165,37,166,144,251,30,224,89,89,52,72,171,128,253,50,96,146,112,118,76,84,45,27,3,103,147,139,127,42,102,196,137,61,37,129,182,112,148,168,3,102,127,58,49,141,230,34,169,236,190,59,11,44,42,43,141,60,7,18,232,148,4,230,244,39,12,138,140,113,102,116,65,56,212,76,234,237,238,207,97,231,111,241,105,58,89,99,38,101,92,229,140,89,120,58,156,78,243,7,59,87,163,96,210,155,250,141,83,126,155,81,86,238,214,108,36,84,123,253,97,22,48,242,40,127,28,168,171,181,196,51,125,201,159,203,124,45,232,97,26,18,118,191,211,109,206,135,72,229,1,195,3,156,102,176,79,183,169,179,79,103,169,150,202,216,190,80,1,100,206,143,225,60,37,164,39,198,98,122,114,196,120,37,13,53,102,204,90,35,207,26,100,210,96,207,127,122,167,196,197,231,88,23,26,158,16,216,146,132,110,30,178,192,243,148,71,95,185,28,211,252,105,207,87,103,182,234,
0,213,102,47,30,20,204,159,215,104,106,147,154,157,120,195,123,38,138,164,124,193,195,241,30,118,8,225,179,109,212,141,148,177,88,209,58,14,56,160,133,230,239,202,64,219,220,102,127,72,29,117,5,17,97,198,120,195,201,53,128,215,121,171,170,188,70,245,76,214,68,45,16,167,193,75,198,84,197,177,252,166,25,99,115,30,62,122,41,94,229,182,54,68,165,138,41,201,231,176,53,2,83,144,224,46,23,56,47,85,48,38,88,27,175,219,150,199,236,122,59,29,22,241,70,194,227,243,245,102,119,253,38,178,10,90,227,196,132,166,134,16,95,124,85,211,182,192,106,235,165,4,21,146,94,30,159,9,72,232,115,253,178,126,44,193,154,171,41,25,107,197,91,174,156,176,85,89,237,188,53,194,135,121,68,32,232,23,137,211,210,13,156,185,7,7,35,41,38,155,204,239,202,233,165,28,76,189,166,196,140,136,224,110,155,245,215,245,132,34,12,157,157,222,163,242,156,104,203,196,76,193,36,108,129,214,158,4,251,82,117,127,137,115,253,50,118,57,140,64,71,114,106,141,233,101,
63,178,53,30,55,143,18,115,99,135,205,202,158,31,124,183,72,83,102,55,204,182,226,68,198,28,61,166,212,212,234,243,169,213,92,217,221,25,231,208,241,184,94,35,113,170,130,147,139,31,170,84,119,140,152,30,5,56,143,12,238,33,51,5,228,28,231,67,150,104,179,48,150,42,239,99,127,247,206,220,0,14,227,131,186,212,216,218,56,240,36,215,129,223,239,219,163,39,189,241,124,226,86,240,77,192,88,114,6,19,1,54,71,246,78,66,38,77,104,151,12,19,20,54,222,109,67,198,228,233,149,66,22,120,204,1,145,254,116,52,69,23,137,254,130,148,241,80,40,107,164,220,184,157,222,12,187,183,215,23,151,66,45,144,168,74,83,185,184,47,148,209,50,231,132,165,158,223,106,213,186,61,95,183,103,170,15,123,37,103,188,15,134,216,156,64,126,9,23,223,71,50,114,28,73,118,70,182,61,242,74,141,101,184,219,40,52,29,10,123,110,93,3,148,237,124,170,116,253,53,141,175,157,241,49,18,252,220,247,89,243,186,11,187,162,119,17,1,239,5,219,11,156,145,76,170,
19,146,76,244,163,100,209,255,98,190,2,238,189,193,131,190,164,247,134,58,72,213,34,251,148,100,254,146,220,32,174,100,98,171,76,172,187,73,61,62,249,160,187,41,190,71,103,208,103,44,152,174,204,210,96,227,27,202,234,120,7,29,201,176,247,233,119,63,25,125,237,59,6,219,117,10,180,159,36,149,27,17,148,232,129,0,169,192,151,146,95,181,96,125,82,204,231,192,33,62,149,64,32,189,223,127,164,241,238,40,47,231,134,151,170,107,251,52,219,214,48,248,225,13,162,86,192,96,179,145,163,215,106,42,10,121,111,118,167,140,120,204,155,73,33,219,82,35,57,176,185,50,12,57,229,153,84,191,183,172,119,130,119,19,106,13,207,236,1,104,175,129,128,217,32,94,43,250,121,62,91,61,60,80,253,19,213,131,135,32,225,100,48,32,12,4,134,1,118,144,28,12,80,195,146,181,7,97,107,211,136,45,33,126,251,90,14,174,94,194,164,166,181,60,226,155,232,241,62,105,197,6,207,94,45,64,220,110,48,144,11,93,44,14,109,241,188,125,188,147,162,90,0,110,66,125,
143,113,120,48,240,187,239,209,32,182,244,33,227,208,122,136,166,195,81,226,20,43,187,8,162,161,148,152,164,114,117,234,104,112,104,93,123,117,63,102,74,187,117,239,85,38,102,35,226,180,210,70,132,95,198,148,245,203,48,245,81,52,177,97,210,56,103,78,240,230,55,101,152,12,144,68,139,94,75,177,163,49,21,58,154,34,110,205,254,4,185,103,159,25,180,122,49,144,48,229,116,68,59,105,3,205,224,222,67,69,202,122,152,83,56,168,229,187,72,39,30,200,177,20,34,52,12,26,50,254,21,162,5,94,104,224,250,248,253,105,7,28,51,130,171,52,227,65,154,206,204,254,145,100,76,180,185,202,209,151,53,40,208,195,46,88,21,216,253,226,223,1,76,219,112,248,162,110,70,198,247,217,208,97,41,38,61,44,229,215,65,11,82,176,230,86,66,60,68,29,133,90,0,231,141,20,3,233,120,195,99,98,163,130,21,222,233,200,0,180,115,167,67,248,102,34,139,227,197,162,87,29,177,190,82,85,122,59,190,218,70,102,114,190,153,9,207,152,198,25,212,224,239,104,94,15,
128,115,9,67,9,150,68,244,37,69,200,156,187,24,75,221,141,48,240,186,46,209,185,226,69,233,135,225,193,145,57,216,155,72,244,98,80,194,142,128,151,146,155,99,241,139,214,118,233,178,135,73,97,149,225,7,47,254,204,170,7,221,34,34,141,148,164,143,67,120,40,87,91,244,171,239,221,222,48,90,123,155,181,196,193,180,181,70,100,110,37,228,71,90,32,59,215,228,4,141,148,149,89,144,34,101,114,20,112,124,19,222,160,175,176,158,28,91,22,245,68,70,123,138,97,112,29,176,16,203,79,236,139,160,208,41,185,235,173,5,180,24,164,84,121,66,92,207,92,48,229,185,241,87,6,93,227,231,12,129,217,34,224,181,99,122,159,67,30,242,202,65,82,199,80,235,214,233,152,141,64,84,166,131,19,104,115,155,177,221,70,105,237,33,200,243,30,47,183,139,4,90,123,4,118,198,103,69,207,90,172,67,102,104,49,121,48,203,134,13,236,34,233,87,63,207,194,101,247,20,9,16,249,38,238,240,105,209,124,25,136,111,254,201,243,57,105,131,130,4,111,72,31,61,171,149,
92,93,3,75,194,10,12,205,112,254,43,99,244,201,73,95,54,86,22,218,145,155,124,224,90,71,169,198,73,199,0,194,29,74,161,217,161,88,38,44,160,156,93,225,9,48,8,238,234,85,214,174,9,219,253,73,98,203,46,92,135,91,93,122,176,201,70,75,26,94,22,163,154,60,247,49,236,26,32,1,210,19,179,136,180,190,74,250,130,180,18,160,30,6,162,64,179,38,168,193,10,213,243,135,194,119,147,73,86,122,188,41,196,98,106,220,37,42,239,73,29,243,16,134,10,10,230,148,116,110,159,192,165,95,214,185,69,129,75,1,24,101,204,250,26,229,192,103,77,198,99,21,112,152,174,124,247,1,63,150,0,93,251,212,215,60,249,26,19,99,150,83,155,96,155,28,26,142,163,41,183,80,170,10,174,47,72,195,166,192,112,118,175,32,96,158,66,185,203,84,120,141,226,154,169,206,62,0,159,232,162,27,77,235,250,40,55,75,22,101,113,93,227,178,83,117,70,231,165,62,41,200,13,73,92,39,1,76,150,99,34,218,57,23,87,1,76,152,131,38,60,179,186,81,113,227,
78,31,95,202,188,55,135,145,165,25,113,93,20,100,120,56,169,121,133,53,58,147,57,85,134,214,137,212,157,69,164,155,99,130,112,15,153,149,6,124,160,156,134,157,138,145,161,249,183,46,105,199,93,236,208,1,15,112,209,158,79,146,147,83,239,8,152,84,192,153,212,7,164,190,11,35,174,92,122,246,132,21,206,242,76,236,187,97,164,224,211,139,221,178,100,60,92,200,135,163,28,105,240,254,240,130,114,81,164,244,169,78,99,132,237,103,219,193,185,99,195,48,198,217,25,204,85,107,229,147,63,73,50,204,176,234,167,201,197,81,91,137,66,1,65,86,87,204,107,154,21,196,68,48,179,26,75,107,251,126,184,100,203,81,88,144,46,92,226,176,208,222,244,144,148,42,150,155,184,225,173,85,38,59,149,228,156,183,92,116,14,122,10,244,108,168,25,61,242,208,243,61,142,95,241,17,86,188,192,187,47,143,62,78,101,161,246,72,10,176,39,3,165,145,185,178,27,74,139,203,213,20,189,203,207,199,200,205,5,134,118,175,57,188,208,53,160,113,124,226,224,120,132,38,43,226,
111,53,50,185,218,147,181,179,119,176,209,221,166,158,29,177,236,195,111,112,4,14,142,7,16,115,19,52,27,24,209,133,19,239,86,46,101,49,223,193,133,162,104,135,145,6,229,170,213,75,116,252,219,88,164,231,44,6,77,78,238,141,90,126,63,247,243,95,174,135,192,167,98,131,69,154,235,142,28,187,233,227,173,17,41,115,244,200,175,212,106,195,70,45,219,246,139,98,228,218,79,15,210,155,220,32,11,234,68,63,70,81,207,93,245,86,14,143,3,26,171,7,16,76,33,26,34,138,239,174,12,123,225,243,107,225,97,179,44,198,201,146,223,183,142,27,95,153,23,193,131,12,180,133,62,118,209,86,66,131,63,195,236,151,34,212,163,58,203,146,96,121,207,126,159,222,222,130,162,16,223,238,143,242,242,110,252,135,152,127,109,228,179,126,124,177,28,158,187,41,236,123,65,235,17,187,154,31,188,170,69,60,121,158,130,172,99,176,217,108,106,122,167,130,100,142,180,140,25,7,151,137,89,85,217,92,95,181,158,73,115,146,119,154,197,233,237,174,248,12,67,167,53,34,192,5,
13,43,114,216,33,15,202,77,116,88,157,142,242,176,197,53,221,171,219,185,193,62,181,173,230,91,231,41,207,243,171,148,113,237,163,231,9,96,20,131,137,201,25,23,219,214,67,112,35,135,222,186,57,88,143,155,5,51,199,121,183,15,106,0,167,224,192,204,1,138,196,51,151,50,86,68,53,151,243,176,24,45,221,84,189,14,170,228,69,177,30,143,52,49,82,212,22,205,70,228,196,163,52,107,210,182,44,116,62,175,138,26,35,161,231,83,212,193,205,176,255,158,179,189,193,230,171,49,217,162,114,198,164,92,108,170,41,150,224,18,60,129,27,60,121,244,44,217,37,245,193,33,134,124,113,74,160,135,215,206,197,119,120,126,134,92,140,153,52,139,186,78,68,244,21,43,40,33,249,242,217,181,183,186,116,104,62,247,231,170,224,42,150,132,164,216,96,188,99,172,223,171,203,156,25,82,126,66,94,25,40,168,74,220,59,30,251,61,12,177,151,34,106,122,24,65,207,18,22,82,214,201,160,75,18,120,40,199,65,48,85,232,47,93,8,89,102,21,226,90,44,227,170,40,226,93,
51,142,31,203,223,163,91,144,74,158,115,88,82,148,229,38,197,93,237,176,97,138,71,99,230,113,55,237,71,243,5,129,99,28,2,138,161,220,228,192,177,86,126,246,107,17,162,68,62,208,135,120,152,172,196,189,2,250,158,190,146,229,128,28,137,192,222,158,56,184,201,171,72,151,14,118,124,23,151,41,37,16,110,97,119,113,158,141,89,216,120,116,198,167,67,162,183,10,197,250,151,89,199,83,169,92,150,250,237,17,89,123,7,109,75,103,151,161,189,250,180,252,203,63,126,174,113,158,101,223,229,121,162,53,78,247,208,100,197,83,79,187,156,204,117,215,169,39,80,63,211,21,75,85,125,208,157,6,224,23,179,166,235,13,123,195,222,221,71,73,161,148,201,174,2,173,84,211,64,188,13,83,4,72,124,89,228,188,8,27,180,215,216,202,9,48,31,197,239,113,166,77,151,152,183,66,141,44,212,46,71,247,251,156,122,95,146,133,20,78,179,174,224,240,25,97,237,222,9,37,158,62,146,220,28,59,89,230,42,117,96,134,218,234,172,127,221,95,71,209,37,161,200,27,194,232,
177,132,169,244,120,178,218,115,123,103,215,173,75,149,168,223,111,67,194,35,250,94,74,20,172,181,124,104,211,219,176,141,222,75,44,194,11,71,236,223,87,116,31,108,200,109,149,185,171,150,136,186,206,62,227,39,240,147,170,178,187,118,101,26,154,119,207,3,232,234,149,178,246,134,43,194,23,237,156,189,217,121,170,135,133,185,123,232,172,187,253,132,181,49,144,26,108,249,225,2,221,239,254,233,171,128,0,116,34,31,149,23,109,83,128,84,18,131,151,208,23,24,232,133,55,153,134,192,53,11,199,251,150,104,180,15,141,49,141,96,146,249,118,55,114,232,66,7,243,48,80,235,39,48,222,174,154,59,3,61,27,105,56,144,234,242,248,130,113,183,155,207,148,36,198,83,140,43,224,21,57,194,102,12,61,103,208,241,62,4,128,14,5,102,182,204,139,14,148,13,129,48,229,170,189,49,143,10,119,182,15,131,99,139,95,78,151,72,155,153,124,63,191,170,184,212,106,107,200,8,35,21,25,164,149,193,24,30,109,206,90,78,154,240,210,184,153,128,133,41,199,90,1,197,160,87,
220,61,172,71,167,120,157,16,77,50,163,252,113,152,59,138,166,153,163,24,103,90,19,12,135,158,20,206,191,99,21,176,44,6,170,79,65,156,57,141,33,82,158,6,32,76,253,136,5,188,144,150,203,62,98,167,223,28,183,25,248,141,17,10,251,230,18,177,103,35,106,159,10,201,8,96,158,241,88,183,107,47,140,52,18,238,224,210,100,187,98,50,57,6,166,28,14,79,5,184,107,254,237,241,3,216,188,235,121,43,163,16,5,20,116,13,17,22,69,197,138,78,81,163,221,74,7,222,209,105,188,225,62,35,191,86,206,42,19,159,206,122,178,97,132,34,246,157,38,214,3,30,235,119,18,201,4,242,245,228,230,46,18,63,113,193,145,116,136,14,222,108,210,214,172,72,51,229,135,148,39,165,254,229,81,149,152,46,103,130,103,111,154,207,249,135,206,49,213,188,246,129,107,110,0,163,244,81,199,158,1,180,107,237,72,200,221,176,153,79,75,203,122,105,5,78,233,37,203,202,164,137,185,238,26,88,233,93,105,98,127,207,117,109,82,109,179,136,175,180,102,11,156,29,190,86,
126,30,179,29,80,17,253,232,50,158,218,229,219,44,0,135,181,195,192,53,241,244,101,18,243,176,68,223,35,185,137,124,177,122,25,26,172,167,44,107,3,168,165,198,151,23,154,65,154,163,251,4,13,232,223,240,155,218,139,248,170,58,233,124,194,7,232,171,76,41,123,204,37,151,135,154,196,12,175,190,136,150,134,87,1,37,231,92,4,130,251,80,234,222,226,49,95,70,104,208,161,238,40,1,141,156,60,99,186,238,128,182,207,196,3,215,29,165,197,139,72,121,248,19,82,172,206,134,192,210,96,144,39,119,213,135,92,147,199,10,73,74,165,95,165,107,162,81,175,62,198,151,33,146,116,6,215,23,251,94,244,22,240,172,62,110,39,204,78,142,143,64,124,197,106,24,203,46,110,133,167,141,115,106,154,200,150,218,175,245,27,238,171,254,208,200,199,60,141,180,179,44,100,61,229,98,230,56,115,91,158,167,143,181,244,214,170,194,129,118,3,120,59,134,35,115,201,252,10,152,105,149,110,56,142,221,205,140,140,208,75,23,22,220,26,39,231,75,192,222,236,5,172,79,254,207,
16,169,55,52,132,109,188,118,184,253,86,131,16,123,209,93,200,158,128,36,194,79,25,131,194,89,13,192,222,26,72,55,104,243,201,97,90,43,215,109,36,78,227,113,183,15,7,69,180,21,15,232,61,9,198,30,130,97,193,70,27,69,248,96,36,18,252,33,38,129,100,34,14,105,16,211,188,236,150,87,217,191,50,170,177,87,11,130,91,156,39,103,80,173,93,172,3,170,178,216,150,155,116,51,213,60,58,179,134,65,208,196,160,59,45,124,168,60,93,224,24,22,58,62,247,189,224,109,54,173,207,195,197,202,64,138,63,119,160,159,135,179,124,152,71,52,170,145,131,238,97,21,141,247,23,199,13,244,190,196,197,151,45,170,153,118,169,47,191,204,217,253,216,195,31,93,150,146,48,192,148,212,212,85,26,56,72,149,81,153,184,146,131,143,59,102,103,168,104,169,72,33,14,36,225,171,11,14,128,245,48,125,187,71,243,106,93,245,189,115,93,224,28,125,222,145,64,159,210,168,203,52,133,205,138,30,127,147,232,77,207,235,224,37,169,211,162,184,27,133,219,225,74,111,48,109,
74,173,82,171,158,156,215,171,182,53,123,248,230,254,61,186,205,187,18,48,7,244,196,16,16,218,65,97,196,24,146,88,194,174,137,50,113,109,16,235,217,54,186,166,205,237,86,163,9,96,116,200,242,235,96,41,44,58,60,119,147,124,114,101,201,202,157,31,132,99,251,245,98,1,30,96,56,3,194,248,28,174,178,31,20,60,66,8,210,77,186,160,217,224,112,59,132,86,13,130,140,48,130,192,217,222,79,43,247,123,66,179,175,171,114,123,69,222,214,177,242,91,151,108,116,141,159,242,115,140,46,22,102,197,33,54,82,104,123,193,245,98,74,105,250,252,82,119,174,207,85,70,60,68,10,134,149,40,68,152,96,110,121,73,126,245,213,218,113,183,115,195,151,68,118,209,11,220,11,165,156,242,212,74,6,196,117,166,29,101,122,162,230,213,7,80,197,2,90,36,250,53,56,67,2,88,0,164,143,45,153,245,46,220,149,135,107,112,144,104,213,163,221,22,239,10,32,108,151,68,128,200,132,204,131,81,196,177,110,88,52,73,235,145,128,171,70,245,94,122,105,92,18,232,230,38,
56,165,148,176,142,157,14,217,105,181,118,190,222,96,245,184,191,14,246,201,253,171,77,77,63,154,253,246,85,34,113,39,35,154,103,181,155,124,135,8,21,204,188,159,0,24,196,252,199,38,151,223,33,53,234,98,234,235,128,34,100,209,223,173,61,106,137,202,185,32,226,75,83,221,156,105,76,207,60,247,186,156,40,107,112,4,240,136,60,205,86,26,64,115,107,63,203,238,247,253,205,240,162,62,188,222,8,169,243,136,63,110,0,82,35,0,168,193,159,98,50,55,127,60,38,143,107,123,247,21,145,191,6,158,29,247,146,132,94,214,97,114,1,250,183,255,249,63,255,149,48,248,191,253,199,255,227,223,32,133,255,21,213,248,255,63,248,63,145,11,255,248,187,223,253,253,223,252,254,151,63,254,250,155,31,255,223,95,126,253,199,31,255,254,111,126,254,241,15,127,247,63,3,30,255,238,239,190,253,95,191,254,242,143,191,254,240,175,223,254,244,231,127,249,229,215,191,252,249,247,127,248,227,63,255,248,237,15,63,254,230,159,126,249,249,151,223,254,242,143,63,5,232,223,254,246,
191,51,15,255,239,223,254,225,167,127,253,225,15,63,254,253,191,251,251,127,247,223,129,145,255,86,248,223,192,135,255,203,111,255,247,255,240,31,127,253,247,255,254,127,224,20,255,63,76,201,255,231,247,127,249,241,183,255,242,211,143,223,126,247,235,15,127,250,225,219,95,126,248,253,31,126,253,203,143,65,231,47,63,255,248,55,223,254,207,31,190,159,249,151,95,126,251,167,239,235,111,191,254,242,151,223,253,242,167,239,151,255,230,159,126,254,233,175,220,198,255,245,219,191,252,242,187,159,126,249,211,95,183,191,253,246,143,255,240,237,143,65,231,159,255,219,222,63,252,248,151,111,127,250,33,232,252,249,199,127,254,246,219,159,126,243,87,80,229,79,223,254,249,199,223,255,225,123,129,127,248,245,151,159,127,250,254,248,111,191,252,250,195,95,190,253,143,114,223,126,254,225,219,191,254,242,155,63,127,251,229,63,125,175,243,211,143,255,233,231,159,126,243,79,223,254,248,251,63,252,240,167,255,250,114,63,255,249,55,255,244,55,127,251,125,224,255,246,191,0,53,156,161,31,

View file

@ -0,0 +1,7 @@
TOPIC("About$en-us")
#include "About$en-us.tpp"
END_TOPIC
TOPIC("About$pl-pl")
#include "About$pl-pl.tpp"
END_TOPIC

View file

@ -0,0 +1,14 @@
description "Simple image viewer";
uses
CtrlLib,
plugin\tif,
plugin\jpg,
plugin\gif;
file
main.cpp;
mainconfig
"" = "GUI";

8
examples/ImageView/init Normal file
View file

@ -0,0 +1,8 @@
#ifndef _ImageView_icpp_init_stub
#define _ImageView_icpp_init_stub
#include "CtrlLib/init"
#include "plugin\tif/init"
#include "plugin\jpg/init"
#include "plugin\gif/init"
#include "plugin\pcx/init"
#endif

141
examples/ImageView/main.cpp Normal file
View file

@ -0,0 +1,141 @@
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
class ImageView : public TopWindow {
public:
virtual bool Key(dword key, int);
private:
ImageCtrl img;
FileList files;
Splitter splitter;
String dir;
FrameTop<Button> dirup;
void Load(const char *filename);
void Enter();
void DoDir();
void DirUp();
public:
typedef ImageView CLASSNAME;
void Serialize(Stream& s);
void LoadDir(const char *d);
void LoadDir() { LoadDir(dir); }
ImageView();
};
void ImageView::Load(const char *filename)
{
img.SetImage(Null);
FileIn in(filename);
One<StreamRaster> r = StreamRaster::OpenAny(in);
if(!r)
return;
Size rsz = img.GetSize();
Size isz = r->GetSize();
if(isz.cx >= rsz.cx || isz.cy >= rsz.cy) {
if(isz.cx * rsz.cx < rsz.cy * isz.cy)
rsz.cx = isz.cx * rsz.cy / isz.cy;
else
rsz.cy = isz.cy * rsz.cx / isz.cx;
ImageEncoder m;
Rescale(m, rsz, *r, isz);
img.SetImage(m);
}
else
img.SetImage(r->GetImage());
}
void ImageView::LoadDir(const char *d)
{
files.Clear();
dir = d;
Title(dir);
::Load(files, dir, "*.*");
SortByExt(files);
}
void ImageView::DirUp()
{
String n = DirectoryUp(dir);
LoadDir(dir);
files.FindSetCursor(n);
}
void ImageView::Enter()
{
if(!files.IsCursor()) {
Title(dir);
return;
}
const FileList::File& f = files.Get(files.GetCursor());
if(f.name == "..") {
Title(dir);
return;
}
String p = AppendFileName(dir, f.name);
Title(p);
if(!f.isdir)
Load(p);
}
void ImageView::DoDir()
{
if(!files.IsCursor())
return;
const FileList::File& f = files.Get(files.GetCursor());
if(!f.isdir)
return;
LoadDir(AppendFileName(dir, f.name));
}
bool ImageView::Key(dword key, int)
{
if(key == K_ENTER) {
DoDir();
return true;
}
return false;
}
void ImageView::Serialize(Stream& s)
{
int version = 0;
s / version;
SerializePlacement(s);
s % files;
s % dir;
s % splitter;
}
ImageView::ImageView()
{
splitter.Horz(files, img);
splitter.SetPos(2700);
Add(splitter.SizePos());
files.WhenEnterItem = THISBACK(Enter);
files.WhenLeftDouble = THISBACK(DoDir);
dirup.Height(max(CtrlImg::DirUp().GetSize().cy, Draw::GetStdFontCy() + 6));
dirup.SetImage(CtrlImg::DirUp());
dirup.NormalStyle();
dirup <<= THISBACK(DirUp);
files.AddFrame(dirup);
Sizeable().Zoomable();
dir = GetCurrentDirectory();
}
GUI_APP_MAIN
{
ImageView x;
LoadFromFile(x);
x.LoadDir();
x.Run();
StoreToFile(x);
}

View file

@ -0,0 +1,31 @@
description "Simple example of ActiveX control";
noblitz;
uses
Ole\Ctrl,
CtrlLib,
Esc;
target
calc.ocx;
link
/def:calc.def;
file
calc.idl,
calc_idl.h,
calc.cpp,
calc_idl.cpp,
calc.lay,
calc.def,
calc.rc
depends() calc.tlb;
mainconfig
"" = "GUI DLL MT";
custom() "post-link",
"regsvr32 /s /c $(OUTPATH)",
"";

76
examples/OleCalc/calc.cpp Normal file
View file

@ -0,0 +1,76 @@
#include <Ole/Ctrl/OleCtrl.h>
#include <CtrlLib/CtrlLib.h>
#include <Esc/Esc.h>
#include "calc_idl.h"
using namespace Upp;
#define LAYOUTFILE "calc.lay"
#include <CtrlCore/lay.h>
class Calculator : public WithCalculatorLayout<OcxRunnableControl>, public DispatchInterface<ICalculator> {
void Eval();
public:
virtual void Paint(UPP::Draw& w);
STDMETHOD(get_Input)(BSTR *result);
STDMETHOD(put_Input)(BSTR input);
STDMETHOD(Calculate)();
STDMETHOD(get_Output)(BSTR *result);
typedef Calculator CLASSNAME;
Calculator();
};
OCX_OBJECT(Calculator)
void Calculator::Paint(UPP::Draw& w)
{
w.DrawRect(GetSize(), SColorFace());
}
Calculator::Calculator()
{
CtrlLayout(*this);
ok.Ok() <<= THISBACK(Eval);
ok.Tip("Evaluate given expression");
NoWantFocus();
}
void Calculator::Eval()
{
ArrayMap<String, EscValue> global;
value <<= Evaluate((String)~expr, global).ToString();
}
HRESULT Calculator::get_Input(BSTR *result)
{
ReturnString(result, ~expr);
return S_OK;
}
HRESULT Calculator::put_Input(BSTR input)
{
expr <<= BSTRToString(input);
return S_OK;
}
HRESULT Calculator::Calculate()
{
Eval();
return S_OK;
}
HRESULT Calculator::get_Output(BSTR *result)
{
ReturnString(result, ~value);
return S_OK;
}
OCX_APP_MAIN
{
SetLanguage(LNG_CZECH);
SetDefaultCharset(CHARSET_WIN1250);
}

View file

@ -0,0 +1,7 @@
LIBRARY "calc.ocx"
EXPORTS
DllCanUnloadNow PRIVATE
DllGetClassObject PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE

41
examples/OleCalc/calc.idl Normal file
View file

@ -0,0 +1,41 @@
// calculator.idl: simple OCX expression evaluator.
import "oaidl.idl";
import "oleidl.idl";
[
object,
uuid(2CFA5DB2-A740-11d3-981C-000000000000),
dual,
helpstring("ICalculator Interface")
]
interface ICalculator : IDispatch
{
[id(1), propget, helpstring("Returns and sets calculator input field text (expression).")]
HRESULT Input([out, retval] BSTR *_value);
[propput, helpstring("Put")]
HRESULT Input([in] BSTR _value);
[id(2), helpstring("Calculate computes the result and places the it in the history list.")]
HRESULT Calculate();
[id(3), propget, helpstring("Value retrieves the result of the computation.")]
HRESULT Output([out, retval] BSTR *value);
};
[
uuid(2CFA5DB0-A740-11d3-981C-000000000000),
version(1.0),
helpstring("Ultimate Calculator 1.0 Type Library")
]
library Calculator_TypeLib
{
importlib("stdole32.tlb");
[
uuid(2CFA5DB1-A740-11d3-981C-000000000000),
helpstring("Calculator Control")
]
coclass Calculator
{
[default] interface ICalculator;
};
};

View file

@ -0,0 +1,7 @@
LAYOUT(CalculatorLayout, 376, 56)
ITEM(Label, dv___0, SetLabel(t_("Expression")).LeftPosZ(4, 56).TopPosZ(4, 19))
ITEM(EditField, expr, HSizePosZ(64, 4).TopPosZ(4, 19))
ITEM(Label, dv___2, SetLabel(t_("Value:")).LeftPosZ(112, 56).TopPosZ(28, 16))
ITEM(EditField, value, HSizePosZ(168, 4).TopPosZ(26, 19))
ITEM(Button, ok, SetLabel(t_("Evaluate")).LeftPosZ(4, 80).TopPosZ(28, 22))
END_LAYOUT

1
examples/OleCalc/calc.rc Normal file
View file

@ -0,0 +1 @@
1 TYPELIB "calc.idl"

View file

@ -0,0 +1 @@
MSFT

View file

@ -0,0 +1,179 @@
/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */
/* link this file in with the server and any clients */
/* File created by MIDL compiler version 6.00.0361 */
/* at Thu Jan 24 22:09:58 2008
*/
/* Compiler settings for d:\examples\OleCalc\calc.idl:
Oicf, W1, Zp8, env=Win32 (32b run)
protocol : dce , ms_ext, c_ext, robust
error checks: allocation ref bounds_check enum stub_data
VC __declspec() decoration level:
__declspec(uuid()), __declspec(selectany), __declspec(novtable)
DECLSPEC_UUID(), MIDL_INTERFACE()
*/
//@@MIDL_FILE_HEADING( )
#if !defined(_M_IA64) && !defined(_M_AMD64)
#pragma warning( disable: 4049 ) /* more than 64k source lines */
#ifdef __cplusplus
extern "C"{
#endif
#include <rpc.h>
#include <rpcndr.h>
#ifdef _MIDL_USE_GUIDDEF_
#ifndef INITGUID
#define INITGUID
#include <guiddef.h>
#undef INITGUID
#else
#include <guiddef.h>
#endif
#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
#else // !_MIDL_USE_GUIDDEF_
#ifndef __IID_DEFINED__
#define __IID_DEFINED__
typedef struct _IID
{
unsigned long x;
unsigned short s1;
unsigned short s2;
unsigned char c[8];
} IID;
#endif // __IID_DEFINED__
#ifndef CLSID_DEFINED
#define CLSID_DEFINED
typedef IID CLSID;
#endif // CLSID_DEFINED
#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
#endif !_MIDL_USE_GUIDDEF_
MIDL_DEFINE_GUID(IID, IID_ICalculator,0x2CFA5DB2,0xA740,0x11d3,0x98,0x1C,0x00,0x00,0x00,0x00,0x00,0x00);
MIDL_DEFINE_GUID(IID, LIBID_Calculator_TypeLib,0x2CFA5DB0,0xA740,0x11d3,0x98,0x1C,0x00,0x00,0x00,0x00,0x00,0x00);
MIDL_DEFINE_GUID(CLSID, CLSID_Calculator,0x2CFA5DB1,0xA740,0x11d3,0x98,0x1C,0x00,0x00,0x00,0x00,0x00,0x00);
#undef MIDL_DEFINE_GUID
#ifdef __cplusplus
}
#endif
#endif /* !defined(_M_IA64) && !defined(_M_AMD64)*/
/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */
/* link this file in with the server and any clients */
/* File created by MIDL compiler version 6.00.0361 */
/* at Thu Jan 24 22:09:58 2008
*/
/* Compiler settings for d:\examples\OleCalc\calc.idl:
Oicf, W1, Zp8, env=Win64 (32b run,appending)
protocol : dce , ms_ext, c_ext, robust
error checks: allocation ref bounds_check enum stub_data
VC __declspec() decoration level:
__declspec(uuid()), __declspec(selectany), __declspec(novtable)
DECLSPEC_UUID(), MIDL_INTERFACE()
*/
//@@MIDL_FILE_HEADING( )
#if defined(_M_IA64) || defined(_M_AMD64)
#pragma warning( disable: 4049 ) /* more than 64k source lines */
#ifdef __cplusplus
extern "C"{
#endif
#include <rpc.h>
#include <rpcndr.h>
#ifdef _MIDL_USE_GUIDDEF_
#ifndef INITGUID
#define INITGUID
#include <guiddef.h>
#undef INITGUID
#else
#include <guiddef.h>
#endif
#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
#else // !_MIDL_USE_GUIDDEF_
#ifndef __IID_DEFINED__
#define __IID_DEFINED__
typedef struct _IID
{
unsigned long x;
unsigned short s1;
unsigned short s2;
unsigned char c[8];
} IID;
#endif // __IID_DEFINED__
#ifndef CLSID_DEFINED
#define CLSID_DEFINED
typedef IID CLSID;
#endif // CLSID_DEFINED
#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
#endif !_MIDL_USE_GUIDDEF_
MIDL_DEFINE_GUID(IID, IID_ICalculator,0x2CFA5DB2,0xA740,0x11d3,0x98,0x1C,0x00,0x00,0x00,0x00,0x00,0x00);
MIDL_DEFINE_GUID(IID, LIBID_Calculator_TypeLib,0x2CFA5DB0,0xA740,0x11d3,0x98,0x1C,0x00,0x00,0x00,0x00,0x00,0x00);
MIDL_DEFINE_GUID(CLSID, CLSID_Calculator,0x2CFA5DB1,0xA740,0x11d3,0x98,0x1C,0x00,0x00,0x00,0x00,0x00,0x00);
#undef MIDL_DEFINE_GUID
#ifdef __cplusplus
}
#endif
#endif /* defined(_M_IA64) || defined(_M_AMD64)*/

304
examples/OleCalc/calc_idl.h Normal file
View file

@ -0,0 +1,304 @@
/* this ALWAYS GENERATED file contains the definitions for the interfaces */
/* File created by MIDL compiler version 6.00.0366 */
/* at Thu Jan 24 22:57:13 2008
*/
/* Compiler settings for C:\Upp.uvs\examples.uc\OleCalc\calc.idl:
Oicf, W1, Zp8, env=Win32 (32b run)
protocol : dce , ms_ext, c_ext, robust
error checks: allocation ref bounds_check enum stub_data
VC __declspec() decoration level:
__declspec(uuid()), __declspec(selectany), __declspec(novtable)
DECLSPEC_UUID(), MIDL_INTERFACE()
*/
//@@MIDL_FILE_HEADING( )
#pragma warning( disable: 4049 ) /* more than 64k source lines */
/* verify that the <rpcndr.h> version is high enough to compile this file*/
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include "rpc.h"
#include "rpcndr.h"
#ifndef __RPCNDR_H_VERSION__
#error this stub requires an updated version of <rpcndr.h>
#endif // __RPCNDR_H_VERSION__
#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif /*COM_NO_WINDOWS_H*/
#ifndef __calc_idl_h__
#define __calc_idl_h__
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif
/* Forward Declarations */
#ifndef __ICalculator_FWD_DEFINED__
#define __ICalculator_FWD_DEFINED__
typedef interface ICalculator ICalculator;
#endif /* __ICalculator_FWD_DEFINED__ */
#ifndef __Calculator_FWD_DEFINED__
#define __Calculator_FWD_DEFINED__
#ifdef __cplusplus
typedef class Calculator Calculator;
#else
typedef struct Calculator Calculator;
#endif /* __cplusplus */
#endif /* __Calculator_FWD_DEFINED__ */
/* header files for imported files */
#include "oaidl.h"
#include "oleidl.h"
#ifdef __cplusplus
extern "C"{
#endif
void * __RPC_USER MIDL_user_allocate(size_t);
void __RPC_USER MIDL_user_free( void * );
#ifndef __ICalculator_INTERFACE_DEFINED__
#define __ICalculator_INTERFACE_DEFINED__
/* interface ICalculator */
/* [helpstring][dual][uuid][object] */
EXTERN_C const IID IID_ICalculator;
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2CFA5DB2-A740-11d3-981C-000000000000")
ICalculator : public IDispatch
{
public:
virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Input(
/* [retval][out] */ BSTR *_value) = 0;
virtual /* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE put_Input(
/* [in] */ BSTR _value) = 0;
virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Calculate( void) = 0;
virtual /* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE get_Output(
/* [retval][out] */ BSTR *value) = 0;
};
#else /* C style interface */
typedef struct ICalculatorVtbl
{
BEGIN_INTERFACE
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
ICalculator * This,
/* [in] */ REFIID riid,
/* [iid_is][out] */ void **ppvObject);
ULONG ( STDMETHODCALLTYPE *AddRef )(
ICalculator * This);
ULONG ( STDMETHODCALLTYPE *Release )(
ICalculator * This);
HRESULT ( STDMETHODCALLTYPE *GetTypeInfoCount )(
ICalculator * This,
/* [out] */ UINT *pctinfo);
HRESULT ( STDMETHODCALLTYPE *GetTypeInfo )(
ICalculator * This,
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ ITypeInfo **ppTInfo);
HRESULT ( STDMETHODCALLTYPE *GetIDsOfNames )(
ICalculator * This,
/* [in] */ REFIID riid,
/* [size_is][in] */ LPOLESTR *rgszNames,
/* [in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ DISPID *rgDispId);
/* [local] */ HRESULT ( STDMETHODCALLTYPE *Invoke )(
ICalculator * This,
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS *pDispParams,
/* [out] */ VARIANT *pVarResult,
/* [out] */ EXCEPINFO *pExcepInfo,
/* [out] */ UINT *puArgErr);
/* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Input )(
ICalculator * This,
/* [retval][out] */ BSTR *_value);
/* [helpstring][propput] */ HRESULT ( STDMETHODCALLTYPE *put_Input )(
ICalculator * This,
/* [in] */ BSTR _value);
/* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE *Calculate )(
ICalculator * This);
/* [helpstring][propget][id] */ HRESULT ( STDMETHODCALLTYPE *get_Output )(
ICalculator * This,
/* [retval][out] */ BSTR *value);
END_INTERFACE
} ICalculatorVtbl;
interface ICalculator
{
CONST_VTBL struct ICalculatorVtbl *lpVtbl;
};
#ifdef COBJMACROS
#define ICalculator_QueryInterface(This,riid,ppvObject) \
(This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
#define ICalculator_AddRef(This) \
(This)->lpVtbl -> AddRef(This)
#define ICalculator_Release(This) \
(This)->lpVtbl -> Release(This)
#define ICalculator_GetTypeInfoCount(This,pctinfo) \
(This)->lpVtbl -> GetTypeInfoCount(This,pctinfo)
#define ICalculator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \
(This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICalculator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \
(This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICalculator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \
(This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#define ICalculator_get_Input(This,_value) \
(This)->lpVtbl -> get_Input(This,_value)
#define ICalculator_put_Input(This,_value) \
(This)->lpVtbl -> put_Input(This,_value)
#define ICalculator_Calculate(This) \
(This)->lpVtbl -> Calculate(This)
#define ICalculator_get_Output(This,value) \
(This)->lpVtbl -> get_Output(This,value)
#endif /* COBJMACROS */
#endif /* C style interface */
/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE ICalculator_get_Input_Proxy(
ICalculator * This,
/* [retval][out] */ BSTR *_value);
void __RPC_STUB ICalculator_get_Input_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);
/* [helpstring][propput] */ HRESULT STDMETHODCALLTYPE ICalculator_put_Input_Proxy(
ICalculator * This,
/* [in] */ BSTR _value);
void __RPC_STUB ICalculator_put_Input_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);
/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE ICalculator_Calculate_Proxy(
ICalculator * This);
void __RPC_STUB ICalculator_Calculate_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);
/* [helpstring][propget][id] */ HRESULT STDMETHODCALLTYPE ICalculator_get_Output_Proxy(
ICalculator * This,
/* [retval][out] */ BSTR *value);
void __RPC_STUB ICalculator_get_Output_Stub(
IRpcStubBuffer *This,
IRpcChannelBuffer *_pRpcChannelBuffer,
PRPC_MESSAGE _pRpcMessage,
DWORD *_pdwStubPhase);
#endif /* __ICalculator_INTERFACE_DEFINED__ */
#ifndef __Calculator_TypeLib_LIBRARY_DEFINED__
#define __Calculator_TypeLib_LIBRARY_DEFINED__
/* library Calculator_TypeLib */
/* [helpstring][version][uuid] */
EXTERN_C const IID LIBID_Calculator_TypeLib;
EXTERN_C const CLSID CLSID_Calculator;
#ifdef __cplusplus
class DECLSPEC_UUID("2CFA5DB1-A740-11d3-981C-000000000000")
Calculator;
#endif
#endif /* __Calculator_TypeLib_LIBRARY_DEFINED__ */
/* Additional Prototypes for ALL interfaces */
unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * );
unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * );
unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * );
void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * );
/* end of Additional Prototypes */
#ifdef __cplusplus
}
#endif
#endif

889
examples/OleCalc/calc_p.c Normal file
View file

@ -0,0 +1,889 @@
/* this ALWAYS GENERATED file contains the proxy stub code */
/* File created by MIDL compiler version 6.00.0361 */
/* at Thu Jan 24 22:09:58 2008
*/
/* Compiler settings for d:\examples\OleCalc\calc.idl:
Oicf, W1, Zp8, env=Win32 (32b run)
protocol : dce , ms_ext, c_ext, robust
error checks: allocation ref bounds_check enum stub_data
VC __declspec() decoration level:
__declspec(uuid()), __declspec(selectany), __declspec(novtable)
DECLSPEC_UUID(), MIDL_INTERFACE()
*/
//@@MIDL_FILE_HEADING( )
#if !defined(_M_IA64) && !defined(_M_AMD64)
#pragma warning( disable: 4049 ) /* more than 64k source lines */
#if _MSC_VER >= 1200
#pragma warning(push)
#endif
#pragma warning( disable: 4100 ) /* unreferenced arguments in x86 call */
#pragma warning( disable: 4211 ) /* redefine extent to static */
#pragma warning( disable: 4232 ) /* dllimport identity*/
#define USE_STUBLESS_PROXY
/* verify that the <rpcproxy.h> version is high enough to compile this file*/
#ifndef __REDQ_RPCPROXY_H_VERSION__
#define __REQUIRED_RPCPROXY_H_VERSION__ 475
#endif
#include "rpcproxy.h"
#ifndef __RPCPROXY_H_VERSION__
#error this stub requires an updated version of <rpcproxy.h>
#endif // __RPCPROXY_H_VERSION__
#include "calc_idl.h"
#define TYPE_FORMAT_STRING_SIZE 57
#define PROC_FORMAT_STRING_SIZE 139
#define TRANSMIT_AS_TABLE_SIZE 0
#define WIRE_MARSHAL_TABLE_SIZE 1
typedef struct _MIDL_TYPE_FORMAT_STRING
{
short Pad;
unsigned char Format[ TYPE_FORMAT_STRING_SIZE ];
} MIDL_TYPE_FORMAT_STRING;
typedef struct _MIDL_PROC_FORMAT_STRING
{
short Pad;
unsigned char Format[ PROC_FORMAT_STRING_SIZE ];
} MIDL_PROC_FORMAT_STRING;
static RPC_SYNTAX_IDENTIFIER _RpcTransferSyntax =
{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
extern const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString;
extern const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString;
extern const MIDL_STUB_DESC Object_StubDesc;
extern const MIDL_SERVER_INFO ICalculator_ServerInfo;
extern const MIDL_STUBLESS_PROXY_INFO ICalculator_ProxyInfo;
extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ];
#if !defined(__RPC_WIN32__)
#error Invalid build platform for this stub.
#endif
#if !(TARGET_IS_NT50_OR_LATER)
#error You need a Windows 2000 or later to run this stub because it uses these features:
#error /robust command line switch.
#error However, your C/C++ compilation flags indicate you intend to run this app on earlier systems.
#error This app will die there with the RPC_X_WRONG_STUB_VERSION error.
#endif
static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString =
{
0,
{
/* Procedure get_Input */
0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 2 */ NdrFcLong( 0x0 ), /* 0 */
/* 6 */ NdrFcShort( 0x7 ), /* 7 */
/* 8 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 10 */ NdrFcShort( 0x0 ), /* 0 */
/* 12 */ NdrFcShort( 0x8 ), /* 8 */
/* 14 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
0x2, /* 2 */
/* 16 */ 0x8, /* 8 */
0x3, /* Ext Flags: new corr desc, clt corr check, */
/* 18 */ NdrFcShort( 0x1 ), /* 1 */
/* 20 */ NdrFcShort( 0x0 ), /* 0 */
/* 22 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter _value */
/* 24 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
/* 26 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 28 */ NdrFcShort( 0x20 ), /* Type Offset=32 */
/* Return value */
/* 30 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 32 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 34 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure put_Input */
/* 36 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 38 */ NdrFcLong( 0x0 ), /* 0 */
/* 42 */ NdrFcShort( 0x8 ), /* 8 */
/* 44 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 46 */ NdrFcShort( 0x0 ), /* 0 */
/* 48 */ NdrFcShort( 0x8 ), /* 8 */
/* 50 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x2, /* 2 */
/* 52 */ 0x8, /* 8 */
0x5, /* Ext Flags: new corr desc, srv corr check, */
/* 54 */ NdrFcShort( 0x0 ), /* 0 */
/* 56 */ NdrFcShort( 0x1 ), /* 1 */
/* 58 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter _value */
/* 60 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 62 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 64 */ NdrFcShort( 0x2e ), /* Type Offset=46 */
/* Return value */
/* 66 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 68 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 70 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure Calculate */
/* 72 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 74 */ NdrFcLong( 0x0 ), /* 0 */
/* 78 */ NdrFcShort( 0x9 ), /* 9 */
/* 80 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 82 */ NdrFcShort( 0x0 ), /* 0 */
/* 84 */ NdrFcShort( 0x8 ), /* 8 */
/* 86 */ 0x44, /* Oi2 Flags: has return, has ext, */
0x1, /* 1 */
/* 88 */ 0x8, /* 8 */
0x1, /* Ext Flags: new corr desc, */
/* 90 */ NdrFcShort( 0x0 ), /* 0 */
/* 92 */ NdrFcShort( 0x0 ), /* 0 */
/* 94 */ NdrFcShort( 0x0 ), /* 0 */
/* Return value */
/* 96 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 98 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 100 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure get_Output */
/* 102 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 104 */ NdrFcLong( 0x0 ), /* 0 */
/* 108 */ NdrFcShort( 0xa ), /* 10 */
/* 110 */ NdrFcShort( 0xc ), /* x86 Stack size/offset = 12 */
/* 112 */ NdrFcShort( 0x0 ), /* 0 */
/* 114 */ NdrFcShort( 0x8 ), /* 8 */
/* 116 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
0x2, /* 2 */
/* 118 */ 0x8, /* 8 */
0x3, /* Ext Flags: new corr desc, clt corr check, */
/* 120 */ NdrFcShort( 0x1 ), /* 1 */
/* 122 */ NdrFcShort( 0x0 ), /* 0 */
/* 124 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter value */
/* 126 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
/* 128 */ NdrFcShort( 0x4 ), /* x86 Stack size/offset = 4 */
/* 130 */ NdrFcShort( 0x20 ), /* Type Offset=32 */
/* Return value */
/* 132 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 134 */ NdrFcShort( 0x8 ), /* x86 Stack size/offset = 8 */
/* 136 */ 0x8, /* FC_LONG */
0x0, /* 0 */
0x0
}
};
static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString =
{
0,
{
NdrFcShort( 0x0 ), /* 0 */
/* 2 */
0x11, 0x4, /* FC_RP [alloced_on_stack] */
/* 4 */ NdrFcShort( 0x1c ), /* Offset= 28 (32) */
/* 6 */
0x13, 0x0, /* FC_OP */
/* 8 */ NdrFcShort( 0xe ), /* Offset= 14 (22) */
/* 10 */
0x1b, /* FC_CARRAY */
0x1, /* 1 */
/* 12 */ NdrFcShort( 0x2 ), /* 2 */
/* 14 */ 0x9, /* Corr desc: FC_ULONG */
0x0, /* */
/* 16 */ NdrFcShort( 0xfffc ), /* -4 */
/* 18 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
/* 20 */ 0x6, /* FC_SHORT */
0x5b, /* FC_END */
/* 22 */
0x17, /* FC_CSTRUCT */
0x3, /* 3 */
/* 24 */ NdrFcShort( 0x8 ), /* 8 */
/* 26 */ NdrFcShort( 0xfff0 ), /* Offset= -16 (10) */
/* 28 */ 0x8, /* FC_LONG */
0x8, /* FC_LONG */
/* 30 */ 0x5c, /* FC_PAD */
0x5b, /* FC_END */
/* 32 */ 0xb4, /* FC_USER_MARSHAL */
0x83, /* 131 */
/* 34 */ NdrFcShort( 0x0 ), /* 0 */
/* 36 */ NdrFcShort( 0x4 ), /* 4 */
/* 38 */ NdrFcShort( 0x0 ), /* 0 */
/* 40 */ NdrFcShort( 0xffde ), /* Offset= -34 (6) */
/* 42 */
0x12, 0x0, /* FC_UP */
/* 44 */ NdrFcShort( 0xffea ), /* Offset= -22 (22) */
/* 46 */ 0xb4, /* FC_USER_MARSHAL */
0x83, /* 131 */
/* 48 */ NdrFcShort( 0x0 ), /* 0 */
/* 50 */ NdrFcShort( 0x4 ), /* 4 */
/* 52 */ NdrFcShort( 0x0 ), /* 0 */
/* 54 */ NdrFcShort( 0xfff4 ), /* Offset= -12 (42) */
0x0
}
};
static const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ] =
{
{
BSTR_UserSize
,BSTR_UserMarshal
,BSTR_UserUnmarshal
,BSTR_UserFree
}
};
/* Object interface: IUnknown, ver. 0.0,
GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
/* Object interface: IDispatch, ver. 0.0,
GUID={0x00020400,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
/* Object interface: ICalculator, ver. 0.0,
GUID={0x2CFA5DB2,0xA740,0x11d3,{0x98,0x1C,0x00,0x00,0x00,0x00,0x00,0x00}} */
#pragma code_seg(".orpc")
static const unsigned short ICalculator_FormatStringOffsetTable[] =
{
(unsigned short) -1,
(unsigned short) -1,
(unsigned short) -1,
(unsigned short) -1,
0,
36,
72,
102
};
static const MIDL_STUBLESS_PROXY_INFO ICalculator_ProxyInfo =
{
&Object_StubDesc,
__MIDL_ProcFormatString.Format,
&ICalculator_FormatStringOffsetTable[-3],
0,
0,
0
};
static const MIDL_SERVER_INFO ICalculator_ServerInfo =
{
&Object_StubDesc,
0,
__MIDL_ProcFormatString.Format,
&ICalculator_FormatStringOffsetTable[-3],
0,
0,
0,
0};
CINTERFACE_PROXY_VTABLE(11) _ICalculatorProxyVtbl =
{
&ICalculator_ProxyInfo,
&IID_ICalculator,
IUnknown_QueryInterface_Proxy,
IUnknown_AddRef_Proxy,
IUnknown_Release_Proxy ,
0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfoCount */ ,
0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfo */ ,
0 /* (void *) (INT_PTR) -1 /* IDispatch::GetIDsOfNames */ ,
0 /* IDispatch_Invoke_Proxy */ ,
(void *) (INT_PTR) -1 /* ICalculator::get_Input */ ,
(void *) (INT_PTR) -1 /* ICalculator::put_Input */ ,
(void *) (INT_PTR) -1 /* ICalculator::Calculate */ ,
(void *) (INT_PTR) -1 /* ICalculator::get_Output */
};
static const PRPC_STUB_FUNCTION ICalculator_table[] =
{
STUB_FORWARDING_FUNCTION,
STUB_FORWARDING_FUNCTION,
STUB_FORWARDING_FUNCTION,
STUB_FORWARDING_FUNCTION,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2
};
CInterfaceStubVtbl _ICalculatorStubVtbl =
{
&IID_ICalculator,
&ICalculator_ServerInfo,
11,
&ICalculator_table[-3],
CStdStubBuffer_DELEGATING_METHODS
};
static const MIDL_STUB_DESC Object_StubDesc =
{
0,
NdrOleAllocate,
NdrOleFree,
0,
0,
0,
0,
0,
__MIDL_TypeFormatString.Format,
1, /* -error bounds_check flag */
0x50002, /* Ndr library version */
0,
0x6000169, /* MIDL Version 6.0.361 */
0,
UserMarshalRoutines,
0, /* notify & notify_flag routine table */
0x1, /* MIDL flag */
0, /* cs routines */
0, /* proxy/server info */
0 /* Reserved5 */
};
const CInterfaceProxyVtbl * _calc_ProxyVtblList[] =
{
( CInterfaceProxyVtbl *) &_ICalculatorProxyVtbl,
0
};
const CInterfaceStubVtbl * _calc_StubVtblList[] =
{
( CInterfaceStubVtbl *) &_ICalculatorStubVtbl,
0
};
PCInterfaceName const _calc_InterfaceNamesList[] =
{
"ICalculator",
0
};
const IID * _calc_BaseIIDList[] =
{
&IID_IDispatch,
0
};
#define _calc_CHECK_IID(n) IID_GENERIC_CHECK_IID( _calc, pIID, n)
int __stdcall _calc_IID_Lookup( const IID * pIID, int * pIndex )
{
if(!_calc_CHECK_IID(0))
{
*pIndex = 0;
return 1;
}
return 0;
}
const ExtendedProxyFileInfo calc_ProxyFileInfo =
{
(PCInterfaceProxyVtblList *) & _calc_ProxyVtblList,
(PCInterfaceStubVtblList *) & _calc_StubVtblList,
(const PCInterfaceName * ) & _calc_InterfaceNamesList,
(const IID ** ) & _calc_BaseIIDList,
& _calc_IID_Lookup,
1,
2,
0, /* table of [async_uuid] interfaces */
0, /* Filler1 */
0, /* Filler2 */
0 /* Filler3 */
};
#if _MSC_VER >= 1200
#pragma warning(pop)
#endif
#endif /* !defined(_M_IA64) && !defined(_M_AMD64)*/
/* this ALWAYS GENERATED file contains the proxy stub code */
/* File created by MIDL compiler version 6.00.0361 */
/* at Thu Jan 24 22:09:58 2008
*/
/* Compiler settings for d:\examples\OleCalc\calc.idl:
Oicf, W1, Zp8, env=Win64 (32b run,appending)
protocol : dce , ms_ext, c_ext, robust
error checks: allocation ref bounds_check enum stub_data
VC __declspec() decoration level:
__declspec(uuid()), __declspec(selectany), __declspec(novtable)
DECLSPEC_UUID(), MIDL_INTERFACE()
*/
//@@MIDL_FILE_HEADING( )
#if defined(_M_IA64) || defined(_M_AMD64)
#pragma warning( disable: 4049 ) /* more than 64k source lines */
#if _MSC_VER >= 1200
#pragma warning(push)
#endif
#pragma warning( disable: 4211 ) /* redefine extent to static */
#pragma warning( disable: 4232 ) /* dllimport identity*/
#define USE_STUBLESS_PROXY
/* verify that the <rpcproxy.h> version is high enough to compile this file*/
#ifndef __REDQ_RPCPROXY_H_VERSION__
#define __REQUIRED_RPCPROXY_H_VERSION__ 475
#endif
#include "rpcproxy.h"
#ifndef __RPCPROXY_H_VERSION__
#error this stub requires an updated version of <rpcproxy.h>
#endif // __RPCPROXY_H_VERSION__
#include "calc_idl.h"
#define TYPE_FORMAT_STRING_SIZE 57
#define PROC_FORMAT_STRING_SIZE 147
#define TRANSMIT_AS_TABLE_SIZE 0
#define WIRE_MARSHAL_TABLE_SIZE 1
typedef struct _MIDL_TYPE_FORMAT_STRING
{
short Pad;
unsigned char Format[ TYPE_FORMAT_STRING_SIZE ];
} MIDL_TYPE_FORMAT_STRING;
typedef struct _MIDL_PROC_FORMAT_STRING
{
short Pad;
unsigned char Format[ PROC_FORMAT_STRING_SIZE ];
} MIDL_PROC_FORMAT_STRING;
static RPC_SYNTAX_IDENTIFIER _RpcTransferSyntax =
{{0x8A885D04,0x1CEB,0x11C9,{0x9F,0xE8,0x08,0x00,0x2B,0x10,0x48,0x60}},{2,0}};
extern const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString;
extern const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString;
extern const MIDL_STUB_DESC Object_StubDesc;
extern const MIDL_SERVER_INFO ICalculator_ServerInfo;
extern const MIDL_STUBLESS_PROXY_INFO ICalculator_ProxyInfo;
extern const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ];
#if !defined(__RPC_WIN64__)
#error Invalid build platform for this stub.
#endif
static const MIDL_PROC_FORMAT_STRING __MIDL_ProcFormatString =
{
0,
{
/* Procedure get_Input */
0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 2 */ NdrFcLong( 0x0 ), /* 0 */
/* 6 */ NdrFcShort( 0x7 ), /* 7 */
/* 8 */ NdrFcShort( 0x18 ), /* ia64 Stack size/offset = 24 */
/* 10 */ NdrFcShort( 0x0 ), /* 0 */
/* 12 */ NdrFcShort( 0x8 ), /* 8 */
/* 14 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
0x2, /* 2 */
/* 16 */ 0xa, /* 10 */
0x3, /* Ext Flags: new corr desc, clt corr check, */
/* 18 */ NdrFcShort( 0x1 ), /* 1 */
/* 20 */ NdrFcShort( 0x0 ), /* 0 */
/* 22 */ NdrFcShort( 0x0 ), /* 0 */
/* 24 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter _value */
/* 26 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
/* 28 */ NdrFcShort( 0x8 ), /* ia64 Stack size/offset = 8 */
/* 30 */ NdrFcShort( 0x20 ), /* Type Offset=32 */
/* Return value */
/* 32 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 34 */ NdrFcShort( 0x10 ), /* ia64 Stack size/offset = 16 */
/* 36 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure put_Input */
/* 38 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 40 */ NdrFcLong( 0x0 ), /* 0 */
/* 44 */ NdrFcShort( 0x8 ), /* 8 */
/* 46 */ NdrFcShort( 0x18 ), /* ia64 Stack size/offset = 24 */
/* 48 */ NdrFcShort( 0x0 ), /* 0 */
/* 50 */ NdrFcShort( 0x8 ), /* 8 */
/* 52 */ 0x46, /* Oi2 Flags: clt must size, has return, has ext, */
0x2, /* 2 */
/* 54 */ 0xa, /* 10 */
0x5, /* Ext Flags: new corr desc, srv corr check, */
/* 56 */ NdrFcShort( 0x0 ), /* 0 */
/* 58 */ NdrFcShort( 0x1 ), /* 1 */
/* 60 */ NdrFcShort( 0x0 ), /* 0 */
/* 62 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter _value */
/* 64 */ NdrFcShort( 0x8b ), /* Flags: must size, must free, in, by val, */
/* 66 */ NdrFcShort( 0x8 ), /* ia64 Stack size/offset = 8 */
/* 68 */ NdrFcShort( 0x2e ), /* Type Offset=46 */
/* Return value */
/* 70 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 72 */ NdrFcShort( 0x10 ), /* ia64 Stack size/offset = 16 */
/* 74 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure Calculate */
/* 76 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 78 */ NdrFcLong( 0x0 ), /* 0 */
/* 82 */ NdrFcShort( 0x9 ), /* 9 */
/* 84 */ NdrFcShort( 0x10 ), /* ia64 Stack size/offset = 16 */
/* 86 */ NdrFcShort( 0x0 ), /* 0 */
/* 88 */ NdrFcShort( 0x8 ), /* 8 */
/* 90 */ 0x44, /* Oi2 Flags: has return, has ext, */
0x1, /* 1 */
/* 92 */ 0xa, /* 10 */
0x1, /* Ext Flags: new corr desc, */
/* 94 */ NdrFcShort( 0x0 ), /* 0 */
/* 96 */ NdrFcShort( 0x0 ), /* 0 */
/* 98 */ NdrFcShort( 0x0 ), /* 0 */
/* 100 */ NdrFcShort( 0x0 ), /* 0 */
/* Return value */
/* 102 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 104 */ NdrFcShort( 0x8 ), /* ia64 Stack size/offset = 8 */
/* 106 */ 0x8, /* FC_LONG */
0x0, /* 0 */
/* Procedure get_Output */
/* 108 */ 0x33, /* FC_AUTO_HANDLE */
0x6c, /* Old Flags: object, Oi2 */
/* 110 */ NdrFcLong( 0x0 ), /* 0 */
/* 114 */ NdrFcShort( 0xa ), /* 10 */
/* 116 */ NdrFcShort( 0x18 ), /* ia64 Stack size/offset = 24 */
/* 118 */ NdrFcShort( 0x0 ), /* 0 */
/* 120 */ NdrFcShort( 0x8 ), /* 8 */
/* 122 */ 0x45, /* Oi2 Flags: srv must size, has return, has ext, */
0x2, /* 2 */
/* 124 */ 0xa, /* 10 */
0x3, /* Ext Flags: new corr desc, clt corr check, */
/* 126 */ NdrFcShort( 0x1 ), /* 1 */
/* 128 */ NdrFcShort( 0x0 ), /* 0 */
/* 130 */ NdrFcShort( 0x0 ), /* 0 */
/* 132 */ NdrFcShort( 0x0 ), /* 0 */
/* Parameter value */
/* 134 */ NdrFcShort( 0x2113 ), /* Flags: must size, must free, out, simple ref, srv alloc size=8 */
/* 136 */ NdrFcShort( 0x8 ), /* ia64 Stack size/offset = 8 */
/* 138 */ NdrFcShort( 0x20 ), /* Type Offset=32 */
/* Return value */
/* 140 */ NdrFcShort( 0x70 ), /* Flags: out, return, base type, */
/* 142 */ NdrFcShort( 0x10 ), /* ia64 Stack size/offset = 16 */
/* 144 */ 0x8, /* FC_LONG */
0x0, /* 0 */
0x0
}
};
static const MIDL_TYPE_FORMAT_STRING __MIDL_TypeFormatString =
{
0,
{
NdrFcShort( 0x0 ), /* 0 */
/* 2 */
0x11, 0x4, /* FC_RP [alloced_on_stack] */
/* 4 */ NdrFcShort( 0x1c ), /* Offset= 28 (32) */
/* 6 */
0x13, 0x0, /* FC_OP */
/* 8 */ NdrFcShort( 0xe ), /* Offset= 14 (22) */
/* 10 */
0x1b, /* FC_CARRAY */
0x1, /* 1 */
/* 12 */ NdrFcShort( 0x2 ), /* 2 */
/* 14 */ 0x9, /* Corr desc: FC_ULONG */
0x0, /* */
/* 16 */ NdrFcShort( 0xfffc ), /* -4 */
/* 18 */ NdrFcShort( 0x1 ), /* Corr flags: early, */
/* 20 */ 0x6, /* FC_SHORT */
0x5b, /* FC_END */
/* 22 */
0x17, /* FC_CSTRUCT */
0x3, /* 3 */
/* 24 */ NdrFcShort( 0x8 ), /* 8 */
/* 26 */ NdrFcShort( 0xfff0 ), /* Offset= -16 (10) */
/* 28 */ 0x8, /* FC_LONG */
0x8, /* FC_LONG */
/* 30 */ 0x5c, /* FC_PAD */
0x5b, /* FC_END */
/* 32 */ 0xb4, /* FC_USER_MARSHAL */
0x83, /* 131 */
/* 34 */ NdrFcShort( 0x0 ), /* 0 */
/* 36 */ NdrFcShort( 0x8 ), /* 8 */
/* 38 */ NdrFcShort( 0x0 ), /* 0 */
/* 40 */ NdrFcShort( 0xffde ), /* Offset= -34 (6) */
/* 42 */
0x12, 0x0, /* FC_UP */
/* 44 */ NdrFcShort( 0xffea ), /* Offset= -22 (22) */
/* 46 */ 0xb4, /* FC_USER_MARSHAL */
0x83, /* 131 */
/* 48 */ NdrFcShort( 0x0 ), /* 0 */
/* 50 */ NdrFcShort( 0x8 ), /* 8 */
/* 52 */ NdrFcShort( 0x0 ), /* 0 */
/* 54 */ NdrFcShort( 0xfff4 ), /* Offset= -12 (42) */
0x0
}
};
static const USER_MARSHAL_ROUTINE_QUADRUPLE UserMarshalRoutines[ WIRE_MARSHAL_TABLE_SIZE ] =
{
{
BSTR_UserSize
,BSTR_UserMarshal
,BSTR_UserUnmarshal
,BSTR_UserFree
}
};
/* Object interface: IUnknown, ver. 0.0,
GUID={0x00000000,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
/* Object interface: IDispatch, ver. 0.0,
GUID={0x00020400,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}} */
/* Object interface: ICalculator, ver. 0.0,
GUID={0x2CFA5DB2,0xA740,0x11d3,{0x98,0x1C,0x00,0x00,0x00,0x00,0x00,0x00}} */
#pragma code_seg(".orpc")
static const unsigned short ICalculator_FormatStringOffsetTable[] =
{
(unsigned short) -1,
(unsigned short) -1,
(unsigned short) -1,
(unsigned short) -1,
0,
38,
76,
108
};
static const MIDL_STUBLESS_PROXY_INFO ICalculator_ProxyInfo =
{
&Object_StubDesc,
__MIDL_ProcFormatString.Format,
&ICalculator_FormatStringOffsetTable[-3],
0,
0,
0
};
static const MIDL_SERVER_INFO ICalculator_ServerInfo =
{
&Object_StubDesc,
0,
__MIDL_ProcFormatString.Format,
&ICalculator_FormatStringOffsetTable[-3],
0,
0,
0,
0};
CINTERFACE_PROXY_VTABLE(11) _ICalculatorProxyVtbl =
{
&ICalculator_ProxyInfo,
&IID_ICalculator,
IUnknown_QueryInterface_Proxy,
IUnknown_AddRef_Proxy,
IUnknown_Release_Proxy ,
0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfoCount */ ,
0 /* (void *) (INT_PTR) -1 /* IDispatch::GetTypeInfo */ ,
0 /* (void *) (INT_PTR) -1 /* IDispatch::GetIDsOfNames */ ,
0 /* IDispatch_Invoke_Proxy */ ,
(void *) (INT_PTR) -1 /* ICalculator::get_Input */ ,
(void *) (INT_PTR) -1 /* ICalculator::put_Input */ ,
(void *) (INT_PTR) -1 /* ICalculator::Calculate */ ,
(void *) (INT_PTR) -1 /* ICalculator::get_Output */
};
static const PRPC_STUB_FUNCTION ICalculator_table[] =
{
STUB_FORWARDING_FUNCTION,
STUB_FORWARDING_FUNCTION,
STUB_FORWARDING_FUNCTION,
STUB_FORWARDING_FUNCTION,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2,
NdrStubCall2
};
CInterfaceStubVtbl _ICalculatorStubVtbl =
{
&IID_ICalculator,
&ICalculator_ServerInfo,
11,
&ICalculator_table[-3],
CStdStubBuffer_DELEGATING_METHODS
};
static const MIDL_STUB_DESC Object_StubDesc =
{
0,
NdrOleAllocate,
NdrOleFree,
0,
0,
0,
0,
0,
__MIDL_TypeFormatString.Format,
1, /* -error bounds_check flag */
0x50002, /* Ndr library version */
0,
0x6000169, /* MIDL Version 6.0.361 */
0,
UserMarshalRoutines,
0, /* notify & notify_flag routine table */
0x1, /* MIDL flag */
0, /* cs routines */
0, /* proxy/server info */
0 /* Reserved5 */
};
const CInterfaceProxyVtbl * _calc_ProxyVtblList[] =
{
( CInterfaceProxyVtbl *) &_ICalculatorProxyVtbl,
0
};
const CInterfaceStubVtbl * _calc_StubVtblList[] =
{
( CInterfaceStubVtbl *) &_ICalculatorStubVtbl,
0
};
PCInterfaceName const _calc_InterfaceNamesList[] =
{
"ICalculator",
0
};
const IID * _calc_BaseIIDList[] =
{
&IID_IDispatch,
0
};
#define _calc_CHECK_IID(n) IID_GENERIC_CHECK_IID( _calc, pIID, n)
int __stdcall _calc_IID_Lookup( const IID * pIID, int * pIndex )
{
if(!_calc_CHECK_IID(0))
{
*pIndex = 0;
return 1;
}
return 0;
}
const ExtendedProxyFileInfo calc_ProxyFileInfo =
{
(PCInterfaceProxyVtblList *) & _calc_ProxyVtblList,
(PCInterfaceStubVtblList *) & _calc_StubVtblList,
(const PCInterfaceName * ) & _calc_InterfaceNamesList,
(const IID ** ) & _calc_BaseIIDList,
& _calc_IID_Lookup,
1,
2,
0, /* table of [async_uuid] interfaces */
0, /* Filler1 */
0, /* Filler2 */
0 /* Filler3 */
};
#if _MSC_VER >= 1200
#pragma warning(pop)
#endif
#endif /* defined(_M_IA64) || defined(_M_AMD64)*/

View file

@ -0,0 +1,38 @@
/*********************************************************
DllData file -- generated by MIDL compiler
DO NOT ALTER THIS FILE
This file is regenerated by MIDL on every IDL file compile.
To completely reconstruct this file, delete it and rerun MIDL
on all the IDL files in this DLL, specifying this file for the
/dlldata command line option
*********************************************************/
#define PROXY_DELEGATION
#include <rpcproxy.h>
#ifdef __cplusplus
extern "C" {
#endif
EXTERN_PROXY_FILE( calc )
PROXYFILE_LIST_START
/* Start of list */
REFERENCE_PROXY_FILE( calc ),
/* End of list */
PROXYFILE_LIST_END
DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )
#ifdef __cplusplus
} /*extern "C" */
#endif
/* end of generated dlldata file */

222
examples/Puzzle/Puzzle.cpp Normal file
View file

@ -0,0 +1,222 @@
#include "CtrlLib/CtrlLib.h"
using namespace Upp;
#define LAYOUTFILE <Puzzle/Puzzle.lay>
#include <CtrlCore/lay.h>
#define IMAGEFILE <Puzzle/Puzzle.iml>
#define IMAGECLASS PuzzleImg
#include <Draw/iml.h>
#define TFILE <Puzzle/Puzzle.t>
#include <Core/t.h>
class Puzzle : public TopWindow {
public:
virtual void Paint(Draw& w);
virtual void LeftDown(Point p, dword);
private:
Buffer<int> box;
Size size;
Point hole;
int moves;
int lang;
VectorMap<String, int> score;
int& Get(int x, int y) { return box[size.cx * y + x]; }
bool Move(int x, int y);
void ShowStatus();
void Init();
void About();
void Scores();
void Setup();
void New();
void GameMenu(Bar& bar);
void MainMenu(Bar& bar);
MenuBar menu;
StatusBar status;
typedef Puzzle CLASSNAME;
public:
void Xmlize(XmlIO xml);
void Generate();
Puzzle();
};
bool Puzzle::Move(int x, int y)
{
if(x >= 0 && x < size.cx && y >= 0 && y < size.cy &&
(y == hole.y && abs(x - hole.x) == 1 || x == hole.x && abs(y - hole.y) == 1)) {
Swap(Get(x, y), Get(hole.x, hole.y));
hole = Point(x, y);
Refresh();
return true;
}
return false;
}
void Puzzle::ShowStatus()
{
String txt = t_("Moves: ");
txt << moves;
status = txt;
}
void Puzzle::Generate()
{
int n = size.cx * size.cy;
box.Alloc(n);
n--;
for(int i = 0; i < n; i++)
box[i] = i + 1;
box[n] = 0;
hole = size - 1;
n = 20 * size.cx * size.cy;
while(n > 0)
n -= Move(hole.x + (rand() % 3) - 1, hole.y + (rand() % 3) - 1);
moves = 0;
ShowStatus();
SetRect(GetWorkArea().CenterRect(AddFrameSize(size * 32)));
}
void Puzzle::Paint(Draw& w)
{
w.DrawRect(GetSize(), WhiteGray);
for(int y = 0; y < size.cy; y++)
for(int x = 0; x < size.cx; x++) {
int b = Get(x, y);
Point p(x * 32, y * 32);
if(b) {
w.DrawImage(p.x, p.y, PuzzleImg::BoxImg());
String txt = AsString(b);
Size sz = GetTextSize(txt, Arial(20).Bold());
w.DrawText(p.x + (32 - sz.cx) / 2, p.y + (32 - sz.cy) / 2, txt,
Arial(20).Bold(), SLtBlue);
}
}
}
void Puzzle::LeftDown(Point p, dword)
{
if(Move(p.x / 32, p.y / 32)) {
moves++;
ShowStatus();
int n = size.cx * size.cy - 1;
for(int i = 0; i < n; i++)
if(box[i] != i + 1)
return;
String dim;
int& sm = score.GetAdd(String().Cat() << size.cx << "x" << size.cy);
if(moves < sm) {
sm = moves;
PromptOK(t_("You win with the new best score!"));
}
else
PromptOK(t_("You win!"));
Generate();
}
else
BeepExclamation();
}
void Puzzle::About()
{
PromptOK("[A5 Puzzle]&Using [*^www://upp.sf.net^ Ultimate`+`+] technology.");
}
void Puzzle::Scores()
{
WithScoreLayout<TopWindow> d;
CtrlLayoutOK(d, t_("Best scores"));
d.score.AddColumn(t_("Dimension"));
d.score.AddColumn(t_("Moves"));
d.score.ColumnWidths("71 48");
d.score.NoCursor().NoGrid();
Vector<int> o = GetSortOrder(score.GetKeys());
for(int i = 0; i < o.GetCount(); i++)
d.score.Add(score.GetKey(o[i]), score[o[i]]);
d.Run();
}
void Puzzle::Setup()
{
WithSetupLayout<TopWindow> d;
CtrlLayoutOKCancel(d, t_("Puzzle setup"));
CtrlRetriever r;
Size sz = size;
r
(d.cx, size.cx)
(d.cy, size.cy)
(d.lang, lang)
;
if(d.Run() == IDOK) {
r.Retrieve();
Init();
if(sz != size)
Generate();
}
}
void Puzzle::New()
{
if(PromptYesNo(t_("Start a new game?")))
Generate();
}
void Puzzle::GameMenu(Bar& bar)
{
bar.Add(t_("New game"), THISBACK(New));
bar.Add(t_("Setup.."), THISBACK(Setup));
bar.Add(t_("Best scores.."), THISBACK(Scores));
bar.Separator();
bar.Add(t_("Exit"), Breaker());
}
void Puzzle::MainMenu(Bar& bar)
{
bar.Add(t_("Game"), THISBACK(GameMenu));
bar.Add(t_("About"), THISBACK(About));
}
void Puzzle::Init()
{
SetLanguage(lang);
SetDefaultCharset(CHARSET_UTF8);
menu.Set(THISBACK(MainMenu));
ShowStatus();
}
void Puzzle::Xmlize(XmlIO xml)
{
XmlizeLangAttr(xml, lang);
xml("Scores", score)
("Dimension", size);
Init();
}
Puzzle::Puzzle()
{
size = Size(4, 4);
AddFrame(menu);
AddFrame(status);
lang = LNG_ENGLISH;
Init();
BackPaint();
}
GUI_APP_MAIN
{
Puzzle p;
LoadFromXMLFile(p);
p.Generate();
p.Run();
StoreAsXMLFile(p);
}

View file

@ -0,0 +1,34 @@
IMAGE_BEGIN(BoxImg)
IMAGE_SCAN("ト仟タタト")
IMAGE_SCAN("ツぢタタ\2チ塔テ膚と寫\1ネ汨ね」暴1ホィ怎マェ档ムッ」ρェ杤1ホィ怩ヒ」暴1ネ汨と寫\1テ膚ぢタタツ")
IMAGE_SCAN("チ\6タタタセ芸チ塔ト来ニ寫ネ汨ね」暴2ホィ慫ェ桙ムッ」\1メッ、<EFBDAF>ウィ\1メッ、びッ」\2マェ榻ィ怩ヒ」暴5ネ汨ニ寫ト来チ塔€€€チ")
IMAGE_SCAN("チ\13タタタチ塔ト来ニ寫ネ汨ヒ」茂ィ慫ェ樮ッ」メッ、ヤウィ茄カャ\12ヤウィメッ、ムッ」マェ榻ィ慷」綿汨ニ寫ト来€€€チ")
IMAGE_SCAN("\12タタタチ塔テ膚ニ寫ネ汨ヒ」茂ィ慫ェ樮ッ」ヤウィへカャ\2リコールスウ<EFBDBD>ソカ\2ルスウリコーへカャ\10ヤウィムッ」マェ榻ィ慷」綿汨ニ寫テ膚\1€€€")
IMAGE_SCAN("\10タタタテ膚ニ寫ネ汨ヒ」茂ィ慫ェ榑ッ、へカャ\1ルスウぽソカ\1ンテコ<EFBE83>ナス\1ンテコぽソカ\1ルスウへカャ\6メッ、マェ榻ィ慷」綿汨ニ寫\1€€€")
IMAGE_SCAN("\7タタタト来ニ寫ヒ」茂ィ慫ェ榑ッ、へカャ\2ルスウロソカ<EFBDBF>ナス<EFBE85>フナ<EFBE8C>ナス\2ロソカルスウへカャ\5メッ、マェ榻ィ慷」免寫\1€€€")
IMAGE_SCAN("\6タタタニ寫ネ汨ヒ」妄ェ樮ッ」へカャ\2ルスウロソカむナス\1篶ナ<E7AFB6>マネ\1篶ナむナス\2ロソカルスウへカャ\4ムッ」マェ寨」綿汨\1€€€")
IMAGE_SCAN("\11タタタネ汨ヒ」茂ィ慯ッ」ヤウィヨカャルスウロソカむナス\2篶ナ蔆ネ<E89486>ユマ\2蔆ネ篶ナむナス\7ロソカルスウヨカャヤウィムッ」ホィ慷」暴1€€€")
IMAGE_SCAN("\10タタタネ汨ヒ」妄ェ榑ッ、ヨカャルスウロソカむナス\1蔆ネらユマ\2<><EFBFBD><EFBFBD>ンリ\2<><EFBFBD>ヤらユマ\1蔆ネむナス\6ロソカルスウヨカャメッ、マェ寨」暴1€€€")
IMAGE_SCAN("\7タタタヒ」茂ィ慯ッ」ヤウィヨカャロソカむナス\1篶ナらユマ\2<><EFBFBD><EFBFBD>矍\2<><EFBFBD>ヤらユマ\1篶ナむナス\5ロソカヨカャヤウィムッ」ホィ彌1€€€")
IMAGE_SCAN("\17タタタヒ」妄ェ榑ッ、ヨカャリコーロソガナス篶ナ蔆ネ釁マ<E98781><EFBFBD>リ髜ン<E9AB9C><EFBFBD>臀15<31>碚矍<E7A29A><EFBFBD>ヤ釁マ蔆ネ篶ナ゙ナスロソカリコーヨカャムッ」マェ杤1€€€")
IMAGE_SCAN("\37タタタヒ」妄ェ榑ッ、ヨカャルスウンテゴナス蔆ネ釁マ<E98781><EFBFBD>リ髜ン<E9AB9C><EFBFBD><E89498><EFBFBD><EFBFBD><E9BB91><EFBFBD><EFBFBD>蒡矍<E892A1><EFBFBD>ヤ釁マ蔆ネ゙ナスンテコルスウヨカャメッ、マェ杤1€€€")
IMAGE_SCAN("\6タタタホィ慫ェ榜ウィヨカャロソカむナス\6蔆ネ釁マ<E98781>ラ髜ン<E9AB9C><EFBFBD><E7A2AF>黑\1<><31><EFBFBD><EFBFBD>6<EFBFBD>銜裔髜ン<E9AB9C>ラ釁マ蔆ネむナス\4ロソカヨカャヤウィマェ杤1€€€")
IMAGE_SCAN("\17タタタホィ慯ッ」ヤウィヨカャロソガナス篶ナ蔆ネ釁マ<E98781>リ髜ン<E9AB9C>蔟渼<E8949F><E6B8BC><EFBFBD>15<31><35><EFBFBD>蒡矍<E892A1>リ釁マ蔆ネ篶ナ゙ナスロソカヨカャヤウィムッ」\1€€€")
IMAGE_SCAN("\37タタタホィ慯ッ」ヤウィヨカャロソガナス篶ナ蔆ネ釁マ<E98781>リ髜ン<E9AB9C>蔕黑<E89495><E9BB91><EFBFBD>\377\377\377飼<37><EFA8AB><EFBFBD><EFBFBD>鈕髜ン<E9AB9C>リ釁マ蔆ネ篶ナ゙ナスロソカヨカャヤウィムッ」\1€€€")
IMAGE_SCAN("\17タタタホィ慯ッ」ヤウィヨカャロソガナス篶ナ蔆ネ釁マ<E98781>リ髜ン<E9AB9C>蔟渼<E8949F><E6B8BC><EFBFBD>15<31><35><EFBFBD>蒡矍<E892A1>リ釁マ蔆ネ篶ナ゙ナスロソカヨカャヤウィムッ」\1€€€")
IMAGE_SCAN("\6タタタホィ慫ェ榜ウィヨカャロソカむナス\6蔆ネ釁マ<E98781>ラ髜ン<E9AB9C><EFBFBD><E7A2AF>黑\1<><31><EFBFBD><EFBFBD>6<EFBFBD>銜裔髜ン<E9AB9C>ラ釁マ蔆ネむナス\4ロソカヨカャヤウィマェ杤1€€€")
IMAGE_SCAN("\37タタタヒ」妄ェ榑ッ、ヨカャルスウンテゴナス蔆ネ釁マ<E98781><EFBFBD>リ髜ン<E9AB9C><EFBFBD><E89498><EFBFBD><EFBFBD><E9BB91><EFBFBD><EFBFBD>蒡矍<E892A1><EFBFBD>ヤ釁マ蔆ネ゙ナスンテコルスウヨカャメッ、マェ杤1€€€")
IMAGE_SCAN("\17タタタヒ」妄ェ榑ッ、ヨカャリコーロソガナス篶ナ蔆ネ釁マ<E98781><EFBFBD>リ髜ン<E9AB9C><EFBFBD>臀15<31>碚矍<E7A29A><EFBFBD>ヤ釁マ蔆ネ篶ナ゙ナスロソカリコーヨカャムッ」マェ杤1€€€")
IMAGE_SCAN("\7タタタヒ」茂ィ慯ッ」ヤウィヨカャロソカむナス\1篶ナらユマ\2<><EFBFBD><EFBFBD>矍\2<><EFBFBD>ヤらユマ\1篶ナむナス\5ロソカヨカャヤウィムッ」ホィ彌1€€€")
IMAGE_SCAN("\10タタタネ汨ヒ」妄ェ榑ッ、ヨカャルスウロソカむナス\1蔆ネらユマ\2<><EFBFBD><EFBFBD>ンリ\2<><EFBFBD>ヤらユマ\1蔆ネむナス\6ロソカルスウヨカャメッ、マェ寨」暴1€€€")
IMAGE_SCAN("\11タタタネ汨ヒ」茂ィ慯ッ」ヤウィヨカャルスウロソカむナス\2篶ナ蔆ネ<E89486>ユマ\2蔆ネ篶ナむナス\7ロソカルスウヨカャヤウィムッ」ホィ慷」暴1€€€")
IMAGE_SCAN("\6タタタニ寫ネ汨ヒ」妄ェ榑ッ、へカャ\2ルスウロソカむナス\1篶ナ<E7AFB6>マネ\1篶ナむナス\2ロソカルスウへカャ\4ムッ」マェ寨」綿汨\1€€€")
IMAGE_SCAN("\7タタタト来ニ寫ヒ」茂ィ慫ェ榑ッ、へカャ\2ルスウロソカ<EFBDBF>ナス<EFBE85>フナ<EFBE8C>ナス\2ロソカルスウへカャ\5メッ、マェ榻ィ慷」免寫\1€€€")
IMAGE_SCAN("\10タタタテ膚ニ寫ネ汨ヒ」茂ィ慫ェ榑ッ、へカャ\1ルスウぽソカ\1ンテコ<EFBE83>ナス\1ンテコぽソカ\1ルスウへカャ\6メッ、マェ榻ィ慷」綿汨ニ寫\1€€€")
IMAGE_SCAN("\12タタタチ塔テ膚ニ寫ネ汨ヒ」茂ィ慫ェ榑ッ、ヤウィへカャ\2リコールスウ<EFBDBD>ソカ\2ルスウリコーへカャ\10ヤウィムッ」マェ榻ィ慷」綿汨ニ寫テ膚\1€€€")
IMAGE_SCAN("\14タタタセ芸チ塔ト来ニ寫ネ汨ヒ」茂ィ慫ェ樮ッ」メッ、ヤウィ茄カャ\12ヤウィメッ、ムッ」マェ榻ィ慷」綿汨ニ寫ト来チ塔\1€€€")
IMAGE_SCAN("チ\6タタタセ芸チ塔ト来ニ寫ネ汨ね」暴3ホィ慫ェ樮ッ」ぴッ、<EFBDAF>ウィぴッ、\3ムッ」マェ榻ィ怩ヒ」暴5ネ汨ニ寫ト来チ塔€€€チ")
IMAGE_SCAN("チ\1タタタだ芸\2チ塔テ膚と寫\1ネ汨ね」暴1ホィ怎マェ档ムッ」ρェ杤1ホィ怩ヒ」暴1ネ汨と寫\4テ膚チ塔セ芸€€€チ")
IMAGE_SCAN("ツ<>€€\5セ芸チ塔テ膚ト来ニ寫な汨ν」妹ホィ怎ヒ」魔ネ汨\4ニ寫ト来テ膚チ塔<EFBE81>€€ツ")
IMAGE_SCAN("ト<>€€ト")
IMAGE_PACKED(BoxImg, "\2 \0\0\0 \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")

View file

@ -0,0 +1,17 @@
LAYOUT(SetupLayout, 152, 160)
ITEM(LabelBox, dv___0, SetLabel(t_("Dimension:")).LeftPosZ(8, 136).TopPosZ(4, 60))
ITEM(Label, dv___1, SetLabel(t_("Height:")).SetAlign(ALIGN_CENTER).LeftPosZ(80, 48).TopPosZ(20, 13))
ITEM(EditIntSpin, cx, Min(3).Max(15).NotNull(true).SetFrame(ThinInsetFrame()).LeftPosZ(16, 56).TopPosZ(36, 19))
ITEM(Label, dv___3, SetLabel(t_("Width:")).SetAlign(ALIGN_CENTER).LeftPosZ(16, 48).TopPosZ(20, 13))
ITEM(EditIntSpin, cy, Min(3).Max(15).NotNull(true).SetFrame(ThinInsetFrame()).LeftPosZ(80, 56).TopPosZ(36, 19))
ITEM(LabelBox, dv___5, SetLabel(t_("Language:")).LeftPosZ(8, 136).TopPosZ(72, 52))
ITEM(LNGCtrl, lang, LeftPosZ(32, 88).TopPosZ(92, 20))
ITEM(Button, ok, SetLabel(t_("OK")).HSizePosZ(80, 8).TopPosZ(132, 20))
ITEM(Button, cancel, SetLabel(t_("Cancel")).HSizePosZ(8, 80).TopPosZ(132, 20))
END_LAYOUT
LAYOUT(ScoreLayout, 156, 260)
ITEM(ArrayCtrl, score, LeftPosZ(8, 140).TopPosZ(44, 180))
ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(84, 64).TopPosZ(232, 20))
ITEM(Label, dv___2, SetLabel(t_("Best scores")).SetAlign(ALIGN_CENTER).SetFont(Arial(20)).SetInk(Blue).LeftPosZ(8, 140).TopPosZ(8, 32))
END_LAYOUT

68
examples/Puzzle/Puzzle.t Normal file
View file

@ -0,0 +1,68 @@
// Puzzle.cpp
T_("Moves: ")
csCZ("Počet tahů: ")
T_("You win with the new best score!")
csCZ("Vyřešeno s nejlepším počtem tahů!")
T_("You win!")
csCZ("Vyřešeno!")
T_("Puzzle")
csCZ("Hlavolam")
T_("Best scores")
csCZ("Nejlepší výsledky")
T_("Dimension")
csCZ("Rozměr")
T_("Moves")
csCZ("Tahy")
T_("Puzzle setup")
csCZ("Nastavení")
T_("Start a new game?")
csCZ("Začít znovu?")
T_("New game")
csCZ("Nová hra")
T_("Setup..")
csCZ("Nastavení")
T_("Best scores..")
csCZ("Nejlepší výsledky")
T_("Exit")
csCZ("Konec")
T_("Game")
csCZ("Hra")
T_("About")
csCZ("O aplikaci")
// Puzzle.lay
T_("Dimension:")
csCZ("Rozměr")
T_("Height:")
csCZ("Výška:")
T_("Width:")
csCZ("Šířka")
T_("Language:")
csCZ("Jazyk:")
T_("OK")
csCZ("OK")
T_("Cancel")
csCZ("Storno")

View file

@ -0,0 +1,14 @@
description "Puzzle game";
uses
CtrlLib;
file
Puzzle.cpp,
Puzzle.t charset "UTF-8",
Puzzle.iml,
Puzzle.lay;
mainconfig
"" = "GUI";

BIN
examples/Puzzle/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 B

View file

@ -0,0 +1,19 @@
description "SDL demo example";
uses
Core;
library(MSC) "SDL SDLmain";
library(GCC WIN32) "SDL.dll SDLmain";
library(LINUX) "SDL SDLmain";
library(FREEBSD) "SDL SDLmain X11 Xext Xrandr Xrender vga vgl aa usbhid ncurses";
file
main.cpp;
mainconfig
"" = "";

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

View file

@ -0,0 +1,380 @@
#include <Core/Core.h>
using namespace Upp;
#ifdef PLATFORM_WIN32
#include <SDL.h>
#else
#include <SDL/SDL.h>
#endif
const int maxpoint = 1000;
const int maxscroll = 7;
const int width = 640;
const int height = 480;
const int bpp = 8;
struct ScreenPoint
{
int x, y;
int sx, sy;
int col;
};
struct ScreenFont
{
int x0, y0;
int x1, y1;
};
double sintab[width];
SDL_Surface *fntbmp;
const char * scroll[]=
{
"ULTIMATE++",
"WHEN PROGRAMMING",
"IS FUN",
"THIS IS A SIMPLE",
"SDL DEMO",
"CODED BY UNO",
"ENJOY THE SCROLL"
};
const ScreenFont fntdef[50] =
{
0,0,32,51, 35,0,65,51, 71,0,101,52, 107,0,137,51, 143,0,167,51, 171,0,192,51,
197,0,227,52, 233,0,264,51, 270,0,283,51, 288,0,305,51, 311,0,343,51,
346,0,367,51, 371,0,412,51, 0,58,30,109, 36,58,66,110, 72,58,100,109,
105,58,135,115, 141,58,170,109, 175,58,205,110, 208,58,237,109,
241,58,271,110, 274,58,308,109, 310,58,361,109, 362,58,393,109,
394,58,424,109, 426,58,449,109,
/* 0 */
0,120,29,172, 33,120,54,171, 60,120,86,171, 93,120,122,172,
126,120,157,171, 162,120,190,172, 196,120,226,172, 230,120,254,171,
258,120,287,172, 293,120,323,172,
/* ! */
0,177,15,231, 18,177,66,233, 69,177,107,231, 111,177,140,236,
146,177,188,232, 191,177,220,205, 223,177,259,232, 261,177,277,194,
281,177,297,231, 301,177,317,231, 322,177,339,215, 343,177,373,221,
378,177,392,231, 396,177,410,231
};
const int fntascii[96] =
{
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,
36,0,38,39,40,42,0,44,45,43,47,0,46,0,0,
26,27,28,29,30,31,32,33,34,35,
0,0,0,0,0,0,37,
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,
17,18,19,20,21,22,23,24,25,
48,0,49,41
};
void PutLetter(SDL_Surface * screen, int x, int y, int n, int col, double ampl)
{
int dx = fntdef[n].x1 - fntdef[n].x0;
int dy = fntdef[n].y1 - fntdef[n].y0;
int sx = fntdef[n].x0;
int sy = fntdef[n].y0;
int w = screen->w;
int h = screen->h;
if(x + dx < 0 || y + dy < 0 || x > w || y > h)
return;
if(x < 0)
{
sx -= x;
dx += x;
x = 0;
}
if(y < 0)
{
sy -= y;
dy += y;
y = 0;
}
if(x + dx > w)
dx = w - x;
if(y + dy > h)
dy = h - y;
Uint8 * b = (Uint8 *) screen->pixels;
Uint8 * f = (Uint8 *) fntbmp->pixels;
for(int j = 0; j < dx; j++)
{
int ads = (y + (int) (sintab[x + j] * ampl)) * screen->w + x;
int adf = sy * fntbmp->w + sx;
for(int i = 0; i < dy; i++)
{
char c = f[adf + j];
if(c == 1)
b[ads + j] = col;
else if(c == 3)
b[ads + j] = 0;
ads += screen->w;
adf += fntbmp->w;
}
}
}
void WriteStr(SDL_Surface * screen, int x, int y, const char *str, int col, double ampl)
{
while(*str)
{
int n = fntascii[*str];
if(*str != 32)
{
PutLetter(screen, x, y, n, col, ampl);
x += fntdef[n].x1 - fntdef[n].x0 + 2;
}
else
x += 20;
str++;
}
}
int LengthStr(const char *str)
{
int l = 0, n;
while(*str)
{
n = fntascii[*str];
if(*str != 32)
l += fntdef[n].x1 - fntdef[n].x0 + 2;
else
l += 20;
str++;
}
return l;
}
void DrawPoints(SDL_Surface *screen, ScreenPoint *p)
{
Uint8 * b = (Uint8 *) screen->pixels;
for(int i = 0; i < maxpoint; i++)
b[p[i].y * screen->w + p[i].x] = 255;
}
void MovePoints(ScreenPoint *p)
{
int w = width - 1;
int h = height - 1;
for(int i = 0; i < maxpoint; i++)
{
p[i].x += p[i].sx;
p[i].y += p[i].sy;
if(p[i].x > w)
{
p[i].sx = -p[i].sx;
p[i].x = w;
}
if(p[i].x < 0)
{
p[i].sx = -p[i].sx;
p[i].x = 0;
}
if(p[i].y > h)
{
p[i].sy = -p[i].sy;
p[i].y = h;
}
if(p[i].y < 0)
{
p[i].sy = -p[i].sy;
p[i].y = 0;
}
}
}
void Blur(SDL_Surface *screen)
{
Uint8 * b = (Uint8 *) screen->pixels;
int i = 0;
for(; i < width * (height - 1); i++)
b[i] = (b[i] + b[i + 1] + b[i + width - 1] + b[i + width + 2]) >> 2;
for(; i < width * height; i++)
b[i] = 0;
}
SDL_Surface *CreateScreen(int w, int h, int bpp, int flags)
{
SDL_Surface * screen = SDL_SetVideoMode(w, h, bpp, flags);
if(!screen)
{
Cout() << Format("Couldn't set display mode: %s\n", SDL_GetError());
return NULL;
}
Cout() << Format("Screen is in %s mode\n", (screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");
return screen;
}
void SetupPalette(SDL_Surface * screen)
{
SDL_Color pal[256];
double d = 20;
double dx = 63.0 / 256.0;
for(int i = 0; i < 254; i++)
{
pal[i].r = (Uint8) d;
pal[i].g = (Uint8) d;
pal[i].b = 0;
d += dx;
}
pal[254].r = 0;
pal[254].g = 150;
pal[254].b = 255;
pal[255].r = 255;
pal[255].g = 255;
pal[255].b = 0;
SDL_SetColors(screen, pal, 0, 256);
SDL_Flip(screen);
SDL_SetColors(screen, pal, 0, 256);
}
CONSOLE_APP_MAIN
{
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
Cout() << Format("Couldn't initialize SDL: %s\n", SDL_GetError());
return;
}
ScreenPoint points[maxpoint];
for(int i = 0; i < width; i++)
sintab[i] = sin(i * M_PI / 180.0);
for(int i = 0; i < maxpoint; i++)
{
points[i].x = rand() % (width - 1);
points[i].y = rand() % (height - 1);
points[i].sx = (rand() & 1) + 1;
points[i].sy = (rand() & 1) + 1;
points[i].col = (rand() % 255);
}
fntbmp = SDL_LoadBMP(GetDataFile("font.bmp"));
if(!fntbmp)
{
Cout() << Format("Error loading font.bmp : %s\n", SDL_GetError());
return;
}
int videoflags = SDL_HWSURFACE | SDL_HWACCEL | SDL_DOUBLEBUF | SDL_FULLSCREEN;
SDL_Surface * screen = CreateScreen(width, height, bpp, videoflags);
if(!screen)
return;
SDL_Surface * surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, bpp, 0, 0, 0, 0);
if(!surface)
return;
SetupPalette(surface);
SetupPalette(screen);
int j = 0;
int k = 0;
int len0 = LengthStr(scroll[j]);
int len1 = len0;
int xmax = (width - len1) / 2;
int x0 = width;
int x1 = -len0;
SDL_Event event;
bool done = false;
while(!done)
{
if(SDL_PollEvent(&event))
switch (event.type)
{
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_LALT || event.key.keysym.sym == SDLK_TAB)
break;
if(event.key.keysym.sym == SDLK_LALT && event.key.keysym.sym == SDLK_RETURN)
{
videoflags ^= SDL_FULLSCREEN;
screen = CreateScreen(screen->w, screen->h, screen->format->BitsPerPixel, videoflags);
if(!screen)
{
Cout() << "Couldn't toggle fullscreen mode\n";
done = true;
}
SetupPalette(surface);
SetupPalette(screen);
break;
}
case SDL_QUIT:
done = true;
break;
default:
break;
}
else
{
SDL_LockSurface(surface);
DrawPoints(surface, points);
Blur(surface);
MovePoints(points);
if(x0 > -len0)
WriteStr(surface, x0 + 5, height - 195, scroll[k], 254, 50);
if(x1 <= xmax)
WriteStr(surface, x1, height - 260, scroll[j], 255, 50);
x0 -= 1;
x1 += 1;
if(x0 < -len0)
{
if(++k > maxscroll - 1) k = 0;
len0 = LengthStr(scroll[k]);
x0 = width;
}
if(x1 > xmax)
{
if(++j > maxscroll - 1) j = 0;
len1 = LengthStr(scroll[j]);
xmax = (width - len1) / 2;
x1 = -len1;
}
SDL_UnlockSurface(surface);
SDL_BlitSurface(surface, NULL, screen, NULL);
SDL_Flip(screen);
}
}
SDL_FreeSurface(surface);
SDL_FreeSurface(screen);
SDL_FreeSurface(fntbmp);
SDL_Quit();
}

Some files were not shown because too many files have changed in this diff Show more