diff --git a/Forms/YtdForm.Designer.cs b/Forms/YtdForm.Designer.cs
index 6e9dc23..737e01b 100644
--- a/Forms/YtdForm.Designer.cs
+++ b/Forms/YtdForm.Designer.cs
@@ -31,6 +31,7 @@
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(YtdForm));
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.FileMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.FileSaveAllMenu = new System.Windows.Forms.ToolStripMenuItem();
this.EditMenu = new System.Windows.Forms.ToolStripMenuItem();
this.ViewMenu = new System.Windows.Forms.ToolStripMenuItem();
this.toolStrip1 = new System.Windows.Forms.ToolStrip();
@@ -47,13 +48,21 @@
this.SelTextureNameTextBox = new System.Windows.Forms.TextBox();
this.TextureTabControl = new System.Windows.Forms.TabControl();
this.TextureTabPage = new System.Windows.Forms.TabPage();
+ this.label1 = new System.Windows.Forms.Label();
+ this.SelTextureZoomCombo = new System.Windows.Forms.ComboBox();
+ this.SelTexturePanel = new System.Windows.Forms.Panel();
+ this.SelTexturePictureBox = new System.Windows.Forms.PictureBox();
this.SelTextureMipLabel = new System.Windows.Forms.Label();
this.SelTextureDimensionsLabel = new System.Windows.Forms.Label();
this.SelTextureMipTrackBar = new System.Windows.Forms.TrackBar();
this.label4 = new System.Windows.Forms.Label();
- this.SelTexturePictureBox = new System.Windows.Forms.PictureBox();
this.DetailsTabPage = new System.Windows.Forms.TabPage();
this.DetailsPropertyGrid = new CodeWalker.WinForms.PropertyGridFix();
+ this.SaveFileDialog = new System.Windows.Forms.SaveFileDialog();
+ this.FolderBrowserDialog = new System.Windows.Forms.FolderBrowserDialog();
+ this.FileSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.ToolbarSaveAsMenu = new System.Windows.Forms.ToolStripMenuItem();
+ this.ToolbarSaveAllMenu = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip1.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.MainToolbar.SuspendLayout();
@@ -63,8 +72,9 @@
this.MainSplitContainer.SuspendLayout();
this.TextureTabControl.SuspendLayout();
this.TextureTabPage.SuspendLayout();
- ((System.ComponentModel.ISupportInitialize)(this.SelTextureMipTrackBar)).BeginInit();
+ this.SelTexturePanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.SelTexturePictureBox)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SelTextureMipTrackBar)).BeginInit();
this.DetailsTabPage.SuspendLayout();
this.SuspendLayout();
//
@@ -82,11 +92,23 @@
//
// FileMenu
//
- this.FileMenu.Enabled = false;
+ this.FileMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.FileSaveAsMenu,
+ this.FileSaveAllMenu});
this.FileMenu.Name = "FileMenu";
this.FileMenu.Size = new System.Drawing.Size(37, 20);
this.FileMenu.Text = "File";
//
+ // FileSaveAllMenu
+ //
+ this.FileSaveAllMenu.Image = ((System.Drawing.Image)(resources.GetObject("FileSaveAllMenu.Image")));
+ this.FileSaveAllMenu.Name = "FileSaveAllMenu";
+ this.FileSaveAllMenu.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.S)));
+ this.FileSaveAllMenu.Size = new System.Drawing.Size(196, 22);
+ this.FileSaveAllMenu.Text = "Save All...";
+ this.FileSaveAllMenu.Click += new System.EventHandler(this.FileSaveAllMenu_Click);
+ //
// EditMenu
//
this.EditMenu.Enabled = false;
@@ -136,12 +158,15 @@
// SaveButton
//
this.SaveButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
- this.SaveButton.Enabled = false;
+ this.SaveButton.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.ToolbarSaveAsMenu,
+ this.ToolbarSaveAllMenu});
this.SaveButton.Image = ((System.Drawing.Image)(resources.GetObject("SaveButton.Image")));
this.SaveButton.ImageTransparentColor = System.Drawing.Color.Magenta;
this.SaveButton.Name = "SaveButton";
this.SaveButton.Size = new System.Drawing.Size(32, 22);
this.SaveButton.Text = "Save YTD...";
+ this.SaveButton.ButtonClick += new System.EventHandler(this.SaveButton_ButtonClick);
//
// MainToolbar
//
@@ -241,11 +266,13 @@
//
// TextureTabPage
//
+ this.TextureTabPage.Controls.Add(this.label1);
+ this.TextureTabPage.Controls.Add(this.SelTextureZoomCombo);
+ this.TextureTabPage.Controls.Add(this.SelTexturePanel);
this.TextureTabPage.Controls.Add(this.SelTextureMipLabel);
this.TextureTabPage.Controls.Add(this.SelTextureDimensionsLabel);
this.TextureTabPage.Controls.Add(this.SelTextureMipTrackBar);
this.TextureTabPage.Controls.Add(this.label4);
- this.TextureTabPage.Controls.Add(this.SelTexturePictureBox);
this.TextureTabPage.Location = new System.Drawing.Point(4, 22);
this.TextureTabPage.Name = "TextureTabPage";
this.TextureTabPage.Padding = new System.Windows.Forms.Padding(3);
@@ -254,6 +281,57 @@
this.TextureTabPage.Text = "Texture";
this.TextureTabPage.UseVisualStyleBackColor = true;
//
+ // label1
+ //
+ this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(452, 426);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(37, 13);
+ this.label1.TabIndex = 54;
+ this.label1.Text = "Zoom:";
+ //
+ // SelTextureZoomCombo
+ //
+ this.SelTextureZoomCombo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.SelTextureZoomCombo.FormattingEnabled = true;
+ this.SelTextureZoomCombo.Items.AddRange(new object[] {
+ "Fill",
+ "100%",
+ "200%"});
+ this.SelTextureZoomCombo.Location = new System.Drawing.Point(495, 423);
+ this.SelTextureZoomCombo.Name = "SelTextureZoomCombo";
+ this.SelTextureZoomCombo.Size = new System.Drawing.Size(69, 21);
+ this.SelTextureZoomCombo.TabIndex = 53;
+ this.SelTextureZoomCombo.Text = "Fill";
+ this.SelTextureZoomCombo.TextChanged += new System.EventHandler(this.SelTextureZoomCombo_TextChanged);
+ //
+ // SelTexturePanel
+ //
+ this.SelTexturePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.SelTexturePanel.AutoScroll = true;
+ this.SelTexturePanel.BackColor = System.Drawing.Color.DarkGray;
+ this.SelTexturePanel.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("SelTexturePanel.BackgroundImage")));
+ this.SelTexturePanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
+ this.SelTexturePanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.SelTexturePanel.Controls.Add(this.SelTexturePictureBox);
+ this.SelTexturePanel.Location = new System.Drawing.Point(6, 6);
+ this.SelTexturePanel.Name = "SelTexturePanel";
+ this.SelTexturePanel.Size = new System.Drawing.Size(559, 408);
+ this.SelTexturePanel.TabIndex = 52;
+ //
+ // SelTexturePictureBox
+ //
+ this.SelTexturePictureBox.BackColor = System.Drawing.Color.Transparent;
+ this.SelTexturePictureBox.Location = new System.Drawing.Point(0, 0);
+ this.SelTexturePictureBox.Name = "SelTexturePictureBox";
+ this.SelTexturePictureBox.Size = new System.Drawing.Size(133, 96);
+ this.SelTexturePictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize;
+ this.SelTexturePictureBox.TabIndex = 45;
+ this.SelTexturePictureBox.TabStop = false;
+ //
// SelTextureMipLabel
//
this.SelTextureMipLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
@@ -298,20 +376,6 @@
this.label4.TabIndex = 47;
this.label4.Text = "Mip:";
//
- // SelTexturePictureBox
- //
- this.SelTexturePictureBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
- | System.Windows.Forms.AnchorStyles.Left)
- | System.Windows.Forms.AnchorStyles.Right)));
- this.SelTexturePictureBox.BackColor = System.Drawing.Color.DarkGray;
- this.SelTexturePictureBox.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
- this.SelTexturePictureBox.Location = new System.Drawing.Point(6, 6);
- this.SelTexturePictureBox.Name = "SelTexturePictureBox";
- this.SelTexturePictureBox.Size = new System.Drawing.Size(558, 408);
- this.SelTexturePictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
- this.SelTexturePictureBox.TabIndex = 45;
- this.SelTexturePictureBox.TabStop = false;
- //
// DetailsTabPage
//
this.DetailsTabPage.Controls.Add(this.DetailsPropertyGrid);
@@ -334,6 +398,35 @@
this.DetailsPropertyGrid.Size = new System.Drawing.Size(558, 445);
this.DetailsPropertyGrid.TabIndex = 0;
//
+ // SaveFileDialog
+ //
+ this.SaveFileDialog.Filter = "DDS files|*.dds|All files|*.*";
+ //
+ // FileSaveAsMenu
+ //
+ this.FileSaveAsMenu.Image = ((System.Drawing.Image)(resources.GetObject("FileSaveAsMenu.Image")));
+ this.FileSaveAsMenu.Name = "FileSaveAsMenu";
+ this.FileSaveAsMenu.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S)));
+ this.FileSaveAsMenu.Size = new System.Drawing.Size(196, 22);
+ this.FileSaveAsMenu.Text = "Save As...";
+ this.FileSaveAsMenu.Click += new System.EventHandler(this.FileSaveAsMenu_Click);
+ //
+ // ToolbarSaveAsMenu
+ //
+ this.ToolbarSaveAsMenu.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveAsMenu.Image")));
+ this.ToolbarSaveAsMenu.Name = "ToolbarSaveAsMenu";
+ this.ToolbarSaveAsMenu.Size = new System.Drawing.Size(152, 22);
+ this.ToolbarSaveAsMenu.Text = "Save as...";
+ this.ToolbarSaveAsMenu.Click += new System.EventHandler(this.ToolbarSaveAsMenu_Click);
+ //
+ // ToolbarSaveAllMenu
+ //
+ this.ToolbarSaveAllMenu.Image = ((System.Drawing.Image)(resources.GetObject("ToolbarSaveAllMenu.Image")));
+ this.ToolbarSaveAllMenu.Name = "ToolbarSaveAllMenu";
+ this.ToolbarSaveAllMenu.Size = new System.Drawing.Size(152, 22);
+ this.ToolbarSaveAllMenu.Text = "Save All...";
+ this.ToolbarSaveAllMenu.Click += new System.EventHandler(this.ToolbarSaveAllMenu_Click);
+ //
// YtdForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -361,8 +454,10 @@
this.TextureTabControl.ResumeLayout(false);
this.TextureTabPage.ResumeLayout(false);
this.TextureTabPage.PerformLayout();
- ((System.ComponentModel.ISupportInitialize)(this.SelTextureMipTrackBar)).EndInit();
+ this.SelTexturePanel.ResumeLayout(false);
+ this.SelTexturePanel.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.SelTexturePictureBox)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.SelTextureMipTrackBar)).EndInit();
this.DetailsTabPage.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@@ -396,5 +491,14 @@
private System.Windows.Forms.ListView TexturesListView;
private System.Windows.Forms.ColumnHeader TextureNameColumnHeader;
private System.Windows.Forms.ColumnHeader TextureSizeColumnHeader;
+ private System.Windows.Forms.Panel SelTexturePanel;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.ComboBox SelTextureZoomCombo;
+ private System.Windows.Forms.ToolStripMenuItem FileSaveAllMenu;
+ private System.Windows.Forms.SaveFileDialog SaveFileDialog;
+ private System.Windows.Forms.FolderBrowserDialog FolderBrowserDialog;
+ private System.Windows.Forms.ToolStripMenuItem FileSaveAsMenu;
+ private System.Windows.Forms.ToolStripMenuItem ToolbarSaveAsMenu;
+ private System.Windows.Forms.ToolStripMenuItem ToolbarSaveAllMenu;
}
}
\ No newline at end of file
diff --git a/Forms/YtdForm.cs b/Forms/YtdForm.cs
index 2f1f9c8..dad6088 100644
--- a/Forms/YtdForm.cs
+++ b/Forms/YtdForm.cs
@@ -6,6 +6,7 @@ using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
+using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
@@ -19,6 +20,9 @@ namespace CodeWalker.Forms
private string fileName;
private YtdFile Ytd { get; set; }
private TextureDictionary TexDict { get; set; }
+ private Texture CurrentTexture = null;
+ private float CurrentZoom = 0.0f; //1.0 = 100%, 0.0 = stretch
+
public YtdForm()
{
@@ -90,6 +94,9 @@ namespace CodeWalker.Forms
private void ShowTextureMip(Texture tex, int mip, bool mipchange)
{
+ CurrentTexture = tex;
+ UpdateSaveAs();
+
if (tex == null)
{
SelTexturePictureBox.Image = null;
@@ -157,6 +164,7 @@ namespace CodeWalker.Forms
SelTexturePictureBox.Image = null;
}
+ UpdateZoom();
}
@@ -171,6 +179,92 @@ namespace CodeWalker.Forms
StatusLabel.Text = text;
}
+ private void UpdateZoom()
+ {
+ //update the image controls for the current zoom level
+
+ var img = SelTexturePictureBox.Image;
+
+ if (CurrentZoom <= 0.0f)
+ {
+ //stretch image to fit the area available.
+ SelTexturePanel.AutoScroll = false;
+ SelTexturePictureBox.SizeMode = PictureBoxSizeMode.Zoom;
+ SelTexturePictureBox.Width = SelTexturePanel.Width - 2;
+ SelTexturePictureBox.Height = SelTexturePanel.Height - 2;
+ SelTexturePictureBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
+ }
+ else
+ {
+ //zoom to the given pixel ratio...
+ var w = (int)(img.Width * CurrentZoom);
+ var h = (int)(img.Height * CurrentZoom);
+ SelTexturePictureBox.Anchor = AnchorStyles.Top | AnchorStyles.Left;
+ SelTexturePictureBox.SizeMode = PictureBoxSizeMode.StretchImage;
+ SelTexturePictureBox.Width = w;
+ SelTexturePictureBox.Height = h;
+ SelTexturePanel.AutoScroll = true;
+ }
+
+ }
+
+
+
+
+
+ private void UpdateSaveAs()
+ {
+ if (CurrentTexture == null)
+ {
+ FileSaveAsMenu.Text = "Save As...";
+ ToolbarSaveAsMenu.Text = "Save As...";
+ FileSaveAsMenu.Enabled = false;
+ ToolbarSaveAsMenu.Enabled = false;
+ }
+ else
+ {
+ string fname = CurrentTexture.Name + ".dds";
+ string sas = "Save " + fname + " As...";
+ FileSaveAsMenu.Text = sas;
+ ToolbarSaveAsMenu.Text = sas;
+ FileSaveAsMenu.Enabled = true;
+ ToolbarSaveAsMenu.Enabled = true;
+ }
+ }
+
+
+ private void SaveAs()
+ {
+ if (CurrentTexture == null) return;
+ string fname = CurrentTexture.Name + ".dds";
+ SaveFileDialog.FileName = fname;
+ if (SaveFileDialog.ShowDialog() != DialogResult.OK) return;
+ string fpath = SaveFileDialog.FileName;
+ byte[] dds = DDSIO.GetDDSFile(CurrentTexture);
+ File.WriteAllBytes(fpath, dds);
+ }
+
+ private void SaveAll()
+ {
+ if (TexDict?.Textures?.data_items == null) return;
+ if (FolderBrowserDialog.ShowDialog() != DialogResult.OK) return;
+ var folder = FolderBrowserDialog.SelectedPath;
+ foreach (var tex in TexDict.Textures.data_items)
+ {
+ byte[] dds = DDSIO.GetDDSFile(tex);
+ string bpath = folder + "\\" + tex.Name;
+ string fpath = bpath + ".dds";
+ int c = 1;
+ while (File.Exists(fpath))
+ {
+ fpath = bpath + "_Copy" + c.ToString() + ".dds";
+ c++;
+ }
+ File.WriteAllBytes(fpath, dds);
+ }
+ }
+
+
private void TexturesListView_SelectedIndexChanged(object sender, EventArgs e)
{
@@ -192,5 +286,47 @@ namespace CodeWalker.Forms
SelTextureMipLabel.Text = SelTextureMipTrackBar.Value.ToString();
ShowTextureMip(tex, SelTextureMipTrackBar.Value, true);
}
+
+ private void SelTextureZoomCombo_TextChanged(object sender, EventArgs e)
+ {
+ string s = SelTextureZoomCombo.Text;
+ if (s.EndsWith("%")) s = s.Substring(0, s.Length - 1);
+
+ float f;
+ if (!float.TryParse(s, out f))
+ {
+ CurrentZoom = 0.0f;
+ }
+ else
+ {
+ CurrentZoom = Math.Min(Math.Max(f, 0.0f), 5000.0f) * 0.01f;
+ }
+ UpdateZoom();
+ }
+
+ private void FileSaveAllMenu_Click(object sender, EventArgs e)
+ {
+ SaveAll();
+ }
+
+ private void FileSaveAsMenu_Click(object sender, EventArgs e)
+ {
+ SaveAs();
+ }
+
+ private void SaveButton_ButtonClick(object sender, EventArgs e)
+ {
+ SaveAs();
+ }
+
+ private void ToolbarSaveAsMenu_Click(object sender, EventArgs e)
+ {
+ SaveAs();
+ }
+
+ private void ToolbarSaveAllMenu_Click(object sender, EventArgs e)
+ {
+ SaveAll();
+ }
}
}
diff --git a/Forms/YtdForm.resx b/Forms/YtdForm.resx
index 5539127..091414c 100644
--- a/Forms/YtdForm.resx
+++ b/Forms/YtdForm.resx
@@ -120,10 +120,26 @@
17, 17
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABUSURBVDhPY/j//z9FGEx8+/btPwn4PRAbMAABigFOTk5w
+ /OH9RzhGFgPRbW1tcEPIMgCEYYaQbQAIg/QQZQAyRlZDWwOIwaMGDEoDyMFwA8jH/xkAuAOq5KQIy40A
+ AAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ wwAADsMBx2+oZAAAAHZJREFUOE/tkLENwCAMBBkpMzCcF2IwgmTRJnpiSyhgQ5EyLx128VzhYKXWejlk
+ Zj6kOg+KMcbGmUtDdyJaSzwBpkqkPmYm6EUAHamP6QUW3wjwWKSUph8VdNxj4VCeZCnA9CSmoBdp0WL/
+ WFZ+wSPYQeqvhHADNufwigti+3EAAAAASUVORK5CYII=
+
+
132, 17
-
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@@ -143,6 +159,22 @@
ajugDypMiBJQluU3f2DiZ+YmT3eANWIyIyKgFsv/AOs2k4wSgIXneRBFEaRpyhew10ZbwNb3fU1oYrPe
qAF5no/CMNSEJsbjiRqAty9JEk1ownEcNaA6BeK6riY2cdgf+SwC2Gf8BEGgCU2slis+iwB2mQZ4Ak3h
K0QAIeQTi/cp4B9tCZE2c6oRhQAAAABJRU5ErkJggg==
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+ YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAABUSURBVDhPY/j//z9FGEx8+/btPwn4PRAbMAABigFOTk5w
+ /OH9RzhGFgPRbW1tcEPIMgCEYYaQbQAIg/QQZQAyRlZDWwOIwaMGDEoDyMFwA8jH/xkAuAOq5KQIy40A
+ AAAASUVORK5CYII=
+
+
+
+
+ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
+ wwAADsMBx2+oZAAAAHZJREFUOE/tkLENwCAMBBkpMzCcF2IwgmTRJnpiSyhgQ5EyLx128VzhYKXWejlk
+ Zj6kOg+KMcbGmUtDdyJaSzwBpkqkPmYm6EUAHamP6QUW3wjwWKSUph8VdNxj4VCeZCnA9CSmoBdp0WL/
+ WFZ+wSPYQeqvhHADNufwigti+3EAAAAASUVORK5CYII=
@@ -156,6 +188,36 @@
237, 17
+
+
+ iVBORw0KGgoAAAANSUhEUgAAAAEAAAQACAIAAACvZKRoAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
+ dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAQUSURBVFhHlYvZVipJEEXj/xcIoqLgBI6IIyoO4IB4
+ HQAVEdTf6XMiMqsSuui7+mGvvU9klfz+/soPoGN+7PZDrH9ws2+50bjrt7TrH36Lf8x/4dvzLd96g7HZ
+ 32zdwU07vE9hNIJHMtL+lhFQ6w3ozazf8XvdCQzjHgYejob6pj0cgrCn8SVf9NeXoe3u8BduhHff0xjQ
+ A8fXQPcATXgbDHAD+uY6iU/6022YW2F/fhp8G7geo+9A9z+lr+5LPwTvfbzx7t8+/JvfH/7+oW903/cH
+ nMD7xztAv5vf39k0thJ2wFvYb/IGv/HmeOMtkZ65BxNu7TfpoXtowpvvXrcnXQd3t9fFrWu3sNUJdMwd
+ uNPpqHnT7nbQvHXkVf0qnVfbnddXu9G8qf+DF/PL64u8vADvRJ7l2ffzs22YhD3GU9hP8JM8wYTNm9/k
+ j/qPswf7z995jPwoj49TaNNtuC1t7Da6PdkBDw7thwfg7w/S5obtHtMirZZ1i7ulO3IS9/dyr7TMLeIa
+ 3Pn3u7jv2Hd32A72BLfet8bd7a1repwb+uYGBjfWt/ANb2M0x2k2pancSHNsGw3SoBvSbDR009oB1wGN
+ 69DXcn0dcqW+Uq4U2+gr22rHpXIpV5cErR5v2nNxMb4vucHFxYW+mT11dZ2u09ZKfYLzupzD53C9fo4G
+ 546wyRl9JmeTnMWcRj6Vs1P2qWs4gRpd866pa9xobr15TgKfnMgJTGo19gTHvo/lGD7m1hs3OA45chzL
+ ETnyHCVySA4PIx+xD9nuTg5iHxwcAPjwINjT2d/fl4P9ce+7e0h1vwpXpVrFrtLW5mT2qnuyt0fQak/F
+ XNmTCtBdialMsluR3couDNTcAHsqO+ad3R1jZwc7bmU7Zht7W3sb7WDzTe3Zku0tY2tr2+GbJptRbzq2
+ NuFN3AG96fZGtDdkc8PtDbR720AbbFBml90tdhku0+VJSlGXSMlchsulku2oY9bXnUvr2uvavHMns0bW
+ 1mR9jbY2wgarDvTq2qqsuq2tO2TFWLG9Qit2415Br+AbNVlekWXX9DK2Nr287G7wGEVZLloXHXovFqWI
+ u+GbDigUpVAsSAEu0p6CB++ul7yXvJekgFYX2Ev4Jr55FiMWZWkRt0UYvYheZAN94zdskHeOyJM8Oi95
+ dB6d1zb4xn/8jlgIvLCgLJB80BHzDtvzDu153AP8ppOYm5+T+Tkaew7tbgr2VHIkF9xyksPO4U7zzfe/
+ mDVmCTbJ5WaD+6ySc1b4XbhDsrOSnbhls1nAO53FN+bJjskYmaxkMhlA2z3jv9G7f0vqcWYiZpTMDO5g
+ ZsZa39D/j7Sk02lrOA1z+5va7TS/1e/jb5JJqVNwKoUNtHnndvdU8E0qxXdzmh3ZvXlSqX8AvThRdO5j
+ +6sAAAAASUVORK5CYII=
+
+
+
+ 358, 17
+
+
+ 489, 17
+
AAABAAMAICAAAAAAGACoDAAANgAAABAQAAAAABgAaAMAAN4MAABAQAAAAAAYACgyAABGEAAAKAAAACAA