This commit is contained in:
kshman 2021-03-21 03:43:05 +09:00
parent 654f405a44
commit f731188c8f
16 changed files with 1127 additions and 419 deletions

View file

@ -151,24 +151,37 @@ namespace DutyContent
public int ActiveFate { get; set; } = 0; public int ActiveFate { get; set; } = 0;
public string LogFontFamily { get; set; } = "Microsoft Sans Serif"; public string LogFontFamily { get; set; } = "Microsoft Sans Serif";
public float LogFontSize { get; set; } = 12.0f; public float LogFontSize { get; set; } = 12.0f;
public bool EnableOverlay { get; set; } public bool EnableOverlay { get; set; }
public Point OverlayLocation { get; set; } = new Point(0, 0);
public bool OverlayClickThru { get; set; }
public bool EnableSound { get; set; } public bool EnableSound { get; set; }
public string SoundInstanceFile { get; set; } public string SoundInstanceFile { get; set; }
public int SoundInstanceVolume { get; set; } = 100; public int SoundInstanceVolume { get; set; } = 100;
public string SoundFateFile { get; set; } public string SoundFateFile { get; set; }
public int SoundFateVolume { get; set; } = 100; public int SoundFateVolume { get; set; } = 100;
public bool UseNotifyLine { get; set; } public bool UseNotifyLine { get; set; }
public string NotifyLineToken { get; set; } public string NotifyLineToken { get; set; }
public bool UseNotifyTelegram { get; set; } public bool UseNotifyTelegram { get; set; }
public string NotifyTelegramId { get; set; } public string NotifyTelegramId { get; set; }
public string NotifyTelegramToken { get; set; } public string NotifyTelegramToken { get; set; }
public Point OverlayLocation { get; set; } = new Point(0, 0);
public bool UsePing { get; set; }
public Color[] PingColors { get; set; } = new Color[4]
{
Color.FromArgb(0xFF, 0x00, 0x00, 0x40),
Color.FromArgb(0xFF, 0x40, 0x00, 0x80),
Color.FromArgb(0xFF, 0x80, 0x40, 0x00),
Color.FromArgb(0xFF, 0xDD, 0xA0, 0xDD),
};
// //
public bool EnableNotify => UseNotifyLine || UseNotifyTelegram; public bool EnableNotify => UseNotifyLine || UseNotifyTelegram;
// //
public FateSelection[] Fates = new FateSelection[4] public FateSelection[] Fates { get; set; } = new FateSelection[4]
{ {
new FateSelection(0), new FateSelection(0),
new FateSelection(1), new FateSelection(1),
@ -186,21 +199,32 @@ namespace DutyContent
sw.WriteLine("DutyFate1={0}", Fates[1].Line); sw.WriteLine("DutyFate1={0}", Fates[1].Line);
sw.WriteLine("DutyFate2={0}", Fates[2].Line); sw.WriteLine("DutyFate2={0}", Fates[2].Line);
sw.WriteLine("DutyFate3={0}", Fates[3].Line); sw.WriteLine("DutyFate3={0}", Fates[3].Line);
sw.WriteLine("DutyLogFontFamily={0}", LogFontFamily); sw.WriteLine("DutyLogFontFamily={0}", LogFontFamily);
sw.WriteLine("DutyLogFontSize={0}", LogFontSize); sw.WriteLine("DutyLogFontSize={0}", LogFontSize);
sw.WriteLine("DutyEnableOverlay={0}", EnableOverlay); sw.WriteLine("DutyEnableOverlay={0}", EnableOverlay);
sw.WriteLine("DutyOverlayLocationX={0}", OverlayLocation.X);
sw.WriteLine("DutyOverlayLocationY={0}", OverlayLocation.Y);
sw.WriteLine("DutyOverlayClickThru={0}", OverlayClickThru);
sw.WriteLine("DutyEnableSound={0}", EnableSound); sw.WriteLine("DutyEnableSound={0}", EnableSound);
sw.WriteLine("DutySoundInstanceFile={0}", SoundInstanceFile); sw.WriteLine("DutySoundInstanceFile={0}", SoundInstanceFile);
sw.WriteLine("DutySoundInstanceVolume={0}", SoundInstanceVolume); sw.WriteLine("DutySoundInstanceVolume={0}", SoundInstanceVolume);
sw.WriteLine("DutySoundFateFile={0}", SoundFateFile); sw.WriteLine("DutySoundFateFile={0}", SoundFateFile);
sw.WriteLine("DutySoundFateVolume={0}", SoundFateVolume); sw.WriteLine("DutySoundFateVolume={0}", SoundFateVolume);
sw.WriteLine("DutyUseNotifyLine={0}", UseNotifyLine); sw.WriteLine("DutyUseNotifyLine={0}", UseNotifyLine);
sw.WriteLine("DutyNotifyLineToken={0}", NotifyLineToken); sw.WriteLine("DutyNotifyLineToken={0}", NotifyLineToken);
sw.WriteLine("DutyUseNotifyTelegram={0}", UseNotifyTelegram); sw.WriteLine("DutyUseNotifyTelegram={0}", UseNotifyTelegram);
sw.WriteLine("DutyNotifyTelegramId={0}", NotifyTelegramId); sw.WriteLine("DutyNotifyTelegramId={0}", NotifyTelegramId);
sw.WriteLine("DutyNotifyTelegramToken={0}", NotifyTelegramToken); sw.WriteLine("DutyNotifyTelegramToken={0}", NotifyTelegramToken);
sw.WriteLine("DutyOverlayLocationX={0}", OverlayLocation.X);
sw.WriteLine("DutyOverlayLocationY={0}", OverlayLocation.Y); sw.WriteLine("DutyUsePing={0}", UsePing);
sw.WriteLine("DutyPingColor0={0:X}", PingColors[0].ToArgb());
sw.WriteLine("DutyPingColor1={0:X}", PingColors[1].ToArgb());
sw.WriteLine("DutyPingColor2={0:X}", PingColors[2].ToArgb());
sw.WriteLine("DutyPingColor3={0:X}", PingColors[3].ToArgb());
sw.WriteLine(); sw.WriteLine();
} }
@ -213,20 +237,33 @@ namespace DutyContent
Fates[1].Line = db["DutyFate1"]; Fates[1].Line = db["DutyFate1"];
Fates[2].Line = db["DutyFate2"]; Fates[2].Line = db["DutyFate2"];
Fates[3].Line = db["DutyFate3"]; Fates[3].Line = db["DutyFate3"];
LogFontFamily = db["DutyLogFontFamily"];
LogFontFamily = db.Get("DutyLogFontFamily", LogFontFamily);
LogFontSize = ThirdParty.Converter.ToFloat(db["DutyLogFontSize"], LogFontSize); LogFontSize = ThirdParty.Converter.ToFloat(db["DutyLogFontSize"], LogFontSize);
EnableOverlay = ThirdParty.Converter.ToBool(db["DutyEnableOverlay"]); EnableOverlay = ThirdParty.Converter.ToBool(db["DutyEnableOverlay"]);
OverlayLocation = new Point(
ThirdParty.Converter.ToInt(db["DutyOverlayLocationX"]),
ThirdParty.Converter.ToInt(db["DutyOverlayLocationY"]));
OverlayClickThru = ThirdParty.Converter.ToBool(db["DutyOverlayClickThru"]);
EnableSound = ThirdParty.Converter.ToBool(db["DutyEnableSound"]); EnableSound = ThirdParty.Converter.ToBool(db["DutyEnableSound"]);
SoundInstanceFile = db["DutySoundInstanceFile"]; SoundInstanceFile = db["DutySoundInstanceFile"];
SoundFateFile = db["DutySoundFateFile"]; SoundFateFile = db["DutySoundFateFile"];
SoundInstanceVolume = ThirdParty.Converter.ToInt(db["DutySoundInstanceVolume"], 100); SoundInstanceVolume = ThirdParty.Converter.ToInt(db["DutySoundInstanceVolume"], 100);
SoundFateVolume = ThirdParty.Converter.ToInt(db["DutySoundFateVolume"], 100); SoundFateVolume = ThirdParty.Converter.ToInt(db["DutySoundFateVolume"], 100);
UseNotifyLine = ThirdParty.Converter.ToBool(db["DutyUseNotifyLine"]); UseNotifyLine = ThirdParty.Converter.ToBool(db["DutyUseNotifyLine"]);
NotifyLineToken = db["DutyNotifyLineToken"]; NotifyLineToken = db["DutyNotifyLineToken"];
UseNotifyTelegram = ThirdParty.Converter.ToBool(db["DutyUseNotifyTelegram"]); UseNotifyTelegram = ThirdParty.Converter.ToBool(db["DutyUseNotifyTelegram"]);
NotifyTelegramId = db["DutyNotifyTelegramId"]; NotifyTelegramId = db["DutyNotifyTelegramId"];
NotifyTelegramToken = db["DutyNotifyTelegramToken"]; NotifyTelegramToken = db["DutyNotifyTelegramToken"];
OverlayLocation = new Point(ThirdParty.Converter.ToInt(db["DutyOverlayLocationX"]), ThirdParty.Converter.ToInt(db["DutyOverlayLocationY"]));
UsePing = ThirdParty.Converter.ToBool(db["DutyUsePing"]);
PingColors[0] = ThirdParty.Converter.ToColorArgb(db["DutyPingColor0"], PingColors[0]);
PingColors[1] = ThirdParty.Converter.ToColorArgb(db["DutyPingColor1"], PingColors[1]);
PingColors[2] = ThirdParty.Converter.ToColorArgb(db["DutyPingColor2"], PingColors[2]);
PingColors[3] = ThirdParty.Converter.ToColorArgb(db["DutyPingColor3"], PingColors[3]);
} }
} }
@ -266,32 +303,56 @@ namespace DutyContent
{ {
public List<ThirdParty.NativeMethods.TcpRow> Conns = new List<ThirdParty.NativeMethods.TcpRow>(); public List<ThirdParty.NativeMethods.TcpRow> Conns = new List<ThirdParty.NativeMethods.TcpRow>();
public ThirdParty.NativeMethods.TcpRow[] CopyConnection()
{
ThirdParty.NativeMethods.TcpRow[] ret;
lock (Conns)
ret = Conns.ToArray();
return ret;
}
public void GetConnections(Process process) public void GetConnections(Process process)
{ {
Conns.Clear();
var size = 0; var size = 0;
var ret = ThirdParty.NativeMethods.GetExtendedTcpTable(IntPtr.Zero, ref size, true, AddressFamily.InterNetwork, 4); ThirdParty.NativeMethods.GetExtendedTcpTable(IntPtr.Zero, ref size, true, AddressFamily.InterNetwork, 4);
var buff = Marshal.AllocHGlobal(size); var buff = Marshal.AllocHGlobal(size);
try try
{ {
ret = ThirdParty.NativeMethods.GetExtendedTcpTable(buff, ref size, true, AddressFamily.InterNetwork, 4); var ret = ThirdParty.NativeMethods.GetExtendedTcpTable(buff, ref size, true, AddressFamily.InterNetwork, 4);
if (ret == 0) if (ret == 0)
{ {
var tbl = Marshal.PtrToStructure<ThirdParty.NativeMethods.TcpTable>(buff); var tbl = Marshal.PtrToStructure<ThirdParty.NativeMethods.TcpTable>(buff);
var ptr = (IntPtr)((long)buff + Marshal.SizeOf(tbl.entries)); var ptr = (IntPtr)((long)buff + Marshal.SizeOf(tbl.entries));
var rows = new ThirdParty.NativeMethods.TcpRow[tbl.entries];
var rcnt = 0;
for (var i = 0; i < tbl.entries; i++) for (var i = 0; i < tbl.entries; i++)
{ {
var row = Marshal.PtrToStructure<ThirdParty.NativeMethods.TcpRow>(ptr); var row = Marshal.PtrToStructure<ThirdParty.NativeMethods.TcpRow>(ptr);
if (!IPAddress.IsLoopback(row.RemoteAddress) && if (!IPAddress.IsLoopback(row.RemoteAddress) &&
process.Id == row.owningPid) process.Id == row.owningPid)
Conns.Add(row); rows[rcnt++] = row;
ptr = (IntPtr)((long)ptr + Marshal.SizeOf(row)); ptr = (IntPtr)((long)ptr + Marshal.SizeOf(row));
} }
lock (Conns)
{
Conns.Clear();
for (var i = 0; i < rcnt; i++)
Conns.Add(rows[i]);
}
}
else
{
lock (Conns)
Conns.Clear();
} }
} }
finally finally

View file

@ -24,8 +24,10 @@ namespace DutyContent
private TabPage _act_tab; private TabPage _act_tab;
private Label _act_label; private Label _act_label;
private Timer _update_and_check; private System.Timers.Timer _save_timer;
private System.Timers.Timer _update_timer;
private ThirdParty.NativeMethods.ProcessHandle _game_process; private ThirdParty.NativeMethods.ProcessHandle _game_process;
private long _game_connection_tick = DateTime.Now.Ticks;
private bool _game_exist; private bool _game_exist;
private bool _game_active; private bool _game_active;
private string _game_zone; private string _game_zone;
@ -104,22 +106,27 @@ namespace DutyContent
MesgLog.I(6, System.Diagnostics.FileVersionInfo.GetVersionInfo(_ffxiv_plugin_data.pluginFile.FullName).FileVersion, _ffxiv_plugin_data.pluginFile.FullName); MesgLog.I(6, System.Diagnostics.FileVersionInfo.GetVersionInfo(_ffxiv_plugin_data.pluginFile.FullName).FileVersion, _ffxiv_plugin_data.pluginFile.FullName);
} }
_update_and_check = new Timer() _save_timer = new System.Timers.Timer() { Interval = 5000 };
_save_timer.Elapsed += (sender, e) =>
{ {
Interval = 300, DcConfig.SaveConfig();
_save_timer.Enabled = false;
}; };
_update_and_check.Tick += (sender, e) =>
_update_timer = new System.Timers.Timer() { Interval = 300 };
_update_timer.Elapsed += (sender, e) =>
{ {
UpdateAndCheckProc(); UpdateAndCheckProc();
_update_and_check.Interval = _game_exist ? _game_active ? 50 : 300 : 500; _update_timer.Interval = _game_exist ? _game_active ? 50 : 300 : 500;
}; };
_update_and_check.Start(); _update_timer.Start();
} }
// //
public void DeInitPlugin() public void DeInitPlugin()
{ {
_update_and_check.Stop(); _update_timer.Stop();
_save_timer.Stop();
DcConfig.PluginEnable = false; DcConfig.PluginEnable = false;
@ -157,6 +164,8 @@ namespace DutyContent
MesgLog.SetTextBox(txtMesg); MesgLog.SetTextBox(txtMesg);
MesgLog.Initialize(Properties.Resources.DefaultMessage); MesgLog.Initialize(Properties.Resources.DefaultMessage);
MesgLog.C(Color.Aquamarine, 4);
DcConfig.Load(); DcConfig.Load();
DcConfig.ReadLanguage(true); DcConfig.ReadLanguage(true);
DcContent.ReadContent(); DcContent.ReadContent();
@ -220,6 +229,14 @@ namespace DutyContent
g.DrawString(p.Text, f, b, r, new StringFormat(s)); g.DrawString(p.Text, f, b, r, new StringFormat(s));
} }
//
public void RefreshSaveConfig(int interval=5000)
{
_save_timer.Enabled = false;
_save_timer.Interval = interval;
_save_timer.Start();
}
// //
private void UpdateAndCheckProc() private void UpdateAndCheckProc()
{ {
@ -239,21 +256,26 @@ namespace DutyContent
{ {
_game_process = p != null ? new ThirdParty.NativeMethods.ProcessHandle(p) : null; _game_process = p != null ? new ThirdParty.NativeMethods.ProcessHandle(p) : null;
} }
if (_game_process != null)
{
//
DcConfig.Connections.GetConnections(_game_process.Process);
//MesgLog.L("count: {0}", DcConfig.Connections.Conns.Count);
}
} }
else else
{ {
_game_exist = true; _game_exist = true;
//
var fgw = ThirdParty.NativeMethods.GetForegroundWindow(); var fgw = ThirdParty.NativeMethods.GetForegroundWindow();
ThirdParty.NativeMethods.GetWindowThreadProcessId(fgw, out int id); ThirdParty.NativeMethods.GetWindowThreadProcessId(fgw, out int id);
_game_active = _game_process.Process.Id == id; _game_active = _game_process.Process.Id == id;
//
var now = DateTime.Now.Ticks;
var delta = now - _game_connection_tick;
var span = new TimeSpan(delta);
if (span.TotalSeconds > 2)
{
_game_connection_tick = now;
DcConfig.Connections.GetConnections(_game_process.Process);
}
} }
var zone = ActGlobals.oFormActMain.CurrentZone; var zone = ActGlobals.oFormActMain.CurrentZone;
@ -292,7 +314,7 @@ namespace DutyContent
tabPageDuty.Text = MesgLog.Text(300); tabPageDuty.Text = MesgLog.Text(300);
Tab.DutyForm.Self?.UpdateUiLocale(); Tab.DutyForm.Self?.UpdateUiLocale();
tabPageConfig.Text= MesgLog.Text(200); tabPageConfig.Text = MesgLog.Text(200);
Tab.ConfigForm.Self?.UpdateUiLocale(); Tab.ConfigForm.Self?.UpdateUiLocale();
} }
} }

View file

@ -96,6 +96,7 @@
<Compile Include="ThirdParty\Converter.cs" /> <Compile Include="ThirdParty\Converter.cs" />
<Compile Include="ThirdParty\LineDb.cs" /> <Compile Include="ThirdParty\LineDb.cs" />
<Compile Include="ThirdParty\NativeMethods.cs" /> <Compile Include="ThirdParty\NativeMethods.cs" />
<Compile Include="ThirdParty\ThreadWorker.cs" />
<Compile Include="WorkerAct.cs" /> <Compile Include="WorkerAct.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -166,6 +167,9 @@
<ItemGroup> <ItemGroup>
<Resource Include="Data\DcLang-Japanese.txt" /> <Resource Include="Data\DcLang-Japanese.txt" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="Resources\pix_tab_ping.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup> <PropertyGroup>
<PostBuildEvent>if exist "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" copy $(TargetPath) "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" /y <PostBuildEvent>if exist "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" copy $(TargetPath) "%25APPDATA%25\Advanced Combat Tracker\Plugins\DutyContent" /y

View file

@ -53,12 +53,12 @@ namespace DutyContent
public static string Text(int key) public static string Text(int key)
{ {
return _lines == null || !_lines.Try(key, out string v) ? ThirdParty.LineDb.InvalidKey : v; return _lines == null || !_lines.Try(key, out string v) ? $"<{key}>" : v;
} }
public static string Text(int key, params object[] prms) public static string Text(int key, params object[] prms)
{ {
return _lines == null || !_lines.Try(key, out string v) ? ThirdParty.LineDb.InvalidKey : string.Format(v, prms); return _lines == null || !_lines.Try(key, out string v) ? $"<{key}>" : string.Format(v, prms);
} }
public static void Write(Color color, string format, params object[] prms) public static void Write(Color color, string format, params object[] prms)

View file

@ -30,6 +30,7 @@ namespace DutyContent.Overlay
private void InitializeComponent() private void InitializeComponent()
{ {
this.lblText = new System.Windows.Forms.Label(); this.lblText = new System.Windows.Forms.Label();
this.lblStat = new System.Windows.Forms.Label();
this.SuspendLayout(); this.SuspendLayout();
// //
// lblText // lblText
@ -37,21 +38,33 @@ namespace DutyContent.Overlay
this.lblText.AutoEllipsis = true; this.lblText.AutoEllipsis = true;
this.lblText.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblText.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblText.ForeColor = System.Drawing.Color.White; this.lblText.ForeColor = System.Drawing.Color.White;
this.lblText.Location = new System.Drawing.Point(0, 0); this.lblText.Location = new System.Drawing.Point(41, 0);
this.lblText.Name = "lblText"; this.lblText.Name = "lblText";
this.lblText.Size = new System.Drawing.Size(300, 20); this.lblText.Size = new System.Drawing.Size(319, 32);
this.lblText.TabIndex = 0; this.lblText.TabIndex = 0;
this.lblText.Text = "Duty Content"; this.lblText.Text = "Duty Content";
this.lblText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.lblText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblText.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lblText_MouseDown); this.lblText.MouseDown += new System.Windows.Forms.MouseEventHandler(this.lblText_MouseDown);
// //
// lblStat
//
this.lblStat.AutoEllipsis = true;
this.lblStat.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblStat.ForeColor = System.Drawing.Color.White;
this.lblStat.Location = new System.Drawing.Point(0, 0);
this.lblStat.Name = "lblStat";
this.lblStat.Size = new System.Drawing.Size(40, 32);
this.lblStat.TabIndex = 1;
this.lblStat.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// DutyOvForm // DutyOvForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.Black; this.BackColor = System.Drawing.Color.Black;
this.ClientSize = new System.Drawing.Size(300, 25); this.ClientSize = new System.Drawing.Size(360, 32);
this.ControlBox = false; this.ControlBox = false;
this.Controls.Add(this.lblStat);
this.Controls.Add(this.lblText); this.Controls.Add(this.lblText);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Name = "DutyOvForm"; this.Name = "DutyOvForm";
@ -68,5 +81,6 @@ namespace DutyContent.Overlay
#endregion #endregion
private System.Windows.Forms.Label lblText; private System.Windows.Forms.Label lblText;
private System.Windows.Forms.Label lblStat;
} }
} }

View file

@ -56,6 +56,9 @@ namespace DutyContent.Overlay
private void DoMoveDown(MouseEventArgs e) private void DoMoveDown(MouseEventArgs e)
{ {
if (DcConfig.Duty.OverlayClickThru)
return;
if (e.Button == MouseButtons.Left) if (e.Button == MouseButtons.Left)
{ {
ThirdParty.NativeMethods.ReleaseCapture(); ThirdParty.NativeMethods.ReleaseCapture();
@ -65,6 +68,9 @@ namespace DutyContent.Overlay
protected override void OnMouseDown(MouseEventArgs e) protected override void OnMouseDown(MouseEventArgs e)
{ {
if (DcConfig.Duty.OverlayClickThru)
return;
base.OnMouseDown(e); base.OnMouseDown(e);
DoMoveDown(e); DoMoveDown(e);
} }
@ -141,5 +147,24 @@ namespace DutyContent.Overlay
StartBlink(); StartBlink();
})); }));
} }
public void ResetStat()
{
lblStat.BackColor = Color.Transparent;
lblStat.Text = string.Empty;
}
public void SetStatPing(Color color, long rtt, double loss)
{
Invoke((MethodInvoker)(() =>
{
if (rtt > 999)
rtt = 999;
lblStat.Text = string.Format("{0}{1}{2:0.#}%", rtt, Environment.NewLine, loss);
lblStat.BackColor = color;
//lblStat.ForeColor = Color.FromArgb(255 - color.R, 255 - color.G, 255 - color.B);
}));
}
} }
} }

View file

@ -79,7 +79,7 @@ namespace DutyContent.Properties {
///12=Unknown FATE: {0} ///12=Unknown FATE: {0}
///13=Data reading failed! ///13=Data reading failed!
///14=Data file not found! {0} ///14=Data file not found! {0}
///20=Duty contents info: {0}({1}) / A:{2} / R:{3} / I:{4} / F:{5} ({6}) ///20=Duty contents info: {1}({0}) / A:{2} / R:{3} / I:{4} / F:{5} ({6})
///21=Roulette ///21=Roulette
///22=Instance ///22=Instance
///23=FATE ///23=FATE
@ -132,6 +132,16 @@ namespace DutyContent.Properties {
} }
} }
/// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary>
internal static System.Drawing.Bitmap pix_tab_ping {
get {
object obj = ResourceManager.GetObject("pix_tab_ping", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary> /// <summary>
/// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다. /// System.Drawing.Bitmap 형식의 지역화된 리소스를 찾습니다.
/// </summary> /// </summary>

View file

@ -133,6 +133,9 @@
<data name="pix_tab_content" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="pix_tab_content" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\resources\pix_tab_content.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\resources\pix_tab_content.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="pix_tab_ping" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pix_tab_ping.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="pix_tab_setting" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="pix_tab_setting" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\pix_tab_setting.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\pix_tab_setting.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>

View file

@ -29,10 +29,11 @@ LANG=English
101=Select wave file 101=Select wave file
102=Wave (*.wav)|*.wav|All (*.*)|*.* 102=Wave (*.wav)|*.wav|All (*.*)|*.*
103=Notify test!! 103=Notify test!!
104=Clickthrough
200=Config 200=Config
201=Display Language 201=Display Language
202=Hide overlays when FFXIV client is in the background 202=Automatically hide overlay when client is in the background
300=Duty 300=Duty
301=Contents 301=Contents
@ -61,6 +62,13 @@ LANG=English
324=Status 324=Status
325=Member 325=Member
326=Progress 326=Progress
327=Ping
328=Use ping
329=Colors
330=Excellent
331=Good
332=Normal
333=Bad
10001="{0}" spawned! 10001="{0}" spawned!
10002=Entry: {0} 10002=Entry: {0}

BIN
Resources/pix_tab_ping.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

316
Tab/DutyForm.Designer.cs generated
View file

@ -57,7 +57,7 @@ namespace DutyContent.Tab
""}, -1); ""}, -1);
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DutyForm)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DutyForm));
this.tabContent = new System.Windows.Forms.TabControl(); this.tabContent = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage(); this.tabPageContent = new System.Windows.Forms.TabPage();
this.splitContainer1 = new System.Windows.Forms.SplitContainer(); this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.rdoFatePreset4 = new System.Windows.Forms.RadioButton(); this.rdoFatePreset4 = new System.Windows.Forms.RadioButton();
this.rdoFatePreset3 = new System.Windows.Forms.RadioButton(); this.rdoFatePreset3 = new System.Windows.Forms.RadioButton();
@ -65,7 +65,7 @@ namespace DutyContent.Tab
this.rdoFatePreset1 = new System.Windows.Forms.RadioButton(); this.rdoFatePreset1 = new System.Windows.Forms.RadioButton();
this.treeFates = new System.Windows.Forms.TreeView(); this.treeFates = new System.Windows.Forms.TreeView();
this.txtContentLog = new System.Windows.Forms.RichTextBox(); this.txtContentLog = new System.Windows.Forms.RichTextBox();
this.tabPage2 = new System.Windows.Forms.TabPage(); this.tabPageSetting = new System.Windows.Forms.TabPage();
this.panel4 = new System.Windows.Forms.Panel(); this.panel4 = new System.Windows.Forms.Panel();
this.lblTelegramToken = new System.Windows.Forms.Label(); this.lblTelegramToken = new System.Windows.Forms.Label();
this.txtTelegramToken = new System.Windows.Forms.TextBox(); this.txtTelegramToken = new System.Windows.Forms.TextBox();
@ -94,11 +94,24 @@ namespace DutyContent.Tab
this.chkEnableSound = new System.Windows.Forms.CheckBox(); this.chkEnableSound = new System.Windows.Forms.CheckBox();
this.lblSoundInstance = new System.Windows.Forms.Label(); this.lblSoundInstance = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel(); this.panel1 = new System.Windows.Forms.Panel();
this.chkOverlayClickThru = new System.Windows.Forms.CheckBox();
this.progbOverlayTransparent = new System.Windows.Forms.ProgressBar(); this.progbOverlayTransparent = new System.Windows.Forms.ProgressBar();
this.btnOverlayDimming = new System.Windows.Forms.Button(); this.btnOverlayDimming = new System.Windows.Forms.Button();
this.lblOverlayTransparent = new System.Windows.Forms.Label(); this.lblOverlayTransparent = new System.Windows.Forms.Label();
this.chkEnableOverlay = new System.Windows.Forms.CheckBox(); this.chkEnableOverlay = new System.Windows.Forms.CheckBox();
this.tabPage3 = new System.Windows.Forms.TabPage(); this.tabPagePing = new System.Windows.Forms.TabPage();
this.panel6 = new System.Windows.Forms.Panel();
this.btnPingColor2 = new System.Windows.Forms.Button();
this.lblPingStat4 = new System.Windows.Forms.Label();
this.lblPingStat2 = new System.Windows.Forms.Label();
this.lblPingStat3 = new System.Windows.Forms.Label();
this.btnPingColor4 = new System.Windows.Forms.Button();
this.btnPingColor1 = new System.Windows.Forms.Button();
this.btnPingColor3 = new System.Windows.Forms.Button();
this.lblPingStat1 = new System.Windows.Forms.Label();
this.lblPingColors = new System.Windows.Forms.Label();
this.chkUsePing = new System.Windows.Forms.CheckBox();
this.tabPagePacket = new System.Windows.Forms.TabPage();
this.panel5 = new System.Windows.Forms.Panel(); this.panel5 = new System.Windows.Forms.Panel();
this.txtPacketDescription = new System.Windows.Forms.TextBox(); this.txtPacketDescription = new System.Windows.Forms.TextBox();
this.lblPacketDesc = new System.Windows.Forms.Label(); this.lblPacketDesc = new System.Windows.Forms.Label();
@ -118,26 +131,31 @@ namespace DutyContent.Tab
this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.lblPacketFinder = new System.Windows.Forms.Label(); this.lblPacketFinder = new System.Windows.Forms.Label();
this.ilTabContent = new System.Windows.Forms.ImageList(this.components); this.ilTabContent = new System.Windows.Forms.ImageList(this.components);
this.tlpnPingColors = new System.Windows.Forms.TableLayoutPanel();
this.tabContent.SuspendLayout(); this.tabContent.SuspendLayout();
this.tabPage1.SuspendLayout(); this.tabPageContent.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout(); this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout(); this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout(); this.splitContainer1.SuspendLayout();
this.tabPage2.SuspendLayout(); this.tabPageSetting.SuspendLayout();
this.panel4.SuspendLayout(); this.panel4.SuspendLayout();
this.panel3.SuspendLayout(); this.panel3.SuspendLayout();
this.panel2.SuspendLayout(); this.panel2.SuspendLayout();
this.panel1.SuspendLayout(); this.panel1.SuspendLayout();
this.tabPage3.SuspendLayout(); this.tabPagePing.SuspendLayout();
this.panel6.SuspendLayout();
this.tabPagePacket.SuspendLayout();
this.panel5.SuspendLayout(); this.panel5.SuspendLayout();
this.tlpnPingColors.SuspendLayout();
this.SuspendLayout(); this.SuspendLayout();
// //
// tabContent // tabContent
// //
this.tabContent.Controls.Add(this.tabPage1); this.tabContent.Controls.Add(this.tabPageContent);
this.tabContent.Controls.Add(this.tabPage2); this.tabContent.Controls.Add(this.tabPageSetting);
this.tabContent.Controls.Add(this.tabPage3); this.tabContent.Controls.Add(this.tabPagePing);
this.tabContent.Controls.Add(this.tabPagePacket);
this.tabContent.Dock = System.Windows.Forms.DockStyle.Fill; this.tabContent.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabContent.ImageList = this.ilTabContent; this.tabContent.ImageList = this.ilTabContent;
this.tabContent.Location = new System.Drawing.Point(0, 0); this.tabContent.Location = new System.Drawing.Point(0, 0);
@ -146,17 +164,17 @@ namespace DutyContent.Tab
this.tabContent.Size = new System.Drawing.Size(800, 502); this.tabContent.Size = new System.Drawing.Size(800, 502);
this.tabContent.TabIndex = 0; this.tabContent.TabIndex = 0;
// //
// tabPage1 // tabPageContent
// //
this.tabPage1.Controls.Add(this.splitContainer1); this.tabPageContent.Controls.Add(this.splitContainer1);
this.tabPage1.ImageIndex = 0; this.tabPageContent.ImageIndex = 0;
this.tabPage1.Location = new System.Drawing.Point(4, 39); this.tabPageContent.Location = new System.Drawing.Point(4, 39);
this.tabPage1.Name = "tabPage1"; this.tabPageContent.Name = "tabPageContent";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3); this.tabPageContent.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(792, 459); this.tabPageContent.Size = new System.Drawing.Size(792, 459);
this.tabPage1.TabIndex = 0; this.tabPageContent.TabIndex = 0;
this.tabPage1.Text = "301"; this.tabPageContent.Text = "301";
this.tabPage1.UseVisualStyleBackColor = true; this.tabPageContent.UseVisualStyleBackColor = true;
// //
// splitContainer1 // splitContainer1
// //
@ -257,20 +275,20 @@ namespace DutyContent.Tab
this.txtContentLog.TabIndex = 0; this.txtContentLog.TabIndex = 0;
this.txtContentLog.Text = ""; this.txtContentLog.Text = "";
// //
// tabPage2 // tabPageSetting
// //
this.tabPage2.Controls.Add(this.panel4); this.tabPageSetting.Controls.Add(this.panel4);
this.tabPage2.Controls.Add(this.panel3); this.tabPageSetting.Controls.Add(this.panel3);
this.tabPage2.Controls.Add(this.panel2); this.tabPageSetting.Controls.Add(this.panel2);
this.tabPage2.Controls.Add(this.panel1); this.tabPageSetting.Controls.Add(this.panel1);
this.tabPage2.ImageIndex = 1; this.tabPageSetting.ImageIndex = 1;
this.tabPage2.Location = new System.Drawing.Point(4, 39); this.tabPageSetting.Location = new System.Drawing.Point(4, 39);
this.tabPage2.Name = "tabPage2"; this.tabPageSetting.Name = "tabPageSetting";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3); this.tabPageSetting.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(792, 459); this.tabPageSetting.Size = new System.Drawing.Size(792, 459);
this.tabPage2.TabIndex = 1; this.tabPageSetting.TabIndex = 1;
this.tabPage2.Text = "302"; this.tabPageSetting.Text = "302";
this.tabPage2.UseVisualStyleBackColor = true; this.tabPageSetting.UseVisualStyleBackColor = true;
// //
// panel4 // panel4
// //
@ -287,7 +305,7 @@ namespace DutyContent.Tab
this.panel4.Controls.Add(this.lblLineToken); this.panel4.Controls.Add(this.lblLineToken);
this.panel4.Controls.Add(this.txtLineToken); this.panel4.Controls.Add(this.txtLineToken);
this.panel4.Controls.Add(this.chkUseNotifyLine); this.panel4.Controls.Add(this.chkUseNotifyLine);
this.panel4.Location = new System.Drawing.Point(6, 273); this.panel4.Location = new System.Drawing.Point(6, 234);
this.panel4.Name = "panel4"; this.panel4.Name = "panel4";
this.panel4.Size = new System.Drawing.Size(778, 143); this.panel4.Size = new System.Drawing.Size(778, 143);
this.panel4.TabIndex = 3; this.panel4.TabIndex = 3;
@ -429,7 +447,7 @@ namespace DutyContent.Tab
// //
this.lblDataSet.AutoSize = true; this.lblDataSet.AutoSize = true;
this.lblDataSet.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblDataSet.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblDataSet.Location = new System.Drawing.Point(22, 4); this.lblDataSet.Location = new System.Drawing.Point(21, 7);
this.lblDataSet.Name = "lblDataSet"; this.lblDataSet.Name = "lblDataSet";
this.lblDataSet.Size = new System.Drawing.Size(39, 20); this.lblDataSet.Size = new System.Drawing.Size(39, 20);
this.lblDataSet.TabIndex = 10; this.lblDataSet.TabIndex = 10;
@ -449,7 +467,7 @@ namespace DutyContent.Tab
// //
this.lblLogFont.AutoSize = true; this.lblLogFont.AutoSize = true;
this.lblLogFont.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblLogFont.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblLogFont.Location = new System.Drawing.Point(381, 4); this.lblLogFont.Location = new System.Drawing.Point(380, 7);
this.lblLogFont.Name = "lblLogFont"; this.lblLogFont.Name = "lblLogFont";
this.lblLogFont.Size = new System.Drawing.Size(39, 20); this.lblLogFont.Size = new System.Drawing.Size(39, 20);
this.lblLogFont.TabIndex = 9; this.lblLogFont.TabIndex = 9;
@ -469,9 +487,9 @@ namespace DutyContent.Tab
this.panel2.Controls.Add(this.txtSoundInstance); this.panel2.Controls.Add(this.txtSoundInstance);
this.panel2.Controls.Add(this.chkEnableSound); this.panel2.Controls.Add(this.chkEnableSound);
this.panel2.Controls.Add(this.lblSoundInstance); this.panel2.Controls.Add(this.lblSoundInstance);
this.panel2.Location = new System.Drawing.Point(6, 135); this.panel2.Location = new System.Drawing.Point(6, 136);
this.panel2.Name = "panel2"; this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(778, 132); this.panel2.Size = new System.Drawing.Size(778, 92);
this.panel2.TabIndex = 1; this.panel2.TabIndex = 1;
// //
// btnSoundPlayFate // btnSoundPlayFate
@ -579,15 +597,28 @@ namespace DutyContent.Tab
this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right))); | System.Windows.Forms.AnchorStyles.Right)));
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel1.Controls.Add(this.chkOverlayClickThru);
this.panel1.Controls.Add(this.progbOverlayTransparent); this.panel1.Controls.Add(this.progbOverlayTransparent);
this.panel1.Controls.Add(this.btnOverlayDimming); this.panel1.Controls.Add(this.btnOverlayDimming);
this.panel1.Controls.Add(this.lblOverlayTransparent); this.panel1.Controls.Add(this.lblOverlayTransparent);
this.panel1.Controls.Add(this.chkEnableOverlay); this.panel1.Controls.Add(this.chkEnableOverlay);
this.panel1.Location = new System.Drawing.Point(6, 68); this.panel1.Location = new System.Drawing.Point(6, 68);
this.panel1.Name = "panel1"; this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(778, 61); this.panel1.Size = new System.Drawing.Size(778, 62);
this.panel1.TabIndex = 0; this.panel1.TabIndex = 0;
// //
// chkOverlayClickThru
//
this.chkOverlayClickThru.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.chkOverlayClickThru.AutoSize = true;
this.chkOverlayClickThru.Location = new System.Drawing.Point(672, 8);
this.chkOverlayClickThru.Name = "chkOverlayClickThru";
this.chkOverlayClickThru.Size = new System.Drawing.Size(44, 17);
this.chkOverlayClickThru.TabIndex = 4;
this.chkOverlayClickThru.Text = "104";
this.chkOverlayClickThru.UseVisualStyleBackColor = true;
this.chkOverlayClickThru.CheckedChanged += new System.EventHandler(this.ChkOverlayClickThru_CheckedChanged);
//
// progbOverlayTransparent // progbOverlayTransparent
// //
this.progbOverlayTransparent.Enabled = false; this.progbOverlayTransparent.Enabled = false;
@ -632,17 +663,150 @@ namespace DutyContent.Tab
this.chkEnableOverlay.UseVisualStyleBackColor = true; this.chkEnableOverlay.UseVisualStyleBackColor = true;
this.chkEnableOverlay.CheckedChanged += new System.EventHandler(this.ChkEnableOverlay_CheckedChanged); this.chkEnableOverlay.CheckedChanged += new System.EventHandler(this.ChkEnableOverlay_CheckedChanged);
// //
// tabPage3 // tabPagePing
// //
this.tabPage3.Controls.Add(this.panel5); this.tabPagePing.Controls.Add(this.panel6);
this.tabPage3.ImageIndex = 2; this.tabPagePing.ImageIndex = 3;
this.tabPage3.Location = new System.Drawing.Point(4, 39); this.tabPagePing.Location = new System.Drawing.Point(4, 39);
this.tabPage3.Name = "tabPage3"; this.tabPagePing.Name = "tabPagePing";
this.tabPage3.Padding = new System.Windows.Forms.Padding(3); this.tabPagePing.Size = new System.Drawing.Size(792, 459);
this.tabPage3.Size = new System.Drawing.Size(792, 459); this.tabPagePing.TabIndex = 3;
this.tabPage3.TabIndex = 2; this.tabPagePing.Text = "327";
this.tabPage3.Text = "303"; this.tabPagePing.UseVisualStyleBackColor = true;
this.tabPage3.UseVisualStyleBackColor = true; //
// panel6
//
this.panel6.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.panel6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.panel6.Controls.Add(this.tlpnPingColors);
this.panel6.Controls.Add(this.lblPingColors);
this.panel6.Controls.Add(this.chkUsePing);
this.panel6.Location = new System.Drawing.Point(6, 8);
this.panel6.Name = "panel6";
this.panel6.Size = new System.Drawing.Size(778, 353);
this.panel6.TabIndex = 1;
//
// btnPingColor2
//
this.btnPingColor2.BackColor = System.Drawing.Color.Aqua;
this.btnPingColor2.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnPingColor2.Location = new System.Drawing.Point(97, 28);
this.btnPingColor2.Name = "btnPingColor2";
this.btnPingColor2.Size = new System.Drawing.Size(85, 28);
this.btnPingColor2.TabIndex = 10;
this.btnPingColor2.UseVisualStyleBackColor = false;
this.btnPingColor2.Click += new System.EventHandler(this.BtnPingColor2_Click);
//
// lblPingStat4
//
this.lblPingStat4.AutoSize = true;
this.lblPingStat4.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblPingStat4.Location = new System.Drawing.Point(279, 3);
this.lblPingStat4.Name = "lblPingStat4";
this.lblPingStat4.Size = new System.Drawing.Size(86, 22);
this.lblPingStat4.TabIndex = 3;
this.lblPingStat4.Text = "333";
this.lblPingStat4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblPingStat2
//
this.lblPingStat2.AutoSize = true;
this.lblPingStat2.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblPingStat2.Location = new System.Drawing.Point(97, 3);
this.lblPingStat2.Name = "lblPingStat2";
this.lblPingStat2.Size = new System.Drawing.Size(85, 22);
this.lblPingStat2.TabIndex = 5;
this.lblPingStat2.Text = "331";
this.lblPingStat2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblPingStat3
//
this.lblPingStat3.AutoSize = true;
this.lblPingStat3.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblPingStat3.Location = new System.Drawing.Point(188, 3);
this.lblPingStat3.Name = "lblPingStat3";
this.lblPingStat3.Size = new System.Drawing.Size(85, 22);
this.lblPingStat3.TabIndex = 4;
this.lblPingStat3.Text = "332";
this.lblPingStat3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// btnPingColor4
//
this.btnPingColor4.BackColor = System.Drawing.Color.Plum;
this.btnPingColor4.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnPingColor4.Location = new System.Drawing.Point(279, 28);
this.btnPingColor4.Name = "btnPingColor4";
this.btnPingColor4.Size = new System.Drawing.Size(86, 28);
this.btnPingColor4.TabIndex = 8;
this.btnPingColor4.UseVisualStyleBackColor = false;
this.btnPingColor4.Click += new System.EventHandler(this.BtnPingColor4_Click);
//
// btnPingColor1
//
this.btnPingColor1.BackColor = System.Drawing.Color.RoyalBlue;
this.btnPingColor1.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnPingColor1.Location = new System.Drawing.Point(6, 28);
this.btnPingColor1.Name = "btnPingColor1";
this.btnPingColor1.Size = new System.Drawing.Size(85, 28);
this.btnPingColor1.TabIndex = 7;
this.btnPingColor1.UseVisualStyleBackColor = false;
this.btnPingColor1.Click += new System.EventHandler(this.BtnPingColor1_Click);
//
// btnPingColor3
//
this.btnPingColor3.BackColor = System.Drawing.Color.LawnGreen;
this.btnPingColor3.Dock = System.Windows.Forms.DockStyle.Fill;
this.btnPingColor3.Location = new System.Drawing.Point(188, 28);
this.btnPingColor3.Name = "btnPingColor3";
this.btnPingColor3.Size = new System.Drawing.Size(85, 28);
this.btnPingColor3.TabIndex = 9;
this.btnPingColor3.UseVisualStyleBackColor = false;
this.btnPingColor3.Click += new System.EventHandler(this.BtnPingColor3_Click);
//
// lblPingStat1
//
this.lblPingStat1.AutoSize = true;
this.lblPingStat1.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblPingStat1.Location = new System.Drawing.Point(6, 3);
this.lblPingStat1.Name = "lblPingStat1";
this.lblPingStat1.Size = new System.Drawing.Size(85, 22);
this.lblPingStat1.TabIndex = 6;
this.lblPingStat1.Text = "330";
this.lblPingStat1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// lblPingColors
//
this.lblPingColors.AutoSize = true;
this.lblPingColors.Location = new System.Drawing.Point(23, 35);
this.lblPingColors.Name = "lblPingColors";
this.lblPingColors.Size = new System.Drawing.Size(25, 13);
this.lblPingColors.TabIndex = 2;
this.lblPingColors.Text = "329";
//
// chkUsePing
//
this.chkUsePing.AutoSize = true;
this.chkUsePing.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.chkUsePing.Location = new System.Drawing.Point(3, 3);
this.chkUsePing.Name = "chkUsePing";
this.chkUsePing.Size = new System.Drawing.Size(58, 24);
this.chkUsePing.TabIndex = 0;
this.chkUsePing.Text = "328";
this.chkUsePing.UseVisualStyleBackColor = true;
this.chkUsePing.CheckedChanged += new System.EventHandler(this.ChkUsePing_CheckedChanged);
//
// tabPagePacket
//
this.tabPagePacket.Controls.Add(this.panel5);
this.tabPagePacket.ImageIndex = 2;
this.tabPagePacket.Location = new System.Drawing.Point(4, 39);
this.tabPagePacket.Name = "tabPagePacket";
this.tabPagePacket.Padding = new System.Windows.Forms.Padding(3);
this.tabPagePacket.Size = new System.Drawing.Size(792, 459);
this.tabPagePacket.TabIndex = 2;
this.tabPagePacket.Text = "303";
this.tabPagePacket.UseVisualStyleBackColor = true;
// //
// panel5 // panel5
// //
@ -833,6 +997,31 @@ namespace DutyContent.Tab
this.ilTabContent.Images.SetKeyName(0, "pix_tab_content.png"); this.ilTabContent.Images.SetKeyName(0, "pix_tab_content.png");
this.ilTabContent.Images.SetKeyName(1, "pix_tab_setting.png"); this.ilTabContent.Images.SetKeyName(1, "pix_tab_setting.png");
this.ilTabContent.Images.SetKeyName(2, "pix_tab_tool.png"); this.ilTabContent.Images.SetKeyName(2, "pix_tab_tool.png");
this.ilTabContent.Images.SetKeyName(3, "pix_tab_ping.png");
//
// tlpnPingColors
//
this.tlpnPingColors.ColumnCount = 4;
this.tlpnPingColors.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tlpnPingColors.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tlpnPingColors.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tlpnPingColors.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F));
this.tlpnPingColors.Controls.Add(this.lblPingStat1, 0, 0);
this.tlpnPingColors.Controls.Add(this.btnPingColor4, 3, 1);
this.tlpnPingColors.Controls.Add(this.btnPingColor2, 1, 1);
this.tlpnPingColors.Controls.Add(this.btnPingColor3, 2, 1);
this.tlpnPingColors.Controls.Add(this.lblPingStat2, 1, 0);
this.tlpnPingColors.Controls.Add(this.lblPingStat4, 3, 0);
this.tlpnPingColors.Controls.Add(this.btnPingColor1, 0, 1);
this.tlpnPingColors.Controls.Add(this.lblPingStat3, 2, 0);
this.tlpnPingColors.Location = new System.Drawing.Point(36, 51);
this.tlpnPingColors.Name = "tlpnPingColors";
this.tlpnPingColors.Padding = new System.Windows.Forms.Padding(3);
this.tlpnPingColors.RowCount = 2;
this.tlpnPingColors.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 40F));
this.tlpnPingColors.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 60F));
this.tlpnPingColors.Size = new System.Drawing.Size(371, 62);
this.tlpnPingColors.TabIndex = 11;
// //
// DutyForm // DutyForm
// //
@ -845,13 +1034,13 @@ namespace DutyContent.Tab
this.Text = "Duty"; this.Text = "Duty";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DutyTabForm_FormClosing); this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.DutyTabForm_FormClosing);
this.tabContent.ResumeLayout(false); this.tabContent.ResumeLayout(false);
this.tabPage1.ResumeLayout(false); this.tabPageContent.ResumeLayout(false);
this.splitContainer1.Panel1.ResumeLayout(false); this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel1.PerformLayout(); this.splitContainer1.Panel1.PerformLayout();
this.splitContainer1.Panel2.ResumeLayout(false); this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false); this.splitContainer1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false); this.tabPageSetting.ResumeLayout(false);
this.panel4.ResumeLayout(false); this.panel4.ResumeLayout(false);
this.panel4.PerformLayout(); this.panel4.PerformLayout();
this.panel3.ResumeLayout(false); this.panel3.ResumeLayout(false);
@ -860,9 +1049,14 @@ namespace DutyContent.Tab
this.panel2.PerformLayout(); this.panel2.PerformLayout();
this.panel1.ResumeLayout(false); this.panel1.ResumeLayout(false);
this.panel1.PerformLayout(); this.panel1.PerformLayout();
this.tabPage3.ResumeLayout(false); this.tabPagePing.ResumeLayout(false);
this.panel6.ResumeLayout(false);
this.panel6.PerformLayout();
this.tabPagePacket.ResumeLayout(false);
this.panel5.ResumeLayout(false); this.panel5.ResumeLayout(false);
this.panel5.PerformLayout(); this.panel5.PerformLayout();
this.tlpnPingColors.ResumeLayout(false);
this.tlpnPingColors.PerformLayout();
this.ResumeLayout(false); this.ResumeLayout(false);
} }
@ -870,9 +1064,9 @@ namespace DutyContent.Tab
#endregion #endregion
private System.Windows.Forms.TabControl tabContent; private System.Windows.Forms.TabControl tabContent;
private System.Windows.Forms.TabPage tabPage1; private System.Windows.Forms.TabPage tabPageContent;
private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.TabPage tabPageSetting;
private System.Windows.Forms.TabPage tabPage3; private System.Windows.Forms.TabPage tabPagePacket;
private System.Windows.Forms.ImageList ilTabContent; private System.Windows.Forms.ImageList ilTabContent;
private System.Windows.Forms.SplitContainer splitContainer1; private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.TreeView treeFates; private System.Windows.Forms.TreeView treeFates;
@ -931,5 +1125,19 @@ namespace DutyContent.Tab
private System.Windows.Forms.TextBox txtPacketDescription; private System.Windows.Forms.TextBox txtPacketDescription;
private System.Windows.Forms.Label lblPacketDesc; private System.Windows.Forms.Label lblPacketDesc;
private System.Windows.Forms.ColumnHeader columnHeader8; private System.Windows.Forms.ColumnHeader columnHeader8;
private System.Windows.Forms.CheckBox chkOverlayClickThru;
private System.Windows.Forms.TabPage tabPagePing;
private System.Windows.Forms.Panel panel6;
private System.Windows.Forms.Label lblPingColors;
private System.Windows.Forms.CheckBox chkUsePing;
private System.Windows.Forms.Button btnPingColor2;
private System.Windows.Forms.Label lblPingStat4;
private System.Windows.Forms.Label lblPingStat2;
private System.Windows.Forms.Label lblPingStat3;
private System.Windows.Forms.Button btnPingColor4;
private System.Windows.Forms.Button btnPingColor1;
private System.Windows.Forms.Button btnPingColor3;
private System.Windows.Forms.Label lblPingStat1;
private System.Windows.Forms.TableLayoutPanel tlpnPingColors;
} }
} }

View file

@ -10,6 +10,8 @@ using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Text; using System.Text;
using System.IO; using System.IO;
using System.Threading;
using System.Net.NetworkInformation;
namespace DutyContent.Tab namespace DutyContent.Tab
{ {
@ -24,9 +26,12 @@ namespace DutyContent.Tab
private bool _is_packet_finder; private bool _is_packet_finder;
private DcConfig.PacketConfig _new_packet; private DcConfig.PacketConfig _new_packet;
private Timer _save_timer;
private Overlay.DutyOvForm _overlay; private Overlay.DutyOvForm _overlay;
private System.Timers.Timer _ping_timer;
private long _ping_last;
private Color _ping_color = Color.Transparent;
public DutyForm() public DutyForm()
{ {
_self = this; _self = this;
@ -38,8 +43,7 @@ namespace DutyContent.Tab
private void DutyTabForm_FormClosing(object sender, FormClosingEventArgs e) private void DutyTabForm_FormClosing(object sender, FormClosingEventArgs e)
{ {
if (_save_timer != null)
_save_timer.Stop();
} }
public void PluginInitialize() public void PluginInitialize()
@ -68,6 +72,7 @@ namespace DutyContent.Tab
progbOverlayTransparent.Enabled = DcConfig.Duty.EnableOverlay; progbOverlayTransparent.Enabled = DcConfig.Duty.EnableOverlay;
btnOverlayDimming.Enabled = DcConfig.Duty.EnableOverlay; btnOverlayDimming.Enabled = DcConfig.Duty.EnableOverlay;
chkOverlayClickThru.Checked = DcConfig.Duty.OverlayClickThru;
// //
_overlay.SetText(MesgLog.Text(99, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString())); _overlay.SetText(MesgLog.Text(99, System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()));
@ -104,6 +109,13 @@ namespace DutyContent.Tab
btnTestNotify.Enabled = DcConfig.Duty.EnableNotify; btnTestNotify.Enabled = DcConfig.Duty.EnableNotify;
//
chkUsePing.Checked = DcConfig.Duty.UsePing;
btnPingColor1.BackColor = DcConfig.Duty.PingColors[0];
btnPingColor2.BackColor = DcConfig.Duty.PingColors[1];
btnPingColor3.BackColor = DcConfig.Duty.PingColors[2];
btnPingColor4.BackColor = DcConfig.Duty.PingColors[3];
// //
switch (DcConfig.Duty.ActiveFate) switch (DcConfig.Duty.ActiveFate)
{ {
@ -115,25 +127,28 @@ namespace DutyContent.Tab
UpdateFates(); UpdateFates();
// //
_save_timer = new Timer() { Interval = 5000 }; _ping_timer = new System.Timers.Timer() { Interval = 5000 };
_save_timer.Tick += (sender, e) => _ping_timer.Elapsed += (sender, e) => PingOnce();
{
DcConfig.SaveConfig(); if (DcConfig.Duty.UsePing)
_save_timer.Enabled = false; _ping_timer.Start();
};
} }
public void PluginDeinitialize() public void PluginDeinitialize()
{ {
if (_ping_timer != null)
{
_ping_timer.Stop();
_ping_timer = null;
}
_overlay.Hide(); _overlay.Hide();
_overlay = null; _overlay = null;
} }
private void RefreshSaveFile(int interval = 5000) private void SaveConfig(int interval = 5000)
{ {
_save_timer.Enabled = false; DcControl.Self.RefreshSaveConfig(interval);
_save_timer.Interval = interval;
_save_timer.Start();
} }
public static List<string> MakeDutyLangList() public static List<string> MakeDutyLangList()
@ -158,15 +173,17 @@ namespace DutyContent.Tab
public void UpdateUiLocale() public void UpdateUiLocale()
{ {
tabContent.TabPages[0].Text = MesgLog.Text(301); tabPageContent.Text = MesgLog.Text(301);
tabContent.TabPages[1].Text = MesgLog.Text(302); tabPageSetting.Text = MesgLog.Text(302);
tabContent.TabPages[2].Text = MesgLog.Text(303); tabPagePacket.Text = MesgLog.Text(303);
tabPagePing.Text = MesgLog.Text(327);
lblDataSet.Text = MesgLog.Text(304); lblDataSet.Text = MesgLog.Text(304);
lblLogFont.Text = MesgLog.Text(305); lblLogFont.Text = MesgLog.Text(305);
chkEnableOverlay.Text = MesgLog.Text(306); chkEnableOverlay.Text = MesgLog.Text(306);
lblOverlayTransparent.Text = MesgLog.Text(307); lblOverlayTransparent.Text = MesgLog.Text(307);
chkOverlayClickThru.Text = MesgLog.Text(104);
chkEnableSound.Text = MesgLog.Text(308); chkEnableSound.Text = MesgLog.Text(308);
lblSoundInstance.Text = MesgLog.Text(309); lblSoundInstance.Text = MesgLog.Text(309);
@ -195,6 +212,13 @@ namespace DutyContent.Tab
btnPacketStart.Text = MesgLog.Text(10007); btnPacketStart.Text = MesgLog.Text(10007);
btnPacketApply.Text = MesgLog.Text(10009); btnPacketApply.Text = MesgLog.Text(10009);
chkUsePing.Text = MesgLog.Text(328);
lblPingColors.Text = MesgLog.Text(329);
lblPingStat1.Text = MesgLog.Text(330);
lblPingStat2.Text = MesgLog.Text(331);
lblPingStat3.Text = MesgLog.Text(332);
lblPingStat4.Text = MesgLog.Text(333);
} }
public void PacketHandler(string pid, byte[] message) public void PacketHandler(string pid, byte[] message)
@ -518,7 +542,7 @@ namespace DutyContent.Tab
lblCurrentDataSet.Text = DcContent.Language; lblCurrentDataSet.Text = DcContent.Language;
RefreshSaveFile(); SaveConfig();
} }
} }
@ -543,7 +567,7 @@ namespace DutyContent.Tab
DcConfig.Duty.LogFontFamily = ret.Name; DcConfig.Duty.LogFontFamily = ret.Name;
DcConfig.Duty.LogFontSize = ret.Size; DcConfig.Duty.LogFontSize = ret.Size;
RefreshSaveFile(); SaveConfig();
btnLogFont.Font = ret; btnLogFont.Font = ret;
btnLogFont.Text = $"{DcConfig.Duty.LogFontFamily}, {DcConfig.Duty.LogFontSize}"; btnLogFont.Text = $"{DcConfig.Duty.LogFontFamily}, {DcConfig.Duty.LogFontSize}";
@ -579,7 +603,7 @@ namespace DutyContent.Tab
} }
MakeFatesSelection(true); MakeFatesSelection(true);
RefreshSaveFile(); SaveConfig();
_is_lock_fate = false; _is_lock_fate = false;
} }
@ -595,7 +619,7 @@ namespace DutyContent.Tab
DcConfig.Duty.ActiveFate = index; DcConfig.Duty.ActiveFate = index;
UpdateFates(); UpdateFates();
RefreshSaveFile(); SaveConfig();
} }
} }
@ -634,7 +658,7 @@ namespace DutyContent.Tab
DcConfig.Duty.EnableOverlay = chkEnableOverlay.Checked; DcConfig.Duty.EnableOverlay = chkEnableOverlay.Checked;
RefreshSaveFile(); SaveConfig();
} }
private void ProgbOverlayTransparent_Click(object sender, EventArgs e) private void ProgbOverlayTransparent_Click(object sender, EventArgs e)
@ -647,6 +671,16 @@ namespace DutyContent.Tab
_overlay.StartBlink(); _overlay.StartBlink();
} }
private void ChkOverlayClickThru_CheckedChanged(object sender, EventArgs e)
{
if (!DcConfig.PluginEnable)
return;
DcConfig.Duty.OverlayClickThru = chkOverlayClickThru.Checked;
SaveConfig();
}
private void ChkEnableSound_CheckedChanged(object sender, EventArgs e) private void ChkEnableSound_CheckedChanged(object sender, EventArgs e)
{ {
if (!DcConfig.PluginEnable) if (!DcConfig.PluginEnable)
@ -661,7 +695,7 @@ namespace DutyContent.Tab
DcConfig.Duty.EnableSound = chkEnableSound.Checked; DcConfig.Duty.EnableSound = chkEnableSound.Checked;
RefreshSaveFile(); SaveConfig();
} }
// //
@ -722,7 +756,7 @@ namespace DutyContent.Tab
DcConfig.Duty.SoundInstanceFile = string.IsNullOrEmpty(filename) ? string.Empty : filename; DcConfig.Duty.SoundInstanceFile = string.IsNullOrEmpty(filename) ? string.Empty : filename;
txtSoundInstance.Text = DcConfig.Duty.SoundInstanceFile; txtSoundInstance.Text = DcConfig.Duty.SoundInstanceFile;
RefreshSaveFile(); SaveConfig();
} }
private void BtnSoundFindFate_Click(object sender, EventArgs e) private void BtnSoundFindFate_Click(object sender, EventArgs e)
@ -735,7 +769,7 @@ namespace DutyContent.Tab
DcConfig.Duty.SoundFateFile = string.IsNullOrEmpty(filename) ? string.Empty : filename; DcConfig.Duty.SoundFateFile = string.IsNullOrEmpty(filename) ? string.Empty : filename;
txtSoundFate.Text = DcConfig.Duty.SoundFateFile; txtSoundFate.Text = DcConfig.Duty.SoundFateFile;
RefreshSaveFile(); SaveConfig();
} }
private async void BtnTestNotify_Click(object sender, EventArgs e) private async void BtnTestNotify_Click(object sender, EventArgs e)
@ -792,7 +826,7 @@ namespace DutyContent.Tab
btnTestNotify.Enabled = DcConfig.Duty.EnableNotify; btnTestNotify.Enabled = DcConfig.Duty.EnableNotify;
RefreshSaveFile(); SaveConfig();
} }
private void LblLineNotifyBotLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) private void LblLineNotifyBotLink_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
@ -811,7 +845,7 @@ namespace DutyContent.Tab
if (e.KeyCode == Keys.Enter) if (e.KeyCode == Keys.Enter)
{ {
DcConfig.Duty.NotifyLineToken = txtLineToken.Text; DcConfig.Duty.NotifyLineToken = txtLineToken.Text;
RefreshSaveFile(); SaveConfig();
} }
} }
@ -824,7 +858,7 @@ namespace DutyContent.Tab
if (!txtLineToken.Text.Equals(DcConfig.Duty.NotifyLineToken)) if (!txtLineToken.Text.Equals(DcConfig.Duty.NotifyLineToken))
{ {
DcConfig.Duty.NotifyLineToken = txtLineToken.Text; DcConfig.Duty.NotifyLineToken = txtLineToken.Text;
RefreshSaveFile(); SaveConfig();
} }
var hc = new HttpClient(); var hc = new HttpClient();
@ -851,7 +885,7 @@ namespace DutyContent.Tab
btnTestNotify.Enabled = DcConfig.Duty.EnableNotify; btnTestNotify.Enabled = DcConfig.Duty.EnableNotify;
RefreshSaveFile(); SaveConfig();
} }
private void TxtTelegramId_KeyDown(object sender, KeyEventArgs e) private void TxtTelegramId_KeyDown(object sender, KeyEventArgs e)
@ -862,7 +896,7 @@ namespace DutyContent.Tab
if (e.KeyCode == Keys.Enter) if (e.KeyCode == Keys.Enter)
{ {
DcConfig.Duty.NotifyTelegramId = txtTelegramId.Text; DcConfig.Duty.NotifyTelegramId = txtTelegramId.Text;
RefreshSaveFile(); SaveConfig();
} }
} }
@ -874,7 +908,7 @@ namespace DutyContent.Tab
if (e.KeyCode == Keys.Enter) if (e.KeyCode == Keys.Enter)
{ {
DcConfig.Duty.NotifyTelegramToken = txtTelegramToken.Text; DcConfig.Duty.NotifyTelegramToken = txtTelegramToken.Text;
RefreshSaveFile(); SaveConfig();
} }
} }
@ -899,13 +933,13 @@ namespace DutyContent.Tab
if (!txtTelegramId.Text.Equals(DcConfig.Duty.NotifyTelegramId)) if (!txtTelegramId.Text.Equals(DcConfig.Duty.NotifyTelegramId))
{ {
DcConfig.Duty.NotifyTelegramId = txtTelegramId.Text; DcConfig.Duty.NotifyTelegramId = txtTelegramId.Text;
RefreshSaveFile(); SaveConfig();
} }
if (!txtTelegramToken.Text.Equals(DcConfig.Duty.NotifyTelegramToken)) if (!txtTelegramToken.Text.Equals(DcConfig.Duty.NotifyTelegramToken))
{ {
DcConfig.Duty.NotifyTelegramToken = txtTelegramToken.Text; DcConfig.Duty.NotifyTelegramToken = txtTelegramToken.Text;
RefreshSaveFile(); SaveConfig();
} }
// https://codingman.tistory.com/41 // https://codingman.tistory.com/41
@ -1123,10 +1157,10 @@ namespace DutyContent.Tab
var data = message.Skip(32).ToArray(); var data = message.Skip(32).ToArray();
// fate // fate
if (data.Length > 4 && data[0] == 0x3E) if (_new_packet.OpFate == 0 && data.Length > 4 && data[0] == 0x3E)
{ {
var cc = BitConverter.ToInt16(data, 4); var cc = BitConverter.ToInt16(data, 4);
if (_packet_target_fates.Contains(cc)) if (_packet_target_fates.Contains(cc) && _new_packet.OpFate != opcode)
{ {
_new_packet.OpFate = opcode; _new_packet.OpFate = opcode;
@ -1141,14 +1175,14 @@ namespace DutyContent.Tab
} }
// duty // duty
if (data.Length > 12) if (_new_packet.OpDuty == 0 && data.Length > 12)
{ {
var rcode = data[8]; var rcode = data[8];
if (rcode == 0) if (rcode == 0)
{ {
// The Steps of Fath (83) // The Steps of Fath (83)
short m = BitConverter.ToInt16(data, 12); short m = BitConverter.ToInt16(data, 12);
if (m == 83) if (m == 83 && _new_packet.OpDuty != opcode)
{ {
_new_packet.OpDuty = opcode; _new_packet.OpDuty = opcode;
@ -1164,14 +1198,14 @@ namespace DutyContent.Tab
} }
// match // match
if (data.Length > 20) if (_new_packet.OpMatch == 0 && data.Length > 20)
{ {
var rcode = data[2]; var rcode = data[2];
if (rcode == 0) if (rcode == 0)
{ {
// The Steps of Fath (83) // The Steps of Fath (83)
short m = BitConverter.ToInt16(data, 20); short m = BitConverter.ToInt16(data, 20);
if (m == 83) if (m == 83 && _new_packet.OpMatch != opcode)
{ {
_new_packet.OpMatch = opcode; _new_packet.OpMatch = opcode;
@ -1187,12 +1221,12 @@ namespace DutyContent.Tab
} }
// instance // instance
if (data.Length >= 16) if (_new_packet.OpInstance == 0 && data.Length >= 16)
{ {
// The Steps of Fath (83) // The Steps of Fath (83)
short m = BitConverter.ToInt16(data, 0); short m = BitConverter.ToInt16(data, 0);
short u = BitConverter.ToInt16(data, 2); short u = BitConverter.ToInt16(data, 2);
if (m == 83 && u == 0) if (m == 83 && u == 0 && _new_packet.OpInstance != opcode)
{ {
_new_packet.OpInstance = opcode; _new_packet.OpInstance = opcode;
@ -1279,5 +1313,156 @@ namespace DutyContent.Tab
} }
} }
} }
private void ChkUsePing_CheckedChanged(object sender, EventArgs e)
{
if (!DcConfig.PluginEnable)
return;
DcConfig.Duty.UsePing = chkUsePing.Checked;
SaveConfig();
if (chkUsePing.Checked)
_ping_timer.Start();
else
{
_ping_timer.Stop();
_overlay.ResetStat();
}
}
private Color PingColorSelectDialog(Color current)
{
Color color = (Color)WorkerAct.Invoker(new WorkerAct.ObjectReturnerDelegate(() =>
{
var dg = new ColorDialog()
{
AnyColor = true,
Color = current,
};
return dg.ShowDialog() == DialogResult.OK ? dg.Color : current;
}));
return color;
}
private void BtnPingColor1_Click(object sender, EventArgs e)
{
var ret = PingColorSelectDialog(DcConfig.Duty.PingColors[0]);
if (DcConfig.Duty.PingColors[0] != ret)
{
btnPingColor1.BackColor = ret;
DcConfig.Duty.PingColors[0] = ret;
SaveConfig();
}
}
private void BtnPingColor2_Click(object sender, EventArgs e)
{
var ret = PingColorSelectDialog(DcConfig.Duty.PingColors[1]);
if (DcConfig.Duty.PingColors[1] != ret)
{
btnPingColor2.BackColor = ret;
DcConfig.Duty.PingColors[1] = ret;
SaveConfig();
}
}
private void BtnPingColor3_Click(object sender, EventArgs e)
{
var ret = PingColorSelectDialog(DcConfig.Duty.PingColors[2]);
if (DcConfig.Duty.PingColors[2] != ret)
{
btnPingColor3.BackColor = ret;
DcConfig.Duty.PingColors[2] = ret;
SaveConfig();
}
}
private void BtnPingColor4_Click(object sender, EventArgs e)
{
var ret = PingColorSelectDialog(DcConfig.Duty.PingColors[2]);
if (DcConfig.Duty.PingColors[2] != ret)
{
btnPingColor4.BackColor = ret;
DcConfig.Duty.PingColors[2] = ret;
SaveConfig();
}
}
//
private void PingOnce()
{
if (!DcConfig.PluginEnable)
return;
var conns = DcConfig.Connections.CopyConnection();
if (conns.Length == 0)
return;
long rtt = 0;
double loss = 0.0;
foreach (var row in conns)
{
var p = CalcPing(row.RemoteAddress);
if (rtt < p.Rtt)
rtt = p.Rtt;
if (loss < p.Loss)
loss = p.Loss;
}
//MesgLog.L("Ping: {0}, {1}%", rtt, loss);
Color color;
if (loss > 0.0 || rtt > 150)
color = DcConfig.Duty.PingColors[3];
else if (rtt > 100)
color = DcConfig.Duty.PingColors[2];
else if (rtt > 50)
color = DcConfig.Duty.PingColors[1];
else
color = DcConfig.Duty.PingColors[0];
if (_ping_last != rtt || loss > 0.0 || _ping_color != color)
{
_ping_last = rtt;
_ping_color = color;
_overlay.SetStatPing(color, rtt, loss);
}
}
private static PingOptions _ping_options = new PingOptions { DontFragment = true };
private static byte[] _ping_buffers = Encoding.ASCII.GetBytes("01234567890123456789012345678901");
private static int _ping_timerout = 120;
//
private (long Rtt, double Loss) CalcPing(IPAddress host, int amount = 6)
{
var ps = new Ping();
int failed = 0;
long rtt = 0;
for (var i = 0; i < amount; i++)
{
PingReply pr = ps.Send(host, _ping_timerout, _ping_buffers, _ping_options);
if (pr.Status != IPStatus.Success)
failed++;
if (rtt < pr.RoundtripTime)
rtt = pr.RoundtripTime;
}
double loss = (failed / amount) * 100;
return (rtt, loss);
}
} }
} }

View file

@ -124,285 +124,307 @@
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAA ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAW
QQAAAk1TRnQBSQFMAgEBAwEAAdABAAHQAQABIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA RgAAAk1TRnQBSQFMAgEBBAEAARABAQEQAQEBIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA
AwABIAMAAQEBAAEgBgABQBoAAzYEWQHEA1UB6gMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/ AwABQAMAAQEBAAEgBgABgP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A
Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DXQHi /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A
A1QBrgMpAT8IAAMHAQoDSAGFAh0BqgH/AhgBqgH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/ /wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AWgADNgRZAcQDVQHqAxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/
AhcBpAH/AhcBowH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/AhcBogH/ AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/
AhcBogH/AhcBogH/AhcBowH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhcBpAH/AhgBqgH/ AxUB/wNdAeIDVAGuAykBPwgAAwcBCgNIAYUCFQGqAf8CEAGqAf8CDwGkAf8CDwGkAf8CDwGkAf8CDwGk
Ah0BqgH/A0gBhQMHAQr/AAUAA04BlwM+Af8DsgH/A80B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPd Af8CDwGkAf8CDwGkAf8CDwGjAf8CDwGiAf8CDwGiAf8CDwGiAf8CDwGiAf8CDwGiAf8CDwGiAf8CDwGi
Af8CDwGiAf8CDwGiAf8CDwGiAf8CDwGjAf8CDwGkAf8CDwGkAf8CDwGkAf8CDwGkAf8CDwGkAf8CDwGk
Af8CEAGqAf8CFQGqAf8DSAGFAwcBCv8ABQADTgGXAzYB/wOyAf8DzQH/A90B/wPdAf8D3QH/A90B/wPd
Af8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPd Af8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPdAf8D3QH/A90B/wPd
Af8DyAH/A6IB/wMvAf8DRgGBBAADSAGFAhcBpAH/AhcBogH/AhcBoQH/AhcBoQH/AhcBoQH/AhcBoQH/ Af8D3QH/A90B/wPIAf8DogH/AycB/wNGAYEEAANIAYUCDwGkAf8CDwGiAf8CDwGhAf8CDwGhAf8CDwGh
AhcBoQH/AhQBoAH/AhQBngH/AhQBmwH/AhQBmQH/AhQBmQH/AhQBlwH/AhQBlQH/AhQBlQH/AhQBlQH/ Af8CDwGhAf8CDwGhAf8CDAGgAf8CDAGeAf8CDAGbAf8CDAGZAf8CDAGZAf8CDAGXAf8CDAGVAf8CDAGV
AhQBlQH/AhQBlwH/AhQBmQH/AhQBmQH/AhQBmwH/AhQBngH/AhQBoAH/AhcBoQH/AhcBoQH/AhcBoQH/ Af8CDAGVAf8CDAGVAf8CDAGXAf8CDAGZAf8CDAGZAf8CDAGbAf8CDAGeAf8CDAGgAf8CDwGhAf8CDwGh
AhcBoQH/AhcBoQH/AhcBogH/AhcBpAH/A0gBhVcAAQEDAgQDBAQBBgMEAQYDAwEEAwEBAgMAAQGMAAM3 Af8CDwGhAf8CDwGhAf8CDwGhAf8CDwGiAf8CDwGkAf8DSAGFVwABAQMCBAMEBAEGAwQBBgMDAQQDAQEC
AVoDSgH/A9sB/wOLAf8DNAH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMd AwABAYwAAzcBWgNCAf8D2wH/A4sB/wMsAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMV
Af8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wM0Af8DhwH/A80B/wM2 Af8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AywB/wOH
Af8DKwFCAhcBpAH/AhcBogH/AhQBnQH/AhIBmAH/AhIBlwH/AhIBlwH/AhIBlwH/AhIBlwH/Ag8BkQH/ Af8DzQH/Ay4B/wMrAUICDwGkAf8CDwGiAf8CDAGdAf8CCgGYAf8CCgGXAf8CCgGXAf8CCgGXAf8CCgGX
Ag8BjwH/Ag8BjAH/Ag8BigH/Ag8BigH/Ag0BiAH/AgoBhgH/AgoBhgH/AgoBhgH/AgwBhgH/Ag8BiAH/ Af8CBwGRAf8CBwGPAf8CBwGMAf8CBwGKAf8CBwGKAf8CBQGIAf8CAgGGAf8CAgGGAf8CAgGGAf8CBAGG
Ag8BigH/Ag8BigH/Ag8BjAH/Ag8BjwH/Ag8BlQH/AhIBlwH/AhIBlwH/AhIBlwH/AhIBlwH/AhIBmAH/ Af8CBwGIAf8CBwGKAf8CBwGKAf8CBwGMAf8CBwGPAf8CBwGVAf8CCgGXAf8CCgGXAf8CCgGXAf8CCgGX
AhQBnQH/AhcBogH/AhcBpAH/UAADAgEDAwYBCAMNARIDGgEkAyMBMwMhATADFgEeAwoBDgMEAQYDAAEB Af8CCgGYAf8CDAGdAf8CDwGiAf8CDwGkAf9QAAMCAQMDBgEIAw0BEgMaASQDIwEzAyEBMAMWAR4DCgEO
iAADWQHDA7IB/wOKAf8BWgFIAS4B/wG5AZMBQAH/Ac4BogFGAf8BzgGiAUYB/wHOAaIBRgH/Ac4BogFG AwQBBgMAAQGIAANZAcMDsgH/A4oB/wFSAUABJgH/AbkBkwE4Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+
Af8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BvQGVAT4B/wGj Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+Af8BzgGiAT4B/wG9
AYABMgH/Ab0BlQE+Af8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BzgGiAUYB/wHOAaIBRgH/Ac4BogFG AZUBNgH/AaMBgAEqAf8BvQGVATYB/wHOAaIBPgH/Ac4BogE+Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+
Af8BzgGiAUYB/wHOAaIBRgH/Ac4BogFGAf8BuQGTAUAB/wFlAVABMQH/A4UB/wOjAf8DVAGrAhcBowH/ Af8BzgGiAT4B/wHOAaIBPgH/Ac4BogE+Af8BzgGiAT4B/wG5AZMBOAH/AV0BSAEpAf8DhQH/A6MB/wNU
AhQBmgH/AhABkQH/AgkBjQH/AggBjQH/AggBigH/AggBhgH/AggBgQH/AggBZAH/AggBYgH/AggBXQH/ AasCDwGjAf8CDAGaAf8CCAGRAf8CAQGNAf8CAAGNAf8CAAGKAf8CAAGGAf8CAAGBAf8CAAFcAf8CAAFa
AggBXAH/AggBXAH/AgcBXAH/AgYBWAH/AgYBVQH/AgYBVQH/AgcBWAH/AggBXAH/AggBXAH/AggBXAH/ Af8CAAFVAf8CAAFUAf8CAAFUAf8CAAFUAf8CAAFQAf8CAAFNAf8CAAFNAf8CAAFQAf8CAAFUAf8CAAFU
AggBXQH/AggBYgH/AggBgAH/AggBhgH/AggBhgH/AggBigH/AggBjQH/AgkBjQH/AhABkQH/AhQBmgH/ Af8CAAFUAf8CAAFVAf8CAAFaAf8CAAGAAf8CAAGGAf8CAAGGAf8CAAGKAf8CAAGNAf8CAQGNAf8CCAGR
AhcBowH/TAADAgEDAwcBCgMXASADMAFMAUUCRgF+AU8CUQGcAU0CTgGWA0EBcgMqAUEDEgEZAwUBBwMA Af8CDAGaAf8CDwGjAf9MAAMCAQMDBwEKAxcBIAMwAUwBRQJGAX4BTwJRAZwBTQJOAZYDQQFyAyoBQQMS
AQGEAANBAfkDygH/AzIB/wG5AY8BPwH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AdUBogFHAf8B1QGi ARkDBQEHAwABAS8AAf8DAAH/AwAB/wMAAf8DAAH/RAADQQH5A8oB/wMqAf8BuQGPATcB/wHVAaIBPwH/
AUcB/wHVAaIBRwH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AdUBogFHAf8BxAGVAT8B/wGJAVEBKwH/ AdUBogE/Af8B1QGiAT8B/wHVAaIBPwH/AdUBogE/Af8B1QGiAT8B/wHVAaIBPwH/AdUBogE/Af8B1QGi
ASYBNQE7Af8BlAFWASoB/wHTAaEBRgH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AdUBogFHAf8B1QGi AT8B/wHVAaIBPwH/AcQBlQE3Af8BiQFJASMB/wEeAS0BMwH/AZQBTgEiAf8B0wGhAT4B/wHVAaIBPwH/
AUcB/wHVAaIBRwH/AdUBogFHAf8B1QGiAUcB/wHVAaIBRwH/AcABkwFBAf8DKwH/A8UB/wNOAfACFQGZ AdUBogE/Af8B1QGiAT8B/wHVAaIBPwH/AdUBogE/Af8B1QGiAT8B/wHVAaIBPwH/AdUBogE/Af8B1QGi
Af8CCwGLAf8CBgFiAf8CBgFeAf8CBgFWAf8CBgFWAf8CBgFRAf8CBgFOAf8CBgFNAf8CBgFKAf8CBgFG AT8B/wHAAZMBOQH/AyMB/wPFAf8DTgHwAg0BmQH/AgMBiwH/AgABWgH/AgABVgH/AgABTgH/AgABTgH/
Af8CBgFGAf8CBgFFAf8CBgFCAf8CBgE+Af8CBgE+Af8CBgE+Af8CBgE+Af8CBgFCAf8CBgFFAf8CBgFG AgABSQH/AgABRgH/AgABRQH/AgABQgH/AgABPgH/AgABPgH/AgABPQH/AgABOgH/AgABNgH/AgABNgH/
Af8CBgFGAf8CBgFKAf8CBgFNAf8CBgFQAf8CBgFWAf8CBgFWAf8CBgFWAf8CBgFeAf8CBgFiAf8CCwGL AgABNgH/AgABNgH/AgABOgH/AgABPQH/AgABPgH/AgABPgH/AgABQgH/AgABRQH/AgABSAH/AgABTgH/
Af8CFQGZAf9IAAMBAQIDBwEJAxgBIgM4AV4BUwJVAa0BXQJhAeIBbQF/AYIB9wJlAWYB9AFeAmEB2gNQ AgABTgH/AgABTgH/AgABVgH/AgABWgH/AgMBiwH/Ag0BmQH/SAADAQECAwcBCQMYASIDOAFeAVMCVQGt
AZoDLQFGAw4BEwMDAQSEAAMdAf8DwgH/Ax8B/wHMAZUBRAH/AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/ AV0CYQHiAm0BcQH3A2UB9AFeAmEB2gNQAZoDLQFGAw4BEwMDAQQvAAH/AwAB/wMAAf8DAAH/AwAB/0QA
AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/Ab8BiwE8Af8BkwFR AxUB/wPCAf8DFwH/AcwBlQE8Af8B1QGbAT4B/wHVAZsBPgH/AdUBmwE+Af8B1QGbAT4B/wHVAZsBPgH/
ASkB/wElATMBPAH/AQABOwGOAf8BVAFBAS0B/wGVAVIBKQH/Ac8BlwFDAf8B1QGbAUYB/wHVAZsBRgH/ AdUBmwE+Af8B1QGbAT4B/wHVAZsBPgH/AdUBmwE+Af8BvwGLATQB/wGTAUkBIQH/AR0BKwE0Af8BAAEz
AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/AdUBmwFGAf8B1QGbAUYB/wHVAZsBRgH/AcUBkAFCAf8DJQH/ AY4B/wFMATkBJQH/AZUBSgEhAf8BzwGXATsB/wHVAZsBPgH/AdUBmwE+Af8B1QGbAT4B/wHVAZsBPgH/
A8IB/wMdAf8CEwGRAf8BDQESAYIB/wENASkBhAH/ARMBMgGFAf8BEwEyAYAB/wETATQBgwH/ARMBNAGD AdUBmwE+Af8B1QGbAT4B/wHVAZsBPgH/AdUBmwE+Af8BxQGQAToB/wMdAf8DwgH/AxUB/wILAZEB/wEF
Af8BEwE0AYMB/wETATQBZAH/ARMBNAFkAf8BEwE0AWQB/wETATQBZAH/ARMBNAFfAf8BEwExAVwB/wET AQoBggH/AQUBIQGEAf8BCwEqAYUB/wELASoBgAH/AQsBLAGDAf8BCwEsAYMB/wELASwBgwH/AQsBLAFc
ATEBXAH/ARMBMQFcAf8BEwExAVwB/wETATEBXAH/ARMBMQFcAf8BEwExAVwB/wETATEBYQH/ARMBMQFh Af8BCwEsAVwB/wELASwBXAH/AQsBLAFcAf8BCwEsAVcB/wELASkBVAH/AQsBKQFUAf8BCwEpAVQB/wEL
Af8BEwExAWEB/wETATEBYQH/ARMBMgGDAf8BEwE0AYMB/wETATQBgwH/ARMBNAGDAf8BEwE0AYgB/wEP ASkBVAH/AQsBKQFUAf8BCwEpAVQB/wELASkBVAH/AQsBKQFZAf8BCwEpAVkB/wELASkBWQH/AQsBKQFZ
ASkBhwH/AQ0BEgGDAf8CEwGRAf9HAAEBAwYBCAMWAR4DOAFdA1UBtQNkAfEB8wH4AfwB/wHtA/8B8wP/ Af8BCwEqAYMB/wELASwBgwH/AQsBLAGDAf8BCwEsAYMB/wELASwBiAH/AQcBIQGHAf8BBQEKAYMB/wIL
AagBuAHCAf4DXwHgA0gBhQMfASwDBQEHhAADHQH/A7QB/wMdAf8BzgGQAUMB/wHVAZQBRQH/AdUBlAFF AZEB/0cAAQEDBgEIAxYBHgM4AV0DVQG1A2QB8QHzAfgB/AH/Ae0D/wHzA/8BmAGoAbIB/gNfAeADSAGF
Af8B1QGUAUUB/wHVAZQBRQH/AdUBlAFFAf8B1QGUAUUB/wHUAZMBRQH/AdABkQFDAf8BtAFjATYB/wGK Ax8BLAMFAQcvAAH/AwAB/wMAAf8DAAH/AwAB/0QAAxUB/wO0Af8DFQH/Ac4BkAE7Af8B1QGUAT0B/wHV
AUkBKQH/ARsBMQFBAf8BAAEfAV4B/wEAAR8BWQH/AQABJgFfAf8BPgE3ATEB/wGSAUwBKAH/AbkBgAE4 AZQBPQH/AdUBlAE9Af8B1QGUAT0B/wHVAZQBPQH/AdUBlAE9Af8B1AGTAT0B/wHQAZEBOwH/AbQBWwEu
Af8B0gGSAUQB/wHVAZQBRQH/AdUBlAFFAf8B1QGUAUUB/wHVAZQBRQH/AdUBlAFFAf8B1QGUAUUB/wHF Af8BigFBASEB/wETASkBOQH/AQABFwFWAf8BAAEXAVEB/wEAAR4BVwH/ATYBLwEpAf8BkgFEASAB/wG5
AYsBQQH/AyQB/wO0Af8DHQH/Ag4BigH/ARIBKwGHAf8BJAGFAakB/wE7AasB1AH/AVQB0QHeAf8BWQHU AYABMAH/AdIBkgE8Af8B1QGUAT0B/wHVAZQBPQH/AdUBlAE9Af8B1QGUAT0B/wHVAZQBPQH/AdUBlAE9
AeEB/wFcAdQB4QH/AV4B1AHhAf8BXgHUAeEB/wFcAdQB4QH/AVkB1AHhAf8BWQHUAeEB/wFZAdMB4AH/ Af8BxQGLATkB/wMcAf8DtAH/AxUB/wIGAYoB/wEKASMBhwH/ARwBhQGpAf8BMwGrAdQB/wFMAdEB3gH/
AVkB0QHeAf8BWQHRAd4B/wFZAdEB3gH/AVkB0QHeAf8BWQHRAd4B/wFZAdEB3gH/AVkB0QHeAf8BWQHR AVEB1AHhAf8BVAHUAeEB/wFWAdQB4QH/AVYB1AHhAf8BVAHUAeEB/wFRAdQB4QH/AVEB1AHhAf8BUQHT
Ad4B/wFZAdEB3gH/AVkB0QHeAf8BWQHRAd4B/wFZAdEB4QH/AVkB1AHhAf8BWQHUAeEB/wFUAdQB4QH/ AeAB/wFRAdEB3gH/AVEB0QHeAf8BUQHRAd4B/wFRAdEB3gH/AVEB0QHeAf8BUQHRAd4B/wFRAdEB3gH/
ATwBsgHYAf8BJgGFAa8B/wESASsBiwH/Ag4BigH/QwABAQMFAQcDFAEbAzUBVgNUAa8BWgJdAfAB8wH4 AVEB0QHeAf8BUQHRAd4B/wFRAdEB3gH/AVEB0QHeAf8BUQHRAeEB/wFRAdQB4QH/AVEB1AHhAf8BTAHU
AfwB/wHUA/8BxAH8Av8BxgH+Av8B6AP/AYcBjwGTAfsBVQJWAbEDLQFFAwcBCoQAAx0B/wOnAf8DHQH/ AeEB/wE0AbIB2AH/AR4BhQGvAf8BCgEjAYsB/wIGAYoB/0MAAQEDBQEHAxQBGwM1AVYDVAGvAVoCXQHw
Ac4BhwFCAf8B1QGLAUQB/wHVAYsBRAH/AcsBhAFAAf8BvQFhATkB/wHEAYABPQH/AcABYwE7Af8BlQFH AfMB+AH8Af8B1AP/AcQB/AL/AcYB/gL/AegD/wF/AYcBiwH7AVUCVgGxAy0BRQMHAQovAAH/AwAB/wMA
ASgB/wGNAUQBKQH/AUIBNQExAf8BAAEpAVYB/wEAAQ4BTAH/ASQBkQGyAf8BWQHVAeYB/wEBAUIBiQH/ Af8DAAH/AwAB/0QAAxUB/wOnAf8DFQH/Ac4BhwE6Af8B1QGLATwB/wHVAYsBPAH/AcsBhAE4Af8BvQFZ
AQABFAFSAf8BBwEtAU0B/wFYATsBLAH/AZIBRgEoAf8BsQFaATQB/wHDAYABPAH/AcMBgAE8Af8BugFg ATEB/wHEAYABNQH/AcABWwEzAf8BlQE/ASAB/wGNATwBIQH/AToBLQEpAf8BAAEhAU4B/wEAAQYBRAH/
ATgB/wHTAYoBQwH/AdUBiwFEAf8BxQGCAUAB/wMkAf8DpwH/Ax0B/wINAYEB/wEWATcBkAH/ATcBoQHC ARwBkQGyAf8BUQHVAeYB/wEAAToBiQH/AQABDAFKAf8BAAElAUUB/wFQATMBJAH/AZIBPgEgAf8BsQFS
Af8BKAFhAaQB/wEcATMBYgH/AR0BMwGEAf8BHgEzAYgB/wEfATMBiAH/AR8BMwGBAf8BHgEzAYEB/wEd ASwB/wHDAYABNAH/AcMBgAE0Af8BugFYATAB/wHTAYoBOwH/AdUBiwE8Af8BxQGCATgB/wMcAf8DpwH/
ATMBgQH/AR0BMwFiAf8BHQEzAWEB/wEdATMBYQH/AR0BMwFhAf8BHQEzAWEB/wEdATMBYQH/AR0BMwFh AxUB/wIFAYEB/wEOAS8BkAH/AS8BoQHCAf8BIAFZAaQB/wEUASsBWgH/ARUBKwGEAf8BFgErAYgB/wEX
Af8BHQEzAWEB/wEdATMBYQH/AR0BMwGBAf8BHQEzAYEB/wEdATMBgQH/AR0BMwGBAf8BHwE0AYgB/wEi ASsBiAH/ARcBKwGBAf8BFgErAYEB/wEVASsBgQH/ARUBKwFaAf8BFQErAVkB/wEVASsBWQH/ARUBKwFZ
ATcBiAH/AR0BMwGEAf8BHAEzAWIB/wEoAWMBpAH/ATcBoQHDAf8BFgE3AZEB/wINAYEB/z8AAQEDBAEG Af8BFQErAVkB/wEVASsBWQH/ARUBKwFZAf8BFQErAVkB/wEVASsBWQH/ARUBKwGBAf8BFQErAYEB/wEV
AxIBGAMyAVADUgGpAVkCZAHsAagBuAHCAf4B2QP/AcQB/AL/AcMB+wL/AcMB+wL/AdcD/wGrAbIBtgH9 ASsBgQH/ARUBKwGBAf8BFwEsAYgB/wEaAS8BiAH/ARUBKwGEAf8BFAErAVoB/wEgAVsBpAH/AS8BoQHD
AVcCWQG/AzIBUAMIAQuEAAMdAf8DmwH/Ax0B/wHOAWUBQAH/AdUBgwFCAf8BywFjAT4B/wGDATwBKQH/ Af8BDgEvAZEB/wIFAYEB/z8AAQEDBAEGAxIBGAMyAVADUgGpAVkCZAHsAZgBqAGyAf4B2QP/AcQB/AL/
AU4BNAEsAf8BXAE3ASoB/wFUATUBKwH/ASUBMgE9Af8BAAEsAVoB/wEAARQBVgH/AQABMQFgAf8BUwHQ AcMB+wL/AcMB+wL/AdcD/wGoAaoBrgH9AVcCWQG/AzIBUAMIAQsvAAH/AwAB/wMAAf8DAAH/AwAB/0QA
AecB/wFeAd0B8QH/AUMBpwGxAf8BZAHhAfcB/wE6AakBxQH/AQABFQFMAf8BAAEgAV0B/wEAAS8BUgH/ AxUB/wObAf8DFQH/Ac4BXQE4Af8B1QGDAToB/wHLAVsBNgH/AYMBNAEhAf8BRgEsASQB/wFUAS8BIgH/
ATYBMgE0Af8BWgE2ASoB/wFbATYBKgH/AUkBNAEwAf8BlAFBASYB/wHTAYIBQQH/AcUBYQE+Af8DIwH/ AUwBLQEjAf8BHQEqATUB/wEAASQBUgH/AQABDAFOAf8BAAEpAVgB/wFLAdAB5wH/AVYB3QHxAf8BOwGn
A5sB/wMdAf8CDQFkAf8BFwE4AYsB/wEwAZwBvQH/AQ4BHwFPAf8BCQESAVsB/wETATkBmAH/ARIBPAGd AbEB/wFcAeEB9wH/ATIBqQHFAf8BAAENAUQB/wEAARgBVQH/AQABJwFKAf8BLgEqASwB/wFSAS4BIgH/
Af8BEgE6AZ0B/wESATkBnAH/ARIBOQGWAf8BEQE4AZUB/wEUATYBkQH/AQYBEAFbAf8CCAFSAf8CCAFS AVMBLgEiAf8BQQEsASgB/wGUATkBHgH/AdMBggE5Af8BxQFZATYB/wMbAf8DmwH/AxUB/wIFAVwB/wEP
Af8CCAFSAf8CCAFSAf8CCAFSAf8BBwEOAVkB/wETATIBkgH/ARIBNAGUAf8BDAEqAY0B/wEWAUABmAH/ ATABiwH/ASgBnAG9Af8BBgEXAUcB/wEBAQoBUwH/AQsBMQGYAf8BCgE0AZ0B/wEKATIBnQH/AQoBMQGc
AQgBIwGOAf8BFgFAAZ8B/wESATABkwH/AQ4BEwFbAf8CCAFMAf8BDgEdAU0B/wEwAZcBtAH/ARcBNwGI Af8BCgExAZYB/wEJATABlQH/AQwBLgGRAf8BAAEIAVMB/wIAAUoB/wIAAUoB/wIAAUoB/wIAAUoB/wIA
Af8CDQFkAf87AAEBAwQBBgMQARUDLAFDAU8CUAGbAVgCYgHpAagBuAHCAf4B3gP/AcYB/gL/AcMB+wL/ AUoB/wEAAQYBUQH/AQsBKgGSAf8BCgEsAZQB/wEEASIBjQH/AQ4BOAGYAf8BAAEbAY4B/wEOATgBnwH/
AcMB+wL/AcgD/wHsA/8BhwGQAZMB+wFVAlYBsQMtAUUDBwEKhAADHQH/A5MB/wMdAf8BzAFdAT4B/wHT AQoBKAGTAf8BBgELAVMB/wIAAUQB/wEGARUBRQH/ASgBlwG0Af8BDwEvAYgB/wIFAVwB/zsAAQEDBAEG
AWABQAH/Ac4BXQE+Af8BigE5ASYB/wEGAUEBhAH/AQABOQGNAf8BAAExAYgB/wEAAScBgQH/ARUBXAGf AxABFQMsAUMBTwJQAZsBWAJiAekBmAGoAbIB/gHeA/8BxgH+Av8BwwH7Av8BwwH7Av8ByAP/AewD/wF/
Af8BVwHVAeYB/wGQAe8B/gH/AToBmwG8Af8BRgEcATMB/wGRARgBMQH/ATUBMgFKAf8BUQHKAeYB/wGQ AYgBiwH7AVUCVgGxAy0BRQMHAQovAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/
Ae0B+gH/AUEBtAHKAf8BAQFCAZIB/wEAASkBgQH/AQABMgGHAf8BAAFDAZYB/wEjATMBRgH/AZMBOwEl JAADFQH/A5MB/wMVAf8BzAFVATYB/wHTAVgBOAH/Ac4BVQE2Af8BigExAR4B/wEAATkBhAH/AQABMQGN
Af8B0gFgAUAB/wHDAVkBPAH/AyIB/wOTAf8DHQH/Ag0BZAH/ARcBOQGLAf8BMAGdAb0B/wEOAR8BVgH/ Af8BAAEpAYgB/wEAAR8BgQH/AQ0BVAGfAf8BTwHVAeYB/wGQAe8B/gH/ATIBmwG8Af8BPgEUASsB/wGR
AREBOAGVAf8BTQHWAekB/wFOAdcB8AH/AU0B0gHwAf8BTQHRAfAB/wFNAdEB7gH/AUoBzQHrAf8BRwHF ARABKQH/AS0BKgFCAf8BSQHKAeYB/wGQAe0B+gH/ATkBtAHKAf8BAAE6AZIB/wEAASEBgQH/AQABKgGH
AecB/wEIARwBigH/Ag8BXAH/Ag8BXAH/Ag8BXAH/Ag8BXAH/AQ4BEAFdAf8BBgEeAYwB/wFIAcEB4gH/ Af8BAAE7AZYB/wEbASsBPgH/AZMBMwEdAf8B0gFYATgB/wHDAVEBNAH/AxoB/wOTAf8DFQH/AgUBXAH/
AUIBxAHoAf8BIAGKAc8B/wFWAeEB9QH/AQ0BVgHDAf8BWAHhAfUB/wEzAaIB1QH/AQgBHQGSAf8BBwEM AQ8BMQGLAf8BKAGdAb0B/wEGARcBTgH/AQkBMAGVAf8BRQHWAekB/wFGAdcB8AH/AUUB0gHwAf8BRQHR
AVgB/wEOAR0BVQH/AS4BlAG0Af8BFwE0AYgB/wINAWQB/zgAAwQBBQMNARIDKAE8A0oBigFeAmEB2gGo AfAB/wFFAdEB7gH/AUIBzQHrAf8BPwHFAecB/wEAARQBigH/AgcBVAH/AgcBVAH/AgcBVAH/AgcBVAH/
Aa8BtQH9AeID/wHGAf4C/wHDAfsC/wHDAfsC/wHJA/8B6QP/AagBrwG1Af0BXAJhAdwDRwGCAx0BKgMF AQYBCAFVAf8BAAEWAYwB/wFAAcEB4gH/AToBxAHoAf8BGAGKAc8B/wFOAeEB9QH/AQUBTgHDAf8BUAHh
AQeEAAMdAf8DjwH/Ax0B/wHJAVoBPQH/AdABXQE/Af8B0AFdAT8B/wGmAUUBLQH/ASsBLwE9Af8BEQFb AfUB/wErAaIB1QH/AQABFQGSAf8BAAEEAVAB/wEGARUBTQH/ASYBlAG0Af8BDwEsAYgB/wIFAVwB/zgA
AaMB/wFDAasB0gH/AZIB6wH4Af8BiQHqAfcB/wFCAaIBvAH/AUIBLwFIAf8BmgEjAUkB/wG/ATYBiwH/ AwQBBQMNARIDKAE8A0oBigFeAmEB2gKoAa0B/QHiA/8BxgH+Av8BwwH7Av8BwwH7Av8ByQP/AekD/wKo
AcEBOwGTAf8BuwE0AYIB/wGCARwBOwH/AToBSwFlAf8BUQHDAdsB/wGTAfAB/AH/AYYB4QHzAf8BMAGR Aa0B/QFcAmEB3ANHAYIDHQEqAwUBBy8AAf8DAAH/AwAB/wMAAf8DAAH/DgAC/wIAAv8CAAL/AgAC/wIA
AbkB/wEKAVYBnwH/AVgBMAEoAf8BvAFSATcB/wHQAV0BPwH/AcABVgE7Af8DIgH/A48B/wMdAf8CDQFk Av8kAAMVAf8DjwH/AxUB/wHJAVIBNQH/AdABVQE3Af8B0AFVATcB/wGmAT0BJQH/ASMBJwE1Af8BCQFT
Af8BFwE5AYsB/wEwAZ0BvQH/AQ4BHwFaAf8BDgE6AZ8B/wFUAeIB9QH/AVsB7AL/AWAB7gL/AWEB7gL/ AaMB/wE7AasB0gH/AZIB6wH4Af8BiQHqAfcB/wE6AaIBvAH/AToBJwFAAf8BmgEbAUEB/wG/AS4BiwH/
AWEB7gL/AWEB7gL/AUABwAHrAf8BCAEcAY8B/wIPAWEB/wIPAV4B/wIPAVwB/wIPAV0B/wELARQBggH/ AcEBMwGTAf8BuwEsAYIB/wGCARQBMwH/ATIBQwFdAf8BSQHDAdsB/wGTAfAB/AH/AYYB4QHzAf8BKAGR
ASIBYAG+Af8BUgHaAfgB/wEiAZgB3wH/AUEBxAHxAf8BNQG2AeoB/wEtAawB5QH/AU0B1gH5Af8BJwGf AbkB/wECAU4BnwH/AVABKAEgAf8BvAFKAS8B/wHQAVUBNwH/AcABTgEzAf8DGgH/A48B/wMVAf8CBQFc
AeEB/wEwAZ8B0wH/AQ4BKQGMAf8BDQEdAVgB/wErAZQBtAH/ARcBNAGIAf8CDQFkAf8kAAMBAQIDAwQE Af8BDwExAYsB/wEoAZ0BvQH/AQYBFwFSAf8BBgEyAZ8B/wFMAeIB9QH/AVMB7AL/AVgB7gL/AVkB7gL/
BAYECAELAw8BFAMkATYBRgJHAYABWAJcAdEBhwGQAZQB+wHpA/8ByAP/AcMB+wL/AcMB+wL/AcwD/wHw AVkB7gL/AVkB7gL/ATgBwAHrAf8BAAEUAY8B/wIHAVkB/wIHAVYB/wIHAVQB/wIHAVUB/wEDAQwBggH/
A/8BhwGQAZQB+wFZAl0B1wNMAZIDKwFCAw0BEgMDAQSEAAMdAf8DjwH/Ax0B/wHHAVgBPQH/Ac4BWwE/ ARoBWAG+Af8BSgHaAfgB/wEaAZgB3wH/ATkBxAHxAf8BLQG2AeoB/wElAawB5QH/AUUB1gH5Af8BHwGf
Af8BzgFbAT8B/wGmAUUBLgH/AisBOQH/AQcBSwGQAf8BKgGHAakB/wEdATIBSgH/AVEBFQEsAf8BpQEk AeEB/wEoAZ8B0wH/AQYBIQGMAf8BBQEVAVAB/wEjAZQBtAH/AQ8BLAGIAf8CBQFcAf8kAAMBAQIDAwQE
AUwB/wHCATcBjAH/AcsBRgGkAf8B0gFOAbEB/wHUAU8BtAH/AdEBTAGwAf8BygFFAaIB/wG+ATUBhAH/ BAYECAELAw8BFAMkATYBRgJHAYABWAJcAdEBfwGIAYwB+wHpA/8ByAP/AcMB+wL/AcMB+wL/AcwD/wHw
AZIBHgFCAf8BQwEaASwB/wEVAUUBYwH/AS8BigGsAf8BAAFAAYgB/wFXATABKAH/Ab0BUQE4Af8BzgFb A/8BfwGIAYwB+wFZAl0B1wNMAZIDKwFCAw0BEgMDAQQvAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/
AT8B/wG/AVUBOwH/AyIB/wOPAf8DHQH/Ag0BZAH/ARcBOAGLAf8BMAGcAbkB/wEOAR8BVAH/AQ4BOgGf AgAC/wIAAv8CAAL/JAADFQH/A48B/wMVAf8BxwFQATUB/wHOAVMBNwH/Ac4BUwE3Af8BpgE9ASYB/wIj
Af8BVAHhAfUB/wFZAecC/wFaAegC/wFbAegC/wFdAeoC/wFhAe4C/wFAAcAB6wH/AQgBHAGOAf8CDwFb ATEB/wEAAUMBkAH/ASIBhwGpAf8BFQEqAUIB/wFJAQ0BJAH/AaUBHAFEAf8BwgEvAYwB/wHLAT4BpAH/
Af8CDwFaAf8CDwFZAf8CDwFZAf8BCwEVAYEB/wE4AaEB1AH/AVkB5gL/AQ8BUgHBAf8BWQHmAv8BIQGP AdIBRgGxAf8B1AFHAbQB/wHRAUQBsAH/AcoBPQGiAf8BvgEtAYQB/wGSARYBOgH/ATsBEgEkAf8BDQE9
AdQB/wFGAckB8QH/AUYByQHxAf8BIQGPAdUB/wFPAdwB9QH/ARMBOAGYAf8BDgEdAVMB/wEvAZQBtAH/ AVsB/wEnAYoBrAH/AQABOAGIAf8BTwEoASAB/wG9AUkBMAH/Ac4BUwE3Af8BvwFNATMB/wMaAf8DjwH/
ARcBNAGIAf8CDQFkAf8cAAMCAQMDBgEIAw0BEQMXASADIgEyAyoBQAMsAUMDMQFOA0cBggFZAlwBzAF2 AxUB/wIFAVwB/wEPATABiwH/ASgBnAG5Af8BBgEXAUwB/wEGATIBnwH/AUwB4QH1Af8BUQHnAv8BUgHo
AYABjAH6Ae0D/wHJA/8BwwH7Av8BwwH7Av8BzQP/AfgD/wFtAXoBfgH4AVwCXgHOAUgCSQGHAysBQgMR Av8BUwHoAv8BVQHqAv8BWQHuAv8BOAHAAesB/wEAARQBjgH/AgcBUwH/AgcBUgH/AgcBUQH/AgcBUQH/
ARcDBAEGAwABAYQAAx0B/wOQAf8DHQH/AcUBVgE8Af8BzAFZAT4B/wHMAVkBPgH/AaQBQgEtAf8BKAEr AQMBDQGBAf8BMAGhAdQB/wFRAeYC/wEHAUoBwQH/AVEB5gL/ARkBjwHUAf8BPgHJAfEB/wE+AckB8QH/
ATsB/wEDAUUBiQH/AQUBSgGNAf8BNAEkAT4B/wG8AS0BYgH/AcQBPQGcAf8B0QFNAa8B/wHcAVkBwQH/ ARkBjwHVAf8BRwHcAfUB/wELATABmAH/AQYBFQFLAf8BJwGUAbQB/wEPASwBiAH/AgUBXAH/HAADAgED
AeYBYgHNAf8B6QFlAdIB/wHmAWMBzQH/Ad0BWgHBAf8B0AFNAa8B/wHFAT4BmwH/AbMBKQFRAf8BBAEy AwYBCAMNAREDFwEgAyIBMgMqAUADLAFDAzEBTgNHAYIBWQJcAcwBbgF3AXsB+gHtA/8ByQP/AcMB+wL/
AVMB/wEWAVEBkAH/AQABOgGDAf8BVgEvASgB/wG7AVABNwH/AcwBWQE+Af8BvQFTAToB/wMiAf8DkAH/ AcMB+wL/Ac0D/wH4A/8BXQFyAXYB+AFcAl4BzgFIAkkBhwMrAUIDEQEXAwQBBgMAAQEvAAH/AwAB/wMA
Ax0B/wINAWQB/wEXATgBiwH/ATABmwG4Af8BDgEeAVIB/wERATIBkgH/AT0BuwHgAf8BQQG8AeYB/wFB Af8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/JAADFQH/A5AB/wMVAf8BxQFOATQB/wHMAVEBNgH/
Ab8B5gH/AUgBvwHkAf8BSAHBAecB/wFIAcUB6wH/AUMBvwHkAf8BCAEZAYQB/wIOAVkB/wINAVkB/wIH AcwBUQE2Af8BpAE6ASUB/wEgASMBMwH/AQABPQGJAf8BAAFCAY0B/wEsARwBNgH/AbwBJQFaAf8BxAE1
AVkB/wIHAVkB/wEKAQ0BXAH/AQcBFgGFAf8BCAEcAY0B/wEIARcBiAH/AQgBHAGPAf8BCAEYAYsB/wEI AZwB/wHRAUUBrwH/AdwBUQHBAf8B5gFaAc0B/wHpAV0B0gH/AeYBWwHNAf8B3QFSAcEB/wHQAUUBrwH/
ARsBlAH/AQkBHAGWAf8BDAEcAZMB/wEIARwBkgH/AQYBEAFdAf8BDgEdAVIB/wEwAZQBtAH/ARcBNAGI AcUBNgGbAf8BswEhAUkB/wEAASoBSwH/AQ4BSQGQAf8BAAEyAYMB/wFOAScBIAH/AbsBSAEvAf8BzAFR
Af8CDQFkAf8XAAEBAwQBBQMKAQ4DGgElAzEBTQNEAXkBTwJQAZsBUwJUAawDVAGuA1UBtQFaAl4B2AFt ATYB/wG9AUsBMgH/AxoB/wOQAf8DFQH/AgUBXAH/AQ8BMAGLAf8BKAGbAbgB/wEGARYBSgH/AQkBKgGS
AXoBggH3AfQD/wHKA/8BwwH7Av8BxAH8Av8B0Qf/AW0BegGCAfcBWAJbAcYDQwF4AyYBOAMQARUDBAEG Af8BNQG7AeAB/wE5AbwB5gH/ATkBvwHmAf8BQAG/AeQB/wFAAcEB5wH/AUABxQHrAf8BOwG/AeQB/wEA
AwABAYgAAx0B/wOSAf8DHQH/AcMBUwE7Af8BygFWAT0B/wHIAVUBPAH/AYwBNAEjAf8BEQEqAUcB/wEM AREBhAH/AgYBUQH/AgUBUQH/AgABUQH/AgABUQH/AQIBBQFUAf8BAAEOAYUB/wEAARQBjQH/AQABDwGI
AUoBjAH/AQwBVgGdAf8BUQEiAT4B/wHCATcBkAH/Ac0BSAGrAf8B3gFcAcQB/wHvAYcB2gH/AfsBkwHs Af8BAAEUAY8B/wEAARABiwH/AQABEwGUAf8BAQEUAZYB/wEEARQBkwH/AQABFAGSAf8BAAEIAVUB/wEG
Af8B/QGYAfQB/wH7AZMB7AH/Ae8BhwHaAf8B3gFcAcQB/wHOAUgBrAH/Ab0BNAGEAf8BIAE0AVQB/wEe ARUBSgH/ASgBlAG0Af8BDwEsAYgB/wIFAVwB/xcAAQEDBAEFAwoBDgMaASUDMQFNA0QBeQFPAlABmwFT
AV0BnQH/AQABOQGEAf8BRAErAS0B/wGwAUgBMgH/AcoBVgE9Af8BuwFQATkB/wMiAf8DkgH/Ax0B/wIN AlQBrANUAa4DVQG1AVoCXgHYAm0BcQH3AfQD/wHKA/8BwwH7Av8BxAH8Av8B0Qf/Am0BcQH3AVgCWwHG
AWQB/wEXATgBigH/ATABlwG2Af8BDgEdAVIB/wEHAQ4BWwH/AQoBGwGPAf8BCgEdAZcB/wEKAR0BlwH/ A0MBeAMmATgDEAEVAwQBBgMAAQEzAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/
AQoBHQGPAf8BCgEdAY8B/wEKAR0BjwH/AQoBGgGIAf8BCgEOAV0B/wIJAVkB/wIGAVkB/wIGAVkB/wIG JAADFQH/A5IB/wMVAf8BwwFLATMB/wHKAU4BNQH/AcgBTQE0Af8BjAEsARsB/wEJASIBPwH/AQQBQgGM
AVkB/wIGAVkB/wIJAVkB/wIOAVkB/wIPAVsB/wIPAWEB/wIPAWEB/wIPAWUB/wIPAYMB/wIPAYMB/wIP Af8BBAFOAZ0B/wFJARoBNgH/AcIBLwGQAf8BzQFAAasB/wHeAVQBxAH/Ae8BhwHaAf8B+wGTAewB/wH9
AWQB/wIIAVMB/wEOAR0BUgH/ATABlAG0Af8BFwE0AYgB/wINAWQB/xMAAQEDBAEGAw8BFAMkATUBPwJA AZgB9AH/AfsBkwHsAf8B7wGHAdoB/wHeAVQBxAH/Ac4BQAGsAf8BvQEsAYQB/wEYASwBTAH/ARYBVQGd
AW8DVgGzAVsCYQHhAmUBZgH0AXEBfQGKAfoBbQF6AX4B+AFZAWYBawH1AWgBegGGAvoD/wHNA/8BwwH7 Af8BAAExAYQB/wE8ASMBJQH/AbABQAEqAf8BygFOATUB/wG7AUgBMQH/AxoB/wOSAf8DFQH/AgUBXAH/
Av8BxAH8Av8B1AP/AfMB+AH8Af8BWQFnAWwB9QFWAlgBwQNAAXADIAEuAwsBDwMEAQUDAAEBjAADHQH/ AQ8BMAGKAf8BKAGXAbYB/wEGARUBSgH/AQABBgFTAf8BAgETAY8B/wECARUBlwH/AQIBFQGXAf8BAgEV
A5YB/wMdAf8BwQFQATsB/wHIAVMBPAH/AcQBUQE6Af8BhwExASMB/wEAATABWgH/AR4BWAGXAf8BEAFT AY8B/wECARUBjwH/AQIBFQGPAf8BAgESAYgB/wECAQYBVQH/AgEBUQH/AgABUQH/AgABUQH/AgABUQH/
AZcB/wGAASEBQgH/AcYBPQGaAf8B1QFRAbcB/wHqAYAB0gH/AfwBlgHxAv8BqAH+Av8BrwP/AagB/gH/ AgABUQH/AgEBUQH/AgYBUQH/AgcBUwH/AgcBWQH/AgcBWQH/AgcBXQH/AgcBgwH/AgcBgwH/AgcBXAH/
AfwBlgHxAf8B6gGAAdIB/wHWAVEBtwH/AcUBOwGTAf8BNwEtAUkB/wEcAV8BoAH/AQQBRQGNAf8BIgEq AgABSwH/AQYBFQFKAf8BKAGUAbQB/wEPASwBiAH/AgUBXAH/EwABAQMEAQYDDwEUAyQBNQE/AkABbwNW
AT4B/wGMATIBIgH/AccBUwE8Af8BuQFNATkB/wMjAf8DlgH/Ax0B/wINAWMB/wEXATYBhQH/AS0BlQG0 AbMBWwJhAeEDZQH0AWkBdQF6AfoBXQFyAXYB+AJZAWAB9QFaAXIBeQL6A/8BzQP/AcMB+wL/AcQB/AL/
Af8BDQEdAVIB/wIIAVMB/wIPAWQB/wIPAYMB/wIPAYMB/wIPAWEB/wIPAWEB/wIPAV4B/wIPAVoB/wIJ AdQD/wHzAfgB/AH/AlkBYgH1AVYCWAHBA0ABcAMgAS4DCwEPAwQBBQMAAQEbAAH/AwAB/wMAAf8DAAH/
AVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wINAVkB/wIPAVsB/wIPAWEB/wIP AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8OAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/
AWEB/wIPAWEB/wIPAYMB/wIPAYMB/wIPAWQB/wIIAVMB/wEOAR0BUgH/ATABlAG0Af8BFwE0AYgB/wIN AgAC/wIAAv8CAAL/AgAC/wwAAxUB/wOWAf8DFQH/AcEBSAEzAf8ByAFLATQB/wHEAUkBMgH/AYcBKQEb
AWQB/xAAAwIBAwMLAQ8DIwE0AUQCRQF8AVcCWgHFAW0BfQGDAfcB8wH4AfwB/wHxA/8B5wP/AeoD/wHv Af8BAAEoAVIB/wEWAVABlwH/AQgBSwGXAf8BgAEZAToB/wHGATUBmgH/AdUBSQG3Af8B6gGAAdIB/wH8
A/8B5AP/Ac0D/wHDAfsC/wHGAf4C/wHaA/8B8wH4AfwB/wFkAWUBZgH0AVYCWAG8Az0BaQMdASoDCgEN AZYB8QL/AagB/gL/Aa8D/wGoAf4B/wH8AZYB8QH/AeoBgAHSAf8B1gFJAbcB/wHFATMBkwH/AS8BJQFB
AwMBBJQAAx0B/wOaAf8DHQH/Ab4BTwE6Af8BxQFRATsB/wGvAUUBMgH/AVEBKwEmAf8BAAE6AYsB/wE1 Af8BFAFXAaAB/wEAAT0BjQH/ARoBIgE2Af8BjAEqARoB/wHHAUsBNAH/AbkBRQExAf8DGwH/A5YB/wMV
AYkBqwH/AQ4BQgFlAf8BqQEpAVMB/wHIAUEBoQH/AdoBVgG8Af8B8AGIAdwB/wH+AZ8B+gL/AbQD/wHC Af8CBQFbAf8BDwEuAYUB/wElAZUBtAH/AQUBFQFKAf8CAAFLAf8CBwFcAf8CBwGDAf8CBwGDAf8CBwFZ
A/8BtAL/Af4BnwH6Af8B8AGIAdwB/wHbAVYBvQH/AckBQAGdAf8BXQEiAUEB/wEYAVwBnQH/ASQBYQGi Af8CBwFZAf8CBwFWAf8CBwFSAf8CAQFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CAAFR
Af8BAAEvAVoB/wGGATABIgH/AcMBUAE6Af8BtgFMATgB/wMjAf8DmgH/Ax0B/wINAWIB/wEXATQBgwH/ Af8CBQFRAf8CBwFTAf8CBwFZAf8CBwFZAf8CBwFZAf8CBwGDAf8CBwGDAf8CBwFcAf8CAAFLAf8BBgEV
AS8BlAG0Af8BDgEdAVIB/wIIAVMB/wIPAWQB/wIPAYMB/wIPAYMB/wIPAWEB/wIPAWEB/wIPAVwB/wIP AUoB/wEoAZQBtAH/AQ8BLAGIAf8CBQFcAf8QAAMCAQMDCwEPAyMBNAFEAkUBfAFXAloBxQJtAXQB9wHz
AVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIHAVkB/wIPAVkB/wIP AfgB/AH/AfED/wHnA/8B6gP/Ae8D/wHkA/8BzQP/AcMB+wL/AcYB/gL/AdoD/wHzAfgB/AH/AWQCZQH0
AV0B/wIPAWEB/wIPAWEB/wIPAYMB/wIPAYMB/wIPAWQB/wIIAVMB/wEOAR0BUgH/ATABlAG0Af8BFwE0 AVYCWAG8Az0BaQMdASoDCgENAwMBBCMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
AYgB/wINAWQB/xAAAwMBBAMYASEDPQFpAVcCWQG/AXkBgQGMAfoB8QP/Ac4D/wHEAfwC/wHDAfsC/wHD Af8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/DAADFQH/
AfsC/wHDAfsC/wHDAfsC/wHDAfsC/wHGAf4C/wHeA/8BqAG4AcIB/gFOAl0B8AFVAlcBtwM7AWMDGgEl A5oB/wMVAf8BvgFHATIB/wHFAUkBMwH/Aa8BPQEqAf8BSQEjAR4B/wEAATIBiwH/AS0BiQGrAf8BBgE6
AwkBDAMDAQSYAAMdAf8DnwH/Ax0B/wG7AUwBOQH/AcABTQE5Af8BhgEvASEB/wEUASkBQgH/AQUBSAGU AV0B/wGpASEBSwH/AcgBOQGhAf8B2gFOAbwB/wHwAYgB3AH/Af4BnwH6Av8BtAP/AcID/wG0Av8B/gGf
Af8BPAGVAbkB/wEsATMBTgH/AbgBLAFgAf8BxwFBAaAB/wHZAVUBuwH/Ae8BhQHaAf8B/gGdAfoC/wGx AfoB/wHwAYgB3AH/AdsBTgG9Af8ByQE4AZ0B/wFVARoBOQH/ARABVAGdAf8BHAFZAaIB/wEAAScBUgH/
A/8BvAP/AbEC/wH+AZ0B+gH/Ae8BhQHaAf8B2QFVAbwB/wHHAUABnwH/AaQBJgFPAf8BFwFMAYkB/wFC AYYBKAEaAf8BwwFIATIB/wG2AUQBMAH/AxsB/wOaAf8DFQH/AgUBWgH/AQ8BLAGDAf8BJwGUAbQB/wEG
AZcBuAH/AQABOAGKAf8BUAEqAScB/wGtAUMBMQH/AbMBSQE3Af8DIwH/A58B/wMdAf8CDQFiAf8BFwE0 ARUBSgH/AgABSwH/AgcBXAH/AgcBgwH/AgcBgwH/AgcBWQH/AgcBWQH/AgcBVAH/AgcBUQH/AgABUQH/
AYMB/wEwAZQBtAH/AQ4BHQFSAf8BCQEaAWQB/wEWAUQBrAH/ARcBSQG2Af8BFQFHAbAB/wEPATYBogH/ AgABUQH/AgABUQH/AgABUQH/AgABUQH/AgABUQH/AgABUQH/AgABUQH/AgcBUQH/AgcBVQH/AgcBWQH/
AQsBIAGOAf8BDAETAWQB/wIPAVsB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIGAVkB/wIG AgcBWQH/AgcBgwH/AgcBgwH/AgcBXAH/AgABSwH/AQYBFQFKAf8BKAGUAbQB/wEPASwBiAH/AgUBXAH/
AVkB/wIHAVkB/wIPAVkB/wIPAVwB/wIPAWEB/wIPAWEB/wIPAYMB/wIPAYMB/wIPAWQB/wIIAVMB/wEO EAADAwEEAxgBIQM9AWkBVwJZAb8BcQF3AXsB+gHxA/8BzgP/AcQB/AL/AcMB+wL/AcMB+wL/AcMB+wL/
AR0BUgH/AS8BlAG0Af8BFwE0AYgB/wINAWQB/xAAAwQBBgMjATMBTQJOAZUCZQFmAfQE/wHaA/8B2QP/ AcMB+wL/AcMB+wL/AcYB/gL/Ad4D/wGYAagBsgH+AU4CXQHwAVUCVwG3AzsBYwMaASUDCQEMAwMBBCcA
AeAD/wHdA/8BzwP/AcUB/QL/AcMB+wL/AcMB+wL/AdMD/wGoAbgBwgH+AU4CXQHwAVUCVwG3AzoBYAMY Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIA
ASIDCAELAwIBA5wAAx0B/wOkAf8DHQH/AbkBSQE3Af8BoAE7ASsB/wFLAScBJQH/AQABKQFhAf8BKwFg Av8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/DAADFQH/A58B/wMVAf8BuwFEATEB/wHAAUUBMQH/
AaIB/wETAVEBkgH/AVkBGQEqAf8BtwEsAWMB/wHCAT0BmwH/AdMBTwGzAf8B5gFkAc8B/wH6AZEB6wL/ AYYBJwEZAf8BDAEhAToB/wEAAUABlAH/ATQBlQG5Af8BJAErAUYB/wG4ASQBWAH/AccBOQGgAf8B2QFN
AaAB/AL/AagB/gL/AaAB/AH/AfoBkQHrAf8B5gFkAc8B/wHTAU8BtAH/AcMBPAGaAf8BtgEqAVcB/wEt AbsB/wHvAYUB2gH/Af4BnQH6Av8BsQP/AbwD/wGxAv8B/gGdAfoB/wHvAYUB2gH/AdkBTQG8Af8BxwE4
ASUBOQH/AScBYgGkAf8BCAFGAZEB/wEPASEBPQH/AYQBLQEfAf8BqQFCATIB/wMjAf8DpAH/Ax0B/wIN AZ8B/wGkAR4BRwH/AQ8BRAGJAf8BOgGXAbgB/wEAATABigH/AUgBIgEfAf8BrQE7ASkB/wGzAUEBLwH/
AWMB/wEXATQBhQH/ATABlAG0Af8BDgEdAVIB/wEVAToBkgH/AVQB5AH1Af8BWQHpAv8BUgHgAfgB/wE1 AxsB/wOfAf8DFQH/AgUBWgH/AQ8BLAGDAf8BKAGUAbQB/wEGARUBSgH/AQEBEgFcAf8BDgE8AawB/wEP
AbEB3wH/AR0BUgG1Af8BDwEhAYoB/wEPAREBWwH/AgkBWQH/AgYBWQH/AgYBWQH/AgYBWQH/AgYBWQH/ AUEBtgH/AQ0BPwGwAf8BBwEuAaIB/wEDARgBjgH/AQQBCwFcAf8CBwFTAf8CAAFRAf8CAAFRAf8CAAFR
AgYBWQH/AgYBWQH/Ag0BWQH/Ag8BWgH/Ag8BXgH/Ag8BYwH/AQwBFAGEAf8BCwEZAY0B/wELARcBjAH/ Af8CAAFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CAAFRAf8CBwFRAf8CBwFUAf8CBwFZAf8CBwFZAf8CBwGD
AQ4BEgGDAf8CCAFUAf8BDQEdAVIB/wEtAZUBtAH/ARcBNgGIAf8CDQFkAf8QAAMEAQYDIgEyAUwCTQGR Af8CBwGDAf8CBwFcAf8CAAFLAf8BBgEVAUoB/wEnAZQBtAH/AQ8BLAGIAf8CBQFcAf8QAAMEAQYDIwEz
AmQBZQHxAasBsQG0Af0BnAGxAb8B/gGoAa8BtQH9AYEBjQGTAfsBcAGIAZoB/AHnAfEB+AH/AdUD/wHD AU0CTgGVA2UB9AT/AdoD/wHZA/8B4AP/Ad0D/wHPA/8BxQH9Av8BwwH7Av8BwwH7Av8B0wP/AZgBqAGy
AfsC/wHDAfsC/wHgA/8BXwGIAZEB+wFaAl0B0wNCAXQDGgElAwYBCAMBAQKgAAMdAf8DqgH/Ax0B/wGp Af4BTgJdAfABVQJXAbcDOgFgAxgBIgMIAQsDAgEDKwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
AT8BMAH/AVMBKAElAf8BRAGWAbUB/wFdAcEB5AH/AZQB2AHrAf8BAAE3AYgB/wEGASoBSwH/AaEBIgFK Af8DAAH/AwAB/wMAAf8DAAH/DgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIA
Af8BvwE1AY4B/wHKAUUBpgH/AdoBVgG8Af8B6AGBAdIB/wH0AYoB4QH/AfkBkAHoAf8B9AGKAeEB/wHo Av8MAAMVAf8DpAH/AxUB/wG5AUEBLwH/AaABMwEjAf8BQwEfAR0B/wEAASEBWQH/ASMBWAGiAf8BCwFJ
AYEB0gH/AdoBVgG9Af8BywFFAaUB/wHAATQBigH/AWMBIQE+Af8BAAEoAVgB/wEkAWIBqQH/AZwB4QHv AZIB/wFRAREBIgH/AbcBJAFbAf8BwgE1AZsB/wHTAUcBswH/AeYBXAHPAf8B+gGRAesC/wGgAfwC/wGo
Af8BTwGwAdYB/wE3ATABOAH/AZABNAEnAf8DJAH/A6oB/wMdAf8CDQFkAf8BFwE0AYgB/wEwAZQBtAH/ Af4C/wGgAfwB/wH6AZEB6wH/AeYBXAHPAf8B0wFHAbQB/wHDATQBmgH/AbYBIgFPAf8BJQEdATEB/wEf
AQ4BHQFSAf8BCwEkAYoB/wEeAYwBzwH/AR4BkwHcAf8BHwGPAdUB/wEVAVwBwwH/AQ8BNgGlAf8BCgEa AVoBpAH/AQABPgGRAf8BBwEZATUB/wGEASUBFwH/AakBOgEqAf8DGwH/A6QB/wMVAf8CBQFbAf8BDwEs
AYkB/wEKARABYAH/Ag4BWQH/AgkBWQH/AgYBWQH/AgYBWQH/AgYBWQH/AgYBWQH/AgkBWQH/Ag4BWQH/ AYUB/wEoAZQBtAH/AQYBFQFKAf8BDQEyAZIB/wFMAeQB9QH/AVEB6QL/AUoB4AH4Af8BLQGxAd8B/wEV
Ag8BWwH/Ag8BYwH/AQ8BHgGOAf8BHAFUAbgB/wEyAZoB0gH/ASkBjQHLAf8BEwE7AaUB/wEIARABXAH/ AUoBtQH/AQcBGQGKAf8BBwEJAVMB/wIBAVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIA
AQ4BHQFSAf8BMAGXAbYB/wEXATgBigH/Ag0BZAH/EAADAwEEAxYBHgM2AVkBTwJRAZwBVwJZAb8BWQJc AVEB/wIFAVEB/wIHAVIB/wIHAVYB/wIHAVsB/wEEAQwBhAH/AQMBEQGNAf8BAwEPAYwB/wEGAQoBgwH/
AckBWgJdAcoBXAJeAc4BWAJfAeMBVwFiAWUB9gHwA/8BwwH7Av8BwwH7Av8B3QP/AXoBlAGgAfwDWQHH AgABTAH/AQUBFQFKAf8BJQGVAbQB/wEPAS4BiAH/AgUBXAH/EAADBAEGAyIBMgFMAk0BkQNkAfEBqAGp
AzcBWwMPARQDAAEBpAADHQH/A7AB/wMdAf8BrwFAATMB/wFiAScBHwH/AUUBIgEkAf8BQAFcAYUB/wGw AawB/QGMAaEBrwH+AqgBrQH9AW0BhQGLAfsBaAF6AYIB/AHnAfEB+AH/AdUD/wHDAfsC/wHDAfsC/wHg
Ae4B9wH/AZsB4wHvAf8BAAE6AZEB/wEPATYBTwH/AaUBJgFSAf8BwAE5AZUB/wHLAUcBqQH/AdYBUgG3 A/8BXwGAAYkB+wFaAl0B0wNCAXQDGgElAwYBCAMBAQIvAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
Af8B3gFcAcIB/wHhAV4BxgH/Ad4BXAHCAf8B1gFSAbcB/wHLAUcBqAH/AcMBOAGRAf8BgQEiAUQB/wEA AwAB/wMAAf8DAAH/AwAB/wMAAf8OAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/AgAC/wIAAv8CAAL/
AUABgAH/ARcBWgGlAf8BtwHzAfoB/wGWAdoB5AH/ATgBLQE1Af8BWAEmASEB/wGjATsBMAH/AyQB/wOw AgAC/wwAAxUB/wOqAf8DFQH/AakBNwEoAf8BSwEgAR0B/wE8AZYBtQH/AVUBwQHkAf8BlAHYAesB/wEA
Af8DHQH/Ag0BZAH/ARcBNAGIAf8BMAGUAbQB/wEOAR0BUgH/AQsBMgGPAf8BPgHHAegB/wFFAdAB8wH/ AS8BiAH/AQABIgFDAf8BoQEaAUIB/wG/AS0BjgH/AcoBPQGmAf8B2gFOAbwB/wHoAYEB0gH/AfQBigHh
AUYBywHyAf8BPAG7AeYB/wEmAY0BzAH/ARIBPQGlAf8BDQEZAYEB/wEIAQ4BWQH/AgcBWQH/AgYBWQH/ Af8B+QGQAegB/wH0AYoB4QH/AegBgQHSAf8B2gFOAb0B/wHLAT0BpQH/AcABLAGKAf8BWwEZATYB/wEA
AgYBWQH/AgYBWQH/AgYBWQH/AgcBWQH/AggBWQH/Ag8BWQH/AQwBEgFjAf8BGAFSAbUB/wFHAdAB8QH/ ASABUAH/ARwBWgGpAf8BnAHhAe8B/wFHAbAB1gH/AS8BKAEwAf8BkAEsAR8B/wMcAf8DqgH/AxUB/wIF
AVcB6QH9Af8BVAHlAfsB/wEwAakB3AH/AQoBIQGEAf8BDgEeAVIB/wEwAZsBuAH/ARcBOAGLAf8CDQFk AVwB/wEPASwBiAH/ASgBlAG0Af8BBgEVAUoB/wEDARwBigH/ARYBjAHPAf8BFgGTAdwB/wEXAY8B1QH/
Af8QAAMCAQMDCgENAxwBJwMvAUkDPAFmA0QBegNIAYQBTgJPAZcBWQJcAcwBUwJkAfEE/wHDAfsC/wHD AQ0BVAHDAf8BBwEuAaUB/wECARIBiQH/AQIBCAFYAf8CBgFRAf8CAQFRAf8CAAFRAf8CAAFRAf8CAAFR
AfsC/wHXA/8BqwGyAbYB/QNbAcgDNwFaAwsBD6gAAx0B/wO2Af8DHQH/AbABPwEzAf8BsgE/ATIB/wGf Af8CAAFRAf8CAQFRAf8CBgFRAf8CBwFTAf8CBwFbAf8BBwEWAY4B/wEUAUwBuAH/ASoBmgHSAf8BIQGN
ATYBKgH/AWMBJgEdAf8BKgEiATEB/wGTAdQB6AH/AZYB3gHvAf8BAAFJAZYB/wEiAS0BRAH/AbgBKgFd AcsB/wELATMBpQH/AQABCAFUAf8BBgEVAUoB/wEoAZcBtgH/AQ8BMAGKAf8CBQFcAf8QAAMDAQQDFgEe
Af8BvwE3AZMB/wHGAUABoAH/AcsBRgGmAf8BzQFIAaoB/wHLAUYBpgH/AcYBQAGgAf8BwAE3AZEB/wGd AzYBWQFPAlEBnAFXAlkBvwFZAlwByQFaAl0BygFcAl4BzgFYAl8B4wFXAmIB9gHwA/8BwwH7Av8BwwH7
ASUBTgH/AQUBQgFcAf8BFwFZAagB/wGvAesB+AH/AVYBoAHDAf8BSAIhAf8BZQEmARwB/wGtAT0BMAH/ Av8B3QP/AXIBfgGIAfwDWQHHAzcBWwMPARQDAAEBTwAB/wMAAf8DAAH/AwAB/wMAAf8OAAL/AgAC/wIA
AakBPQEyAf8DJAH/A7YB/wMdAf8CDQFkAf8BFwE0AYgB/wEvAZQBtAH/AQ4BHQFSAf8BCQEtAY4B/wE3 Av8CAAL/AgAC/yQAAxUB/wOwAf8DFQH/Aa8BOAErAf8BWgEfARcB/wE9ARoBHAH/ATgBVAGFAf8BsAHu
AcMB5wH/AT4BzgHyAf8BPgHIAfIB/wE0AbQB5gH/ASEBigHKAf8BEQE7AZ8B/wEHARUBXwH/AgYBUAH/ AfcB/wGbAeMB7wH/AQABMgGRAf8BBwEuAUcB/wGlAR4BSgH/AcABMQGVAf8BywE/AakB/wHWAUoBtwH/
AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTgH/AgYBTwH/AQUBDwFdAf8BKAGV Ad4BVAHCAf8B4QFWAcYB/wHeAVQBwgH/AdYBSgG3Af8BywE/AagB/wHDATABkQH/AYEBGgE8Af8BAAE4
AcsB/wFMAekB/QH/AU4B7gL/AU4B7gL/AUAB1QHwAf8BCQEuAZAB/wEOAR8BUgH/ATABnAG5Af8BFwE4 AYAB/wEPAVIBpQH/AbcB8wH6Af8BlgHaAeQB/wEwASUBLQH/AVABHgEZAf8BowEzASgB/wMcAf8DsAH/
AYsB/wINAWQB/xMAAQEDBwEJAxYBHwMvAUkBQQJCAXMBTAJNAZEBUAJSAaMBVQJXAboDXwHgAUkBYgFl AxUB/wIFAVwB/wEPASwBiAH/ASgBlAG0Af8BBgEVAUoB/wEDASoBjwH/ATYBxwHoAf8BPQHQAfMB/wE+
AfYB8wP/AcMB+wL/AcMB+wL/Ad0D/wF6AZQBoAH8AVcCWgG9AzEBTwMJAQyoAAMdAf8DuwH/Ax0B/wGt AcsB8gH/ATQBuwHmAf8BHgGNAcwB/wEKATUBpQH/AQUBEQGBAf8BAAEGAVEB/wIAAVEB/wIAAVEB/wIA
ATwBMgH/AbMBPgEzAf8BswE+ATMB/wGoATkBLgH/AWIBIwEcAf8BKgEiATEB/wGRAdEB6gH/AWEBugHd AVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIAAVEB/wIHAVEB/wEEAQoBWwH/ARABSgG1Af8BPwHQAfEB/wFP
Af8BAgFSAZMB/wFLAR8BOgH/AbgBKAFgAf8BvAEwAYcB/wHAATIBigH/Ab8BMwGMAf8BwAEyAYoB/wG8 AekB/QH/AUwB5QH7Af8BKAGpAdwB/wECARkBhAH/AQYBFgFKAf8BKAGbAbgB/wEPATABiwH/AgUBXAH/
AS8BhgH/AbQBJwFYAf8BHgEwAUUB/wEMAVgBogH/AZ0B3gHxAf8BVgGgAcYB/wFKASABIQH/AZYBMAEn EAADAgEDAwoBDQMcAScDLwFJAzwBZgNEAXoDSAGEAU4CTwGXAVkCXAHMAVMCZAHxBP8BwwH7Av8BwwH7
Af8BsgE+ATMB/wGzAT4BMwH/AaYBOgExAf8DJQH/A7sB/wMdAf8CDQFkAf8BFwE0AYgB/wErAZQBtAH/ Av8B1wP/AagBqgGuAf0DWwHIAzcBWgMLAQ9TAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIA
AQ0BHQFSAf8BAwEfAYUB/wEVAYIBygH/ARQBjgHXAf8BFAGKAdcB/wEUAYYBzwH/ARQBXAHAAf8BDgFD Av8CAAL/JAADFQH/A7YB/wMVAf8BsAE3ASsB/wGyATcBKgH/AZ8BLgEiAf8BWwEeARUB/wEiARoBKQH/
AaoB/wEKASQBjAH/AgYBSwH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRQH/AgYBRwH/ AZMB1AHoAf8BlgHeAe8B/wEAAUEBlgH/ARoBJQE8Af8BuAEiAVUB/wG/AS8BkwH/AcYBOAGgAf8BywE+
AgYBSQH/AQMBDAFZAf8BHgGAAcEB/wFBAeMB+wH/AUUB7gL/AUUB7gL/ATIBxgHqAf8BBgEmAYwB/wEO AaYB/wHNAUABqgH/AcsBPgGmAf8BxgE4AaAB/wHAAS8BkQH/AZ0BHQFGAf8BAAE6AVQB/wEPAVEBqAH/
AR8BVAH/ATABnQG9Af8BFwE5AYsB/wINAWQB/xMAAQEDCgENAyoBQAFOAk8BlwFYAlwB0QNcAeoDZwHy Aa8B6wH4Af8BTgGgAcMB/wFAAhkB/wFdAR4BFAH/Aa0BNQEoAf8BqQE1ASoB/wMcAf8DtgH/AxUB/wIF
AVkBZwFsAfUBgQGNAZMB+wHaAeoB9QH/AdgD/wHDAfsC/wHFAf0C/wHvA/8CYgFoAfYBUAJSAaMDJwE6 AVwB/wEPASwBiAH/AScBlAG0Af8BBgEVAUoB/wEBASUBjgH/AS8BwwHnAf8BNgHOAfIB/wE2AcgB8gH/
AwcBCagAAx0B/wPAAf8DHQH/AakBOgEwAf8BrwE7ATEB/wGvATsBMQH/Aa8BOwExAf8BpQE2AS0B/wFe ASwBtAHmAf8BGQGKAcoB/wEJATMBnwH/AQABDQFXAf8CAAFIAf8CAAFGAf8CAAFGAf8CAAFGAf8CAAFG
ASEBGgH/ASsBNAFJAf8BmAHaAfEB/wE3AY8BvAH/AQgBPQFZAf8BWgEVASsB/wFOASEBPAH/AT0BJwFC Af8CAAFGAf8CAAFGAf8CAAFGAf8CAAFHAf8BAAEHAVUB/wEgAZUBywH/AUQB6QH9Af8BRgHuAv8BRgHu
Af8BPQEnAUIB/wFBASYBQQH/AVYBHQE4Af8BRAEYASkB/wECAU0BkAH/AWUBvAHgAf8BhAG7AeEB/wE8 Av8BOAHVAfAB/wEBASYBkAH/AQYBFwFKAf8BKAGcAbkB/wEPATABiwH/AgUBXAH/EwABAQMHAQkDFgEf
AR4BJAH/AZEBLQEkAf8BrwE7ATEB/wGvATsBMQH/Aa8BOwExAf8BogE4AS8B/wMlAf8DwAH/Ax0B/wIN Ay8BSQFBAkIBcwFMAk0BkQFQAlIBowFVAlcBugNfAeABSQJiAfYB8wP/AcMB+wL/AcMB+wL/Ad0D/wFy
AWUB/wEXATQBiwH/AS4BlAG0Af8BCgEZAU4B/wEJAS0BjAH/ATYB2gHrAf8BOwHkAfUB/wE7AeIB9QH/ AX4BiAH8AVcCWgG9AzEBTwMJAQxTAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/
ATYB2QHzAf8BMAHCAekB/wEhAZMB0QH/AREBPQGjAf8BAQEFAUIB/wIBATsB/wIBATsB/wIBATsB/wIB JAADFQH/A7sB/wMVAf8BrQE0ASoB/wGzATYBKwH/AbMBNgErAf8BqAExASYB/wFaARsBFAH/ASIBGgEp
ATsB/wIBATsB/wIBATsB/wIBAT4B/wIBAT4B/wEAAQUBRgH/AQYBLAGQAf8BIgGeAdYB/wE2AdEB8AH/ Af8BkQHRAeoB/wFZAboB3QH/AQABSgGTAf8BQwEXATIB/wG4ASABWAH/AbwBKAGHAf8BwAEqAYoB/wG/
ATABwwHqAf8BFwFdAb0B/wEBARABWwH/AQsBGwFUAf8BMAGdAb0B/wEXATkBjgH/Ag0BZQH/EwABAQMP ASsBjAH/AcABKgGKAf8BvAEnAYYB/wG0AR8BUAH/ARYBKAE9Af8BBAFQAaIB/wGdAd4B8QH/AU4BoAHG
ARQDOwFjA14B2AT/AfsD/wHzA/8B7gP/AeID/wHRA/8BxgH+Av8BxAH8Av8B1gP/AecB8QH4Af8BVwJc Af8BQgEYARkB/wGWASgBHwH/AbIBNgErAf8BswE2ASsB/wGmATIBKQH/Ax0B/wO7Af8DFQH/AgUBXAH/
Ad8DRAF5AxgBIgMEAQaoAAMdAf8DxwH/Ax0B/wGmATYBLwH/AawBNwEwAf8BrAE3ATAB/wGsATcBMAH/ AQ8BLAGIAf8BIwGUAbQB/wEFARUBSgH/AQABFwGFAf8BDQGCAcoB/wEMAY4B1wH/AQwBigHXAf8BDAGG
AawBNwEwAf8BmgEvASgB/wFVAR8BHQH/AUgBkAGyAf8BlgHSAfEB/wENAVABogH/AQIBSQGLAf8BBQFR Ac8B/wEMAVQBwAH/AQYBOwGqAf8BAgEcAYwB/wIAAUMB/wIAAT0B/wIAAT0B/wIAAT0B/wIAAT0B/wIA
AZMB/wELAVcBmgH/AQ0BWQGcAf8BCgFWAZcB/wEEAVEBkwH/AQEBRAGLAf8BMgGJAbsB/wGYAdgB8wH/ AT0B/wIAAT0B/wIAAT8B/wIAAUEB/wEAAQQBUQH/ARYBgAHBAf8BOQHjAfsB/wE9Ae4C/wE9Ae4C/wEq
ASwBOgFQAf8BXQEfARoB/wGrATYBLwH/AawBNwEwAf8BrAE3ATAB/wGsATcBMAH/AZ8BNQEuAf8DJQH/ AcYB6gH/AQABHgGMAf8BBgEXAUwB/wEoAZ0BvQH/AQ8BMQGLAf8CBQFcAf8TAAEBAwoBDQMqAUABTgJP
A8cB/wMdAf8CDwGFAf8BGwE7AY0B/wEwAZcBtAH/AQgBFwFMAf8BAAEOAU0B/wEJATEBjAH/AQoBMwGS AZcBWAJcAdEDXAHqA2cB8gJZAWIB9QFtAYUBiwH7AdoB6gH1Af8B2AP/AcMB+wL/AcUB/QL/Ae8D/wNi
Af8BCgEzAZIB/wEIATEBkAH/AQcBLAGGAf8BBAEfAV8B/wECARABTwH/AgABOAH/AgABMgH/AgABMgH/ AfYBUAJSAaMDJwE6AwcBCVMAAf8DAAH/AwAB/wMAAf8DAAH/DgAC/wIAAv8CAAL/AgAC/wIAAv8kAAMV
AgABMgH/AgABMgH/AgABMgH/AgABMgH/AgABMgH/AgABOAH/AQABAQE5Af8BAAEJAUQB/wECARcBXwH/ Af8DwAH/AxUB/wGpATIBKAH/Aa8BMwEpAf8BrwEzASkB/wGvATMBKQH/AaUBLgElAf8BVgEZARIB/wEj
AQgBLQGKAf8BBgElAYUB/wEFARABWAH/AQUBBwFFAf8BCAEYAU0B/wEwAZwBuQH/ARsBPAGRAf8CDwGF ASwBQQH/AZgB2gHxAf8BLwGPAbwB/wEAATUBUQH/AVIBDQEjAf8BRgEZATQB/wE1AR8BOgH/ATUBHwE6
Af8TAAEBAw0BEgM4AVwBWAJbAcsBqAG1Ab4B/gHqA/8BzQP/AcQB/AL/AcMB+wL/AcMB+wL/AcYB/gL/ Af8BOQEeATkB/wFOARUBMAH/ATwBEAEhAf8BAAFFAZAB/wFdAbwB4AH/AYQBuwHhAf8BNAEWARwB/wGR
AdgD/wHzAfgB/AH/A10B8ANSAakDLgFHAwwBEAMCAQOoAAMdAf8DzwH/Ax0B/wGjATMBLQH/AagBNAEu ASUBHAH/Aa8BMwEpAf8BrwEzASkB/wGvATMBKQH/AaIBMAEnAf8DHQH/A8AB/wMVAf8CBQFdAf8BDwEs
Af8BqAE0AS4B/wGoATQBLgH/AagBNAEuAf8BqAE0AS4B/wGNAScBIgH/ATABIgEtAf8BjAHSAfMB/wHD AYsB/wEmAZQBtAH/AQIBEQFGAf8BAQElAYwB/wEuAdoB6wH/ATMB5AH1Af8BMwHiAfUB/wEuAdkB8wH/
AfAB+AH/AdUB7gH3Af8B4AH3AfwB/wHnA/8B6AP/AeYB/gL/Ad0B8gH6Af8BzQHtAfcB/wG1Ae8B+wH/ ASgBwgHpAf8BGQGTAdEB/wEJATUBowH/AgABOgH/AgABMwH/AgABMwH/AgABMwH/AgABMwH/AgABMwH/
AVYBqwHPAf8BSwEbAR0B/wGWASwBJgH/AagBNAEuAf8BqAE0AS4B/wGoATQBLgH/AagBNAEuAf8BnQEy AgABMwH/AgABNgH/AgABNgH/AgABPgH/AQABJAGQAf8BGgGeAdYB/wEuAdEB8AH/ASgBwwHqAf8BDwFV
ASwB/wMmAf8DzwH/Ax0B/wIVAYoB/wEcAT4BmAH/ATEBlQG2Af8BGwFCAYgB/wENARsBSwH/AQ0BGwFQ Ab0B/wEAAQgBUwH/AQMBEwFMAf8BKAGdAb0B/wEPATEBjgH/AgUBXQH/EwABAQMPARQDOwFjA14B2AT/
Af8BDQEbAVAB/wENARsBUAH/AQ0BGwFKAf8BDQEbAUoB/wENARsBSgH/AQ0BGwFFAf8BBgEVAUQB/wEG AfsD/wHzA/8B7gP/AeID/wHRA/8BxgH+Av8BxAH8Av8B1gP/AecB8QH4Af8BVwJcAd8DRAF5AxgBIgME
ARUBRAH/AQYBFQFEAf8BBgEVAUQB/wEGARUBRAH/AQYBFQFEAf8BBgEVAUQB/wEGARUBRAH/AQ0BGwFF AQZTAAH/AwAB/wMAAf8DAAH/AwAB/w4AAv8CAAL/AgAC/wIAAv8CAAL/JAADFQH/A8cB/wMVAf8BpgEu
Af8BDQEcAUsB/wENAR0BTAH/AQ0BHQFMAf8BDQEdAVIB/wENAR0BUgH/AQ0BHAFRAf8BDQEbAUsB/wEZ AScB/wGsAS8BKAH/AawBLwEoAf8BrAEvASgB/wGsAS8BKAH/AZoBJwEgAf8BTQEXARUB/wFAAZABsgH/
AUIBhwH/ATABlAG1Af8BHAE+AZgB/wIVAYoB/xMAAQEDBwEKAyYBOANKAYsBWQJcAc8BcgF6AX4B+AHz AZYB0gHxAf8BBQFIAaIB/wEAAUEBiwH/AQABSQGTAf8BAwFPAZoB/wEFAVEBnAH/AQIBTgGXAf8BAAFJ
AfgB/AH/AfID/wHmA/8B6AP/AfoD/wGoAbgBwgH+A2EB7gNVAbIDOAFcAxUBHQMFAQcDAAEBqAADHQH/ AZMB/wEAATwBiwH/ASoBiQG7Af8BmAHYAfMB/wEkATIBSAH/AVUBFwESAf8BqwEuAScB/wGsAS8BKAH/
A9cB/wMdAf8BnwEwASwB/wGkATEBLQH/AaQBMQEtAf8BpAExAS0B/wGkATEBLQH/AaQBMQEtAf8BmQEs AawBLwEoAf8BrAEvASgB/wGfAS0BJgH/Ax0B/wPHAf8DFQH/AgcBhQH/ARMBMwGNAf8BKAGXAbQB/wEA
ASgB/wFFARkBHQH/Aa8B3AHkAf8B4gHwAfIB/wGNAaQBrwH/AUkBTwFbAf8BNwEzAUEB/wE4ATQBQgH/ AQ8BRAH/AQABBgFFAf8BAQEpAYwB/wECASsBkgH/AQIBKwGSAf8BAAEpAZAB/wEAASQBhgH/AQABFwFX
AToBNwFEAf8BVAFgAYYB/wGlAcABxQH/Ae8C+wH/AUABggGXAf8BVgEaARkB/wGjATABLAH/AaQBMQEt Af8BAAEIAUcB/wIAATAB/wIAASoB/wIAASoB/wIAASoB/wIAASoB/wIAASoB/wIAASoB/wIAASoB/wIA
Af8BpAExAS0B/wGkATEBLQH/AaQBMQEtAf8BmQEvASsB/wMmAf8D1wH/Ax0B/wIWAZQB/wEbATkBmwH/ ATAB/wIAATEB/wEAAQEBPAH/AQABDwFXAf8BAAElAYoB/wEAAR0BhQH/AQABCAFQAf8CAAE9Af8BAAEQ
ATwBogHDAf8BTwG3Ac0B/wFLAbkBzQH/AUsBuQHNAf8BSQG5Ac0B/wFIAbkBzQH/AUgBuQHNAf8BSAG5 AUUB/wEoAZwBuQH/ARMBNAGRAf8CBwGFAf8TAAEBAw0BEgM4AVwBWAJbAcsBmAGlAa4B/gHqA/8BzQP/
Ac0B/wFIAbkBzQH/AUgBuQHNAf8BSAG5Ac0B/wFIAbkBzQH/AUgBuQHNAf8BSAG5Ac0B/wFIAbkBzQH/ AcQB/AL/AcMB+wL/AcMB+wL/AcYB/gL/AdgD/wHzAfgB/AH/A10B8ANSAakDLgFHAwwBEAMCAQNTAAH/
AUgBuQHNAf8BSAG5Ac0B/wFIAbkBzQH/AUsBuQHNAf8BSwG8Ac8B/wFLAb8B0gH/AUsBvwHSAf8BSwG/ AwAB/wMAAf8DAAH/AwAB/0QAAxUB/wPPAf8DFQH/AaMBKwElAf8BqAEsASYB/wGoASwBJgH/AagBLAEm
AdIB/wFLAb8B0gH/AUkBvAHPAf8BSAG5Ac0B/wFHAbYByAH/ATcBngHAAf8BGwE4AZsB/wIWAZQB/xQA Af8BqAEsASYB/wGoASwBJgH/AY0BHwEaAf8BKAEaASUB/wGMAdIB8wH/AcMB8AH4Af8B1QHuAfcB/wHg
AwQBBQMRARcDKQE/A0QBeQFVAlYBtAFcAmEB3AFfAWQBagHzAXEBfQGKAfoBcQF9AYoB+gJdAV8B7QFb AfcB/AH/AecD/wHoA/8B5gH+Av8B3QHyAfoB/wHNAe0B9wH/AbUB7wH7Af8BTgGrAc8B/wFDARMBFQH/
Al4B0AFQAlEBnwM2AVkDGAEhAwcBCgMBAQKsAAMdAf8D3wH/Ax0B/wGcAS0BKwH/AaEBLgEsAf8BoQEu AZYBJAEeAf8BqAEsASYB/wGoASwBJgH/AagBLAEmAf8BqAEsASYB/wGdASoBJAH/Ax4B/wPPAf8DFQH/
ASwB/wGhAS4BLAH/AaEBLgEsAf8BoQEuASwB/wGbASsBKQH/AUsBGAEbAf8BjwGWAaEB/wE5ARYBHgH/ Ag0BigH/ARQBNgGYAf8BKQGVAbYB/wETAToBiAH/AQUBEwFDAf8BBQETAUgB/wEFARMBSAH/AQUBEwFI
AVMCGAH/AVYBGAEXAf8BgQEgAR4B/wGBASABHgH/AYEBIAEeAf8BVQEYARcB/wFQARgBGQH/AS0BIQEw Af8BBQETAUIB/wEFARMBQgH/AQUBEwFCAf8BBQETAT0B/wEAAQ0BPAH/AQABDQE8Af8BAAENATwB/wEA
Af8BXQFhAYgB/wFVARgBFwH/AaABLQErAf8BoQEuASwB/wGhAS4BLAH/AaEBLgEsAf8BoQEuASwB/wGW AQ0BPAH/AQABDQE8Af8BAAENATwB/wEAAQ0BPAH/AQABDQE8Af8BBQETAT0B/wEFARQBQwH/AQUBFQFE
ASwBKgH/AycB/wPfAf8DHQH/AhcBngH/ARgBHwGUAf8BJwFBAZ8B/wE6AWEBrgH/AT0BZQGrAf8BPQFl Af8BBQEVAUQB/wEFARUBSgH/AQUBFQFKAf8BBQEUAUkB/wEFARMBQwH/AREBOgGHAf8BKAGUAbUB/wEU
AasB/wE7AWUBqwH/AToBZQGnAf8BOgFlAaYB/wE4AWIBpgH/ATQBXwGmAf8BNAFfAaIB/wE0AV8BoQH/ ATYBmAH/Ag0BigH/EwABAQMHAQoDJgE4A0oBiwFZAlwBzwFnAXIBdgH4AfMB+AH8Af8B8gP/AeYD/wHo
ATQBXwGhAf8BNAFfAaEB/wE0AV8BoQH/ATQBXwGhAf8BNAFfAaEB/wE0AV8BoQH/ATQBXwGhAf8BOAFf A/8B+gP/AZgBqAGyAf4DYQHuA1UBsgM4AVwDFQEdAwUBBwMAAQFTAAH/AwAB/wMAAf8DAAH/AwAB/0QA
AaIB/wE4AV8BpgH/ATsBYgGmAf8BPQFlAaYB/wE9AWUBpwH/AT0BZQGrAf8BOwFlAasB/wE6AWUBqwH/ AxUB/wPXAf8DFQH/AZ8BKAEkAf8BpAEpASUB/wGkASkBJQH/AaQBKQElAf8BpAEpASUB/wGkASkBJQH/
ATcBYQGuAf8BJQFBAZ8B/wEYAR8BlAH/AhcBngH/FwABAQMEAQYDDAEQAxwBKAMxAU0DQgF1A04BmQFT AZkBJAEgAf8BPQERARUB/wGvAdwB5AH/AeIB8AHyAf8BjQGkAa8B/wFBAUcBUwH/AS8BKwE5Af8BMAEs
AlUBrQNSAakDSwGOATwCPQFnAykBPgMUARsDBwEJAwIBA7AAA0wB8wPfAf8DNAH/AYoCJwH/AZsBKQEq AToB/wEyAS8BPAH/AUwBWAGGAf8BpQHAAcUB/wHvAvsB/wE4AYIBlwH/AU4BEgERAf8BowEoASQB/wGk
Af8BmwEpASoB/wGbASkBKgH/AZsBKQEqAf8BmwEpASoB/wGaASgBKQH/AVABFQEWAf8BSgEVARgB/wFS ASkBJQH/AaQBKQElAf8BpAEpASUB/wGkASkBJQH/AZkBJwEjAf8DHgH/A9cB/wMVAf8CDgGUAf8BEwEx
AhUB/wGZASgBKQH/AZoBKQEqAf8BmwEpASoB/wGbASkBKgH/AZsBKQEqAf8BmgEoASkB/wGSASUBJgH/ AZsB/wE0AaIBwwH/AUcBtwHNAf8BQwG5Ac0B/wFDAbkBzQH/AUEBuQHNAf8BQAG5Ac0B/wFAAbkBzQH/
AVECFQH/AUcBFQEZAf8BUgIVAf8BmgEpASoB/wGbASkBKgH/AZsBKQEqAf8BmwEpASoB/wGbASkBKgH/ AUABuQHNAf8BQAG5Ac0B/wFAAbkBzQH/AUABuQHNAf8BQAG5Ac0B/wFAAbkBzQH/AUABuQHNAf8BQAG5
AWIBJQEmAf8DPAH/A90B/wNOAfACHAGkAf8CFwGeAf8CFgGUAf8CFQGPAf8CFQGMAf8CFQGGAf8CFQGC Ac0B/wFAAbkBzQH/AUABuQHNAf8BQAG5Ac0B/wFDAbkBzQH/AUMBvAHPAf8BQwG/AdIB/wFDAb8B0gH/
Af8CEAFkAf8CDwFkAf8CDgFhAf8CDQFeAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFc AUMBvwHSAf8BQwG/AdIB/wFBAbwBzwH/AUABuQHNAf8BPwG2AcgB/wEvAZ4BwAH/ARMBMAGbAf8CDgGU
Af8CDQFcAf8CDQFcAf8CDQFcAf8CDQFcAf8CDQFeAf8CDgFhAf8CDwFkAf8CEAFkAf8CFQGCAf8CFQGG Af8UAAMEAQUDEQEXAykBPwNEAXkBVQJWAbQBXAJhAdwDXwHzAWkBdQF6AfoBaQF1AXoB+gNdAe0BWwJe
Af8CFQGMAf8CFQGPAf8CFgGUAf8CFwGeAf8CHAGkAf8bAAEBAwIBAwMGAQgDDAEQAxYBHgMiATIDKgFA AdABUAJRAZ8DNgFZAxgBIQMHAQoDAQECVwAB/wMAAf8DAAH/AwAB/wMAAf9EAAMVAf8D3wH/AxUB/wGc
AykBPgMfASwDEgEZAwoBDQMEAQYDAQECtAADVwG9A78B/wOUAf8BSAEmASgB/wGKASUBKwH/AZMBIwEq ASUBIwH/AaEBJgEkAf8BoQEmASQB/wGhASYBJAH/AaEBJgEkAf8BoQEmASQB/wGbASMBIQH/AUMBEAET
Af8BkwEjASoB/wGTASMBKgH/AZMBIwEqAf8BkwEjASoB/wGSASMBKQH/AY4BIQEoAf8BkgEjASoB/wGT Af8BjwGWAaEB/wExAQ4BFgH/AUsCEAH/AU4BEAEPAf8BgQEYARYB/wGBARgBFgH/AYEBGAEWAf8BTQEQ
ASMBKgH/AZMBIwEqAf8BkwEjASoB/wGTASMBKgH/AZMBIwEqAf8BkwEjASoB/wGTASMBKgH/AZIBIwEp AQ8B/wFIARABEQH/ASUBGQEoAf8BVQFZAYgB/wFNARABDwH/AaABJQEjAf8BoQEmASQB/wGhASYBJAH/
Af8BjQEhAScB/wGSASMBKgH/AZMBIwEqAf8BkwEjASoB/wGTASMBKgH/AZMBIwEqAf8BgAEmASsB/wE9 AaEBJgEkAf8BoQEmASQB/wGWASQBIgH/Ax8B/wPfAf8DFQH/Ag8BngH/ARABFwGUAf8BHwE5AZ8B/wEy
ASUBJwH/A7QB/wO0Af8DVAGuAh8BrAH/Ah8BqQH/Ah8BpgH/AhoBpgH/AhkBpgH/AhkBowH/AhkBnwH/ AVkBrgH/ATUBXQGrAf8BNQFdAasB/wEzAV0BqwH/ATIBXQGnAf8BMgFdAaYB/wEwAVoBpgH/ASwBVwGm
AhcBngH/AhcBlwH/AhcBlwH/AhcBlgH/AhcBlgH/AhcBjgH/AhcBjgH/AhcBjgH/AhcBjgH/AhcBjgH/ Af8BLAFXAaIB/wEsAVcBoQH/ASwBVwGhAf8BLAFXAaEB/wEsAVcBoQH/ASwBVwGhAf8BLAFXAaEB/wEs
AhcBjgH/AhcBjgH/AhcBjgH/AhcBlgH/AhcBlgH/AhcBlwH/AhcBlwH/AhcBngH/AhkBnwH/AhkBowH/ AVcBoQH/ASwBVwGhAf8BMAFXAaIB/wEwAVcBpgH/ATMBWgGmAf8BNQFdAaYB/wE1AV0BpwH/ATUBXQGr
AhkBpgH/AhoBpgH/Ah8BpgH/Ah8BqQH/Ah8BrAH/JAADAQECAwMEBAQGAQgDBgEIAwQBBgMDAQQDAAEB Af8BMwFdAasB/wEyAV0BqwH/AS8BWQGuAf8BHQE5AZ8B/wEQARcBlAH/Ag8BngH/FwABAQMEAQYDDAEQ
vAADNAFUA0wB/wPuAf8DkwH/AzMB/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMd AxwBKAMxAU0DQgF1A04BmQFTAlUBrQNSAakDSwGOATwCPQFnAykBPgMUARsDBwEJAwIBA1sAAf8DAAH/
Af8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DPAH/A7IB/wPq AwAB/wMAAf8DAAH/RAADTAHzA98B/wMsAf8BigIfAf8BmwEhASIB/wGbASEBIgH/AZsBIQEiAf8BmwEh
Af8DPAH/Ay0BRQIfAawB/wIfAawB/wIfAawB/wIfAawB/wIfAawB/wIfAawB/wIfAawB/wIbAagB/wIa ASIB/wGbASEBIgH/AZoBIAEhAf8BSAENAQ4B/wFCAQ0BEAH/AUoCDQH/AZkBIAEhAf8BmgEhASIB/wGb
AaQB/wIXAaIB/wIXAZ8B/wIXAZ8B/wIXAZwB/wIXAZwB/wIXAZwB/wIXAZwB/wIXAZwB/wIXAZwB/wIX ASEBIgH/AZsBIQEiAf8BmwEhASIB/wGaASABIQH/AZIBHQEeAf8BSQINAf8BPwENAREB/wFKAg0B/wGa
AZwB/wIXAZwB/wIXAZ8B/wIXAZ8B/wIXAaIB/wIaAacB/wIbAagB/wIfAawB/wIfAawB/wIfAawB/wIf ASEBIgH/AZsBIQEiAf8BmwEhASIB/wGbASEBIgH/AZsBIQEiAf8BWgEdAR4B/wM0Af8D3QH/A04B8AIU
AawB/wIfAawB/wIfAawB/wIfAawB//8ABQADSgGNA0sB/wPNAf8D+QH/A/sB/wP7Af8D+wH/A/sB/wP7 AaQB/wIPAZ4B/wIOAZQB/wINAY8B/wINAYwB/wINAYYB/wINAYIB/wIIAVwB/wIHAVwB/wIGAVkB/wIF
Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7 AVYB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIFAVQB/wIF
Af8D+wH/A/sB/wPrAf8DvQH/AzYB/wNIAYcEAANIAYUCHwGsAf8CHwGsAf8CHwGsAf8CHwGsAf8CHwGs AVQB/wIFAVYB/wIGAVkB/wIHAVwB/wIIAVwB/wINAYIB/wINAYYB/wINAYwB/wINAY8B/wIOAZQB/wIP
Af8CHwGsAf8CHwGsAf8CHgGpAf8CHAGpAf8CHAGmAf8CGAGkAf8CFwGhAf8CFwGhAf8CFwGhAf8CFwGh AZ4B/wIUAaQB/xsAAQEDAgEDAwYBCAMMARADFgEeAyIBMgMqAUADKQE+Ax8BLAMSARkDCgENAwQBBgMB
Af8CFwGhAf8CFwGhAf8CFwGhAf8CFwGhAf8CGAGkAf8CHAGmAf8CHAGpAf8CHgGrAf8CHwGsAf8CHwGs AQJfAAH/AwAB/wMAAf8DAAH/AwAB/0QAA1cBvQO/Af8DlAH/AUABHgEgAf8BigEdASMB/wGTARsBIgH/
Af8CHwGsAf8CHwGsAf8CHwGsAf8CHwGsAf8CHwGsAf8DSAGF/wAJAAM3AVoDWQHDAysB/AMdAf8DHQH/ AZMBGwEiAf8BkwEbASIB/wGTARsBIgH/AZMBGwEiAf8BkgEbASEB/wGOARkBIAH/AZIBGwEiAf8BkwEb
Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DHQH/ ASIB/wGTARsBIgH/AZMBGwEiAf8BkwEbASIB/wGTARsBIgH/AZMBGwEiAf8BkwEbASIB/wGSARsBIQH/
Ax0B/wMdAf8DHQH/Ax0B/wMdAf8DVQHqA1QBrgMtAUUIAAMHAQoDSAGFAh8BrAH/Ah8BrAH/Ah8BrAH/ AY0BGQEfAf8BkgEbASIB/wGTARsBIgH/AZMBGwEiAf8BkwEbASIB/wGTARsBIgH/AYABHgEjAf8BNQEd
Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BqwH/Ah4BqgH/Ah0BqgH/Ah0BqAH/Ah0BpAH/ AR8B/wO0Af8DtAH/A1QBrgIXAawB/wIXAakB/wIXAaYB/wISAaYB/wIRAaYB/wIRAaMB/wIRAZ8B/wIP
Ah0BpAH/Ah0BpAH/Ah0BpAH/Ah0BqAH/Ah0BqgH/Ah4BqgH/Ah8BqwH/Ah8BrAH/Ah8BrAH/Ah8BrAH/ AZ4B/wIPAZcB/wIPAZcB/wIPAZYB/wIPAZYB/wIPAY4B/wIPAY4B/wIPAY4B/wIPAY4B/wIPAY4B/wIP
Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/Ah8BrAH/A0gBhQMHAQr/AAEAAUIBTQE+BwABPgMAASgDAAGA AY4B/wIPAY4B/wIPAY4B/wIPAZYB/wIPAZYB/wIPAZcB/wIPAZcB/wIPAZ4B/wIRAZ8B/wIRAaMB/wIR
AwABIAMAAQEBAAEBBgABAhYAA/8BAAHAAgABAwQABP8EAAGAAgABAQQAAv8B+AEHDAAC/wHwAQMMAAL/ AaYB/wISAaYB/wIXAaYB/wIXAakB/wIXAawB/yQAAwEBAgMDBAQEBgEIAwYBCAMEAQYDAwEEAwABAWcA
AeABAQwAAv8BwAEBDAAC/wGAAQEMAAL/AQABAQwAAf8B/gEAAQEMAAH/AfwBAAEBDAAB/wH8AQABAQwA Af8DAAH/AwAB/wMAAf8DAAH/RAADNAFUA0QB/wPuAf8DkwH/AysB/wMVAf8DFQH/AxUB/wMVAf8DFQH/
Af8BgAEAAQEMAAH+AgABAQwAAfgCAAEDDAAB8AIAAQcMAAHwAgABHwwAAfACAAE/DAAB8AIAAX8MAAHw AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/
AgAB/wwAAfABAAEBAf8MAAHwAQABAwH/DAAB8AEAAQMB/wwAAfABAAEDAf8MAAHwAQABAwH/DAAB8AEA AxUB/wMVAf8DNAH/A7IB/wPqAf8DNAH/Ay0BRQIXAawB/wIXAawB/wIXAawB/wIXAawB/wIXAawB/wIX
AQMB/wwAAfABAAEDAf8MAAH4AQABBwH/DAAB+AEAAQ8B/wwAAfwBAAEfAf8MAAH/AYABfwH/DAAE/wQA AawB/wIXAawB/wITAagB/wISAaQB/wIPAaIB/wIPAZ8B/wIPAZ8B/wIPAZwB/wIPAZwB/wIPAZwB/wIP
AYACAAEBBAAE/wQAAcACAAEDBAAE/wQACw== AZwB/wIPAZwB/wIPAZwB/wIPAZwB/wIPAZwB/wIPAZ8B/wIPAZ8B/wIPAaIB/wISAacB/wITAagB/wIX
AawB/wIXAawB/wIXAawB/wIXAawB/wIXAawB/wIXAawB/wIXAawB//8ABQADSgGNA0MB/wPNAf8D+QH/
A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/
A/sB/wP7Af8D+wH/A/sB/wP7Af8D+wH/A/sB/wPrAf8DvQH/Ay4B/wNIAYcEAANIAYUCFwGsAf8CFwGs
Af8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFgGpAf8CFAGpAf8CFAGmAf8CEAGkAf8CDwGh
Af8CDwGhAf8CDwGhAf8CDwGhAf8CDwGhAf8CDwGhAf8CDwGhAf8CDwGhAf8CEAGkAf8CFAGmAf8CFAGp
Af8CFgGrAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8CFwGsAf8DSAGF/wAJAAM3
AVoDWQHDAysB/AMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMV
Af8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DFQH/AxUB/wMVAf8DVQHqA1QBrgMtAUUIAAMHAQoDSAGF
AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBqwH/AhYBqgH/
AhUBqgH/AhUBqAH/AhUBpAH/AhUBpAH/AhUBpAH/AhUBpAH/AhUBqAH/AhUBqgH/AhYBqgH/AhcBqwH/
AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/AhcBrAH/A0gBhQMHAQr/AAEA
AUIBTQE+BwABPgMAASgDAAGAAwABQAMAAQEBAAEBBgABBBYAA///AP8AAwABwAIAAQMEAAj/AYACAAEB
BAAC/wH4AQcE/wgAAv8B8AEDBP8IAAL/AeABAQH/AcEC/wgAAv8BwAEBAf8BwQL/CAAC/wGAAQEB/wHB
Av8IAAL/AQABAQH/AcEC/wgAAf8B/gEAAQEB/wHBAv8IAAH/AfwBAAEBAf8CwQH/CAAB/wH8AQABAQH/
AsEB/wgAAf8BgAEAAQEB/wLBAf8IAAH+AgABAQH/AsEB/wgAAfgCAAEDAf8CwQH/CAAB8AIAAQcB4AEB
AcABBwgAAfACAAEfAeABAQHAAQcIAAHwAgABPwHgAQEBwAEHCAAB8AIAAX8B4AEBAcABBwgAAfACAAH/
AeABAQHAAQcIAAHwAQABAQL/AsEB/wgAAfABAAEDAv8CwQH/CAAB8AEAAQMC/wLBAf8IAAHwAQABAwL/
AsEB/wgAAfABAAEDAv8CwQH/CAAB8AEAAQMC/wHBAv8IAAHwAQABAwL/AcEC/wgAAfgBAAEHAv8BwQL/
CAAB+AEAAQ8C/wHBAv8IAAH8AQABHwL/AcEC/wgAAf8BgAF/Av8BwQL/CAAI/wGAAgABAQQACP8BwAIA
AQMEAAj/Cw==
</value> </value>
</data> </data>
</root> </root>

View file

@ -1,7 +1,42 @@
namespace DutyContent.ThirdParty using System;
using System.Drawing;
namespace DutyContent.ThirdParty
{ {
static class Converter static class Converter
{ {
public static bool TryLong(string s, out long ret)
{
ret = 0;
for (int i = 0; i < s.Length; i++)
{
var n = s[i] - '0';
if (n < 0 || n > 9)
return false;
ret = ret * 10 + n;
}
return true;
}
public static long ToLong(string s, long failret = 0)
{
long ret = 0;
for (int i = 0; i < s.Length; i++)
{
var n = s[i] - '0';
if (n < 0 || n > 9)
return failret;
ret = ret * 10 + n;
}
return ret;
}
public static bool TryInt(string s, out int ret) public static bool TryInt(string s, out int ret)
{ {
ret = 0; ret = 0;
@ -50,7 +85,7 @@
return true; return true;
} }
public static ushort ToUshort(string s, ushort failret=0) public static ushort ToUshort(string s, ushort failret = 0)
{ {
int ret = 0; int ret = 0;
@ -71,9 +106,28 @@
return s.ToUpper().Equals("TRUE"); return s.ToUpper().Equals("TRUE");
} }
public static float ToFloat(string s, float failret=0.0f) public static float ToFloat(string s, float failret = 0.0f)
{ {
return float.TryParse(s, out float v) ? v : failret; return float.TryParse(s, out float v) ? v : failret;
} }
public static Color ToColorArgb(string s, Color failret)
{
try
{
var i = Convert.ToInt32(s, 16);
var r = Color.FromArgb(i);
return r;
}
catch
{
return failret;
}
}
public static Color ToColorArgb(string s)
{
return ToColorArgb(s, Color.Transparent);
}
} }
} }

24
ThirdParty/LineDb.cs vendored
View file

@ -10,8 +10,6 @@ namespace DutyContent.ThirdParty
private Dictionary<string, string> _dbstr = new Dictionary<string, string>(); private Dictionary<string, string> _dbstr = new Dictionary<string, string>();
private Dictionary<int, string> _dbint = new Dictionary<int, string>(); private Dictionary<int, string> _dbint = new Dictionary<int, string>();
public static string InvalidKey = "<invalid>";
public LineDb(string ctx, bool useintdb) public LineDb(string ctx, bool useintdb)
{ {
LoadString(ctx, useintdb, false); LoadString(ctx, useintdb, false);
@ -140,15 +138,25 @@ namespace DutyContent.ThirdParty
public string Get(string name) public string Get(string name)
{ {
if (!_dbstr.TryGetValue(name, out string value)) return Get(name, string.Empty);
return name;
return value;
} }
public string Get(int key) public string Get(int key)
{
return Get(key, string.Empty);
}
public string Get(string name, string defvalue)
{
if (!_dbstr.TryGetValue(name, out string value))
return defvalue;
return value;
}
public string Get(int key, string defvalue)
{ {
if (!_dbint.TryGetValue(key, out string value)) if (!_dbint.TryGetValue(key, out string value))
return InvalidKey; return defvalue;
return value; return value;
} }
@ -208,7 +216,7 @@ namespace DutyContent.ThirdParty
{ {
get get
{ {
return Try(index, out string v) ? v : ""; return Try(index, out string v) ? v : string.Empty;
} }
} }
@ -216,7 +224,7 @@ namespace DutyContent.ThirdParty
{ {
get get
{ {
return Try(key, out string v) ? v : ""; return Try(key, out string v) ? v : string.Empty;
} }
} }
} }

84
ThirdParty/ThreadWorker.cs vendored Normal file
View file

@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DutyContent.ThirdParty
{
public abstract class ThreadWorker<T>
{
protected readonly object _thread_lock = new object();
protected readonly object _sleep_lock = new object();
private Thread _thread_ptr;
protected bool IsBreak { get; private set; } = false;
protected abstract void RunThread(T context);
public void StartThread(T context, string name = null)
{
lock (_thread_lock)
{
StopThread();
_thread_ptr = CreateThread(name);
_thread_ptr.Start(context);
}
}
public void StopThread()
{
lock (_thread_lock)
{
while (_thread_ptr!=null && _thread_ptr.IsAlive)
{
IsBreak = true;
lock (_sleep_lock)
Monitor.Pulse(_sleep_lock);
Monitor.Wait(_thread_lock, 100);
}
_thread_ptr = null;
IsBreak = false;
}
}
protected virtual Thread CreateThread(string name = null)
{
var thd = new Thread(new ParameterizedThreadStart((context) =>
{
try
{
RunThread((T)context);
}
finally
{
lock (_thread_lock)
{
_thread_ptr = null;
Monitor.PulseAll(_thread_lock);
}
}
}))
{
IsBackground = true,
Name = !string.IsNullOrEmpty(name) ? name : GetType().FullName
};
return thd;
}
protected void SafeSleep(TimeSpan ts)
{
lock (_sleep_lock)
Monitor.Wait(_sleep_lock, ts);
}
protected void SafeSleep(int milliseconds)
{
lock (_sleep_lock)
Monitor.Wait(_sleep_lock, milliseconds);
}
}
}