Added a basic secret base editor

This commit is contained in:
Kurt 2014-11-23 14:23:40 -08:00
parent b2abf024f6
commit 817538e208
8 changed files with 2207 additions and 35 deletions

View file

@ -102,6 +102,12 @@
<Compile Include="PKX\f3-MemoryAmie.Designer.cs">
<DependentUpon>f3-MemoryAmie.cs</DependentUpon>
</Compile>
<Compile Include="SAV\SAV_SecretBase.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="SAV\SAV_SecretBase.Designer.cs">
<DependentUpon>SAV_SecretBase.cs</DependentUpon>
</Compile>
<Compile Include="SAV\SAV_EventFlagsORAS.cs">
<SubType>Form</SubType>
</Compile>
@ -217,6 +223,9 @@
<EmbeddedResource Include="PKX\f3-MemoryAmie.resx">
<DependentUpon>f3-MemoryAmie.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SAV\SAV_SecretBase.resx">
<DependentUpon>SAV_SecretBase.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="SAV\SAV_EventFlagsORAS.resx">
<DependentUpon>SAV_EventFlagsORAS.cs</DependentUpon>
</EmbeddedResource>

View file

@ -298,6 +298,7 @@
this.subepkx1 = new System.Windows.Forms.PictureBox();
this.subepkx2 = new System.Windows.Forms.PictureBox();
this.subepkx3 = new System.Windows.Forms.PictureBox();
this.B_OpenSecretBase = new System.Windows.Forms.Button();
this.GB_GTS = new System.Windows.Forms.GroupBox();
this.gtspkx = new System.Windows.Forms.PictureBox();
this.GB_Fused = new System.Windows.Forms.GroupBox();
@ -3368,8 +3369,9 @@
//
// Tab_Other
//
this.Tab_Other.Controls.Add(this.GB_Daycare);
this.Tab_Other.Controls.Add(this.B_OpenSecretBase);
this.Tab_Other.Controls.Add(this.GB_SUBE);
this.Tab_Other.Controls.Add(this.GB_Daycare);
this.Tab_Other.Controls.Add(this.GB_GTS);
this.Tab_Other.Controls.Add(this.GB_Fused);
this.Tab_Other.Controls.Add(this.L_ReadOnlyOther);
@ -3547,6 +3549,17 @@
this.subepkx3.TabIndex = 20;
this.subepkx3.TabStop = false;
//
// B_OpenSecretBase
//
this.B_OpenSecretBase.Location = new System.Drawing.Point(227, 151);
this.B_OpenSecretBase.Name = "B_OpenSecretBase";
this.B_OpenSecretBase.Size = new System.Drawing.Size(60, 37);
this.B_OpenSecretBase.TabIndex = 21;
this.B_OpenSecretBase.Text = "Secret Base";
this.B_OpenSecretBase.UseVisualStyleBackColor = true;
this.B_OpenSecretBase.Visible = false;
this.B_OpenSecretBase.Click += new System.EventHandler(this.B_OpenSecretBase_Click);
//
// GB_GTS
//
this.GB_GTS.Controls.Add(this.gtspkx);
@ -4326,6 +4339,7 @@
private System.Windows.Forms.CheckBox CHK_HackedStats;
private System.Windows.Forms.MaskedTextBox MT_Level;
private System.Windows.Forms.MaskedTextBox MT_Form;
private System.Windows.Forms.Button B_OpenSecretBase;
}
}

View file

@ -1215,7 +1215,7 @@ namespace PKHeX
TB_TID.Text = 12345.ToString();
TB_SID.Text = 54321.ToString();
}
updateAbilityList();
updateAbilityList(TB_AbilityNumber,Util.getIndex(CB_Species),CB_Ability,CB_Form);
}
private void InitializeLanguage()
{
@ -1681,7 +1681,7 @@ namespace PKHeX
TB_PID.Text = PID.ToString("X8");
CB_Species.SelectedValue = species;
CB_HeldItem.SelectedValue = helditem;
updateAbilityList();
updateAbilityList(TB_AbilityNumber, species, CB_Ability, CB_Form);
TB_AbilityNumber.Text = abilitynum.ToString();
if (abilitynum>>1 < 3) CB_Ability.SelectedIndex = abilitynum>>1; // error handling
else CB_Ability.SelectedIndex = 0;
@ -1816,7 +1816,7 @@ namespace PKHeX
TB_Level.Text = level.ToString();
// Setup Forms
setForms(species);
setForms(species, CB_Form);
try
{
CB_Form.SelectedIndex = altforms;
@ -1897,7 +1897,7 @@ namespace PKHeX
}
setMarkings();
}
private void setForms(int species)
public void setForms(int species, ComboBox cb)
{
// Form Tables
//
@ -2124,9 +2124,9 @@ namespace PKHeX
new { Text = forms[734], Value = 6}, // Cosplay
};
CB_Form.DataSource = form_list;
CB_Form.DisplayMember = "Text";
CB_Form.ValueMember = "Value";
cb.DataSource = form_list;
cb.DisplayMember = "Text";
cb.ValueMember = "Value";
// Mega List
int[] mspec = { // XY
@ -2138,8 +2138,8 @@ namespace PKHeX
{
if (mspec[i] == species)
{
CB_Form.DataSource = form_mega;
CB_Form.Enabled = true; // Mega Form Selection
cb.DataSource = form_mega;
cb.Enabled = true; // Mega Form Selection
return;
}
}
@ -2147,8 +2147,8 @@ namespace PKHeX
// MegaXY List
if ((species == 6) || (species == 150))
{
CB_Form.DataSource = form_megaxy;
CB_Form.Enabled = true; // Mega Form Selection
cb.DataSource = form_megaxy;
cb.Enabled = true; // Mega Form Selection
return;
}
@ -2188,12 +2188,12 @@ namespace PKHeX
else
{
CB_Form.Enabled = false;
cb.Enabled = false;
return;
};
CB_Form.DataSource = form_list;
CB_Form.Enabled = true;
cb.DataSource = form_list;
cb.Enabled = true;
}
private void setGenderLabel()
{
@ -2693,7 +2693,7 @@ namespace PKHeX
{
updateStats();
// Repopulate Abilities if Species Form has different abilities
updateAbilityList();
updateAbilityList(TB_AbilityNumber, Util.getIndex(CB_Species), CB_Ability, CB_Form);
// If form has a single gender, account for it.
if (CB_Form.Text == "♂")
@ -2740,7 +2740,7 @@ namespace PKHeX
if (MT_Level.Visible) level = Util.ToInt32(MT_Level.Text);
// Get Forms for Given Species
setForms(species);
setForms(species, CB_Form);
// Recalculate EXP for Given Level
uint exp = PKX.getEXP(level, species);
@ -2766,7 +2766,7 @@ namespace PKHeX
}
setGenderLabel();
updateAbilityList();
updateAbilityList(TB_AbilityNumber, Util.getIndex(CB_Species), CB_Ability, CB_Form);
updateForm(null, null);
// If species changes and no nickname, set the new name == speciesName.
@ -3490,20 +3490,19 @@ namespace PKHeX
Stat_SPD.Text = ((((((SPD_IV + (2 * SPD_B) + (SPD_EV / 4)) * level) / 100) + 5) * n4) / 10).ToString();
Stat_SPE.Text = ((((((SPE_IV + (2 * SPE_B) + (SPE_EV / 4)) * level) / 100) + 5) * n5) / 10).ToString();
}
private void updateAbilityList()
public void updateAbilityList(MaskedTextBox tb_abil, int species, ComboBox cb_abil, ComboBox cb_forme)
{
if (!init)
return;
int newabil = Convert.ToInt16(TB_AbilityNumber.Text) >> 1;
int species = Util.getIndex(CB_Species);
int newabil = Convert.ToInt16(tb_abil.Text) >> 1;
int[] abils = { 0, 0, 0 };
//
// Alternate Forms have different abilities. We must account for them!
//
if (CB_Form.SelectedIndex > 0)
if (cb_forme.SelectedIndex > 0)
{
int formnum = CB_Form.SelectedIndex;
int formnum = cb_forme.SelectedIndex;
if (species == 492 && formnum == 1) { species = 727; } // Shaymin
else if (species == 487 && formnum == 1) { species = 728; } // Giratina-O
else if (species == 550 && formnum == 1) { species = 738; } // Basculin Blue
@ -3576,10 +3575,10 @@ namespace PKHeX
ability_list.Add(abilitylist[abils[0]] + " (1)");
ability_list.Add(abilitylist[abils[1]] + " (2)");
ability_list.Add(abilitylist[abils[2]] + " (H)");
CB_Ability.DataSource = ability_list;
cb_abil.DataSource = ability_list;
if (newabil < 3) CB_Ability.SelectedIndex = newabil;
else CB_Ability.SelectedIndex = 0;
if (newabil < 3) cb_abil.SelectedIndex = newabil;
else cb_abil.SelectedIndex = 0;
}
private void updateAbilityNumber()
{
@ -3941,7 +3940,8 @@ namespace PKHeX
GB_SUBE.Visible =
B_OpenOPowers.Enabled = B_OpenPokedex.Enabled =
B_OpenBerryField.Enabled = !oras;
//B_OpenTrainerInfo.Enabled = B_OpenPokepuffs.Enabled = B_OpenBoxLayout.Enabled =
B_OpenSecretBase.Visible = oras;
this.Width = largeWidth;
}
@ -5856,6 +5856,12 @@ namespace PKHeX
SAV_HallOfFame halloffame = new PKHeX.SAV_HallOfFame(this);
halloffame.ShowDialog();
}
private void B_OpenSecretBase_Click(object sender, EventArgs e)
{
// Open Secret Base Menu
SAV_SecretBase secretbase = new PKHeX.SAV_SecretBase(this);
secretbase.ShowDialog();
}
private void B_OpenTemp_Click(object sender, EventArgs e)
{

View file

@ -528,6 +528,12 @@
<metadata name="ppkx6.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="GB_SUBE.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="subepkx1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="GB_Daycare.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
@ -564,12 +570,6 @@
<metadata name="DayCare_HasEgg.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="GB_SUBE.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="subepkx1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="GB_GTS.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>

View file

@ -342,8 +342,11 @@ http://projectpokemon.org/forums/showthread.php?36986
- Fixed: EXP now calculates and sets properly; switched from formulas (rounding errata) to a lookup table.
- Changed: Reorganized and cleaned up the source code in prep for future usage/updates.
11/05/14 - New Update:
11/05/14 - New Update: (Stable X/Y)
- Fixed: Casting error for base happiness.
11/21/14 - New Update:
- Added: Basic ORAS Support
11/22/14 - New Update:
- Improved ORAS support

1283
SAV/SAV_SecretBase.Designer.cs generated Normal file

File diff suppressed because it is too large Load diff

641
SAV/SAV_SecretBase.cs Normal file
View file

@ -0,0 +1,641 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace PKHeX
{
public partial class SAV_SecretBase : Form
{
public SAV_SecretBase(Form1 frm1)
{
InitializeComponent();
m_parent = frm1;
Array.Copy(m_parent.savefile, sav, 0x100000);
savindex = m_parent.savindex;
specieslist = Form1.specieslist;
movelist = Form1.movelist;
itemlist = Form1.itemlist;
abilitylist = Form1.abilitylist;
natures = Form1.natures;
setupComboBoxes();
popFavorite();
popFavorite();
LB_Favorite.SelectedIndex = 0;
B_SAV2FAV(null, null);
if (LB_Passerby.Items.Count > 0)
LB_Passerby.SelectedIndex = 0;
}
Form1 m_parent;
public byte[] sav = new Byte[0x100000];
public byte[] wondercard_data = new Byte[0x108];
public bool editing = false;
private static uint ToUInt32(String value)
{
if (String.IsNullOrEmpty(value))
return 0;
return UInt32.Parse(value);
}
public int savindex; int sv = 0;
private int fav_offset = 0x23A00;
private int pass_offset = 0x2B600 + 0x408;
private bool loading = true;
public static string[] specieslist = { };
public static string[] movelist = { };
public static string[] itemlist = { };
public static string[] abilitylist = { };
public static string[] natures = { };
private void setupComboBoxes()
{
#region Balls
{
// Allowed Balls
int[] ball_nums = { 7, 576, 13, 492, 497, 14, 495, 493, 496, 494, 11, 498, 8, 6, 12, 15, 9, 5, 499, 10, 1, 16 };
int[] ball_vals = { 7, 25, 13, 17, 22, 14, 20, 18, 21, 19, 11, 23, 8, 6, 12, 15, 9, 5, 24, 10, 1, 16 };
// Set up
List<cbItem> ball_list = new List<cbItem>();
for (int i = 4; i > 1; i--) // add 4,3,2
{
// First 3 Balls are always first
cbItem ncbi = new cbItem();
ncbi.Text = itemlist[i];
ncbi.Value = i;
ball_list.Add(ncbi);
}
// Sort the Rest based on String Name
string[] ballnames = new string[ball_nums.Length];
for (int i = 0; i < ball_nums.Length; i++)
ballnames[i] = itemlist[ball_nums[i]];
string[] sortedballs = new string[ball_nums.Length];
Array.Copy(ballnames, sortedballs, ballnames.Length);
Array.Sort(sortedballs);
// Add the rest of the balls
for (int i = 0; i < sortedballs.Length; i++)
{
cbItem ncbi = new cbItem();
ncbi.Text = sortedballs[i];
ncbi.Value = ball_vals[Array.IndexOf(ballnames, sortedballs[i])];
ball_list.Add(ncbi);
}
CB_Ball.DisplayMember = "Text";
CB_Ball.ValueMember = "Value";
CB_Ball.DataSource = ball_list;
}
#endregion
#region Held Items
{
// List of valid items to hold
int[] item_nums = {
000,001,002,003,004,005,006,007,008,009,010,011,012,013,014,015,017,018,019,020,021,022,023,024,025,026,027,028,029,030,031,032,033,034,035,
036,037,038,039,040,041,042,043,044,045,046,047,048,049,050,051,052,053,054,055,056,057,058,059,060,061,062,063,064,065,066,067,068,069,070,
071,072,073,074,075,076,077,078,079,080,081,082,083,084,085,086,087,088,089,090,091,092,093,094,099,100,101,102,103,104,105,106,107,108,109,
110,112,116,117,118,119,134,135,136,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,
175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,
210,211,212,213,214,215,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,
245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,
280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,
315,316,317,318,319,320,321,322,323,324,325,326,327,504,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,
558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,577,580,581,582,583,584,585,586,587,588,589,590,591,639,640,644,645,646,647,
648,649,650,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,
684,685,686,687,688,699,704,708,709,710,711,715,
// Appended ORAS Items (Orbs & Mega Stones)
534,535,
752,753,754,755,756,757,758,759,760,761,762,763,764,767,768,769,770,
};
List<cbItem> item_list = new List<cbItem>();
// Sort the Rest based on String Name
string[] itemnames = new string[item_nums.Length];
for (int i = 0; i < item_nums.Length; i++)
itemnames[i] = itemlist[item_nums[i]];
string[] sorteditems = new string[item_nums.Length];
Array.Copy(itemnames, sorteditems, itemnames.Length);
Array.Sort(sorteditems);
// Add the rest of the items
for (int i = 0; i < sorteditems.Length; i++)
{
cbItem ncbi = new cbItem();
ncbi.Text = sorteditems[i];
ncbi.Value = item_nums[Array.IndexOf(itemnames, sorteditems[i])];
item_list.Add(ncbi);
}
CB_HeldItem.DisplayMember = "Text";
CB_HeldItem.ValueMember = "Value";
CB_HeldItem.DataSource = item_list;
}
#endregion
#region Species
{
List<cbItem> species_list = new List<cbItem>();
// Sort the Rest based on String Name
string[] sortedspecies = new string[specieslist.Length];
Array.Copy(specieslist, sortedspecies, specieslist.Length);
Array.Sort(sortedspecies);
// Add the rest of the items
for (int i = 0; i < sortedspecies.Length; i++)
{
cbItem ncbi = new cbItem();
ncbi.Text = sortedspecies[i];
ncbi.Value = Array.IndexOf(specieslist, sortedspecies[i]);
species_list.Add(ncbi);
}
CB_Species.DisplayMember = "Text";
CB_Species.ValueMember = "Value";
CB_Species.DataSource = species_list;
}
#endregion
#region Natures
{
List<cbItem> natures_list = new List<cbItem>();
// Sort the Rest based on String Name
string[] sortednatures = new string[natures.Length];
Array.Copy(natures, sortednatures, natures.Length);
Array.Sort(sortednatures);
// Add the rest of the items
for (int i = 0; i < sortednatures.Length; i++)
{
cbItem ncbi = new cbItem();
ncbi.Text = sortednatures[i];
ncbi.Value = Array.IndexOf(natures, sortednatures[i]);
natures_list.Add(ncbi);
}
CB_Nature.DisplayMember = "Text";
CB_Nature.ValueMember = "Value";
CB_Nature.DataSource = natures_list;
}
#endregion
#region Moves
{
List<cbItem> move_list = new List<cbItem>();
// Sort the Rest based on String Name
string[] sortedmoves = new string[movelist.Length];
Array.Copy(movelist, sortedmoves, movelist.Length);
Array.Sort(sortedmoves);
// Add the rest of the items
for (int i = 0; i < sortedmoves.Length; i++)
{
cbItem ncbi = new cbItem();
ncbi.Text = sortedmoves[i];
ncbi.Value = Array.IndexOf(movelist, sortedmoves[i]);
move_list.Add(ncbi);
}
CB_Move1.DisplayMember = CB_Move2.DisplayMember = CB_Move3.DisplayMember = CB_Move4.DisplayMember = "Text";
CB_Move1.ValueMember = CB_Move2.ValueMember = CB_Move3.ValueMember = CB_Move4.ValueMember = "Value";
var move1_list = new BindingSource(move_list, null);
CB_Move1.DataSource = move1_list;
var move2_list = new BindingSource(move_list, null);
CB_Move2.DataSource = move2_list;
var move3_list = new BindingSource(move_list, null);
CB_Move3.DataSource = move3_list;
var move4_list = new BindingSource(move_list, null);
CB_Move4.DataSource = move4_list;
}
#endregion
}
// Repopulation Functions
private void popFavorite()
{
LB_Favorite.Items.Clear();
int playeroff = fav_offset + 0x5400 + 0x326;
int favoff = fav_offset + 0x5400 + 0x63A;
string OT = Util.TrimFromZero(Encoding.Unicode.GetString(sav, sv + playeroff + 0x218, 0x1A));
LB_Favorite.Items.Add("* " + OT);
for (int i = 0; i < 30; i++)
{
string BaseTrainer = Util.TrimFromZero(Encoding.Unicode.GetString(sav, sv + favoff + i * 0x3E0 + 0x218, 0x1A));
if (BaseTrainer.Length < 1 || BaseTrainer[0] == '\0')
BaseTrainer = "Empty";
LB_Favorite.Items.Add(i.ToString() + " " + BaseTrainer);
}
}
private void popPasserby()
{
for (int i = 0; i < 30; i++) // Passerby
{
// Trainer Names
string BaseTrainer = Encoding.Unicode.GetString(sav, sv + pass_offset + (0x298) * i + 0x14, 0x1A);
LB_Passerby.Items.Add(i.ToString() + " " + BaseTrainer);
}
}
private void B_SAV2FAV(object sender, EventArgs e)
{
loading = true;
int index = LB_Favorite.SelectedIndex;
if (index < 0) return;
int offset = fav_offset + 0x5400 + 0x25A;
// Base Offset Changing
if (index == 0)
offset = fav_offset + 0x5400 + 0x326;
else offset += 0x3E0 * index;
string TrainerName = Util.TrimFromZero(Encoding.Unicode.GetString(sav, sv + offset + 0x218, 0x1A));
string saying1 = Util.TrimFromZero(Encoding.Unicode.GetString(sav, sv + offset + 0x276 + 0x22 * 0, 0x22));
string saying2 = Util.TrimFromZero(Encoding.Unicode.GetString(sav, sv + offset + 0x276 + 0x22 * 1, 0x22));
string saying3 = Util.TrimFromZero(Encoding.Unicode.GetString(sav, sv + offset + 0x276 + 0x22 * 2, 0x22));
string saying4 = Util.TrimFromZero(Encoding.Unicode.GetString(sav, sv + offset + 0x276 + 0x22 * 3, 0x22));
int baseloc = BitConverter.ToInt16(sav, sv + offset);
textBox1.Text = baseloc.ToString();
TB_FOT.Text = TrainerName; TB_FSay1.Text = saying1; TB_FSay2.Text = saying2; TB_FSay3.Text = saying3; TB_FSay4.Text = saying4;
// Gather data for Object Array
objdata = new byte[25, 12];
for (int i = 0; i < 25; i++)
for (int z = 0; z < 12; z++)
objdata[i, z] = sav[sv + offset + 2 + 12 * i + z];
NUD_FObject.Value = 1; // Trigger Update
changeObjectIndex(null, null);
GB_PKM.Enabled = (index > 0);
// Trainer Pokemon
pkmdata = new byte[3, 0x34];
if (index > 0)
for (int i = 0; i < 3; i++)
for (int z = 0; z < 0x34; z++)
pkmdata[i, z] = sav[sv + offset + 0x32E + 0x34 * i + z];
NUD_FPKM.Value = 1;
changeFavPKM(null, null); // Trigger Update
loading = false;
}
private byte[,] objdata;
private byte[,] pkmdata;
private void B_FAV2SAV(object sender, EventArgs e)
{
// Write data back to save
int index = LB_Favorite.SelectedIndex; // store for restoring
if (index < 0) return;
int offset = fav_offset + 0x5400 + 0x25A;
// Base Offset Changing
if (index == 0)
offset = fav_offset + 0x5400 + 0x326;
else offset += 0x3E0 * index;
string TrainerName = TB_FOT.Text;
byte[] tr = Encoding.Unicode.GetBytes(TrainerName);
Array.Resize(ref tr, 0x22); Array.Copy(tr, 0, sav, sv + offset + 0x218, 0x1A);
string saying1 = TB_FSay1.Text;
string saying2 = TB_FSay2.Text;
string saying3 = TB_FSay3.Text;
string saying4 = TB_FSay4.Text;
byte[] s1 = Encoding.Unicode.GetBytes(saying1);
Array.Resize(ref s1, 0x22); Array.Copy(s1, 0, sav, sv + offset + 0x276 + 0x22 * 0, 0x22);
byte[] s2 = Encoding.Unicode.GetBytes(saying2);
Array.Resize(ref s2, 0x22); Array.Copy(s2, 0, sav, sv + offset + 0x276 + 0x22 * 1, 0x22);
byte[] s3 = Encoding.Unicode.GetBytes(saying3);
Array.Resize(ref s3, 0x22); Array.Copy(s3, 0, sav, sv + offset + 0x276 + 0x22 * 2, 0x22);
byte[] s4 = Encoding.Unicode.GetBytes(saying4);
Array.Resize(ref s4, 0x22); Array.Copy(s4, 0, sav, sv + offset + 0x276 + 0x22 * 3, 0x22);
int baseloc = Convert.ToInt16(textBox1.Text);
Array.Copy(BitConverter.GetBytes(baseloc), 0, sav, sv + offset, 2);
TB_FOT.Text = TrainerName; TB_FSay1.Text = saying1; TB_FSay2.Text = saying2; TB_FSay3.Text = saying3; TB_FSay4.Text = saying4;
// Copy back Objects
for (int i = 0; i < 25; i++)
for (int z = 0; z < 12; z++)
sav[sv + offset + 2 + 12 * i + z] = objdata[i, z];
if (GB_PKM.Enabled) // Copy pkm data back in
for (int i = 0; i < 3; i++)
for (int z = 0; z < 0x34; z++)
sav[sv + offset + 0x32E + 0x34 * i + z] = pkmdata[i, z];
popFavorite();
LB_Favorite.SelectedIndex = index;
}
// Button Specific
private void B_Cancel_Click(object sender, EventArgs e)
{
Close();
}
private void B_Save_Click(object sender, EventArgs e)
{
Array.Copy(sav, m_parent.savefile, 0x100000);
m_parent.savedited = true;
Close();
}
private void B_GiveDecor_Click(object sender, EventArgs e)
{
int offset = sv + 0x23A00 + 0x5400;
for (int i = 0; i < 173; i++)
{
int qty = BitConverter.ToUInt16(sav, offset + i * 4);
int has = BitConverter.ToUInt16(sav, offset + i * 4 + 2);
if (qty == 0) // give 1.
{
sav[offset + i * 4] = (byte)(1 + 4 * Convert.ToInt16(ModifierKeys == Keys.Control)); // give 4 more if ctrl is pressed.
sav[offset + i * 4 + 2] = 1;
}
}
}
private void changeObjectIndex(object sender, EventArgs e)
{
int objindex = (int)(NUD_FObject.Value) - 1;
byte[] objinfo = new Byte[12];
for (int i = 0; i < 12; i++)
objinfo[i] = objdata[objindex, i];
// Array with object data acquired. Fill data.
int val = objinfo[0]; if (val == 0xFF) val = -1;
byte x = objinfo[2];
byte y = objinfo[4];
byte rot = objinfo[6];
byte unk1 = objinfo[7];
ushort unk2 = BitConverter.ToUInt16(objinfo, 0x8);
// Set values to display
editing = true;
NUD_FObjType.Value = val;
NUD_FX.Value = x;
NUD_FY.Value = y;
NUD_FRot.Value = rot;
editing = false;
}
private void changeObjectQuality(object sender, EventArgs e)
{
if (editing) return;
int objindex = (int)(NUD_FObject.Value) - 1;
byte val = (byte)(NUD_FObjType.Value);
byte x = (byte)(NUD_FX.Value);
byte y = (byte)(NUD_FY.Value);
byte rot = (byte)(NUD_FRot.Value);
objdata[objindex, 0] = val;
objdata[objindex, 2] = x;
objdata[objindex, 4] = y;
objdata[objindex, 6] = rot;
}
private int currentpkm;
private void changeFavPKM(object sender, EventArgs e)
{
int index = (int)(NUD_FPKM.Value);
saveFavPKM(); // Save existing PKM
currentpkm = index;
loadFavPKM();
}
private void saveFavPKM()
{
if (loading || !GB_PKM.Enabled) return;
int index = currentpkm;
byte[] pkm = new Byte[0x34];
Array.Copy(BitConverter.GetBytes(Util.getHEXval(TB_EC)), 0, pkm, 0, 4); // EC
Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_Species)), 0, pkm, 8, 2);
Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_HeldItem)), 0, pkm, 0xA, 2);
pkm[0xC] = (byte)Array.IndexOf(abilitylist, (CB_Ability.Text).Remove((CB_Ability.Text).Length - 4)); // Ability
pkm[0xD] = (byte)(CB_Ability.SelectedIndex << 1); // Number
pkm[0x14] = (byte)Util.getIndex(CB_Nature);
int fegform = 0;
fegform += (Convert.ToInt32(Label_Gender.Text == "♀") * 2); // Female Gender
fegform += (Convert.ToInt32(Label_Gender.Text == "-") * 4); // Genderless
fegform += ((Util.getIndex(CB_Form)) * 8);
pkm[0x15] = (byte)fegform;
pkm[0x16] = (byte)(Convert.ToByte( TB_HPEV.Text) & 0x1F);
pkm[0x17] = (byte)(Convert.ToByte(TB_ATKEV.Text) & 0x1F);
pkm[0x18] = (byte)(Convert.ToByte(TB_DEFEV.Text) & 0x1F);
pkm[0x19] = (byte)(Convert.ToByte(TB_SPAEV.Text) & 0x1F);
pkm[0x1A] = (byte)(Convert.ToByte(TB_SPDEV.Text) & 0x1F);
pkm[0x1B] = (byte)(Convert.ToByte(TB_SPEEV.Text) & 0x1F);
Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_Move1)), 0, pkm, 0x1C, 2);
Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_Move2)), 0, pkm, 0x1E, 2);
Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_Move3)), 0, pkm, 0x20, 2);
Array.Copy(BitConverter.GetBytes(Util.getIndex(CB_Move4)), 0, pkm, 0x22, 2);
pkm[0x24] = (byte)CB_PPu1.SelectedIndex;
pkm[0x25] = (byte)CB_PPu2.SelectedIndex;
pkm[0x26] = (byte)CB_PPu3.SelectedIndex;
pkm[0x27] = (byte)CB_PPu4.SelectedIndex;
pkm[0x28] = (byte)(Convert.ToByte(TB_HPIV.Text) & 0x1F);
pkm[0x29] = (byte)(Convert.ToByte(TB_ATKIV.Text) & 0x1F);
pkm[0x2A] = (byte)(Convert.ToByte(TB_DEFIV.Text) & 0x1F);
pkm[0x2B] = (byte)(Convert.ToByte(TB_SPAIV.Text) & 0x1F);
pkm[0x2C] = (byte)(Convert.ToByte(TB_SPDIV.Text) & 0x1F);
pkm[0x2D] = (byte)(Convert.ToByte(TB_SPEIV.Text) & 0x1F);
int shiny = (checkBox1.Checked? 1 : 0) << 6;
pkm[0x2D] |= (byte)shiny;
pkm[0x2E] = Convert.ToByte(TB_Friendship.Text);
pkm[0x2F] = (byte)Util.getIndex(CB_Ball);
pkm[0x30] = Convert.ToByte(TB_Level.Text);
for (int i = 0; i < 0x34; i++) // Copy data back to storage.
pkmdata[index - 1, i] = pkm[i];
}
private void loadFavPKM()
{
int index = currentpkm - 1;
byte[] fpkm = new Byte[0x34];
for (int i = 0; i < 0x34; i++)
fpkm[i] = pkmdata[index, i];
uint ec = BitConverter.ToUInt32(fpkm, 0);
uint unk = BitConverter.ToUInt32(fpkm, 4);
int spec = BitConverter.ToInt16(fpkm, 8);
int item = BitConverter.ToInt16(fpkm, 0xA);
int abil = fpkm[0xC];
int abil_no = fpkm[0xD];
MT_AbilNo.Text = abil_no.ToString();
// 6 unknown bytes, contest?
int nature = fpkm[0x14];
byte genform = fpkm[0x15];
genderflag = (genform >> 1) & 0x3;
setGenderLabel();
byte HP_EV = fpkm[0x16];
byte AT_EV = fpkm[0x17];
byte DE_EV = fpkm[0x18];
byte SA_EV = fpkm[0x19];
byte SD_EV = fpkm[0x1A];
byte SP_EV = fpkm[0x1B];
int move1 = BitConverter.ToInt16(fpkm, 0x1C);
int move2 = BitConverter.ToInt16(fpkm, 0x1E);
int move3 = BitConverter.ToInt16(fpkm, 0x20);
int move4 = BitConverter.ToInt16(fpkm, 0x22);
byte ppu1 = fpkm[0x24];
byte ppu2 = fpkm[0x25];
byte ppu3 = fpkm[0x26];
byte ppu4 = fpkm[0x27];
byte HP_IV = fpkm[0x28];
byte AT_IV = fpkm[0x29];
byte DE_IV = fpkm[0x2A];
byte SA_IV = fpkm[0x2B];
byte SD_IV = fpkm[0x2C];
byte SP_IV = fpkm[0x2D];
bool isshiny = ((SP_IV & 0x40) > 0);
SP_IV &= 0x40;
byte friendship = fpkm[0x2E];
int ball = fpkm[0x2F];
byte level = fpkm[0x30];
// Put data into fields.
TB_EC.Text = ec.ToString("X8");
CB_Species.SelectedValue = spec;
CB_HeldItem.SelectedValue = item;
CB_Nature.SelectedValue = nature;
CB_Ball.SelectedValue = ball;
TB_HPIV.Text = HP_IV.ToString();
TB_ATKIV.Text = AT_IV.ToString();
TB_DEFIV.Text = DE_IV.ToString();
TB_SPAIV.Text = SA_IV.ToString();
TB_SPDIV.Text = SD_IV.ToString();
TB_SPEIV.Text = (SP_IV & 0x1F).ToString();
TB_HPEV.Text = HP_EV.ToString();
TB_ATKEV.Text = AT_EV.ToString();
TB_DEFEV.Text = DE_EV.ToString();
TB_SPAEV.Text = SA_EV.ToString();
TB_SPDEV.Text = SD_EV.ToString();
TB_SPEEV.Text = SP_EV.ToString();
TB_Friendship.Text = friendship.ToString();
TB_Level.Text = level.ToString();
CB_Move1.SelectedValue = move1;
CB_Move2.SelectedValue = move2;
CB_Move3.SelectedValue = move3;
CB_Move4.SelectedValue = move4;
CB_PPu1.SelectedIndex = ppu1;
CB_PPu2.SelectedIndex = ppu2;
CB_PPu3.SelectedIndex = ppu3;
CB_PPu4.SelectedIndex = ppu4;
checkBox1.Checked = isshiny;
// Set Form
m_parent.setForms(spec, CB_Form);
int form = genform >> 3;
CB_Form.SelectedIndex = form;
// Set Ability
m_parent.updateAbilityList(MT_AbilNo, spec, CB_Ability, CB_Form);
}
private void updateSpecies(object sender, EventArgs e)
{
int species = Util.getIndex(CB_Species);
// Get Forms for Given Species
m_parent.setForms(species, CB_Form);
// Check for Gender Changes
// Get Gender Threshold
species = Util.getIndex(CB_Species);
DataTable spectable = PKX.SpeciesTable();
gt = (int)spectable.Rows[species][8];
if (gt == 258) // Genderless
genderflag = 2;
else if (gt == 257) // Female Only
genderflag = 1;
else if (gt == 256) // Male Only
genderflag = 0;
setGenderLabel();
m_parent.updateAbilityList(MT_AbilNo, Util.getIndex(CB_Species), CB_Ability, CB_Form);
}
private void updateForm(object sender, EventArgs e)
{
m_parent.updateAbilityList(MT_AbilNo, Util.getIndex(CB_Species), CB_Ability, CB_Form);
// If form has a single gender, account for it.
if (CB_Form.Text == "♂")
Label_Gender.Text = "♂";
else if (CB_Form.Text == "♀")
Label_Gender.Text = "♀";
}
private int species; private int gt; private int genderflag;
private void Label_Gender_Click(object sender, EventArgs e)
{
// Get Gender Threshold
species = Util.getIndex(CB_Species);
DataTable spectable = PKX.SpeciesTable();
gt = (int)spectable.Rows[species][8];
if (gt > 255) // Single gender/genderless
return;
if (gt < 256) // If not a single gender(less) species:
{
if (Label_Gender.Text == "♂")
Label_Gender.Text = "♀";
else
Label_Gender.Text = "♂";
}
}
private void setGenderLabel()
{
if (genderflag == 0)
{
// Gender = Male
Label_Gender.Text = "♂";
}
else if (genderflag == 1)
{
// Gender = Female
Label_Gender.Text = "♀";
}
else { Label_Gender.Text = "-"; }
}
}
}

216
SAV/SAV_SecretBase.resx Normal file
View file

@ -0,0 +1,216 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAE
AAAAAAAAAAAAAAAAAAAAAAAAIyMjAQAAAAALCwsPJiYmJysrKycqKionKSkpJykpKScpKSknKioqJyoq
KicrKysnJycnJw0ODQ8AAAAAJiYmAQAAAABpaWlHq6ur17+/v+6+vr7svr6+7b6+vu2+vr7tvr6+7b6+
vu2+vr7tvr6+7L+/v+6rq6vXampqSAAAAAAoKSgXvr++3eLi4v/g4OD94eHh/+Hh4f/i4uL/4uLi/+Li
4v/i4uL/4eHh/+Dh4P/g4OD94uLi/7+/v90sLCwXfn5+PNna2frg4OD/39/f/uHh4f7h4eH+39/f/uDg
4P7g4OD+39/f/uHh4f7h4OH+39/f/t/g3//a2tr6g4ODPoOCgz7X19f64+Pj/+Li4v7k5OT/4+Tj//Ly
8v/19fX/9PT0//T09P/k5OT/5OTk/+Pj4/7j4+P/19jX+4qLikCDhIM+2tra++Xl5f/k5eT+5OTk//Lz
8v+urq7/RUVF/z4+Pv+Zmpn/8fHx/+Xm5f/k5eT+5eXl/9ra2vyLi4tAhYWFPuXm5vvx8vP/7+/w/v//
//+sra3/AgIC/15eXv9tbG3/BQUF/4yMjP//////7+/w/vHy8//l5ub8jY2NQC4uLD5LS0f7UFBL/09P
Sv5YWVP/FBUS/29wcP///////////5SUlP8PDw//U1NO/1BQS/5PT0r/S0tH/DIyMEAAAAs+AAAM+wAA
Dv8AAA/+AwMS/wAAAP+UlJX///////////+3t7n/AAAA/wAAD/8BAQ/+AAAO/wAADPwCAg5ABARSPgoK
k/sNDab/DQ2o/hAQvP8CAmj/IiIW/7Kzrv/Cw8D/NDQm/wAATf8QELz/DQ2q/gwMp/8LC5T8Dg5bQAUF
Xj4KCpz7DQ2u/w0NsP4NDbX/Dw+//wUFYf8CAhL/AwMP/wMDTf8ODrj/Dg64/w0NsP4MDK7/Cwud/A8P
aEEGBmU9DAyl+w4Otf8ODrf+Dw+6/xAQvv8TE8v/EhK+/xAQvP8TE8v/EBDA/w8Puf8PD7f+Dg61/w0N
pvsREW9ACAhtQA8PsfsTE77/ExO//xQUwP8UFML/FBTD/xUVyP8WFsn/FRXE/xQUw/8UFMH/ExO//xMT
vv8QELL7ERF3QxkZdCgXF771ExPH/xUVyPwVFcn9FhbL/RcXzP0XF8z9FxfM/RcXy/0XF8v9FhbJ/RUV
yPwTE8f/Fxe+9RkZdykAAAAAIyOtghsbx/8ZGcj+GRnJ/xoayf8aGsn/GhrK/xoayv8aGsn/GhrJ/xkZ
yf8ZGcj+GxvH/yMjrYQAAAAAAADHAQAAAAAzM51FLCyscCoqrGwqKqxtKSmsbSoqrG0qKqxtKSmsbSoq
rG0qKqxsLCyscDMznUUAAAAAAAAAAP//AADAAwAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIAB
AACAAQAAgAEAAIABAACAAQAAgAEAAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAAAQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKysrCR0dHSMWFhY3GBgYORgYGDkYGBg5GBgYORgY
GDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5GBgYORgYGDkYGBg5FxcXNx4e
HiQuLi4JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhIARYWFis7OzuVkJCQ2ampqeqqqqrsqqqq7Kqq
quyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqqquyqqqrsqqqq7Kqq
quypqanqkZGR2j09PZcXFxcsUFBQAQAAAAAAAAAAAAAAAAAAAAASEhIuhISEytvb2/7W1tb/19fX/9jY
2P/Y2Nj/2NjY/9jY2P/Y2Nj/2NjY/9nZ2f/Z2dn/2dnZ/9nZ2f/Z2dn/2dnZ/9nZ2f/Y2Nj/2NjY/9jY
2P/Y2Nj/2NjY/9fX1//W1tb/29vb/oeHh8sTExMvAAAAAAAAAAAAAAAAPDw8DGtra6zZ2dn/2dnZ/9ra
2v/b29v/29vb/9vb2//c3Nz/3Nzc/9zc3P/c3Nz/3d3d/93d3f/d3d3/3d3d/93d3f/d3d3/3Nzc/9zc
3P/c3Nz/3Nzc/9vb2//b29v/29vb/9ra2v/Z2dn/2dnZ/21tba5DQ0MNAAAAAAAAAAAiIiIx1NXU9tna
2f/c3Nz/3d3d/93e3f/e3t7/3t7e/9/f3//f39//39/f/9/g3//g4OD/4ODg/+Dg4P/g4OD/4ODg/+Dg
4P/g4OD/39/f/9/f3//f39//3t/e/97e3v/d3t3/3d3d/9zc3P/Z2tn/1dXV9icnJzMAAAAAAAAAAFhZ
WFzf4N//3Nzc/97e3v/f39//39/f/9/g3//g4OD/4ODg/+Hh4f/h4eH/4eHh/+Li4v/i4uL/4uLi/+Li
4v/i4uL/4uLi/+Hi4f/h4eH/4eHh/+Dg4P/g4OD/3+Df/9/f3//f39//3t7e/9zc3P/f39//XV1dXQAA
AAAAAAAAZmZmZdvc2//e3t7/3+Df/+Dg4P/g4eD/4eHh/+Hi4f/i4uL/4uPi/+Pj4//j4+P/5OTk/+Tk
5P/k5OT/5OTk/+Tk5P/k5OT/4+Pj/+Pj4//j4+P/4uLi/+Li4v/h4eH/4eHh/+Dg4P/f4N//3t7e/9vb
2/9wcHBoAAAAAAAAAABoaGhl3d3d/9/f3//h4eH/4eLh/+Li4v/j4+P/4+Pj/+Tk5P/k5OT/5eXl/+Xl
5f/l5uX/5ubm/+bm5v/m5ub/5ubm/+bm5v/l5eX/5eXl/+Tk5P/k5OT/4+Pj/+Pj4//i4uL/4uLi/+Hh
4f/f39//3N3c/3Nzc2kAAAAAAAAAAGhoaGXe3t7/4ODg/+Li4v/j4+P/4+Pj/+Tk5P/l5eX/5eXl/+bm
5v/m5+b/5+fn/+fn5//n6Of/6Ojo/+jo6P/o6Oj/5+fn/+fn5//n5+f/5ubm/+Xl5f/l5eX/5OTk/+Pk
4//j4+P/4uLi/+Dg4P/e3t7/c3NzaQAAAAAAAAAAaGhoZd/g3//i4uL/5OTk/+Tl5P/l5eX/5ebl/+bn
5v/n5+f/5+jn/+jp6P/p6en/7Ozs/8LCwv+Tk5P/ioqK/66urv/o6ej/6enp/+jp6P/o6Oj/5+jn/+bn
5v/m5ub/5ebl/+Tl5P/k5OT/4uLi/9/g3/9zdHNpAAAAAAAAAABoaWhl4eLh/+Pk4//m5ub/5ubm/+fn
5//n6Of/6Ojo/+np6f/p6un/6urq/8bGxv8yMjL/AAAA/wAAAP8AAAD/AAAA/xMTE/+ZmZn/7Ozs/+rq
6v/p6en/6Ojo/+jo6P/n5+f/5ubm/+bm5v/k5OT/4eHh/3R0dGkAAAAAAAAAAGhpaGXj4+P/5eXl/+fn
5//n6Of/6Ojo/+np6f/q6ur/6urq/+vr6//Dw8P/DAwM/wAAAP8AAAD/Gxsb/ygoKP8BAQH/AAAA/wAA
AP+FhYX/7O3s/+rr6v/q6ur/6enp/+jo6P/o6Oj/5+fn/+Xl5f/i4+L/dHR0aQAAAAAAAAAAYWFhZeTl
5P/m5+b/6Ono/+np6f/p6un/6uvq/+vr6//s7Oz/7e7t/ycnJ/8AAAD/Ghoa/7S0tP/m5ub/5OTk/9HR
0f9GRkb/AAAA/wICAv/IyMj/7Ozs/+vs6//q6+r/6urq/+nq6f/o6ej/5+fn/+Tk5P9sbGxpAAAAAAAA
AAA9Pj1lj4+P/5OTk/+VlZX/lpaW/5eXl/+YmJj/mZmZ/5qamv92dnb/AAAA/wEBAf+/wL//3Nzc/+Tk
5P/l5eX/3d3d/+Li4v8mJib/AAAA/0ZGRv+ampr/mZmZ/5iYmP+Xl5f/lpaW/5WVlf+Tk5P/j4+P/0ZG
RmoAAAAAAAAAAAwMDGUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/Nzc3/+fn
5//q6ur/7O3s/+zt7P/v7+//39/f/4WFhf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/EBAQagAAAAAAAAAAAwMHZQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP9NTU3/5ufm//Lz8v/z9PP/8/Tz//X19f/l5eX/nZ2d/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8GBgpqAAAAAAAAAAAAABZlAQEk/wEBJ/8CAin/AgIq/wICKv8CAiv/AgIs/wIC
LP8BAR3/AAAA/xwcHP/w8PD/6+zr//r6+v/6+vr/9PT0/+vr6/9lZWX/AAAA/wAAD/8CAi3/AgIs/wIC
K/8CAir/AgIq/wICKf8BASf/AQEl/wUFG2oAAAAAAAAAAAICQGUGBpL/Bwec/wgIo/8JCaf/CQmq/wkJ
rf8JCa//Cgqz/wkJqP8AAAL/AAAA/4CAgP/y8/L/6+zr/+3t7f/u7u7/xMTE/wcHB/8AAAD/BgZz/woK
s/8JCbD/CQmt/wkJqv8JCaj/CAik/wcHnf8HB5P/Dg5MagAAAAAAAAAAAwNHZQgIk/8JCZ3/Cgqj/wsL
p/8LC6n/Cwus/wsLr/8MDLL/DAy2/wYGW/8AAAD/AAAA/1JSUv+sraz/tra2/3h4eP8KCgr/AAAA/wIC
Iv8MDLb/DAyy/wsLsP8LC63/Cwuq/wsLp/8KCqT/CQmd/wgIk/8PD1VrAAAAAAAAAAAEBE1lCQmY/woK
ov8LC6j/DAyr/wwMrf8MDLD/DAyy/w0Ntf8NDbf/Dg67/wUFSv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8CAiH/DQ2q/w0NuP8NDbX/DQ2z/wwMsP8MDK7/DAyr/wsLqP8KCqL/CQmZ/xAQWmsAAAAAAAAAAAQE
UGUKCp7/Cwum/wwMrP8NDa//DQ2w/w0Ns/8ODrX/Dg63/w4Ouf8ODrv/Dw/A/wwMiv8FBTj/AAAG/wAA
AP8DAyb/CQls/w8Pu/8PD7z/Dg66/w4OuP8ODrX/DQ2z/w0Nsf8NDa//DAys/wsLp/8KCp7/ERFeawAA
AAAAAAAABQVTZQsLpP8MDKv/DQ2w/w4Os/8ODrT/Dg62/w8PuP8PD7r/Dw+8/w8Pvf8QEL//EBDA/xER
w/8SEsn/ERHJ/xERxf8QEMD/EBC//w8Pvv8PD7z/Dw+6/w8PuP8ODrf/Dg61/w4Os/8NDbH/DAyr/wsL
pP8SEmFrAAAAAAAAAAAGBlZlDAyq/w4OsP8PD7X/Dw+3/w8PuP8QELr/EBC7/xAQvf8REb7/ERHA/xER
wf8REcL/EhLC/xISw/8SEsP/EhLC/xERwv8REcH/ERHA/xERvv8QEL3/EBC7/xAQuv8QELj/Dw+3/w8P
tf8ODrD/DAyq/xMTZWsAAAAAAAAAAAcHWmUODrD/EBC2/xERuv8REbz/ERG9/xISvv8SEr//EhLA/xMT
wf8TE8P/ExPD/xMTxP8TE8X/FBTF/xQUxf8UFMX/ExPE/xMTxP8TE8P/ExPC/xISwf8SEr//EhK+/xER
vf8REbz/ERG6/xAQtv8ODrD/FBRpawAAAAAAAAAACAhcYxAQtf8SErv/ExO+/xQUwP8UFMD/FBTB/xUV
wv8VFcP/FRXE/xUVxf8WFsb/FhbG/xYWx/8WFsf/FhbH/xYWx/8WFsf/FhbG/xYWxf8VFcT/FRXD/xUV
wv8UFMH/FBTB/xQUwP8TE77/EhK7/xAQtf8TE2hoAAAAAAAAAAAQEFNUFRXC/xMTv/8UFMP/FRXE/xUV
xP8VFcX/FRXG/xYWx/8WFsf/FhbI/xYWyf8XF8n/FxfK/xcXyv8XF8r/FxfK/xcXyf8XF8n/FhbI/xYW
yP8WFsf/FhbG/xUVxf8VFcT/FRXE/xQUw/8TE7//FRXB/xAQV1UAAAAAAAAAAA0NPxkjI8byFBTD/xUV
x/8WFsj/FxfJ/xcXyf8XF8r/FxfK/xcXy/8YGMz/GBjM/xgYzP8YGM3/GBjN/xgYzf8YGM3/GBjM/xgY
zP8YGMz/GBjL/xcXy/8XF8r/FxfJ/xcXyf8WFsj/FRXH/xQUw/8jI8f0Dg5GGwAAAAAAAAAAFhZxAiUl
eIUZGcr/FBTI/xUVyv8WFsv/FhbM/xYWzP8WFsz/FhbN/xcXzf8XF83/FxfN/xcXzv8XF87/FxfO/xcX
zv8XF87/FxfN/xcXzf8WFs3/FhbM/xYWzP8WFsz/FhbL/xUVyv8UFMj/GBjJ/yYmeogWFnYCAAAAAAAA
AAAAAAAAGBh1BzMzk50kJNP+FxfK/xgYzP8YGMz/GBjN/xgYzf8YGM3/GBjN/xgYzf8ZGc7/GRnO/xkZ
zv8ZGc7/GRnO/xkZzv8YGM3/GBjN/xgYzf8YGM3/GBjN/xgYzP8YGMz/FxfK/yMj0v4zM5WfFBRkBwAA
AAAAAAAAAAAAAAAAAAAAAAAAHBx7Ay0tdkg3N5emMTGpxSwsp8gsLKfILCynyCwsp8gsLKfILCynyCws
p8gsLKfILCynyCwsp8gsLKfILCynyCwsp8gsLKfILCynyCwsp8gsLKfILCynyDExqcU2NpenLi54Shsb
ewMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////8AAAD+AAAAfAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AA
AAPAAAADwAAAA8AAAAPAAAAD4AAAB/gAAB//////
</value>
</data>
</root>