diff --git a/SpineViewer/Controls/SpinePreviewPanel.Designer.cs b/SpineViewer/Controls/SpinePreviewPanel.Designer.cs
index e901259..b4d6ac5 100644
--- a/SpineViewer/Controls/SpinePreviewPanel.Designer.cs
+++ b/SpineViewer/Controls/SpinePreviewPanel.Designer.cs
@@ -41,6 +41,7 @@
button_ForwardStep = new Button();
button_ForwardFast = new Button();
toolTip = new ToolTip(components);
+ wallpaperForm = new WallpaperForm();
tableLayoutPanel1.SuspendLayout();
panel_Container.SuspendLayout();
flowLayoutPanel1.SuspendLayout();
@@ -190,6 +191,19 @@
button_ForwardFast.UseVisualStyleBackColor = true;
button_ForwardFast.Click += button_ForwardFast_Click;
//
+ // wallpaperForm
+ //
+ wallpaperForm.ClientSize = new Size(490, 456);
+ wallpaperForm.ControlBox = false;
+ wallpaperForm.MaximizeBox = false;
+ wallpaperForm.MinimizeBox = false;
+ wallpaperForm.Name = "WallpaperForm";
+ wallpaperForm.ShowIcon = false;
+ wallpaperForm.ShowInTaskbar = false;
+ wallpaperForm.StartPosition = FormStartPosition.Manual;
+ wallpaperForm.Text = "SpineViewerWallpaperForm";
+ wallpaperForm.Visible = false;
+ //
// SpinePreviewPanel
//
AutoScaleDimensions = new SizeF(11F, 24F);
@@ -219,5 +233,6 @@
private Button button_ForwardStep;
private Button button_ForwardFast;
private Button button_Restart;
+ private WallpaperForm wallpaperForm;
}
}
diff --git a/SpineViewer/Controls/SpinePreviewPanel.cs b/SpineViewer/Controls/SpinePreviewPanel.cs
index b8c4abf..33395d9 100644
--- a/SpineViewer/Controls/SpinePreviewPanel.cs
+++ b/SpineViewer/Controls/SpinePreviewPanel.cs
@@ -11,6 +11,7 @@ using System.Security.Policy;
using System.Diagnostics;
using NLog;
using SpineViewer.Utils;
+using SpineViewer.Natives;
namespace SpineViewer.Controls
{
@@ -21,6 +22,8 @@ namespace SpineViewer.Controls
InitializeComponent();
renderWindow = new(panel_Render.Handle);
renderWindow.SetActive(false);
+ wallpaperTexture = new(1, 1);
+ _wallpaperFormHandle = wallpaperForm.Handle;
// 设置默认参数
Resolution = new(2048, 2048);
@@ -101,6 +104,13 @@ namespace SpineViewer.Controls
renderWindow.SetView(view);
resolution = value;
+
+ // 设置壁纸窗口分辨率
+ wallpaperForm.Size = value;
+ _memDCsize = new() { cx = value.Width, cy = value.Height };
+ wallpaperTexture.Dispose();
+ wallpaperTexture = new((uint)value.Width, (uint)value.Height);
+ wallpaperTexture.SetView(view);
}
}
private Size resolution = new(0, 0);
@@ -123,6 +133,7 @@ namespace SpineViewer.Controls
using var view = renderWindow.GetView();
view.Center = new(value.X, value.Y);
renderWindow.SetView(view);
+ wallpaperTexture.SetView(view);
}
}
@@ -146,6 +157,7 @@ namespace SpineViewer.Controls
var signY = Math.Sign(view.Size.Y);
view.Size = new(resolution.Width / value * signX, resolution.Height / value * signY);
renderWindow.SetView(view);
+ wallpaperTexture.SetView(view);
}
}
@@ -166,6 +178,7 @@ namespace SpineViewer.Controls
using var view = renderWindow.GetView();
view.Rotation = value;
renderWindow.SetView(view);
+ wallpaperTexture.SetView(view);
}
}
@@ -189,6 +202,7 @@ namespace SpineViewer.Controls
size.X *= -1;
view.Size = size;
renderWindow.SetView(view);
+ wallpaperTexture.SetView(view);
}
}
@@ -212,6 +226,7 @@ namespace SpineViewer.Controls
size.Y *= -1;
view.Size = size;
renderWindow.SetView(view);
+ wallpaperTexture.SetView(view);
}
}
@@ -242,6 +257,36 @@ namespace SpineViewer.Controls
///
public SFML.Graphics.View GetView() => renderWindow.GetView();
+ ///
+ /// 是否开启桌面投影
+ ///
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ [Browsable(false)]
+ public bool EnableDesktopProjection
+ {
+ get => enableDesktopProjection;
+ set
+ {
+ if (enableDesktopProjection == value) return;
+ if (value)
+ {
+ screenDC = Win32.GetDC(IntPtr.Zero);
+ memDC = Win32.CreateCompatibleDC(screenDC);
+ wallpaperForm.Show();
+ }
+ else
+ {
+ wallpaperForm.Hide();
+ Win32.DeleteDC(memDC);
+ Win32.ReleaseDC(IntPtr.Zero, screenDC);
+ memDC = 0;
+ screenDC = 0;
+ }
+ enableDesktopProjection = value;
+ }
+ }
+ private bool enableDesktopProjection = false;
+
#endregion
#region 渲染管理
@@ -266,6 +311,25 @@ namespace SpineViewer.Controls
///
private readonly SFML.Graphics.RenderWindow renderWindow;
+ ///
+ /// 屏幕 DC
+ ///
+ private IntPtr screenDC;
+
+ ///
+ /// 用于壁纸窗口的内存 DC
+ ///
+ private IntPtr memDC;
+ private readonly IntPtr _wallpaperFormHandle;
+ private Win32.SIZE _memDCsize = new();
+ private Win32.POINT _memDCptSrc = new() { x = 0, y = 0 };
+ private Win32.BLENDFUNCTION _memDCblend = new() { BlendOp = 0, BlendFlags = 0, SourceConstantAlpha = 255, AlphaFormat = Win32.AC_SRC_ALPHA };
+
+ ///
+ /// 壁纸窗口
+ ///
+ private SFML.Graphics.RenderTexture wallpaperTexture;
+
///
/// 帧间隔计时器
///
@@ -312,11 +376,11 @@ namespace SpineViewer.Controls
///
public void StartRender()
{
- if (task is not null)
- return;
+ if (task is not null) return;
cancelToken = new();
task = Task.Run(RenderTask, cancelToken.Token);
IsUpdating = true;
+ if (enableDesktopProjection) wallpaperForm.Show();
}
///
@@ -324,6 +388,7 @@ namespace SpineViewer.Controls
///
public void StopRender()
{
+ wallpaperForm.Hide();
IsUpdating = false;
if (task is null || cancelToken is null)
return;
@@ -341,6 +406,7 @@ namespace SpineViewer.Controls
try
{
renderWindow.SetActive(true);
+ wallpaperTexture.SetActive(true);
float delta;
while (cancelToken is not null && !cancelToken.IsCancellationRequested)
@@ -359,6 +425,7 @@ namespace SpineViewer.Controls
}
renderWindow.Clear(BackgroundColor);
+ if (enableDesktopProjection) wallpaperTexture.Clear(SFML.Graphics.Color.Transparent);
if (ShowAxis)
{
@@ -392,11 +459,31 @@ namespace SpineViewer.Controls
spine.EnableDebug = true;
renderWindow.Draw(spine);
spine.EnableDebug = false;
+
+ if (enableDesktopProjection) wallpaperTexture.Draw(spine);
}
}
}
renderWindow.Display();
+
+ // 桌面投影
+ if (enableDesktopProjection)
+ {
+ wallpaperTexture.Display();
+ using var img = wallpaperTexture.Texture.CopyToImage();
+ img.SaveToMemory(out var imgBuffer, "bmp");
+ using var stream = new MemoryStream(imgBuffer);
+ using var bitmap = new Bitmap(stream);
+
+ var newBitmap = bitmap.GetHbitmap(Color.FromArgb(0));
+ var oldBitmap = Win32.SelectObject(memDC, newBitmap);
+
+ Win32.UpdateLayeredWindow(_wallpaperFormHandle, screenDC, IntPtr.Zero, ref _memDCsize, memDC, ref _memDCptSrc, 0, ref _memDCblend, Win32.ULW_ALPHA);
+
+ Win32.SelectObject(memDC, oldBitmap);
+ Win32.DeleteObject(newBitmap);
+ }
}
}
catch (Exception ex)
@@ -408,6 +495,7 @@ namespace SpineViewer.Controls
finally
{
renderWindow.SetActive(false);
+ wallpaperTexture.SetActive(false);
}
}
@@ -660,6 +748,7 @@ namespace SpineViewer.Controls
[Browsable(false)]
public SpinePreviewPanel PreviewPanel { get; } = previewPanel;
+ [RefreshProperties(RefreshProperties.All)]
[TypeConverter(typeof(SizeConverter))]
[Category("[0] 导出"), DisplayName("分辨率")]
public Size Resolution { get => PreviewPanel.Resolution; set => PreviewPanel.Resolution = value; }
diff --git a/SpineViewer/Controls/SpinePreviewPanel.resx b/SpineViewer/Controls/SpinePreviewPanel.resx
index 588c9f4..8884137 100644
--- a/SpineViewer/Controls/SpinePreviewPanel.resx
+++ b/SpineViewer/Controls/SpinePreviewPanel.resx
@@ -125,177 +125,177 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAEZTeXN0ZW0uV2luZG93cy5Gb3JtcywgQ3VsdHVyZT1uZXV0cmFs
LCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5BQEAAAAmU3lzdGVtLldpbmRvd3MuRm9ybXMu
SW1hZ2VMaXN0U3RyZWFtZXIBAAAABERhdGEHAgIAAAAJAwAAAA8DAAAAHi0AAAJNU0Z0AUkBTAIBAQYB
- AAF4AQABeAEAAR8BAAEYAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABfAMAATADAAEBAQABIAYAAV0q
- AAQCAy0BRQNbAc0DXwHoA1kBxgMyAU8DDwEUBAIYAAMOARIDQwF3A10BzwNbAc0DLQFFBAIYAANWAbID
- XwHoA1wB1gNDAXcDFgEeBAIYAAMKAQ0DSQGFA18B4wNfAeUDUQGeAyQBNAMJAQsEARgAAwsBDgM7AWQD
- XgHSA1YBsv8AEQAEAgMxAUwDYgHhAwAB/wMxAfkDYAHbA0QBewMeASoDBgEIFAADGAEhA1cBwgMhAfsD
- YgHhAzEBTAQCGAADWQHDAwAB/wMjAfwDXgHrA0gBhAMWAR4YAAMLAQ4DTQGSAy4B+QMQAf4DUwHyA1gB
- ugM3AVoDEQEWAwIBAxQAAxcBHwNJAYYDXgHrA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wMAAf8DIAH9A2AB
+ AAGIAQABiAEAAR8BAAEYAQAE/wEhAQAI/wFCAU0BNgcAATYDAAEoAwABfAMAATADAAEBAQABIAYAAV0q
+ AAQCAy0BRQNbAc0DYAHoA1kBxgMyAU8DDwEUBAIYAAMOARIDQwF3A10BzwNbAc0DLQFFBAIYAANWAbID
+ YAHoA1wB1gNDAXcDFgEeBAIYAAMKAQ0DSQGFA2AB4wNfAeUDUQGeAyQBNAMJAQsEARgAAwsBDgM7AWQD
+ XgHSA1YBsv8AEQAEAgMxAUwDYgHhAwAB/wM3AfkDYAHbA0QBewMeASoDBgEIFAADGAEhA1cBwgMhAfsD
+ YgHhAzEBTAQCGAADWQHDAwAB/wMnAfwDYQHrA0gBhAMWAR4YAAMLAQ4DTQGSAzQB+QMSAf4DVwHyA1gB
+ ugM3AVoDEQEWAwIBAxQAAxcBHwNJAYYDYQHrA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wMAAf8DJAH9A2AB
4ANQAZoDLgFGAxEBFgMGAQcEAQgAAxoBJANbAc0DAAH/A2IB4QMxAUwEAhgAA1kBwwMAAf8DAAH/AwAB
- /wNbAdADPgFrAw8BEwMCAQMQAAMLAQ4DTQGSAy4B+QMAAf8DAAH/AzwB9gNcAcsDRAF5Ax4BKgMGAQcM
- AAQBAxgBIQNKAYsDXAHsA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wMxAfkDXAHnA0QB9QNXAe4DWQG7A0MB
- dwMoATsDDwEUBAEEAAMaASQDWwHNAwAB/wNiAeEDMQFMBAIYAANZAcMDIgH8A1EB8ANEAfUDMQH5A10B
- zgNDAXcDGgEjAwIBAwwAAwsBDgNNAZIDLgH5AwEB/wMlAfoDOwH4AzEB+QNeAeMDTgGYAyQBNQMGAQgE
- AQQABAEDGAEhA0oBiwNcAewDWQHD/wARAAQCAzEBTANiAeEDAAH/A1wB2QM7AWMDWQG7Az8B9wM6AfgD
- XAHnA1sBxQNBAXMDEwEZAwIBAwMaASQDWwHNAwAB/wNiAeEDMQFMBAIYAANZAcMDXgHrA1ABmgNVAbED
- TgHzAyEB+wNbAeQDSwGPAxsBJQMDAQQIAAMLAQ4DTQGSAy4B+QMhAf0DXAHZA1oBxwNEAfUDEAH+A14B
- 6wNSAaMDJQE3AwMBBAQABAEDGAEhA0oBiwNcAewDWQHD/wARAAQCAzEBTANiAeEDAAH/A1sBzQMaASQD
+ /wNbAdADPgFrAw8BEwMCAQMQAAMLAQ4DTQGSAzQB+QMAAf8DAAH/A0IB9gNcAcsDRAF5Ax4BKgMGAQcM
+ AAQBAxgBIQNKAYsDXQHsA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wM3AfkDXAHnA0YB9QNZAe4DWQG7A0MB
+ dwMoATsDDwEUBAEEAAMaASQDWwHNAwAB/wNiAeEDMQFMBAIYAANZAcMDJgH8A1MB8ANGAfUDNwH5A10B
+ zgNDAXcDGgEjAwIBAwwAAwsBDgNNAZIDNAH5AwEB/wMnAfoDPQH4AzcB+QNgAeMDTgGYAyQBNQMGAQgE
+ AQQABAEDGAEhA0oBiwNdAewDWQHD/wARAAQCAzEBTANiAeEDAAH/A1wB2QM7AWMDWQG7A0QB9wM8AfgD
+ XAHnA1sBxQNBAXMDEwEZAwIBAwMaASQDWwHNAwAB/wNiAeEDMQFMBAIYAANZAcMDYQHrA1ABmgNVAbED
+ UAHzAyEB+wNbAeQDSwGPAxsBJQMDAQQIAAMLAQ4DTQGSAzQB+QMlAf0DXAHZA1oBxwNGAfUDEgH+A2EB
+ 6wNSAaMDJQE3AwMBBAQABAEDGAEhA0oBiwNdAewDWQHD/wARAAQCAzEBTANiAeEDAAH/A1sBzQMaASQD
FgEdA1UBrwMAAf8DAAH/AwAB/wMAAf8DVQGvAxYBHQMaASQDWwHNAwAB/wNiAeEDMQFMBAIYAANZAcMD
- WwHkAzsBZQMHAQkDSQGGAyEB+wMAAf8DAAH/A1kBwQMdASkIAAMLAQ4DTQGSAy4B+QMuAfkDTQGSAzkE
- XgHiAwAB/wMAAf8DXgHjAzYBWAMFAQYEAAQBAxgBIQNKAYsDXAHsA1kBw/8AEQAEAgMxAUwDYgHhAwAB
- /wNbAc0DGgEkAwIBAwMTARoDRgF/A1sB3gMhAfsDEAH+AzoB+ANZAbsDOwFjA1wB2QMAAf8DYgHhAzEB
- TAQCGAADWQHDA1sB5AM7AWUDBwQJAQwDOgFhA18B1QNDAfUDMQH5A1sBygMyAU8DDwEUAw0BEQNNAZID
- LgH5Ay4B+QNNAZIDEQEWAy0BRANaAb8DVAHvAyEB+wNdAdwDPwFuAxYBHgMEAQUDGAEhA0oBiwNcAewD
- WQHD/wARAAQCAzEBTANiAeEDAAH/A1sBzQMaASQEAAQCAxMBGgM9AWcDWQHAA1QB7wMQAf4DPwH3A1wB
- 5wMxAfkDAAH/A2IB4QMxAUwEAhgAA1kBwwNbAeQDOwFlAwcBCQQAAwsBDgMxAU0DWAG9AzwB9gMxAfkD
- YAHbA0QBeAMhAS8DTgGVAy4B+QMuAfkDTQGSAwsBDgMGAQgDIAEuA00BkgNdAdwDRAH1A1oB6QNOAZYD
- KAE8AyABLQNLAY0DXAHsA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wNbAc0DGgEkCAAEAgMMARADLwFJA1IB
- owNbAeQDPwH3AxAB/gMAAf8DAAH/A2IB4QMxAUwEAhgAA1kBwwNbAeQDOwFlAwcBCQgAAxABFQM/AW0D
- XAHWAyUB+gMgAf0DXAHWA0QBeQNUAasDIQH7Ay4B+QNNAZIDCwEOBAADAwEEAxsBJgNBAXMDWgHEA0cB
- 9ANXAe4DVQG0A0QBegNRAaIDVwHuA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wNbAc0DGgEkEAADCAEKAyMB
- MwNEAXkDVwG8A18B5QMlAfoDAAH/A2IB4QMxAUwEAhgAA1kBwwNbAeQDOwFlAwcBCQgAAwMBBAMaASQD
- QgF0A14B0gMhAfsDPAH2A10B0QNgAeADIAH9Ay4B+QNNAZIDCwEOCAADAgEDAxIBFwM1AVUDWAG6A1YB
- 8QM8AfYDWwHeA2AB2wM6AfgDWQHD/wARAAQCAzEBTANiAeEDAAH/A1sBzQMaASQUAAMCAQMDDgESAyMB
+ WwHkAzsBZQMHAQkDSQGGAyEB+wMAAf8DAAH/A1kBwQMdASkIAAMLAQ4DTQGSAzQB+QM0AfkDTQGSAzkE
+ XgHiAwAB/wMAAf8DYAHjAzYBWAMFAQYEAAQBAxgBIQNKAYsDXQHsA1kBw/8AEQAEAgMxAUwDYgHhAwAB
+ /wNbAc0DGgEkAwIBAwMTARoDRgF/A1sB3gMhAfsDEgH+AzwB+ANZAbsDOwFjA1wB2QMAAf8DYgHhAzEB
+ TAQCGAADWQHDA1sB5AM7AWUDBwQJAQwDOgFhA18B1QNFAfUDNwH5A1sBygMyAU8DDwEUAw0BEQNNAZID
+ NAH5AzQB+QNNAZIDEQEWAy0BRANaAb8DWAHvAyEB+wNdAdwDPwFuAxYBHgMEAQUDGAEhA0oBiwNdAewD
+ WQHD/wARAAQCAzEBTANiAeEDAAH/A1sBzQMaASQEAAQCAxMBGgM9AWcDWQHAA1gB7wMSAf4DRAH3A1wB
+ 5wM3AfkDAAH/A2IB4QMxAUwEAhgAA1kBwwNbAeQDOwFlAwcBCQQAAwsBDgMxAU0DWAG9A0IB9gM3AfkD
+ YAHbA0QBeAMhAS8DTgGVAzQB+QM0AfkDTQGSAwsBDgMGAQgDIAEuA00BkgNdAdwDRgH1A1oB6QNOAZYD
+ KAE8AyABLQNLAY0DXQHsA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wNbAc0DGgEkCAAEAgMMARADLwFJA1IB
+ owNbAeQDRAH3AxIB/gMAAf8DAAH/A2IB4QMxAUwEAhgAA1kBwwNbAeQDOwFlAwcBCQgAAxABFQM/AW0D
+ XAHWAycB+gMkAf0DXAHWA0QBeQNUAasDIQH7AzQB+QNNAZIDCwEOBAADAwEEAxsBJgNBAXMDWgHEA00B
+ 9ANZAe4DVQG0A0QBegNRAaIDWQHuA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wNbAc0DGgEkEAADCAEKAyMB
+ MwNEAXkDVwG8A18B5QMnAfoDAAH/A2IB4QMxAUwEAhgAA1kBwwNbAeQDOwFlAwcBCQgAAwMBBAMaASQD
+ QgF0A14B0gMhAfsDQgH2A10B0QNgAeADJAH9AzQB+QNNAZIDCwEOCAADAgEDAxIBFwM1AVUDWAG6A1gB
+ 8QNCAfYDWwHeA2AB2wM8AfgDWQHD/wARAAQCAzEBTANiAeEDAAH/A1sBzQMaASQUAAMCAQMDDgESAyMB
MgM9AWgDXgHdAwAB/wNiAeEDMQFMBAIYAANZAcMDWwHkAzsBZQMHAQkMAAMCAQMDDwETAzQBUwNdAdED
- OgH4AyEB/AMhAf0DAAH/Ay4B+QNNAZIDCwEODAAEAQMJAQwDIwEzA1UBrgMiAf0DIAH9AyEB/AMQAf4D
+ PAH4AyUB/AMlAf0DAAH/AzQB+QNNAZIDCwEODAAEAQMJAQwDIwEzA1UBrgMmAf0DJAH9AyUB/AMSAf4D
WQHD/wARAAQCAzEBTANiAeEDAAH/A1sBzQMaASQgAAMaASQDWwHNAwAB/wNiAeEDMQFMBAIYAANZAcMD
- WwHkAzsBZQMHAQkYAAMPARQDVwG5AwAB/wMAAf8DAAH/Ay4B+QNNAZIDCwEOGAADRwGAA14B7QMAAf8D
+ WwHkAzsBZQMHAQkYAAMPARQDVwG5AwAB/wMAAf8DAAH/AzQB+QNNAZIDCwEOGAADRwGAA14B7QMAAf8D
AAH/AwAB/wNZAcP/ABEABAIDMQFMA2IB4QMAAf8DWwHNAxoBJBQABAIDBwEJAxYBHQM1AVUDXAHZAwAB
- /wNiAeEDMQFMBAIYAANZAcMDWwHkAzsBZQMHAQkMAAQBAw0BEQM0AVMDXQHRAzEB+QMRAf4DEAH+AwAB
- /wMuAfkDTQGSAwsBDgwABAEDCQELAx4BKwNTAakDIgH9AyAB/QMhAfwDEAH+A1kBw/8AEQAEAgMxAUwD
- YgHhAwAB/wNbAc0DGgEkEAADBwEJAxsBJgM0AVMDTQGSA14B3QMxAfkDAAH/A2IB4QMxAUwEAhgAA1kB
- wwNbAeQDOwFlAwcBCQgABAIDEAEVAzkBXgNbAc0DIQH7AyEB+wNcAecDVwHuAxAB/gMuAfkDTQGSAwsB
- DggAAwIBAwMSARcDNQFVA1gBuANWAfEDPAH2A1sB3gNgAdsDOgH4A1kBw/8AEQAEAgMxAUwDYgHhAwAB
- /wNbAc0DGgEkCAAEAgMMARADLgFGA00BkgNcAcgDXgHrAyAB/QMAAf8DAAH/A2IB4QMxAUwEAhgAA1kB
- wwNbAeQDOwFlAwcBCQgAAwkBDAMxAU4DWAG3A04B8wMgAf0DXgHdA04BlgNZAb4DIQH8Ay4B+QNNAZID
- CwEOBAADAwEEAxsBJgNBAXMDWgHEA0cB9ANXAe4DVQG0A0QBegNRAaIDVwHuA1kBw/8AEQAEAgMxAUwD
- YgHhAwAB/wNbAc0DGgEkBAAEAgMTARoDPQFnA1oBvwNeAesDJQH6Az0B9gNcAecDMQH5AwAB/wNiAeED
- MQFMBAIYAANZAcMDWwHkAzsBZQMHAQkEAAMLAQ4DLgFHA1UBrQNUAe8DOwH4A2AB2wNEAXoDJAE1A04B
- mAMkAfoDLgH5A00BkgMLAQ4DBgEIAyABLgNNAZIDXQHcA0QB9QNaAekDTgGWAygBPAMgAS0DSwGNA1wB
- 7ANZAcP/ABEABAIDMQFMA2IB4QMAAf8DWwHNAxoBJAMCAQMDEwEaA0YBfwNbAd4DIQH7AxAB/gM6AfgD
- WQG7AzsBYwNcAdkDAAH/A2IB4QMxAUwEAhgAA1kBwwNbAeQDOwFlAwcECQEMAzoBYQNdAdQDRwH0AzEB
- +QNbAcoDMgFPAw8BFAMNAREDTQGSAy4B+QMuAfkDTQGSAxEBFgMtAUQDWgG/A1QB7wMiAfwDYAHgA0AB
- cQMXAR8DBAEFAxgBIQNKAYsDXAHsA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wNbAc0DGgEkAxYBHQNVAa8D
+ /wNiAeEDMQFMBAIYAANZAcMDWwHkAzsBZQMHAQkMAAQBAw0BEQM0AVMDXQHRAzcB+QMTAf4DEgH+AwAB
+ /wM0AfkDTQGSAwsBDgwABAEDCQELAx4BKwNTAakDJgH9AyQB/QMlAfwDEgH+A1kBw/8AEQAEAgMxAUwD
+ YgHhAwAB/wNbAc0DGgEkEAADBwEJAxsBJgM0AVMDTQGSA14B3QM3AfkDAAH/A2IB4QMxAUwEAhgAA1kB
+ wwNbAeQDOwFlAwcBCQgABAIDEAEVAzkBXgNbAc0DIQH7AyEB+wNcAecDWQHuAxIB/gM0AfkDTQGSAwsB
+ DggAAwIBAwMSARcDNQFVA1gBuANYAfEDQgH2A1sB3gNgAdsDPAH4A1kBw/8AEQAEAgMxAUwDYgHhAwAB
+ /wNbAc0DGgEkCAAEAgMMARADLgFGA00BkgNcAcgDYQHrAyQB/QMAAf8DAAH/A2IB4QMxAUwEAhgAA1kB
+ wwNbAeQDOwFlAwcBCQgAAwkBDAMxAU4DWAG3A1AB8wMkAf0DXgHdA04BlgNZAb4DJQH8AzQB+QNNAZID
+ CwEOBAADAwEEAxsBJgNBAXMDWgHEA00B9ANZAe4DVQG0A0QBegNRAaIDWQHuA1kBw/8AEQAEAgMxAUwD
+ YgHhAwAB/wNbAc0DGgEkBAAEAgMTARoDPQFnA1oBvwNhAesDJwH6A0MB9gNcAecDNwH5AwAB/wNiAeED
+ MQFMBAIYAANZAcMDWwHkAzsBZQMHAQkEAAMLAQ4DLgFHA1UBrQNYAe8DPQH4A2AB2wNEAXoDJAE1A04B
+ mAMmAfoDNAH5A00BkgMLAQ4DBgEIAyABLgNNAZIDXQHcA0YB9QNaAekDTgGWAygBPAMgAS0DSwGNA10B
+ 7ANZAcP/ABEABAIDMQFMA2IB4QMAAf8DWwHNAxoBJAMCAQMDEwEaA0YBfwNbAd4DIQH7AxIB/gM8AfgD
+ WQG7AzsBYwNcAdkDAAH/A2IB4QMxAUwEAhgAA1kBwwNbAeQDOwFlAwcECQEMAzoBYQNdAdQDTQH0AzcB
+ +QNbAcoDMgFPAw8BFAMNAREDTQGSAzQB+QM0AfkDTQGSAxEBFgMtAUQDWgG/A1gB7wMmAfwDYAHgA0AB
+ cQMXAR8DBAEFAxgBIQNKAYsDXQHsA1kBw/8AEQAEAgMxAUwDYgHhAwAB/wNbAc0DGgEkAxYBHQNVAa8D
AAH/AwAB/wMAAf8DAAH/A1UBrwMWAR0DGgEkA1sBzQMAAf8DYgHhAzEBTAQCGAADWQHDA1sB5AM7AWUD
- BwEJA0kBhgMhAfsDAAH/AwAB/wNZAcEDHQEpCAADCwEOA00BkgMuAfkDLgH5A00BkgM5BF4B4gMAAf8D
- AAH/A1oB7QNKAYsDGAEgCAEDGAEhA0oBiwNcAewDWQHD/wARAAQCAzEBTANiAeEDAAH/A1wB2QM7AWMD
- WQG7Az8B9wMiAfwDRwH0A1wB2QNGAX4DEwEaAwIBAwMaASQDWwHNAwAB/wNiAeEDMQFMBAIYAANZAcMD
- XgHrA1ABmgNVAbEDTgHzAyEB+wNfAeUDSwGPAxsBJQMDAQQIAAMLAQ4DTQGSAy4B+QMhAfsDVgGzA0wB
- jgNeAesDEAH+A1EB8ANXAbkDLgFHAwYBCAQABAEDGAEhA0oBiwNcAewDWQHD/wARAAQCAzEBTANiAeED
- AAH/AzEB+QNcAecDRAH1A1UB8QNbAdMDUQGkAzgBWwMTARkEAgQAAxoBJANbAc0DAAH/A2IB4QMxAUwE
- AhgAA1kBwwMiAfwDUQHwA0QB9QMhAf0DXgHXA0YBfgMaASQDAgEDDAADCwEOA00BkgMuAfkDEAH+A04B
- 8wNXAe4DPwH3A14B4wNOAZgDJwE5AwgBCgQBBAAEAQMYASEDSgGLA1wB7ANZAcP/ABEABAIDMQFMA2IB
- 4QMAAf8DAAH/AyAB/QNiAeEDUgGjAzsBYwMhAS8DCgENBAIIAAMaASQDWwHNAwAB/wNiAeEDMQFMBAIY
- AANZAcMDAAH/AwAB/wMAAf8DXwHoA0oBiwMWAR0DBAEFEAADCwEOA00BkgMuAfkDAAH/AwAB/wM8AfYD
- XAHLA0QBeQMeASoDBgEHDAAEAQMYASEDSgGLA1wB7ANZAcP/ABEABAIDMQFMA2IB4QMAAf8DMQH5A2AB
- 2wNFAXwDIQEwAwwBEAMDAQQQAAMaASMDXAHIAyEB/QNiAeEDMQFMBAIYAANZAcMDAAH/AyMB/ANeAesD
- TgGXAyMBMwQCFAADCwEOA00BkgMuAfkDEAH+A1MB8gNYAboDNwFaAxEBFgMCAQMUAAMXAR8DSQGGA14B
- 6wNZAcP/ABEABAIDLQFFA14B0gNTAfIDXQHJAzIBTwMQARUDAgEDGAADEwEaA1ABnwNbAeQDWwHQAy0B
- RQQCGAADVQG0A1gB7gNfAdoDRAF4AxgBIAMDAQQYAAMKAQ0DSQGGA18B6ANaAekDUAGfAyQBNAMJAQsE
+ BwEJA0kBhgMhAfsDAAH/AwAB/wNZAcEDHQEpCAADCwEOA00BkgM0AfkDNAH5A00BkgM5BF4B4gMAAf8D
+ AAH/A14B7QNKAYsDGAEgCAEDGAEhA0oBiwNdAewDWQHD/wARAAQCAzEBTANiAeEDAAH/A1wB2QM7AWMD
+ WQG7A0QB9wMmAfwDTQH0A1wB2QNGAX4DEwEaAwIBAwMaASQDWwHNAwAB/wNiAeEDMQFMBAIYAANZAcMD
+ YQHrA1ABmgNVAbEDUAHzAyEB+wNfAeUDSwGPAxsBJQMDAQQIAAMLAQ4DTQGSAzQB+QMhAfsDVgGzA0wB
+ jgNhAesDEgH+A1MB8ANXAbkDLgFHAwYBCAQABAEDGAEhA0oBiwNdAewDWQHD/wARAAQCAzEBTANiAeED
+ AAH/AzcB+QNcAecDRgH1A1cB8QNbAdMDUQGkAzgBWwMTARkEAgQAAxoBJANbAc0DAAH/A2IB4QMxAUwE
+ AhgAA1kBwwMmAfwDUwHwA0YB9QMlAf0DXgHXA0YBfgMaASQDAgEDDAADCwEOA00BkgM0AfkDEgH+A1AB
+ 8wNZAe4DRAH3A2AB4wNOAZgDJwE5AwgBCgQBBAAEAQMYASEDSgGLA10B7ANZAcP/ABEABAIDMQFMA2IB
+ 4QMAAf8DAAH/AyQB/QNiAeEDUgGjAzsBYwMhAS8DCgENBAIIAAMaASQDWwHNAwAB/wNiAeEDMQFMBAIY
+ AANZAcMDAAH/AwAB/wMAAf8DYAHoA0oBiwMWAR0DBAEFEAADCwEOA00BkgM0AfkDAAH/AwAB/wNCAfYD
+ XAHLA0QBeQMeASoDBgEHDAAEAQMYASEDSgGLA10B7ANZAcP/ABEABAIDMQFMA2IB4QMAAf8DNwH5A2AB
+ 2wNFAXwDIQEwAwwBEAMDAQQQAAMaASMDXAHIAyUB/QNiAeEDMQFMBAIYAANZAcMDAAH/AycB/ANhAesD
+ TgGXAyMBMwQCFAADCwEOA00BkgM0AfkDEgH+A1cB8gNYAboDNwFaAxEBFgMCAQMUAAMXAR8DSQGGA2EB
+ 6wNZAcP/ABEABAIDLQFFA14B0gNXAfIDXQHJAzIBTwMQARUDAgEDGAADEwEaA1ABnwNbAeQDWwHQAy0B
+ RQQCGAADVQG0A1oB7gNfAdoDRAF4AxgBIAMDAQQYAAMKAQ0DSQGGA2AB6ANaAekDUAGfAyQBNAMJAQsE
ARgAAwsBDgM7AWUDWwHTA1YBsv8AFQADAwEEAycBOgM/AW0DFAEbKAADDwETAzEBTgMdASkDAgEDHAAD
DgESAzEBTQMjATMDBAEFJAADBgEHAygBPAMoATwDBgEHJAAEAQMHAQkDCwEOAwIBA/8ABQADAgEDAw8B
- FANJAYgDXwHlA18B6ANfAegDXwHoA18B6ANfAegDXwHoA18B6ANfAegDXwHoA18B6ANfAegDXwHoA18B
- 6ANfAegDXwHoA18B6ANfAegDXwHoA1sB5ANGAX4DBQEGBAEoAAMCAQMDDQERAx8BLAMtAUYDVwG5A18B
- 6ANfAegDXwHoA18B6ANfAegDXwHoA2AB4wNZAb4DMgFPAw8BEwMCAQMwAAMTARkDRgF+A18B6ANfAegD
- WQHBAzkBXgMmATgDDwEUBAJcAAM5AV8DXgHiA1wB5wNfAegDXwHoA18B6ANfAegDXQHcAzwBZgMGAQgD
- BgEIAzwBZgNdAdwDXwHoA18B6ANfAegDXwHoA10B3ANQAZ0DJQE2IAADDAEQAzwBZgNdAc8DIAH9AyUB
- +gNUAe8DWgHtA1oB7QNaAe0DWgHtA1oB7QNaAe0DWgHtA1oB7QNaAe0DWgHtA1oB7QNaAe0DWgHtA1oB
- 7QNUAe8DJQH6AyIB/ANWAbUDKwFCAwgBCiQABAIDGAEhA0ABcANaAb8DXQHfA1wB7QNUAe8DXAHsA2AB
- 5gNfAeUDWgHqA1oB7QNRAfADPQH2A10B0QNDAXcDHgErAwYBBywAAz0BaQNbAd4DAQH/AzEB+QNdAewD
- WwHkA14B1wNEAXsDHgEqAwYBCFgAAz8BbAMhAf0DOgH4A1QB7wNaAe0DVwHuAyUB+gM8AfYDTwGbAx4B
- KwMgAS0DUAGdAzwB9gMlAfoDVwHuA1oB7QNUAe8DPwH3A1MB8gM7AWUgAAMTARkDUAGcAz8B9wM9AfYD
+ FANJAYgDXwHlA2AB6ANgAegDYAHoA2AB6ANgAegDYAHoA2AB6ANgAegDYAHoA2AB6ANgAegDYAHoA2AB
+ 6ANgAegDYAHoA2AB6ANgAegDYAHoA1sB5ANGAX4DBQEGBAEoAAMCAQMDDQERAx8BLAMtAUYDVwG5A2AB
+ 6ANgAegDYAHoA2AB6ANgAegDYAHoA2AB4wNZAb4DMgFPAw8BEwMCAQMwAAMTARkDRgF+A2AB6ANgAegD
+ WQHBAzkBXgMmATgDDwEUBAJcAAM5AV8DXgHiA1wB5wNgAegDYAHoA2AB6ANgAegDXQHcAzwBZgMGAQgD
+ BgEIAzwBZgNdAdwDYAHoA2AB6ANgAegDYAHoA10B3ANQAZ0DJQE2IAADDAEQAzwBZgNdAc8DJAH9AycB
+ +gNYAe8DXgHtA14B7QNeAe0DXgHtA14B7QNeAe0DXgHtA14B7QNeAe0DXgHtA14B7QNeAe0DXgHtA14B
+ 7QNYAe8DJwH6AyYB/ANWAbUDKwFCAwgBCiQABAIDGAEhA0ABcANaAb8DXQHfA14B7QNYAe8DXQHsA2EB
+ 5gNfAeUDXQHqA14B7QNTAfADQwH2A10B0QNDAXcDHgErAwYBBywAAz0BaQNbAd4DAQH/AzcB+QNdAewD
+ WwHkA14B1wNEAXsDHgEqAwYBCFgAAz8BbAMlAf0DPAH4A1gB7wNeAe0DWQHuAycB+gNCAfYDTwGbAx4B
+ KwMgAS0DUAGdA0IB9gMnAfoDWQHuA14B7QNYAe8DRAH3A1cB8gM7AWUgAAMTARkDUAGcA0QB9wNDAfYD
XQHMA0sBjQNGAYADRgGAA0YBgANGAYADRgGAA0YBgANGAYADRgGAA0YBgANGAYADRgGAA0YBgANGAYAD
- RgGAA0sBjwNcAdkDIAH9A1UB8QNOAZQDEgEYJAADBQEGAzEBTgNbAdADUwHyA14B4gNVAa4DSgGKA0YB
- fwNDAXcDQwF2A0UBfANGAYADTwGbA14B3QNfAegDXwHaA04BlgMoATwDCQEMKAADRwGDAzoB+AMiAfwD
- WwHTA1MBpgNcAdkDMQH5A2AB4ANQAZoDLQFEAwsBDlQAAz8BbAMiAfwDWwHTA0wBjgNGAYADSgGKA10B
- 3AMhAf0DXgHdAzoBYAM6AWIDXQHfAyAB/QNdAdwDSgGKA0YBgANMAY4DWwHTAyIB/AM/AWwgAAMUARsD
- UgGlAx8B/QNbAdADPwFsAxgBIQMOARIDDgESAw4BEgMOARIDDgESAw4BEgMOARIDDgESAw4BEgMOARID
- DgESAw4BEgMOARIDDgESAyABLgNXAbkDIAH9Ax8B/QNSAaUDFAEbJAADBQEGAzEBTQNaAccDXAHIA0AB
- bwMlATcDEwEaAw4BEgMNAREDDAEQAw4BEgMOARIDHQEoAzoBYANLAY8DWwHYA2AB5gNWAbYDMQFNAwYB
- CCQAA0kBhgMhAfsDMQH5A1UBrgMqAUADPwFtA10B0QNEAfUDVwHuA1gBtwM2AVcDFgEdAwwBEAQCSAAD
- PwFsAzEB+QNVAa4DIAEtAw4BEgMbASUDWQG+AwAB/wNaAe0DPwFtAz8BbQNaAe0DAAH/A1kBvgMbASUD
- DgESAyABLQNVAa4DMQH5Az8BbCAAAxQBGwNSAaUDHwH9A1YBtgMoATwDCAEKOAADFgEeA1YBswMgAf0D
- HwH9A1IBpQMUARskAAQBAw8BFAMjATMDIQEwAwsBDgMDAQQEARQABAIDBwEJAx4BKgNLAYwDXQHfAz8B
- 9wNTAakDKAE7JAADSQGGAyEB+wMxAfkDUwGnAxYBHgMMARADKgFAA1gBugNPAfMDSQH0A2AB2wNXAbwD
- QgF0AxMBGQMCAQNEAAM/AWwDMQH5A1MBpwMVARwEAAMPARQDVwG5AwAB/wNaAe0DPwFtAz8BbQNaAe0D
- AAH/A1cBuQMPARQEAAMVARwDUwGnAzEB+QM/AWwgAAMUARsDUgGlAx8B/QNVAbQDJgE4AwcBCTgAAxYB
- HgNWAbMDIAH9Ax8B/QNSAaUDFAEbYAADFQEcA1MBpwMxAfkDIQH7A0kBhiQAA0kBhgMhAfsDMQH5A1MB
- pwMVARwIAAMPARMDQwF2A1wB2QMhAf0DAAH/AwAB/wNVAa8DFgEdRAADPwFsAzEB+QNTAacDFQEcBAAD
- DwEUA1cBuQMAAf8DWgHtAz8BbQM/AW0DWgHtAwAB/wNXAbkDDwEUBAADFQEcA1MBpwMxAfkDPwFsIAAD
- FAEbA1IBpQMfAf0DVQG0AyYBOAMHAQk4AAMWAR4DVgGzAyAB/QMfAf0DUgGlAxQBG2AAAwIBAwMeASoD
- VQG0Az8B9wNSAaADGwElAwUBBhwAA0kBhgMhAfsDMQH5A1MBpwMVARwIAAQCAwkBCwMYASADRAF6A2AB
- 2wM9AfcDPwH3A1kBuwMqAUADDgESAwUBBgQCNAADPwFsAzEB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8D
- WgHtAz8BbQM/AW0DWgHtAwAB/wNXAbkDDwEUBAADFQEcA1MBpwMxAfkDPwFsIAADFAEbA1IBpQMfAf0D
- VQG0AyYBOAMHAQk4AAMWAR4DVgGzAyAB/QMfAf0DUgGlAxQBG2QAAw8BEwNAAW8DXQHUA1UB7wNMAZED
- EgEYHAADSQGGAyEB+wMxAfkDUwGnAxUBHBAABAIDDQERAzYBVwNYAbcDXAHsA1YB8QNdAdEDRAF5AzMB
- UAMbASYDBgEHMAADPwFsAzEB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8DWgHtAz8BbQM/AW0DWgHtAwAB
- /wNXAbkDDwEUBAADFQEcA1MBpwMxAfkDPwFsIAADFAEbA1IBpQMfAf0DVQG0AyYBOAMHAQk4AAMWAR4D
- VgGzAyAB/QMfAf0DUgGlAxQBG2QAAwIBAwMPARMDUQGeAx8B/QNSAaUDFAEbHAADSQGGAyEB+wMxAfkD
- UwGnAxUBHBgAAwsBDgMtAUQDSwGPA1sBxQNiAeEDYgHhA1sBzQNMAZADKAE7AwkBDCwAAz8BbAMxAfkD
- UwGnAxUBHAQAAw8BFANXAbkDAAH/A1oB7QM/AW0DPwFtA1oB7QMAAf8DVwG5Aw8BFAQAAxUBHANTAacD
- MQH5Az8BbCAAAxQBGwNSAaUDHwH9A1UBtAMmATgDBwEJOAADFgEeA1YBswMgAf0DHwH9A1IBpQMUARts
- AANNAZMDHwH9A1IBpQMUARscAANJAYYDIQH7AzEB+QNTAacDFQEcHAADBgEIAxkBIgMvAUkDQAFxA10B
- zANOAfMDWgHpA1YBtgMtAUQsAAM/AWwDMQH5A1MBpwMVARwEAAMPARQDVwG5AwAB/wNaAe0DPwFtAz8B
- bQNaAe0DAAH/A1cBuQMPARQEAAMVARwDUwGnAzEB+QM/AWwgAAMUARsDUgGlAx8B/QNVAbQDJgE4AwcB
- CTgAAxYBHgNWAbMDIAH9Ax8B/QNSAaUDFAEbbAADTQGTAx8B/QNSAaUDFAEbHAADSQGGAyEB+wMxAfkD
- UwGnAxUBHCAABAIDBAEFAwsBDgMwAUwDWQHBAz0B9gMvAfkDQQFyAwYBCCgAAz8BbAMxAfkDUwGnAxUB
- HAQAAw8BFANXAbkDAAH/A1oB7QM/AW0DPwFtA1oB7QMAAf8DVwG5Aw8BFAQAAxUBHANTAacDMQH5Az8B
- bCAAAxQBGwNSAaUDHwH9A1UBtAMmATgDBwEJOAADFgEeA1YBswMgAf0DHwH9A1IBpQMUARtsAANNAZMD
- HwH9A1IBpQMUARscAANJAYYDIQH7AzEB+QNTAacDFQEcMAADFQEcA1MBpwMxAfkDWwHTAzoBYSgAAz8B
- bAMxAfkDUwGnAxUBHAQAAw8BFANXAbkDAAH/A1oB7QM/AW0DPwFtA1oB7QMAAf8DVwG5Aw8BFAQAAxUB
- HANTAacDMQH5Az8BbCAAAxQBGwNSAaUDHwH9A1UBtAMmATgDBwEJOAADFgEeA1YBswMgAf0DHwH9A1IB
- pQMUARsQAAQBAwQBBQMLAQ4DDwETAw8BEwMPARMDDwETAw8BEwMNAREDCQEMAwMBBAQBLAADTQGTAx8B
- /QNSAaUDFAEbHAADSQGGAyEB+wMxAfkDUwGnAxUBHCAABAEDAgEDAwsBDgMwAUwDWQHBAz0B9gMvAfkD
- QQFyAwYBCCgAAz8BbAMxAfkDUwGnAxUBHAQAAw8BFANXAbkDAAH/A1oB7QM/AW0DPwFtA1oB7QMAAf8D
- VwG5Aw8BFAQAAxUBHANTAacDMQH5Az8BbCAAAxQBGwNSAaUDHwH9A1UBtAMmATgDBwEJOAADFgEeA1YB
- swMgAf0DHwH9A1IBpQMUARsQAAMGAQgDJAE1Az4BawNGAX0DRgF+A0YBfgNGAX4DRgF+A0QBewM9AWkD
- JAE0AwkBDCwAA00BkwMfAf0DUgGlAxQBGxwAA0kBhgMhAfsDMQH5A1MBpwMVARwcAAMGAQgDEgEXAyMB
- MwM/AW4DWwHNAz0B9gNaAeoDVgG2Ay0BRCwAAz8BbAMxAfkDUwGnAxUBHAQAAw8BFANXAbkDAAH/A1oB
- 7QM/AW0DPwFtA1oB7QMAAf8DVwG5Aw8BFAQAAxUBHANTAacDMQH5Az8BbCAAAxQBGwNSAaUDHwH9A1UB
- tAMmATgDBwEJOAADFgEeA1YBswMgAf0DHwH9A1IBpQMUARsQAAMQARUDRgF/A1wB2QNaAeoDYAHmA2IB
- 4QNgAeADXgHiA1wB5wNiAeEDUAGdAyEBMCQAAwIBAwMPARMDUQGeAx8B/QNSAaUDFAEbHAADSQGGAyEB
- +wMxAfkDUwGnAxUBHBgAAwsBDgMtAUQDRgGBA1MBqQNdAd8DXwHoA18B2gNOAZYDKAE8AwkBDCwAAz8B
- bAMxAfkDUwGnAxUBHAQAAw8BFANXAbkDAAH/A1oB7QM/AW0DPwFtA1oB7QMAAf8DVwG5Aw8BFAQAAxUB
- HANTAacDMQH5Az8BbCAAAxQBGwNSAaUDHwH9A1UBtAMmATgDBwEJOAADFgEeA1YBswMgAf0DHwH9A1IB
- pQMUARsQAAMTARoDTgGYA0MB9QMAAf8DYAHgA1YBtgNZAb4DXgHXAz8B9wMiAfwDWgHHAysBQiQAAw8B
- EwNAAW8DXQHUA1UB7wNNAZIDEgEYHAADSQGGAyEB+wMxAfkDUwGnAxUBHBAABAIDDQERAzYBVwNYAbcD
- WgHqA10B7ANfAdUDSwGPAzoBYAMeASsDBgEHMAADPwFsAzEB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8D
- WgHtAz8BbQM/AW0DWgHtAwAB/wNXAbkDDwEUBAADFQEcA1MBpwMxAfkDPwFsIAADFAEbA1IBpQMfAf0D
- VQG0AyYBOAMHAQk4AAMWAR4DVgGzAyAB/QMfAf0DUgGlAxQBGxAAAxQBGwNQAZoDPAH2AwAB/wNRAaQD
- JAE0A0QBeANeAd0DPwH3A1sB3gM7AWMDDgESIAADAgEDAx4BKgNVAbQDPwH3A1EBoQMbASYDBQEGHAAD
- SQGGAyEB+wMxAfkDUwGnAxUBHAwABAEDEwEZA0QBegNgAdsDPQH3Az8B9wNZAbsDKwFCAxMBGQMIAQoD
- AgEDNAADPwFsAzEB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8DWgHtAz8BbQM/AW0DWgHtAwAB/wNXAbkD
- DwEUBAADFQEcA1MBpwMxAfkDPwFsIAADFAEbA1IBpQMfAf0DVQG0AyYBOAMHAQk4AAMWAR4DVgGzAyAB
- /QMfAf0DUgGlAxQBGxAAAxQBGwNQAZoDPAH2AwAB/wNOAZUDMQFMA2IB4QMAAf8DWwHNAxoBJCgAAxUB
- HANTAacDMQH5AyEB+wNJAYYkAANJAYYDIQH7AzEB+QNTAacDFQEcDAADCwEOA00BkgMuAfkDAAH/AwAB
- /wNVAa8DFgEdRAADPwFsAzEB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8DWgHtAz8BbQM/AW0DWgHtAwAB
- /wNXAbkDDwEUBAADFQEcA1MBpwMxAfkDPwFsIAADFAEbA1IBpQMfAf0DVgG2AygBPAMIAQo4AAMWAR4D
- VgGzAyAB/QMfAf0DUgGlAxQBGxAAAxQBGwNQAZoDPAH2AwAB/wNEAfUDVgHvAyMB/AMSAf4DXQHMAx0B
- KQQCGAAEAgMGAQcDDwETAzIBTwNZAcADQwH1A10B0QM6AWAkAANJAYYDIQH7AzEB+QNTAacDFgEeAwwB
- EAMqAUADVwG5A1oB6QNVAe8DXQHoA10BzwNGAX0DEwEaAwIBA0QAAz8BbAMxAfkDUwGnAxUBHAQAAw8B
- FANXAbkDAAH/A1oB7QM/AW0DPwFtA1oB7QMAAf8DVwG5Aw8BFAQAAxUBHANTAacDMQH5Az8BbCAAAxQB
- GwNSAaUDHwH9A1sB0AM/AWwDGAEhAw4BEgMOARIDDgESAw4BEgMOARIDDgESAw4BEgMOARIDDgESAw4B
- EgMOARIDDgESAw4BEgMOARIDIAEuA1cBuQMgAf0DHwH9A1IBpQMUARsQAAMUARsDUAGaAzwB9gMAAf8D
- AAH/AyQB+gNDAfUDIAH9A2AB4ANAAXEDHQEoAw4BEgMNAREDCQEMAwgBCgMLBA4BEgMcAScDOAFbA0QB
- eQNaAccDYgHhA1YBtgM0AVQDDAEPJAADSQGGAyEB+wMxAfkDVQGuAyoBQAM/AW0DXQHRA0QB9QNXAe4D
- WQG7A0QBeQMqAUADEQEWBAJIAAM/AWwDMQH5A1UBrgMgAS0DDgESAxsBJQNZAb4DAAH/A1oB7QM/AW0D
- PwFtA1oB7QMAAf8DWQG+AxsBJQMOARIDIAEtA1UBrgMxAfkDPwFsIAADEwEaA1EBpAMhAfwDPAH2A10B
+ RgGAA0sBjwNcAdkDJAH9A1cB8QNOAZQDEgEYJAADBQEGAzEBTgNbAdADVwHyA14B4gNVAa4DSgGKA0YB
+ fwNDAXcDQwF2A0UBfANGAYADTwGbA14B3QNgAegDXwHaA04BlgMoATwDCQEMKAADRwGDAzwB+AMmAfwD
+ WwHTA1MBpgNcAdkDNwH5A2AB4ANQAZoDLQFEAwsBDlQAAz8BbAMmAfwDWwHTA0wBjgNGAYADSgGKA10B
+ 3AMlAf0DXgHdAzoBYAM6AWIDXQHfAyQB/QNdAdwDSgGKA0YBgANMAY4DWwHTAyYB/AM/AWwgAAMUARsD
+ UgGlAyMB/QNbAdADPwFsAxgBIQMOARIDDgESAw4BEgMOARIDDgESAw4BEgMOARIDDgESAw4BEgMOARID
+ DgESAw4BEgMOARIDDgESAyABLgNXAbkDJAH9AyMB/QNSAaUDFAEbJAADBQEGAzEBTQNaAccDXAHIA0AB
+ bwMlATcDEwEaAw4BEgMNAREDDAEQAw4BEgMOARIDHQEoAzoBYANLAY8DWwHYA2EB5gNWAbYDMQFNAwYB
+ CCQAA0kBhgMhAfsDNwH5A1UBrgMqAUADPwFtA10B0QNGAfUDWQHuA1gBtwM2AVcDFgEdAwwBEAQCSAAD
+ PwFsAzcB+QNVAa4DIAEtAw4BEgMbASUDWQG+AwAB/wNeAe0DPwFtAz8BbQNeAe0DAAH/A1kBvgMbASUD
+ DgESAyABLQNVAa4DNwH5Az8BbCAAAxQBGwNSAaUDIwH9A1YBtgMoATwDCAEKOAADFgEeA1YBswMkAf0D
+ IwH9A1IBpQMUARskAAQBAw8BFAMjATMDIQEwAwsBDgMDAQQEARQABAIDBwEJAx4BKgNLAYwDXQHfA0QB
+ 9wNTAakDKAE7JAADSQGGAyEB+wM3AfkDUwGnAxYBHgMMARADKgFAA1gBugNRAfMDTgH0A2AB2wNXAbwD
+ QgF0AxMBGQMCAQNEAAM/AWwDNwH5A1MBpwMVARwEAAMPARQDVwG5AwAB/wNeAe0DPwFtAz8BbQNeAe0D
+ AAH/A1cBuQMPARQEAAMVARwDUwGnAzcB+QM/AWwgAAMUARsDUgGlAyMB/QNVAbQDJgE4AwcBCTgAAxYB
+ HgNWAbMDJAH9AyMB/QNSAaUDFAEbYAADFQEcA1MBpwM3AfkDIQH7A0kBhiQAA0kBhgMhAfsDNwH5A1MB
+ pwMVARwIAAMPARMDQwF2A1wB2QMlAf0DAAH/AwAB/wNVAa8DFgEdRAADPwFsAzcB+QNTAacDFQEcBAAD
+ DwEUA1cBuQMAAf8DXgHtAz8BbQM/AW0DXgHtAwAB/wNXAbkDDwEUBAADFQEcA1MBpwM3AfkDPwFsIAAD
+ FAEbA1IBpQMjAf0DVQG0AyYBOAMHAQk4AAMWAR4DVgGzAyQB/QMjAf0DUgGlAxQBG2AAAwIBAwMeASoD
+ VQG0A0QB9wNSAaADGwElAwUBBhwAA0kBhgMhAfsDNwH5A1MBpwMVARwIAAQCAwkBCwMYASADRAF6A2AB
+ 2wNBAfcDRAH3A1kBuwMqAUADDgESAwUBBgQCNAADPwFsAzcB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8D
+ XgHtAz8BbQM/AW0DXgHtAwAB/wNXAbkDDwEUBAADFQEcA1MBpwM3AfkDPwFsIAADFAEbA1IBpQMjAf0D
+ VQG0AyYBOAMHAQk4AAMWAR4DVgGzAyQB/QMjAf0DUgGlAxQBG2QAAw8BEwNAAW8DXQHUA1kB7wNMAZED
+ EgEYHAADSQGGAyEB+wM3AfkDUwGnAxUBHBAABAIDDQERAzYBVwNYAbcDXQHsA1gB8QNdAdEDRAF5AzMB
+ UAMbASYDBgEHMAADPwFsAzcB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8DXgHtAz8BbQM/AW0DXgHtAwAB
+ /wNXAbkDDwEUBAADFQEcA1MBpwM3AfkDPwFsIAADFAEbA1IBpQMjAf0DVQG0AyYBOAMHAQk4AAMWAR4D
+ VgGzAyQB/QMjAf0DUgGlAxQBG2QAAwIBAwMPARMDUQGeAyMB/QNSAaUDFAEbHAADSQGGAyEB+wM3AfkD
+ UwGnAxUBHBgAAwsBDgMtAUQDSwGPA1sBxQNiAeEDYgHhA1sBzQNMAZADKAE7AwkBDCwAAz8BbAM3AfkD
+ UwGnAxUBHAQAAw8BFANXAbkDAAH/A14B7QM/AW0DPwFtA14B7QMAAf8DVwG5Aw8BFAQAAxUBHANTAacD
+ NwH5Az8BbCAAAxQBGwNSAaUDIwH9A1UBtAMmATgDBwEJOAADFgEeA1YBswMkAf0DIwH9A1IBpQMUARts
+ AANNAZMDIwH9A1IBpQMUARscAANJAYYDIQH7AzcB+QNTAacDFQEcHAADBgEIAxkBIgMvAUkDQAFxA10B
+ zANQAfMDWgHpA1YBtgMtAUQsAAM/AWwDNwH5A1MBpwMVARwEAAMPARQDVwG5AwAB/wNeAe0DPwFtAz8B
+ bQNeAe0DAAH/A1cBuQMPARQEAAMVARwDUwGnAzcB+QM/AWwgAAMUARsDUgGlAyMB/QNVAbQDJgE4AwcB
+ CTgAAxYBHgNWAbMDJAH9AyMB/QNSAaUDFAEbbAADTQGTAyMB/QNSAaUDFAEbHAADSQGGAyEB+wM3AfkD
+ UwGnAxUBHCAABAIDBAEFAwsBDgMwAUwDWQHBA0MB9gM1AfkDQQFyAwYBCCgAAz8BbAM3AfkDUwGnAxUB
+ HAQAAw8BFANXAbkDAAH/A14B7QM/AW0DPwFtA14B7QMAAf8DVwG5Aw8BFAQAAxUBHANTAacDNwH5Az8B
+ bCAAAxQBGwNSAaUDIwH9A1UBtAMmATgDBwEJOAADFgEeA1YBswMkAf0DIwH9A1IBpQMUARtsAANNAZMD
+ IwH9A1IBpQMUARscAANJAYYDIQH7AzcB+QNTAacDFQEcMAADFQEcA1MBpwM3AfkDWwHTAzoBYSgAAz8B
+ bAM3AfkDUwGnAxUBHAQAAw8BFANXAbkDAAH/A14B7QM/AW0DPwFtA14B7QMAAf8DVwG5Aw8BFAQAAxUB
+ HANTAacDNwH5Az8BbCAAAxQBGwNSAaUDIwH9A1UBtAMmATgDBwEJOAADFgEeA1YBswMkAf0DIwH9A1IB
+ pQMUARsQAAQBAwQBBQMLAQ4DDwETAw8BEwMPARMDDwETAw8BEwMNAREDCQEMAwMBBAQBLAADTQGTAyMB
+ /QNSAaUDFAEbHAADSQGGAyEB+wM3AfkDUwGnAxUBHCAABAEDAgEDAwsBDgMwAUwDWQHBA0MB9gM1AfkD
+ QQFyAwYBCCgAAz8BbAM3AfkDUwGnAxUBHAQAAw8BFANXAbkDAAH/A14B7QM/AW0DPwFtA14B7QMAAf8D
+ VwG5Aw8BFAQAAxUBHANTAacDNwH5Az8BbCAAAxQBGwNSAaUDIwH9A1UBtAMmATgDBwEJOAADFgEeA1YB
+ swMkAf0DIwH9A1IBpQMUARsQAAMGAQgDJAE1Az4BawNGAX0DRgF+A0YBfgNGAX4DRgF+A0QBewM9AWkD
+ JAE0AwkBDCwAA00BkwMjAf0DUgGlAxQBGxwAA0kBhgMhAfsDNwH5A1MBpwMVARwcAAMGAQgDEgEXAyMB
+ MwM/AW4DWwHNA0MB9gNdAeoDVgG2Ay0BRCwAAz8BbAM3AfkDUwGnAxUBHAQAAw8BFANXAbkDAAH/A14B
+ 7QM/AW0DPwFtA14B7QMAAf8DVwG5Aw8BFAQAAxUBHANTAacDNwH5Az8BbCAAAxQBGwNSAaUDIwH9A1UB
+ tAMmATgDBwEJOAADFgEeA1YBswMkAf0DIwH9A1IBpQMUARsQAAMQARUDRgF/A1wB2QNdAeoDYQHmA2IB
+ 4QNgAeADXgHiA1wB5wNiAeEDUAGdAyEBMCQAAwIBAwMPARMDUQGeAyMB/QNSAaUDFAEbHAADSQGGAyEB
+ +wM3AfkDUwGnAxUBHBgAAwsBDgMtAUQDRgGBA1MBqQNdAd8DYAHoA18B2gNOAZYDKAE8AwkBDCwAAz8B
+ bAM3AfkDUwGnAxUBHAQAAw8BFANXAbkDAAH/A14B7QM/AW0DPwFtA14B7QMAAf8DVwG5Aw8BFAQAAxUB
+ HANTAacDNwH5Az8BbCAAAxQBGwNSAaUDIwH9A1UBtAMmATgDBwEJOAADFgEeA1YBswMkAf0DIwH9A1IB
+ pQMUARsQAAMTARoDTgGYA0UB9QMAAf8DYAHgA1YBtgNZAb4DXgHXA0QB9wMmAfwDWgHHAysBQiQAAw8B
+ EwNAAW8DXQHUA1kB7wNNAZIDEgEYHAADSQGGAyEB+wM3AfkDUwGnAxUBHBAABAIDDQERAzYBVwNYAbcD
+ XQHqA10B7ANfAdUDSwGPAzoBYAMeASsDBgEHMAADPwFsAzcB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8D
+ XgHtAz8BbQM/AW0DXgHtAwAB/wNXAbkDDwEUBAADFQEcA1MBpwM3AfkDPwFsIAADFAEbA1IBpQMjAf0D
+ VQG0AyYBOAMHAQk4AAMWAR4DVgGzAyQB/QMjAf0DUgGlAxQBGxAAAxQBGwNQAZoDQgH2AwAB/wNRAaQD
+ JAE0A0QBeANeAd0DRAH3A1sB3gM7AWMDDgESIAADAgEDAx4BKgNVAbQDRAH3A1EBoQMbASYDBQEGHAAD
+ SQGGAyEB+wM3AfkDUwGnAxUBHAwABAEDEwEZA0QBegNgAdsDQQH3A0QB9wNZAbsDKwFCAxMBGQMIAQoD
+ AgEDNAADPwFsAzcB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8DXgHtAz8BbQM/AW0DXgHtAwAB/wNXAbkD
+ DwEUBAADFQEcA1MBpwM3AfkDPwFsIAADFAEbA1IBpQMjAf0DVQG0AyYBOAMHAQk4AAMWAR4DVgGzAyQB
+ /QMjAf0DUgGlAxQBGxAAAxQBGwNQAZoDQgH2AwAB/wNOAZUDMQFMA2IB4QMAAf8DWwHNAxoBJCgAAxUB
+ HANTAacDNwH5AyEB+wNJAYYkAANJAYYDIQH7AzcB+QNTAacDFQEcDAADCwEOA00BkgM0AfkDAAH/AwAB
+ /wNVAa8DFgEdRAADPwFsAzcB+QNTAacDFQEcBAADDwEUA1cBuQMAAf8DXgHtAz8BbQM/AW0DXgHtAwAB
+ /wNXAbkDDwEUBAADFQEcA1MBpwM3AfkDPwFsIAADFAEbA1IBpQMjAf0DVgG2AygBPAMIAQo4AAMWAR4D
+ VgGzAyQB/QMjAf0DUgGlAxQBGxAAAxQBGwNQAZoDQgH2AwAB/wNGAfUDWQHvAycB/AMUAf4DXQHMAx0B
+ KQQCGAAEAgMGAQcDDwETAzIBTwNZAcADRQH1A10B0QM6AWAkAANJAYYDIQH7AzcB+QNTAacDFgEeAwwB
+ EAMqAUADVwG5A1oB6QNZAe8DYAHoA10BzwNGAX0DEwEaAwIBA0QAAz8BbAM3AfkDUwGnAxUBHAQAAw8B
+ FANXAbkDAAH/A14B7QM/AW0DPwFtA14B7QMAAf8DVwG5Aw8BFAQAAxUBHANTAacDNwH5Az8BbCAAAxQB
+ GwNSAaUDIwH9A1sB0AM/AWwDGAEhAw4BEgMOARIDDgESAw4BEgMOARIDDgESAw4BEgMOARIDDgESAw4B
+ EgMOARIDDgESAw4BEgMOARIDIAEuA1cBuQMkAf0DIwH9A1IBpQMUARsQAAMUARsDUAGaA0IB9gMAAf8D
+ AAH/AyYB+gNFAfUDJAH9A2AB4ANAAXEDHQEoAw4BEgMNAREDCQEMAwgBCgMLBA4BEgMcAScDOAFbA0QB
+ eQNaAccDYgHhA1YBtgM0AVQDDAEPJAADSQGGAyEB+wM3AfkDVQGuAyoBQAM/AW0DXQHRA0YB9QNZAe4D
+ WQG7A0QBeQMqAUADEQEWBAJIAAM/AWwDNwH5A1UBrgMgAS0DDgESAxsBJQNZAb4DAAH/A14B7QM/AW0D
+ PwFtA14B7QMAAf8DWQG+AxsBJQMOARIDIAEtA1UBrgM3AfkDPwFsIAADEwEaA1EBpAMlAfwDQgH2A10B
zANLAY0DRgGAA0YBgANGAYADRgGAA0YBgANGAYADRgGAA0YBgANGAYADRgGAA0YBgANGAYADRgGAA0YB
- gANLAY8DXAHZAyAB/QNHAfQDTgGYAxMBGRAAAxIBGANLAYwDWgHtAwAB/wMiAf0DXAHZA1UBsQNdAd8D
- RAH1A2AB4ANPAZsDRgGAA0QBegM5AV4DMwFQAz0BaANGAX4DUAGaA18B2gNbAeQDXwHaA08BmwMpAT4D
- CgENKAADSQGGAyEB+wMiAfwDWwHTA1MBpgNcAdkDMQH5A2AB4ANQAZoDLQFFAxABFQMGAQcEAUwAAz8B
- bAMiAfwDWwHTA0wBjgNGAYADSgGKA10B3AMgAf0DXQHfAzoBYgM6AWIDXQHfAyAB/QNdAdwDSgGKA0YB
- gANMAY4DWwHTAyIB/AM/AWwgAAMSARcDSgGLA1wB6gMQAf4DJQH6A1QB7wNaAe0DWgHtA1oB7QNaAe0D
- WgHtA1oB7QNaAe0DWgHtA1oB7QNaAe0DWgHtA1oB7QNaAe0DWgHtA1QB7wMlAfoDIAH9A1cBwgM0AVQD
- CwEOEAADCAEKAy4BSANVAbEDXgHiA2AB2wNPAZsDLQFEA0MBdwNdAcwDYgHhA1oB6gNaAe0DWgHpA1sB
- 0wNcAcgDXwHaA14B6wNQAfIDMQH5A14B0gNEAXgDIQEvAwcBCSwAA0IBdQNaAeoDAQH/AzEB+QNRAfAD
- XQHsA1wB2QNEAXsDHgEqAwYBCFgAAz8BbAMBAf8DMQH5A1QB7wNaAe0DVwHuAyUB+gM8AfYDUAGdAyAB
- LQMgAS0DUAGdAzwB9gMlAfoDVwHuA1oB7QNUAe8DMQH5AxAB/gM/AWwgAAMFAQYDGgEjA00BkwNhAeYD
- XAHtAz8B9gM/AfcDPwH3Az8B9wM/AfcDPwH3Az8B9wM/AfcDPwH3Az8B9wM/AfcDPwH3Az8B9wM/AfcD
- PwH3Az8B9gNcAe0DXwHlA0cBgwMKAQ0EAhAABAEDCAEKAx8BLAMuAUgDLQFEAxsBJQMHAQkDDwETAyMB
- MgMuAUcDVwG5A18B6ANaAekDWAHuA1YB8QNdAewDWgHpA18B6ANbAdADNAFTAw8BEwMCAQMwAAMWAR4D
- RwGDA1wB7QNWAfEDXwHVA0wBjgMrAUIDDwEUBAJcAAM6AWIDWgHpA1wB7QM/AfYDPwH3Az8B9gNdAewD
- XQHcAzwBZgMGAQgDBgEIAzwBZgNdAdwDXAHtAz8B9gM/AfcDPwH2A1wB7QNhAeYDOgFiLAAEAQMjATMD
+ gANLAY8DXAHZAyQB/QNNAfQDTgGYAxMBGRAAAxIBGANLAYwDXgHtAwAB/wMmAf0DXAHZA1UBsQNdAd8D
+ RgH1A2AB4ANPAZsDRgGAA0QBegM5AV4DMwFQAz0BaANGAX4DUAGaA18B2gNbAeQDXwHaA08BmwMpAT4D
+ CgENKAADSQGGAyEB+wMmAfwDWwHTA1MBpgNcAdkDNwH5A2AB4ANQAZoDLQFFAxABFQMGAQcEAUwAAz8B
+ bAMmAfwDWwHTA0wBjgNGAYADSgGKA10B3AMkAf0DXQHfAzoBYgM6AWIDXQHfAyQB/QNdAdwDSgGKA0YB
+ gANMAY4DWwHTAyYB/AM/AWwgAAMSARcDSgGLA10B6gMSAf4DJwH6A1gB7wNeAe0DXgHtA14B7QNeAe0D
+ XgHtA14B7QNeAe0DXgHtA14B7QNeAe0DXgHtA14B7QNeAe0DXgHtA1gB7wMnAfoDJAH9A1cBwgM0AVQD
+ CwEOEAADCAEKAy4BSANVAbEDXgHiA2AB2wNPAZsDLQFEA0MBdwNdAcwDYgHhA10B6gNeAe0DWgHpA1sB
+ 0wNcAcgDXwHaA2EB6wNVAfIDNwH5A14B0gNEAXgDIQEvAwcBCSwAA0IBdQNdAeoDAQH/AzcB+QNTAfAD
+ XQHsA1wB2QNEAXsDHgEqAwYBCFgAAz8BbAMBAf8DNwH5A1gB7wNeAe0DWQHuAycB+gNCAfYDUAGdAyAB
+ LQMgAS0DUAGdA0IB9gMnAfoDWQHuA14B7QNYAe8DNwH5AxIB/gM/AWwgAAMFAQYDGgEjA00BkwNhAeYD
+ XgHtA0QB9gNEAfcDRAH3A0QB9wNEAfcDRAH3A0QB9wNEAfcDRAH3A0QB9wNEAfcDRAH3A0QB9wNEAfcD
+ RAH3A0QB9gNeAe0DXwHlA0cBgwMKAQ0EAhAABAEDCAEKAx8BLAMuAUgDLQFEAxsBJQMHAQkDDwETAyMB
+ MgMuAUcDVwG5A2AB6ANaAekDWgHuA1gB8QNdAewDWgHpA2AB6ANbAdADNAFTAw8BEwMCAQMwAAMWAR4D
+ RwGDA14B7QNYAfEDXwHVA0wBjgMrAUIDDwEUBAJcAAM6AWIDWgHpA14B7QNEAfYDRAH3A0QB9gNdAewD
+ XQHcAzwBZgMGAQgDBgEIAzwBZgNdAdwDXgHtA0QB9gNEAfcDRAH2A14B7QNhAeYDOgFiLAAEAQMjATMD
TgGXA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasDVAGrA1QBqwNUAasD
TgGXAyMBMwQBTAADCQELAzkBXQNHAYIDJwE6AwQBBUgABAIDIgExAzoBYQMPARRwAAMDAQQDKAE7A04B
mANUAasDUQGeAyEBLxQAAwMBBAMlATcDUAGfA1QBqwNOAZgDKAE7AwMBBBgAAUIBTQE+BwABPgMAASgD
@@ -323,4 +323,7 @@
165, 17
+
+ 291, 17
+
\ No newline at end of file
diff --git a/SpineViewer/Forms/PetForm.cs b/SpineViewer/Forms/PetForm.cs
deleted file mode 100644
index 0138ba5..0000000
--- a/SpineViewer/Forms/PetForm.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-using SpineViewer.Natives;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Forms;
-
-namespace SpineViewer
-{
- public partial class PetForm: Form
- {
- public PetForm()
- {
- InitializeComponent();
- }
-
- protected override CreateParams CreateParams
- {
- get
- {
- //var style = Win32.GetWindowLong(hWnd, Win32.GWL_STYLE) | Win32.WS_POPUP;
- //var exStyle = Win32.GetWindowLong(hWnd, Win32.GWL_EXSTYLE) | Win32.WS_EX_LAYERED | Win32.WS_EX_TOOLWINDOW | Win32.WS_EX_TOPMOST;
- //Win32.SetWindowLong(hWnd, Win32.GWL_STYLE, style);
- //Win32.SetWindowLong(hWnd, Win32.GWL_EXSTYLE, exStyle);
- //Win32.SetLayeredWindowAttributes(hWnd, crKey, 255, Win32.LWA_COLORKEY | Win32.LWA_ALPHA);
- //Win32.SetWindowPos(hWnd, Win32.HWND_TOPMOST, 0, 0, 0, 0, Win32.SWP_NOMOVE | Win32.SWP_NOSIZE);
- var cp = base.CreateParams;
- cp.ExStyle = Win32.WS_EX_LAYERED | Win32.WS_EX_TOPMOST;
- cp.Style = Win32.WS_POPUP;
- //cp.ExStyle |= Win32.WS_EX_LAYERED | Win32.WS_EX_TOOLWINDOW | Win32.WS_EX_TOPMOST;
- return cp;
- }
- }
-
- protected override void OnPaint(PaintEventArgs e)
- {
- ;
- }
-
- protected override void OnPaintBackground(PaintEventArgs e)
- {
- ;
- }
- }
-}
diff --git a/SpineViewer/Forms/SpineViewerForm.Designer.cs b/SpineViewer/Forms/SpineViewerForm.Designer.cs
index bfd4f23..1d16e20 100644
--- a/SpineViewer/Forms/SpineViewerForm.Designer.cs
+++ b/SpineViewer/Forms/SpineViewerForm.Designer.cs
@@ -59,6 +59,9 @@
toolStripMenuItem_Diagnostics = new ToolStripMenuItem();
toolStripSeparator3 = new ToolStripSeparator();
toolStripMenuItem_About = new ToolStripMenuItem();
+ toolStripMenuItem_Experiment = new ToolStripMenuItem();
+ toolStripMenuItem_DesktopProjection = new ToolStripMenuItem();
+ toolStripMenuItem_Debug = new ToolStripMenuItem();
rtbLog = new RichTextBox();
splitContainer_MainForm = new SplitContainer();
splitContainer_Functional = new SplitContainer();
@@ -102,7 +105,7 @@
//
menuStrip.BackColor = SystemColors.Control;
menuStrip.ImageScalingSize = new Size(24, 24);
- menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItem_File, toolStripMenuItem_Tool, toolStripMenuItem_Download, toolStripMenuItem_Help });
+ menuStrip.Items.AddRange(new ToolStripItem[] { toolStripMenuItem_File, toolStripMenuItem_Tool, toolStripMenuItem_Download, toolStripMenuItem_Help, toolStripMenuItem_Experiment });
menuStrip.Location = new Point(0, 0);
menuStrip.Name = "menuStrip";
menuStrip.Size = new Size(1778, 32);
@@ -295,6 +298,28 @@
toolStripMenuItem_About.Text = "关于(&A)";
toolStripMenuItem_About.Click += toolStripMenuItem_About_Click;
//
+ // toolStripMenuItem_Experiment
+ //
+ toolStripMenuItem_Experiment.DropDownItems.AddRange(new ToolStripItem[] { toolStripMenuItem_DesktopProjection, toolStripMenuItem_Debug });
+ toolStripMenuItem_Experiment.Name = "toolStripMenuItem_Experiment";
+ toolStripMenuItem_Experiment.Size = new Size(138, 28);
+ toolStripMenuItem_Experiment.Text = "实验性功能(&E)";
+ //
+ // toolStripMenuItem_DesktopProjection
+ //
+ toolStripMenuItem_DesktopProjection.Name = "toolStripMenuItem_DesktopProjection";
+ toolStripMenuItem_DesktopProjection.Size = new Size(270, 34);
+ toolStripMenuItem_DesktopProjection.Text = "桌面投影";
+ toolStripMenuItem_DesktopProjection.Click += toolStripMenuItem_DesktopProjection_Click;
+ //
+ // toolStripMenuItem_Debug
+ //
+ toolStripMenuItem_Debug.Name = "toolStripMenuItem_Debug";
+ toolStripMenuItem_Debug.Size = new Size(270, 34);
+ toolStripMenuItem_Debug.Text = "调试";
+ toolStripMenuItem_Debug.Visible = false;
+ toolStripMenuItem_Debug.Click += toolStripMenuItem_Debug_Click;
+ //
// rtbLog
//
rtbLog.BackColor = SystemColors.Window;
@@ -305,7 +330,7 @@
rtbLog.Margin = new Padding(3, 2, 3, 2);
rtbLog.Name = "rtbLog";
rtbLog.ReadOnly = true;
- rtbLog.Size = new Size(1758, 142);
+ rtbLog.Size = new Size(1758, 150);
rtbLog.TabIndex = 0;
rtbLog.Text = "";
rtbLog.WordWrap = false;
@@ -329,7 +354,7 @@
splitContainer_MainForm.Panel2.Controls.Add(rtbLog);
splitContainer_MainForm.Panel2.Cursor = Cursors.Default;
splitContainer_MainForm.Size = new Size(1758, 1097);
- splitContainer_MainForm.SplitterDistance = 947;
+ splitContainer_MainForm.SplitterDistance = 939;
splitContainer_MainForm.SplitterWidth = 8;
splitContainer_MainForm.TabIndex = 3;
splitContainer_MainForm.TabStop = false;
@@ -353,7 +378,7 @@
//
splitContainer_Functional.Panel2.Controls.Add(groupBox_Preview);
splitContainer_Functional.Panel2.Cursor = Cursors.Default;
- splitContainer_Functional.Size = new Size(1758, 947);
+ splitContainer_Functional.Size = new Size(1758, 939);
splitContainer_Functional.SplitterDistance = 788;
splitContainer_Functional.SplitterWidth = 8;
splitContainer_Functional.TabIndex = 2;
@@ -377,7 +402,7 @@
//
splitContainer_Information.Panel2.Controls.Add(splitContainer_Config);
splitContainer_Information.Panel2.Cursor = Cursors.Default;
- splitContainer_Information.Size = new Size(788, 947);
+ splitContainer_Information.Size = new Size(788, 939);
splitContainer_Information.SplitterDistance = 351;
splitContainer_Information.SplitterWidth = 8;
splitContainer_Information.TabIndex = 1;
@@ -391,7 +416,7 @@
groupBox_SkelList.Dock = DockStyle.Fill;
groupBox_SkelList.Location = new Point(0, 0);
groupBox_SkelList.Name = "groupBox_SkelList";
- groupBox_SkelList.Size = new Size(351, 947);
+ groupBox_SkelList.Size = new Size(351, 939);
groupBox_SkelList.TabIndex = 0;
groupBox_SkelList.TabStop = false;
groupBox_SkelList.Text = "模型列表";
@@ -401,16 +426,16 @@
spineListView.Dock = DockStyle.Fill;
spineListView.Location = new Point(3, 26);
spineListView.Name = "spineListView";
- spineListView.Size = new Size(345, 918);
+ spineListView.Size = new Size(345, 910);
spineListView.SpinePropertyGrid = spineViewPropertyGrid;
spineListView.TabIndex = 0;
//
- // spinePropertyGrid
+ // spineViewPropertyGrid
//
spineViewPropertyGrid.Dock = DockStyle.Fill;
spineViewPropertyGrid.Location = new Point(3, 26);
- spineViewPropertyGrid.Name = "spinePropertyGrid";
- spineViewPropertyGrid.Size = new Size(423, 586);
+ spineViewPropertyGrid.Name = "spineViewPropertyGrid";
+ spineViewPropertyGrid.Size = new Size(423, 582);
spineViewPropertyGrid.TabIndex = 0;
//
// splitContainer_Config
@@ -427,8 +452,8 @@
// splitContainer_Config.Panel2
//
splitContainer_Config.Panel2.Controls.Add(groupBox_SkelConfig);
- splitContainer_Config.Size = new Size(429, 947);
- splitContainer_Config.SplitterDistance = 324;
+ splitContainer_Config.Size = new Size(429, 939);
+ splitContainer_Config.SplitterDistance = 320;
splitContainer_Config.SplitterWidth = 8;
splitContainer_Config.TabIndex = 0;
//
@@ -439,7 +464,7 @@
groupBox_PreviewConfig.Location = new Point(0, 0);
groupBox_PreviewConfig.Margin = new Padding(0);
groupBox_PreviewConfig.Name = "groupBox_PreviewConfig";
- groupBox_PreviewConfig.Size = new Size(429, 324);
+ groupBox_PreviewConfig.Size = new Size(429, 320);
groupBox_PreviewConfig.TabIndex = 1;
groupBox_PreviewConfig.TabStop = false;
groupBox_PreviewConfig.Text = "画面参数";
@@ -450,10 +475,9 @@
propertyGrid_Previewer.HelpVisible = false;
propertyGrid_Previewer.Location = new Point(3, 26);
propertyGrid_Previewer.Name = "propertyGrid_Previewer";
- propertyGrid_Previewer.Size = new Size(423, 295);
+ propertyGrid_Previewer.Size = new Size(423, 291);
propertyGrid_Previewer.TabIndex = 1;
propertyGrid_Previewer.ToolbarVisible = false;
- propertyGrid_Previewer.PropertyValueChanged += propertyGrid_PropertyValueChanged;
//
// groupBox_SkelConfig
//
@@ -462,7 +486,7 @@
groupBox_SkelConfig.Location = new Point(0, 0);
groupBox_SkelConfig.Margin = new Padding(0);
groupBox_SkelConfig.Name = "groupBox_SkelConfig";
- groupBox_SkelConfig.Size = new Size(429, 615);
+ groupBox_SkelConfig.Size = new Size(429, 611);
groupBox_SkelConfig.TabIndex = 0;
groupBox_SkelConfig.TabStop = false;
groupBox_SkelConfig.Text = "模型参数";
@@ -473,18 +497,18 @@
groupBox_Preview.Dock = DockStyle.Fill;
groupBox_Preview.Location = new Point(0, 0);
groupBox_Preview.Name = "groupBox_Preview";
- groupBox_Preview.Size = new Size(962, 947);
+ groupBox_Preview.Size = new Size(962, 939);
groupBox_Preview.TabIndex = 1;
groupBox_Preview.TabStop = false;
groupBox_Preview.Text = "预览画面";
//
- // spinePreviewer
+ // spinePreviewPanel
//
spinePreviewPanel.Dock = DockStyle.Fill;
spinePreviewPanel.Location = new Point(3, 26);
- spinePreviewPanel.Name = "spinePreviewer";
+ spinePreviewPanel.Name = "spinePreviewPanel";
spinePreviewPanel.PropertyGrid = propertyGrid_Previewer;
- spinePreviewPanel.Size = new Size(956, 918);
+ spinePreviewPanel.Size = new Size(956, 910);
spinePreviewPanel.SpineListView = spineListView;
spinePreviewPanel.TabIndex = 0;
//
@@ -590,5 +614,8 @@
private ToolStripSeparator toolStripSeparator5;
private ToolStripSeparator toolStripSeparator6;
private SplitContainer splitContainer_Config;
+ private ToolStripMenuItem toolStripMenuItem_Experiment;
+ private ToolStripMenuItem toolStripMenuItem_DesktopProjection;
+ private ToolStripMenuItem toolStripMenuItem_Debug;
}
}
diff --git a/SpineViewer/Forms/SpineViewerForm.cs b/SpineViewer/Forms/SpineViewerForm.cs
index 34e9e26..10f194c 100644
--- a/SpineViewer/Forms/SpineViewerForm.cs
+++ b/SpineViewer/Forms/SpineViewerForm.cs
@@ -31,6 +31,9 @@ namespace SpineViewer
MessagePopup.Warn("Fragment shader 加载失败,预乘Alpha通道属性失效");
}
+#if DEBUG
+ toolStripMenuItem_Debug.Visible = true;
+#endif
}
///
@@ -336,12 +339,6 @@ namespace SpineViewer
private void splitContainer_MouseUp(object sender, MouseEventArgs e) => ActiveControl = null;
- private void propertyGrid_PropertyValueChanged(object sender, PropertyValueChangedEventArgs e)
- {
- // 用来解决对面板某些值修改之后, 其他被联动修改的值不会实时刷新的问题
- (sender as PropertyGrid)?.Refresh();
- }
-
private void Export_Work(object? sender, DoWorkEventArgs e)
{
var worker = (BackgroundWorker)sender;
@@ -395,7 +392,7 @@ namespace SpineViewer
}
var root = srcCvter.Read(skelPath);
root = srcCvter.ToVersion(root, args.TargetVersion);
- if (args.JsonTarget) tgtCvter.WriteJson(root, newPath);
+ if (args.JsonTarget) tgtCvter.WriteJson(root, newPath);
else tgtCvter.WriteBinary(root, newPath);
success++;
}
@@ -419,48 +416,30 @@ namespace SpineViewer
}
}
- //private System.Windows.Forms.Timer timer = new();
- //private PetForm pet = new PetForm();
- //private IntPtr screenDC;
- //private IntPtr memDC;
- //private void _Test()
- //{
- // screenDC = Win32.GetDC(IntPtr.Zero);
- // memDC = Win32.CreateCompatibleDC(screenDC);
- // pet.Show();
- // timer.Tick += Timer_Tick;
- // timer.Enabled = true;
- // timer.Interval = 50;
- // timer.Start();
- //}
+ private void toolStripMenuItem_DesktopProjection_Click(object sender, EventArgs e)
+ {
+ toolStripMenuItem_DesktopProjection.Checked = !toolStripMenuItem_DesktopProjection.Checked;
+ spinePreviewPanel.EnableDesktopProjection = toolStripMenuItem_DesktopProjection.Checked;
+ }
- //private void Timer_Tick(object? sender, EventArgs e)
- //{
- // using var tex = new SFML.Graphics.RenderTexture((uint)pet.Width, (uint)pet.Height);
- // var v = spinePreviewer.GetView();
- // tex.SetView(v);
- // tex.Clear(new SFML.Graphics.Color(0, 0, 0, 0));
- // lock (spineListView.Spines)
- // {
- // foreach (var sp in spineListView.Spines)
- // tex.Draw(sp);
- // }
- // tex.Display();
- // using var frame = new SFMLImageVideoFrame(tex.Texture.CopyToImage());
- // using var bitmap = frame.CopyToBitmap();
+ private void toolStripMenuItem_Debug_Click(object sender, EventArgs e)
+ {
+#if DEBUG
+ //var cvt = SkeletonConverter.New(SpineVersion.V38);
+ //var root = cvt.ReadBinary(@"D:\ACGN\AzurLane_Export\AzurLane_Dynamic\docs\aerhangeersike\aerhangeersike_3\aerhangeersike_3 - 副本.skel");
+ //cvt.WriteJson(root, @"D:\ACGN\AzurLane_Export\AzurLane_Dynamic\docs\aerhangeersike\aerhangeersike_3\aerhangeersike_3.json");
- // var newBitmap = bitmap.GetHbitmap(Color.FromArgb(0));
- // var oldBitmap = Win32.SelectObject(memDC, newBitmap);
+ //root = cvt.ReadJson(@"D:\ACGN\AzurLane_Export\AzurLane_Dynamic\docs\aerhangeersike\aerhangeersike_3\aerhangeersike_3.json");
+ //cvt.WriteBinary(root, @"D:\ACGN\AzurLane_Export\AzurLane_Dynamic\docs\aerhangeersike\aerhangeersike_3\aerhangeersike_3.skel");
+ //var sp = SpineObject.New(SpineVersion.V38, @"D:\ACGN\AzurLane_Export\AzurLane_Dynamic\docs\aerhangeersike\aerhangeersike_3\aerhangeersike_3.skel");
- // Win32.SIZE size = new Win32.SIZE { cx = pet.Width, cy = pet.Height };
- // Win32.POINT srcPos = new Win32.POINT { x = 0, y = 0 };
- // Win32.BLENDFUNCTION blend = new Win32.BLENDFUNCTION { BlendOp = 0, BlendFlags = 0, SourceConstantAlpha = 255, AlphaFormat = Win32.AC_SRC_ALPHA };
-
- // Win32.UpdateLayeredWindow(pet.Handle, screenDC, IntPtr.Zero, ref size, memDC, ref srcPos, 0, ref blend, Win32.ULW_ALPHA);
-
- // Win32.SelectObject(memDC, oldBitmap);
- // Win32.DeleteObject(newBitmap);
- //}
+ //var cvt = SkeletonConverter.New(SpineVersion.V38);
+ //var root = cvt.ReadJson(@"D:\ACGN\G\GirlsCreation\standing_spine\st4020069\st4020069.json");
+ //cvt.WriteBinary(root, @"D:\ACGN\G\GirlsCreation\standing_spine\st4020069\st4020069.skel");
+ //var sp = SpineObject.New(SpineVersion.V38, @"D:\ACGN\G\GirlsCreation\standing_spine\st4020069\st4020069.skel");
+ //_Test();
+#endif
+ }
//private void spinePreviewer_KeyDown(object sender, KeyEventArgs e)
//{
diff --git a/SpineViewer/Forms/PetForm.Designer.cs b/SpineViewer/Forms/WallpaperForm.Designer.cs
similarity index 90%
rename from SpineViewer/Forms/PetForm.Designer.cs
rename to SpineViewer/Forms/WallpaperForm.Designer.cs
index 22d391c..2311b39 100644
--- a/SpineViewer/Forms/PetForm.Designer.cs
+++ b/SpineViewer/Forms/WallpaperForm.Designer.cs
@@ -1,6 +1,6 @@
namespace SpineViewer
{
- partial class PetForm
+ partial class WallpaperForm
{
///
/// Required designer variable.
@@ -30,18 +30,18 @@
{
SuspendLayout();
//
- // PetForm
+ // WallpaperForm
//
AutoScaleMode = AutoScaleMode.None;
ClientSize = new Size(490, 456);
ControlBox = false;
MaximizeBox = false;
MinimizeBox = false;
- Name = "PetForm";
+ Name = "WallpaperForm";
ShowIcon = false;
ShowInTaskbar = false;
StartPosition = FormStartPosition.Manual;
- Text = "PetForm";
+ Text = "SpineViewerWallpaperForm";
ResumeLayout(false);
}
diff --git a/SpineViewer/Forms/WallpaperForm.cs b/SpineViewer/Forms/WallpaperForm.cs
new file mode 100644
index 0000000..b86a2ee
--- /dev/null
+++ b/SpineViewer/Forms/WallpaperForm.cs
@@ -0,0 +1,38 @@
+using SpineViewer.Natives;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.ComponentModel.Design;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace SpineViewer
+{
+ [ToolboxItem(true)]
+ [Designer(typeof(ComponentDesigner), typeof(IDesigner))]
+ [DesignTimeVisible(true)]
+ public partial class WallpaperForm: Form
+ {
+ public WallpaperForm()
+ {
+ InitializeComponent();
+ }
+
+ protected override CreateParams CreateParams
+ {
+ get
+ {
+ var cp = base.CreateParams;
+ cp.X = cp.Y = 0;
+ cp.ExStyle = Win32.WS_EX_LAYERED | Win32.WS_EX_TOOLWINDOW;
+ cp.Style = Win32.WS_POPUP;
+ return cp;
+ }
+ }
+ }
+}
diff --git a/SpineViewer/Forms/PetForm.resx b/SpineViewer/Forms/WallpaperForm.resx
similarity index 100%
rename from SpineViewer/Forms/PetForm.resx
rename to SpineViewer/Forms/WallpaperForm.resx