diff --git a/BetterJoyForCemu/BetterJoyForCemu.csproj b/BetterJoyForCemu/BetterJoyForCemu.csproj
index 318e76c..dd50a6a 100644
--- a/BetterJoyForCemu/BetterJoyForCemu.csproj
+++ b/BetterJoyForCemu/BetterJoyForCemu.csproj
@@ -170,6 +170,12 @@
True
Resources.resx
+
+ Form
+
+
+ Reassign.cs
+
@@ -204,6 +210,9 @@
ResXFileCodeGenerator
Resources.Designer.cs
+
+ Reassign.cs
+
diff --git a/BetterJoyForCemu/Config.cs b/BetterJoyForCemu/Config.cs
index 0281367..9ebe2e8 100644
--- a/BetterJoyForCemu/Config.cs
+++ b/BetterJoyForCemu/Config.cs
@@ -8,23 +8,36 @@ using System.Threading.Tasks;
namespace BetterJoyForCemu {
public static class Config { // stores dynamic configuration, including
const string PATH = "settings";
- static Dictionary variables = new Dictionary();
+ static Dictionary variables = new Dictionary();
- const int settingsNum = 2; // currently - ProgressiveScan, StartInTray
+ const int settingsNum = 9; // currently - ProgressiveScan, StartInTray + special buttons
+
+ public static string GetDefaultValue(string s) {
+ switch(s) {
+ case "ProgressiveScan":
+ return "1";
+ case "capture":
+ return "key_" + ((int)WindowsInput.Events.KeyCode.PrintScreen);
+ case "reset_mouse":
+ return "joy_" + ((int)Joycon.Button.STICK);
+ }
+ return "0";
+ }
public static void Init(List> caliData) {
- variables["ProgressiveScan"] = true;
- variables["StartInTray"] = false;
+ foreach (string s in new string[] { "ProgressiveScan", "StartInTray", "capture", "home", "sl_l", "sl_r", "sr_l", "sr_r", "reset_mouse" })
+ variables[s] = GetDefaultValue(s);
if (File.Exists(PATH)) {
+ int lineNO = 0;
using (StreamReader file = new StreamReader(PATH)) {
string line = String.Empty;
- int lineNO = 0;
+
while ((line = file.ReadLine()) != null) {
string[] vs = line.Split();
try {
if (lineNO < settingsNum) { // load in basic settings
- variables[vs[0]] = Boolean.Parse(vs[1]);
+ variables[vs[0]] = vs[1];
} else { // load in calibration presets
caliData.Clear();
for (int i = 0; i < vs.Length; i++) {
@@ -42,6 +55,14 @@ namespace BetterJoyForCemu {
} catch { }
lineNO++;
}
+
+
+ }
+
+ // if old settings
+ if (lineNO < settingsNum) {
+ File.Delete(PATH);
+ Init(caliData);
}
} else {
using (StreamWriter file = new StreamWriter(PATH)) {
@@ -58,13 +79,27 @@ namespace BetterJoyForCemu {
}
}
- public static bool Value(string key) {
- if (!variables.ContainsKey("ProgressiveScan") && !variables.ContainsKey("StartInTray")) {
- return false;
+ public static int IntValue(string key) {
+ if (!variables.ContainsKey(key)) {
+ return 0;
+ }
+ return Int32.Parse(variables[key]);
+ }
+
+ public static string Value(string key) {
+ if (!variables.ContainsKey(key)) {
+ return "";
}
return variables[key];
}
+ public static bool SetValue(string key, string value) {
+ if (!variables.ContainsKey(key))
+ return false;
+ variables[key] = value;
+ return true;
+ }
+
public static void SaveCaliData(List> caliData) {
string[] txt = File.ReadAllLines(PATH);
if (txt.Length < settingsNum + 1) // no custom calibrations yet
@@ -80,8 +115,7 @@ namespace BetterJoyForCemu {
File.WriteAllLines(PATH, txt);
}
- public static void Save(string key, bool value) {
- variables[key] = value;
+ public static void Save() {
string[] txt = File.ReadAllLines(PATH);
int NO = 0;
foreach (string k in variables.Keys) {
diff --git a/BetterJoyForCemu/Joycon.cs b/BetterJoyForCemu/Joycon.cs
index b02ad7c..be61fe5 100644
--- a/BetterJoyForCemu/Joycon.cs
+++ b/BetterJoyForCemu/Joycon.cs
@@ -299,7 +299,7 @@ namespace BetterJoyForCemu {
public void DebugPrint(String s, DebugType d) {
if (debug_type == DebugType.NONE) return;
if (d == DebugType.ALL || d == debug_type || debug_type == DebugType.ALL) {
- form.console.Text += s + "\r\n";
+ form.AppendTextBox(s + "\r\n");
}
}
public bool GetButtonDown(Button b) {
@@ -470,8 +470,6 @@ namespace BetterJoyForCemu {
state = state_.NOT_ATTACHED;
}
- string extraGyroFeature = ConfigurationManager.AppSettings["GyroToJoyOrMouse"];
- int GyroMouseSensitivity = Int32.Parse(ConfigurationManager.AppSettings["GyroMouseSensitivity"]);
// TODO: Improve this loop, make USB not laggy
private byte ts_en;
private int ReceiveRaw() {
@@ -501,28 +499,14 @@ namespace BetterJoyForCemu {
Program.server.NewReportIncoming(this);
if (xin != null)
- xin.SendReport(report);
+ try {
+ xin.SendReport(report);
+ } catch (Exception e) {
+ // ignore /shrug
+ }
}
- // Link capture button to print screen
- if (buttons[(int)Button.CAPTURE])
- WindowsInput.Simulate.Events().Click(WindowsInput.Events.KeyCode.PrintScreen).Invoke();
-
- if (extraGyroFeature == "joy") {
- // TODO
- } else if (extraGyroFeature == "mouse" && (isPro || (other == null) || (other != null && (Boolean.Parse(ConfigurationManager.AppSettings["GyroMouseLeftHanded"]) ? isLeft : !isLeft)))) {
- float dt = 0.015f; // 15ms
-
- // gyro data is in degrees/s
- int dx = (int)(GyroMouseSensitivity * (gyr_g.Z * dt) * (Math.Abs(gyr_g.Z) < 1 ? 0 : 1));
- int dy = (int)-(GyroMouseSensitivity * (gyr_g.Y * dt) * (Math.Abs(gyr_g.Y) < 1 ? 0 : 1));
-
- WindowsInput.Simulate.Events().MoveBy(dx, dy).Invoke();
-
- // reset mouse position to centre of primary monitor
- if (buttons[(int)Button.STICK] || buttons[(int)Button.STICK2])
- WindowsInput.Simulate.Events().MoveTo(Screen.PrimaryScreen.Bounds.Width / 2, Screen.PrimaryScreen.Bounds.Height / 2).Invoke();
- }
+ DoThingsWithButtons();
if (ts_en == raw_buf[1] && !isSnes) {
form.AppendTextBox("Duplicate timestamp enqueued.\r\n");
@@ -534,6 +518,46 @@ namespace BetterJoyForCemu {
return ret;
}
+ private void Simulate(string s) {
+ if (s.StartsWith("key_"))
+ WindowsInput.Simulate.Events().Click((WindowsInput.Events.KeyCode) Int32.Parse(s.Substring(4))).Invoke();
+ else if (s.StartsWith("mse_"))
+ WindowsInput.Simulate.Events().Click((WindowsInput.Events.ButtonCode) Int32.Parse(s.Substring(4))).Invoke();
+ }
+
+ string extraGyroFeature = ConfigurationManager.AppSettings["GyroToJoyOrMouse"];
+ int GyroMouseSensitivity = Int32.Parse(ConfigurationManager.AppSettings["GyroMouseSensitivity"]);
+ private void DoThingsWithButtons() {
+ if (buttons_down[(int)Button.CAPTURE])
+ Simulate(Config.Value("capture"));
+ if (buttons_down[(int)Button.HOME])
+ Simulate(Config.Value("home"));
+ if (isLeft && buttons_down[(int)Button.SL])
+ Simulate(Config.Value("sl_l"));
+ if (isLeft && buttons_down[(int)Button.SR])
+ Simulate(Config.Value("sr_l"));
+ if (!isLeft && buttons_down[(int)Button.SL])
+ Simulate(Config.Value("sl_r"));
+ if (!isLeft && buttons_down[(int)Button.SR])
+ Simulate(Config.Value("sr_r"));
+
+ if (extraGyroFeature == "joy") {
+ // TODO
+ } else if (extraGyroFeature == "mouse" && (isPro || (other == null) || (other != null && (Boolean.Parse(ConfigurationManager.AppSettings["GyroMouseLeftHanded"]) ? isLeft : !isLeft)))) {
+ float dt = 0.015f; // 15ms
+
+ // gyro data is in degrees/s
+ int dx = (int)(GyroMouseSensitivity * (gyr_g.Z * dt) * (Math.Abs(gyr_g.Z) < 1 ? 0 : 1));
+ int dy = (int)-(GyroMouseSensitivity * (gyr_g.Y * dt) * (Math.Abs(gyr_g.Y) < 1 ? 0 : 1));
+
+ WindowsInput.Simulate.Events().MoveBy(dx, dy).Invoke();
+
+ // reset mouse position to centre of primary monitor
+ if (buttons_down[(int)Button.STICK] || buttons_down[(int)Button.STICK2])
+ WindowsInput.Simulate.Events().MoveTo(Screen.PrimaryScreen.Bounds.Width / 2, Screen.PrimaryScreen.Bounds.Height / 2).Invoke();
+ }
+ }
+
// TODO: Fix?
private Thread PollThreadObj; // pro times out over time randomly if it was USB and then bluetooth??
private void Poll() {
@@ -727,6 +751,10 @@ namespace BetterJoyForCemu {
}
}
+ // overwrite guide button if it's custom-mapped
+ if (Config.Value("home") != "0")
+ report.SetButtonState(Xbox360Buttons.Guide, false);
+
lock (buttons_up) {
lock (buttons_down) {
for (int i = 0; i < buttons.Length; ++i) {
diff --git a/BetterJoyForCemu/MainForm.Designer.cs b/BetterJoyForCemu/MainForm.Designer.cs
index 3176221..9d6385e 100644
--- a/BetterJoyForCemu/MainForm.Designer.cs
+++ b/BetterJoyForCemu/MainForm.Designer.cs
@@ -51,6 +51,7 @@
this.rightPanel = new System.Windows.Forms.Panel();
this.settingsApply = new System.Windows.Forms.Button();
this.AutoCalibrate = new System.Windows.Forms.Button();
+ this.btn_reassign_open = new System.Windows.Forms.Button();
this.contextMenu.SuspendLayout();
this.conCntrls.SuspendLayout();
this.groupBox1.SuspendLayout();
@@ -333,6 +334,16 @@
this.AutoCalibrate.UseVisualStyleBackColor = true;
this.AutoCalibrate.Click += new System.EventHandler(this.StartCalibrate);
//
+ // btn_reassign_open
+ //
+ this.btn_reassign_open.Location = new System.Drawing.Point(107, 112);
+ this.btn_reassign_open.Name = "btn_reassign_open";
+ this.btn_reassign_open.Size = new System.Drawing.Size(75, 20);
+ this.btn_reassign_open.TabIndex = 13;
+ this.btn_reassign_open.Text = "Map Buttons";
+ this.btn_reassign_open.UseVisualStyleBackColor = true;
+ this.btn_reassign_open.Click += new System.EventHandler(this.btn_reassign_open_Click);
+ //
// MainForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -340,6 +351,7 @@
this.AutoSize = true;
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.ClientSize = new System.Drawing.Size(284, 261);
+ this.Controls.Add(this.btn_reassign_open);
this.Controls.Add(this.foldLbl);
this.Controls.Add(this.rightPanel);
this.Controls.Add(this.AutoCalibrate);
@@ -396,5 +408,6 @@
private System.Windows.Forms.Button settingsApply;
private System.Windows.Forms.Label foldLbl;
private System.Windows.Forms.Button AutoCalibrate;
- }
+ private System.Windows.Forms.Button btn_reassign_open;
+ }
}
\ No newline at end of file
diff --git a/BetterJoyForCemu/MainForm.cs b/BetterJoyForCemu/MainForm.cs
index 4196ece..85f5e7a 100644
--- a/BetterJoyForCemu/MainForm.cs
+++ b/BetterJoyForCemu/MainForm.cs
@@ -93,10 +93,10 @@ namespace BetterJoyForCemu {
Program.Start();
- passiveScanBox.Checked = Config.Value("ProgressiveScan");
- startInTrayBox.Checked = Config.Value("StartInTray");
+ passiveScanBox.Checked = Config.IntValue("ProgressiveScan") == 1;
+ startInTrayBox.Checked = Config.IntValue("StartInTray") == 1;
- if (Config.Value("StartInTray")) {
+ if (Config.IntValue("StartInTray") == 1) {
HideToTray();
} else {
ShowFromTray();
@@ -124,7 +124,8 @@ namespace BetterJoyForCemu {
}
private void passiveScanBox_CheckedChanged(object sender, EventArgs e) {
- Config.Save("ProgressiveScan", passiveScanBox.Checked);
+ Config.SetValue("ProgressiveScan", passiveScanBox.Checked ? "1" : "0");
+ Config.Save();
}
public void AppendTextBox(string value) { // https://stackoverflow.com/questions/519233/writing-to-a-textbox-from-another-thread
@@ -224,7 +225,8 @@ namespace BetterJoyForCemu {
}
private void startInTrayBox_CheckedChanged(object sender, EventArgs e) {
- Config.Save("StartInTray", startInTrayBox.Checked);
+ Config.SetValue("StartInTray", startInTrayBox.Checked ? "1" : "0");
+ Config.Save();
}
private void btn_open3rdP_Click(object sender, EventArgs e) {
@@ -330,6 +332,11 @@ namespace BetterJoyForCemu {
countDown.Enabled = true;
}
+ private void btn_reassign_open_Click(object sender, EventArgs e) {
+ Reassign mapForm = new Reassign();
+ mapForm.ShowDialog();
+ }
+
private void CountDown(object sender, EventArgs e) {
if (this.count == 0) {
this.console.Text = "Calibrating...";
diff --git a/BetterJoyForCemu/Program.cs b/BetterJoyForCemu/Program.cs
index 817f891..ac31281 100644
--- a/BetterJoyForCemu/Program.cs
+++ b/BetterJoyForCemu/Program.cs
@@ -95,7 +95,7 @@ namespace BetterJoyForCemu {
}
void CheckForNewControllersTime(Object source, ElapsedEventArgs e) {
- if (Config.Value("ProgressiveScan")) {
+ if (Config.IntValue("ProgressiveScan") == 1) {
CheckForNewControllers();
}
}
diff --git a/BetterJoyForCemu/Reassign.Designer.cs b/BetterJoyForCemu/Reassign.Designer.cs
new file mode 100644
index 0000000..71d24dd
--- /dev/null
+++ b/BetterJoyForCemu/Reassign.Designer.cs
@@ -0,0 +1,248 @@
+namespace BetterJoyForCemu {
+ partial class Reassign {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing) {
+ if (disposing && (components != null)) {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent() {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Reassign));
+ this.btn_capture = new System.Windows.Forms.Button();
+ this.lbl_capture = new System.Windows.Forms.Label();
+ this.lbl_home = new System.Windows.Forms.Label();
+ this.btn_home = new System.Windows.Forms.Button();
+ this.lbl_sl_l = new System.Windows.Forms.Label();
+ this.btn_sl_l = new System.Windows.Forms.Button();
+ this.lbl_sr_l = new System.Windows.Forms.Label();
+ this.btn_sr_l = new System.Windows.Forms.Button();
+ this.lbl_sl_r = new System.Windows.Forms.Label();
+ this.btn_sl_r = new System.Windows.Forms.Button();
+ this.lbl_sr_r = new System.Windows.Forms.Label();
+ this.btn_sr_r = new System.Windows.Forms.Button();
+ this.btn_close = new System.Windows.Forms.Button();
+ this.btn_apply = new System.Windows.Forms.Button();
+ this.tip_reassign = new System.Windows.Forms.ToolTip(this.components);
+ this.lbl_reset_mouse = new System.Windows.Forms.Label();
+ this.btn_reset_mouse = new System.Windows.Forms.Button();
+ this.SuspendLayout();
+ //
+ // btn_capture
+ //
+ this.btn_capture.Location = new System.Drawing.Point(105, 12);
+ this.btn_capture.Name = "btn_capture";
+ this.btn_capture.Size = new System.Drawing.Size(75, 23);
+ this.btn_capture.TabIndex = 0;
+ this.btn_capture.UseVisualStyleBackColor = true;
+ //
+ // lbl_capture
+ //
+ this.lbl_capture.AutoSize = true;
+ this.lbl_capture.Location = new System.Drawing.Point(15, 17);
+ this.lbl_capture.Name = "lbl_capture";
+ this.lbl_capture.Size = new System.Drawing.Size(44, 13);
+ this.lbl_capture.TabIndex = 2;
+ this.lbl_capture.Text = "Capture";
+ this.lbl_capture.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ //
+ // lbl_home
+ //
+ this.lbl_home.AutoSize = true;
+ this.lbl_home.Location = new System.Drawing.Point(15, 46);
+ this.lbl_home.Name = "lbl_home";
+ this.lbl_home.Size = new System.Drawing.Size(35, 13);
+ this.lbl_home.TabIndex = 4;
+ this.lbl_home.Text = "Home";
+ this.lbl_home.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ //
+ // btn_home
+ //
+ this.btn_home.Location = new System.Drawing.Point(105, 41);
+ this.btn_home.Name = "btn_home";
+ this.btn_home.Size = new System.Drawing.Size(75, 23);
+ this.btn_home.TabIndex = 3;
+ this.btn_home.UseVisualStyleBackColor = true;
+ //
+ // lbl_sl_l
+ //
+ this.lbl_sl_l.AutoSize = true;
+ this.lbl_sl_l.Location = new System.Drawing.Point(15, 75);
+ this.lbl_sl_l.Name = "lbl_sl_l";
+ this.lbl_sl_l.Size = new System.Drawing.Size(78, 13);
+ this.lbl_sl_l.TabIndex = 6;
+ this.lbl_sl_l.Text = "SL Left Joycon";
+ this.lbl_sl_l.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ //
+ // btn_sl_l
+ //
+ this.btn_sl_l.Location = new System.Drawing.Point(105, 70);
+ this.btn_sl_l.Name = "btn_sl_l";
+ this.btn_sl_l.Size = new System.Drawing.Size(75, 23);
+ this.btn_sl_l.TabIndex = 5;
+ this.btn_sl_l.UseVisualStyleBackColor = true;
+ //
+ // lbl_sr_l
+ //
+ this.lbl_sr_l.AutoSize = true;
+ this.lbl_sr_l.Location = new System.Drawing.Point(15, 104);
+ this.lbl_sr_l.Name = "lbl_sr_l";
+ this.lbl_sr_l.Size = new System.Drawing.Size(80, 13);
+ this.lbl_sr_l.TabIndex = 8;
+ this.lbl_sr_l.Text = "SR Left Joycon";
+ this.lbl_sr_l.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ //
+ // btn_sr_l
+ //
+ this.btn_sr_l.Location = new System.Drawing.Point(105, 99);
+ this.btn_sr_l.Name = "btn_sr_l";
+ this.btn_sr_l.Size = new System.Drawing.Size(75, 23);
+ this.btn_sr_l.TabIndex = 7;
+ this.btn_sr_l.UseVisualStyleBackColor = true;
+ //
+ // lbl_sl_r
+ //
+ this.lbl_sl_r.AutoSize = true;
+ this.lbl_sl_r.Location = new System.Drawing.Point(15, 133);
+ this.lbl_sl_r.Name = "lbl_sl_r";
+ this.lbl_sl_r.Size = new System.Drawing.Size(85, 13);
+ this.lbl_sl_r.TabIndex = 10;
+ this.lbl_sl_r.Text = "SL Right Joycon";
+ this.lbl_sl_r.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ //
+ // btn_sl_r
+ //
+ this.btn_sl_r.Location = new System.Drawing.Point(105, 128);
+ this.btn_sl_r.Name = "btn_sl_r";
+ this.btn_sl_r.Size = new System.Drawing.Size(75, 23);
+ this.btn_sl_r.TabIndex = 9;
+ this.btn_sl_r.UseVisualStyleBackColor = true;
+ //
+ // lbl_sr_r
+ //
+ this.lbl_sr_r.AutoSize = true;
+ this.lbl_sr_r.Location = new System.Drawing.Point(15, 162);
+ this.lbl_sr_r.Name = "lbl_sr_r";
+ this.lbl_sr_r.Size = new System.Drawing.Size(87, 13);
+ this.lbl_sr_r.TabIndex = 12;
+ this.lbl_sr_r.Text = "SR Right Joycon";
+ this.lbl_sr_r.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ //
+ // btn_sr_r
+ //
+ this.btn_sr_r.Location = new System.Drawing.Point(105, 157);
+ this.btn_sr_r.Name = "btn_sr_r";
+ this.btn_sr_r.Size = new System.Drawing.Size(75, 23);
+ this.btn_sr_r.TabIndex = 11;
+ this.btn_sr_r.UseVisualStyleBackColor = true;
+ //
+ // btn_close
+ //
+ this.btn_close.Location = new System.Drawing.Point(15, 231);
+ this.btn_close.Name = "btn_close";
+ this.btn_close.Size = new System.Drawing.Size(75, 23);
+ this.btn_close.TabIndex = 13;
+ this.btn_close.Text = "Okay";
+ this.btn_close.UseVisualStyleBackColor = true;
+ this.btn_close.Click += new System.EventHandler(this.btn_close_Click);
+ //
+ // btn_apply
+ //
+ this.btn_apply.Location = new System.Drawing.Point(105, 231);
+ this.btn_apply.Name = "btn_apply";
+ this.btn_apply.Size = new System.Drawing.Size(75, 23);
+ this.btn_apply.TabIndex = 14;
+ this.btn_apply.Text = "Apply";
+ this.btn_apply.UseVisualStyleBackColor = true;
+ this.btn_apply.Click += new System.EventHandler(this.btn_apply_Click);
+ //
+ // lbl_reset_mouse
+ //
+ this.lbl_reset_mouse.AutoSize = true;
+ this.lbl_reset_mouse.Location = new System.Drawing.Point(15, 191);
+ this.lbl_reset_mouse.Name = "lbl_reset_mouse";
+ this.lbl_reset_mouse.Size = new System.Drawing.Size(80, 13);
+ this.lbl_reset_mouse.TabIndex = 16;
+ this.lbl_reset_mouse.Text = "Re-Centre Gyro";
+ this.lbl_reset_mouse.TextAlign = System.Drawing.ContentAlignment.TopCenter;
+ //
+ // btn_reset_mouse
+ //
+ this.btn_reset_mouse.Enabled = false;
+ this.btn_reset_mouse.Location = new System.Drawing.Point(105, 186);
+ this.btn_reset_mouse.Name = "btn_reset_mouse";
+ this.btn_reset_mouse.Size = new System.Drawing.Size(75, 23);
+ this.btn_reset_mouse.TabIndex = 15;
+ this.btn_reset_mouse.UseVisualStyleBackColor = true;
+ //
+ // Reassign
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(192, 266);
+ this.Controls.Add(this.lbl_reset_mouse);
+ this.Controls.Add(this.btn_reset_mouse);
+ this.Controls.Add(this.btn_apply);
+ this.Controls.Add(this.btn_close);
+ this.Controls.Add(this.lbl_sr_r);
+ this.Controls.Add(this.btn_sr_r);
+ this.Controls.Add(this.lbl_sl_r);
+ this.Controls.Add(this.btn_sl_r);
+ this.Controls.Add(this.lbl_sr_l);
+ this.Controls.Add(this.btn_sr_l);
+ this.Controls.Add(this.lbl_sl_l);
+ this.Controls.Add(this.btn_sl_l);
+ this.Controls.Add(this.lbl_home);
+ this.Controls.Add(this.btn_home);
+ this.Controls.Add(this.lbl_capture);
+ this.Controls.Add(this.btn_capture);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "Reassign";
+ this.Text = "Map Special Buttons";
+ this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Reassign_FormClosing);
+ this.Load += new System.EventHandler(this.Reassign_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button btn_capture;
+ private System.Windows.Forms.Label lbl_capture;
+ private System.Windows.Forms.Label lbl_home;
+ private System.Windows.Forms.Button btn_home;
+ private System.Windows.Forms.Label lbl_sl_l;
+ private System.Windows.Forms.Button btn_sl_l;
+ private System.Windows.Forms.Label lbl_sr_l;
+ private System.Windows.Forms.Button btn_sr_l;
+ private System.Windows.Forms.Label lbl_sl_r;
+ private System.Windows.Forms.Button btn_sl_r;
+ private System.Windows.Forms.Label lbl_sr_r;
+ private System.Windows.Forms.Button btn_sr_r;
+ private System.Windows.Forms.Button btn_close;
+ private System.Windows.Forms.Button btn_apply;
+ private System.Windows.Forms.ToolTip tip_reassign;
+ private System.Windows.Forms.Label lbl_reset_mouse;
+ private System.Windows.Forms.Button btn_reset_mouse;
+ }
+}
\ No newline at end of file
diff --git a/BetterJoyForCemu/Reassign.cs b/BetterJoyForCemu/Reassign.cs
new file mode 100644
index 0000000..acf1f6c
--- /dev/null
+++ b/BetterJoyForCemu/Reassign.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Diagnostics;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace BetterJoyForCemu {
+ public partial class Reassign : Form {
+ private WindowsInput.Events.Sources.IKeyboardEventSource keyboard;
+ private WindowsInput.Events.Sources.IMouseEventSource mouse;
+
+ private Control curAssignment;
+
+ public Reassign() {
+ InitializeComponent();
+
+ foreach (Control c in new Control[] { btn_capture, btn_home, btn_sl_l, btn_sl_r, btn_sr_l, btn_sr_r, btn_reset_mouse }) {
+ c.Tag = c.Name.Substring(4);
+ GetPrettyName(c);
+
+ tip_reassign.SetToolTip(c, "Left-click to detect input.\r\nMiddle-click to clear to default.\r\nRight-click to see more options.");
+ c.MouseDown += Remap;
+ }
+ }
+
+ private void Remap(object sender, MouseEventArgs e) {
+ Button c = sender as Button;
+ Debug.WriteLine(e.Button);
+ switch (e.Button) {
+ case MouseButtons.Left:
+ c.Text = "...";
+ curAssignment = c;
+ break;
+ case MouseButtons.Middle:
+ Config.SetValue((string) c.Tag, Config.GetDefaultValue((string) c.Tag));
+ GetPrettyName(c);
+ break;
+ case MouseButtons.Right:
+ break;
+ }
+ }
+
+ private void Reassign_Load(object sender, EventArgs e) {
+ keyboard = WindowsInput.Capture.Global.KeyboardAsync();
+ keyboard.KeyEvent += Keyboard_KeyEvent;
+ mouse = WindowsInput.Capture.Global.MouseAsync();
+ mouse.MouseEvent += Mouse_MouseEvent;
+ }
+
+ private void Mouse_MouseEvent(object sender, WindowsInput.Events.Sources.EventSourceEventArgs e) {
+ if (curAssignment != null && e.Data.ButtonDown != null) {
+ Config.SetValue((string)curAssignment.Tag, "mse_" + ((int)e.Data.ButtonDown.Button));
+ AsyncPrettyName(curAssignment);
+ curAssignment = null;
+ }
+ }
+
+ private void Keyboard_KeyEvent(object sender, WindowsInput.Events.Sources.EventSourceEventArgs e) {
+ if (curAssignment != null && e.Data.KeyDown != null) {
+ Config.SetValue((string)curAssignment.Tag, "key_" + ((int)e.Data.KeyDown.Key));
+ AsyncPrettyName(curAssignment);
+ curAssignment = null;
+ }
+ }
+
+ private void Reassign_FormClosing(object sender, FormClosingEventArgs e) {
+ keyboard.Dispose();
+ mouse.Dispose();
+ }
+
+ private void AsyncPrettyName(Control c) {
+ if (InvokeRequired) {
+ this.Invoke(new Action(AsyncPrettyName), new object[] { c });
+ return;
+ }
+ GetPrettyName(c);
+ }
+
+ private void GetPrettyName(Control c) {
+ string val;
+ switch (val = Config.Value((string)c.Tag)) {
+ case "0":
+ if (c == btn_home)
+ c.Text = "Guide";
+ break;
+ default:
+ Type t = val.StartsWith("joy_") ? typeof(Joycon.Button) : (val.StartsWith("key_") ? typeof(WindowsInput.Events.KeyCode) : typeof(WindowsInput.Events.ButtonCode));
+ c.Text = Enum.GetName(t, Int32.Parse(val.Substring(4)));
+ break;
+ }
+ }
+
+ private void btn_apply_Click(object sender, EventArgs e) {
+ Config.Save();
+ }
+
+ private void btn_close_Click(object sender, EventArgs e) {
+ btn_apply_Click(sender, e);
+ Close();
+ }
+ }
+}
diff --git a/BetterJoyForCemu/Reassign.resx b/BetterJoyForCemu/Reassign.resx
new file mode 100644
index 0000000..3e39d2c
--- /dev/null
+++ b/BetterJoyForCemu/Reassign.resx
@@ -0,0 +1,762 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ 17, 17
+
+
+
+
+ AAABAAUAEBAAAAEAIABoBAAAVgAAABgYAAABACAAiAkAAL4EAAAgIAAAAQAgAKgQAABGDgAAMDAAAAEA
+ IACoJQAA7h4AAAAAAAABACAA6E8AAJZEAAAoAAAAEAAAACAAAAABACAAAAAAAAAEAADDDgAAww4AAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAPDwwRDhI7XgoNMEwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJ
+ EgAAABYELicITTcvB2QLCwwUFBlTjSg1x/siLKjtBwkkQQoNNAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9
+ RQAqJAUAIR0KQJN5AuyzlAH9TkEGlhsjhNgzQ/z/Lz7s/xMaYpsAAAADAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAFBQUAAAAPA1ZIA5nSrQD/5LwA/3pmBOEeJondMkL8/zFB//9ETbjuYWFgnmJiYo1eXl6OXl5ejl5e
+ Xo5iYmKPZWVljmJjZJ6okint5LwA/+K6AP96ZQLkGyOA0S8/+v9aZ///1Nf9/+rq6f+9vb3/6urq/+zs
+ 7P/q6ur/vr6+/66urv/o6On/+fHL/+nJMv/ftwD/cF0D2TI4dL6OlvT/4+X///z8/P+cnJz/NjY2/7Gx
+ sf//////39/f/2RkZP9dXV3/s7Oz///////79dn/59Jy/2dbIMdeXmCh6uvr//b29v/e3t7/oKCg/z8/
+ P/+5ubn//////+Hh4f9kZGT/XFxc/6Ojo/+9vb3//Pz8/+zs6/9eXVysRUVFeNLS0v6Ojo7/YGBg/56e
+ nv/Z2dn/7e3t//n5+f/39/f/y8vL/6qqqv+urq7/j4+P/8bGxv/Kysr/RUVGgR8fH0KoqKjvb29v/15e
+ Xv9+fn7/+vr6/9TU1P/u7u7/6urq/9jY2P+xsbH/lpaW/9PT0/+CgoL/jo6O8icnJ0kAAAAOcHBws7W1
+ tf+ZmZn/3Nzc/93d3f/j4+P////////////d3d3/4eHh/9vb2/99fX3/2dnZ/29vb7cAAAASHx8fABQU
+ FDxPT0/jiIiI/6SkpP+vr6/7t7e38rq6uvK6urrytra2862trfyenp7/eXl5/1FRUdUZGRk0KCgoAAMD
+ AwAEBAQBAgICOAMDA4IICAibEBAQZhcXFzcVFRU4FRUVNxYWFjkODg51CAgInAMDA3gBAQErFBQUAAAA
+ AAAAAAAAAAAAAAAAAAD6+voA/Pz8APv7+wD7+/sAAAAAAAAAAADz8/MA9PT0APf39wD09PQAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP//AAD//wAAD/AAAA/wAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAB
+ AACAAwAA//8AAP//AAAoAAAAGAAAADAAAAABACAAAAAAAAAJAADDDgAAww4AAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8OBgsBAQA0AAAAJwAA
+ AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADA8eAAsP
+ IwIHCBEqCAkPPAQFFQ4BAxAADg0AExEUNJsaIoHxFBpl4QMED1gUGmQAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQADQQAABIRC1dXSAPjdWEC9TApBqQDBhQZCgsZdyEr
+ ovo0RP//Lz7s/xEWVdAAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAWFhcAAAAZGEc8Bc7PqwD/6L8A/5d9Af0dGgqFDBA6vS084f8zQ///NET//yAqofsCAghcBAYWAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAExMTgANCgEADQ0MWYpyAvrnvwD/5b0A/86q
+ AP88MwbMEBRFzC896f8zQ///M0P//y074f8MDz68AAAAHwAAAA0AAAANAAAADQAAAA0AAAANAAAADQAA
+ AA0AAAAOAAAADgAAAA4AAAIeNi0CuMajAP/mvQD/5b0A/9KtAP9EOgjaExdDyC485f8zQ///M0P//zND
+ //9cY7b8Xl5b2VJSUshTU1PIUlJSyFJSUshSUlLIUlJSyFJSUshTU1PJVVVVyVZWVspeX2HYqZhG++S8
+ Av/kvAD/5b0A/86qAP85LwLQDhE4uCw63v8zQ///MUH//3F9///r7f//+Pj3/+jo6P/k5OT/8fHx//Hx
+ 8f/x8fH/8fHx//Pz8//j4+P/2dnZ//Hx8f/4+fn//Pnn/+3RUf/kuwD/5b0A/8ilAP8zKwbIEBMxqCg2
+ 1P89Tf//hI3//+rs/////////////56env9qamr/+/v7/////////////////87Ozv9dXV3/UVFR/5CQ
+ kP/5+fn///////z45v/u1mL/58AL/76cAP8pIgW1FRYmj3B2xf/L0P//+fn////////9/f3/k5OT/y4u
+ Lv8ZGRn/b29v/+zs7P///////v7+/3R0dP9dXV3/dXV1/0lJSf/Q0ND////////////+/fb/+u+5/7qp
+ WP8iHw+fGBgYcrCwsP3////////////////9/f3/paWl/zw8PP8gICD/hISE/+/v7////////////3h4
+ eP9WVlb/bm5u/0dHR//Ozs7/4eHh//n5+f///////////7Kysv8aGhqEBgYGUJSUlPb/////6Ojo/5OT
+ k/+Hh4f/29vb/6mpqf94eHj/+/v7/////////////////9jY2P9lZWX/U1NT/6Ojo/++vr7/Jycn/8DA
+ wP///////////5eXl/kHBwheAAAALXJycuT6+vr/enp6/05OTv9aWlr/XFxc/+np6f/7+/v/8/Pz/+bm
+ 5v///////v7+/+rq6v/x8fH/4ODg/6ioqP/FxcX/kZGR/8rKyv+np6f/6enp/3V1deoAAAA2AAAADkpK
+ SsDg4OD/W1tb/21tbf96enr/SkpK/9nZ2f//////1NTU/6SkpP///////Pz8/5mZmf/e3t7/zs7O/x4e
+ Hv+pqan//////7e3t/8dHR3/ra2t/09PT8kAAAATTU1NACEhIYK7u7v/np6e/0VFRf9GRkb/cXFx//f3
+ 9//f39//5ubm//z8/P////////////n5+f/e3t7/3d3d/9HR0f/MzMz/YmJi/76+vv/U1NT/tLS0/yQk
+ JI3BwcEADg4OAAICAilZWVna39/f/8rKyv+7u7v/8PDw//////+5ubn/zs7O////////////////////
+ //++vr7/xsbG///////U1NT/S0tL/8bGxv/q6ur/W1tb3wUFBTENDQ0AGhoaAAAAAAAMDAxqQ0ND+p+f
+ n//Nzc3/3t7e/+fn5//o6Oj/5ubm/+bm5v/m5ub/5ubm/+bm5v/m5ub/6Ojo/+bm5v/c3Nz/vb29/5eX
+ l/9GRkbwDg4OWQAAAAAnJycAAAAAAA8PDwAREREMBQUFhwUFBegQEBD9Hh4e/ykpKf04ODjSQEBAsj8/
+ P7I/Pz+yPz8/sj8/P7I/Pz+0MzMz4ScnJ/8dHR3/EBAQ+gUFBdkGBgZnGRkZBBMTEwAAAAAAAAAAAAAA
+ AAAmJiYANjY2BRISEiwICAhYCQkJcgYGBmYEBAQdAAAABAAAAAUAAAAFAAAABQAAAAUBAQEFBQUFMAYG
+ BnEKCgpvCQkJThMTEx42NjYBJCQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8Ah//hAAf/4AAD/8AAA//AAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAQCAAAEAwAADAMAAAwDgAAcA////AP///wD///8AKAAAACAA
+ AABAAAAAAQAgAAAAAAAAEAAAww4AAMMOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAQDAAAGBQADAAAAEwAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF5gaADIydEAFBYiDhIU
+ HxkTFSEFDg8cAP///wAcGxYAHx4XGgsMEo0JDC3QBggevQAAAE0AAAABAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkJCQAWVlYAQoK
+ Dk0eGgfCLSYG2hIRCZkKCxEgAwQKABsaDg8LDBmlHCSF/y074v8nM8P/Cw855AAAADsAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2NjAA0N
+ DgALDBQ4LicE46eKAP/MqAD/fmgB/xkWCLMUFiAWBwYAXBYcZfYyQvj/M0T//zRE//8iLan/AwMNnQAA
+ AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAvLy8AUVh3AhEQC5qMdAD/6cAA/+a+AP/iuwD/ZFIC+gkKD24CAwieIi2q/zRE//8zQ///M0P//y8+
+ 6f8MEDzhAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAABQUFAAGCRYlMioF38yoAP/mvQD/5LwA/+i/AP+ghAD/ERAHsgQFErYmMr7/NET//zND
+ //8zQ///M0T//xsjhv8AAAB4AwQSAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAPDw8AAAAAAAgJDXRwXAH/5b0A/+S8AP/kvAD/574A/6+QAP8gHA7NCwwXtyUx
+ uv80RP//M0P//zND//8zRP//KzjY/wkML90EBABbAAAAMgAAADMAAAAzAAAAMwAAADMAAAAzAAAAMwAA
+ ADMAAAAzAAAAMwAAADQAAAA0AAAANQAAADYAAAFXKCEC2LybAP/mvgD/5LwA/+S8AP/nvwD/q40A/xcU
+ B8UPEBiwJC+y/zRE//8zQ///M0P//zJC//86Sf//foPB/2dnZflSUlLwUlJS8FJSUvBSUlLwUlJS8FJS
+ UvBSUlLwUlJS8FJSUvBSUlLwUlJS8FNTU/BXV1fwWFhY8WlpbPm4q23/5b4K/+S8AP/kvAD/5LwA/+e/
+ AP+jhgD/DgwDvAMECJsiLKn/NET//zND//8yQv//NUX//5Ka///5+f///f38//j4+P/6+vr/+fn5//j4
+ +P/4+Pj/+Pj4//j4+P/4+Pj/+Pj4//r6+v/6+vr/+Pj4//39/f/7+/v//f3+//79+P/x3Hv/5L0G/+S8
+ AP/kvAD/6L8A/5p/AP8REAu1Dg4PkSApmv8zRP//MED//zpJ//+Vnf//9vb/////////////9fX1/4qK
+ iv+oqKj/////////////////////////////////39/f/4SEhP9qamr/o6Oj//X19f////////////78
+ 9f/x3Hv/5b4K/+S7AP/ovwD/jHMA/wYGBJ4MCwd4GySJ/jlI//9fa///t73///n6//////////////j4
+ +P/b29v/JCQk/1VVVf/v7+//+/v7/////////////////+3t7f9TU1P/QUFB/1dXV/80NDT/kJCQ////
+ //////////////79+P/15qD/6ckx/+jABf98ZgH/CgoOjgwMCWFFSXX6wMX//+/w////////////////
+ ////////hoaG/yoqKv8ICAj/EhIS/zMzM/+3t7f/////////////////vLy8/zc3N/94eHj/fHx8/2Zm
+ Zv9ISEj/8PDw///////////////////////9+ej/+Oqs/29lN/4HBwp0BwcHSF9fX/P8/Pv/////////
+ //////////////////+ZmZn/RkZG/wwMDP8cHBz/UVFR/8LCwv/////////////////AwMD/MzMz/3V1
+ df98fHz/X19f/0pKSv/y8vL/+vr6//39/f/////////////////9/f3/YWFh+QsLC1wAAAAtRUVF5fHx
+ 8f////////////T09P/V1dX/39/f//39/f/n5+f/JiYm/1paWv/6+vr//v7+//////////////////Ly
+ 8v9gYGD/MzMz/0VFRf8uLi7/oaGh/9LS0v9QUFD/np6e//////////////////T09P9ISEjuBQUFPgMD
+ AxYuLi7P3Nzc///////h4eH/Xl5e/zg4OP88PDz/jY2N//Hx8f+oqKj/vr6+////////////////////
+ /////////////+vr6/+bm5v/f39//7u7u///////pqam/wEBAf9cXFz//Pz8////////////4eHh/y8v
+ L9oAAAAgJSUlBRoaGqu6urr//////3d3d/8+Pj7/dHR0/2xsbP8zMzP/ubm5////////////+/v7/9vb
+ 2//19fX////////////09PT/5OTk//7+/v/9/f3/qqqq/5GRkf/h4eH/rKys/9jY2P+9vb3/hISE/+fn
+ 5//BwcH/HBwcuR0dHQoAAAAACQkJd4qKiv/8/Pz/U1NT/15eXv97e3v/fHx8/0NDQ/+SkpL/////////
+ ///s7Oz/X19f/8/Pz////////////7y8vP9iYmL/9vb2/+vr6/8vLy//DQ0N/8jIyP//////+vr6/1FR
+ Uf8AAAD/qKio/5KSkv8LCwuGAAAAABAQEAAEBARAVVVV8/f39/9+fn7/OTk5/3BwcP9mZmb/Ly8v/7y8
+ vP////////////z8/P/k5OT/9/f3////////////8fHx/9zc3P/9/f3/+/v7/52dnf+EhIT/5eXl/7q6
+ uv/W1tb/tLS0/3h4eP/a2tr/WFhY+QgICE0PDw8AGBgYAAcHBxAgICDAwMDA/+np6f9nZ2f/NTU1/zg4
+ OP+Ojo7/+fn5//7+/v+cnJz/vb29/////////////////////////////////6SkpP+wsLD/////////
+ //+2trb/BwcH/01NTf/39/f//////8LCwv8hISHMFRUVFyEhIQAsLCwAAAAAAAgICFFHR0fx3t7e//r6
+ +v/d3d3/4+Pj//z8/P///////v7+/6urq//Hx8f/////////////////////////////////srKy/7y8
+ vP///////////9XV1f9OTk7/kZGR///////g4OD/S0tL9AsLC14AAAAAKioqAAAAAAAmJiYAODg4BQoK
+ Cpo6Ojr/p6en/9/f3//09PT//Pz8////////////////////////////////////////////////////
+ ///////////////////+/v7/+/v7/+rq6v/Y2Nj/pKSk/z09PfwLCwuDMTExBSYmJgAAAAAAAAAAAP//
+ /wAPDw8AFBQUJQMDA8kGBgb/HR0d/zo6Ov9TU1P/ZWVl/29vb/9zc3P+dHR0/HR0dPx0dHT8dHR0/HR0
+ dPx0dHT8dHR0/HR0dP1ycnL+bm5u/2NjY/9QUFD/ODg4/xsbG/8GBgb8BgYGoRwcHBAXFxcAAAAAAAAA
+ AAAAAAAAAAAAACIiIgAXFxcAGhoaJg8PD48EBATVAQEB7gAAAPgAAAD7AQEB3wUFBXsAAABVAAAAVgAA
+ AFYAAABWAAAAVgAAAFYAAABWAQEBVwQEBJ4AAADyAAAA/AAAAPcBAQHnBQUFwg4ODmsmJiYRHx8fANDQ
+ 0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6OjoASUlJAhcXFxcSEhIyFxcXRxMTE08TExMoMjIyAioq
+ KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASEhIAFhYWCRQUFDwTExNQGRkZRBISEikgICANxsbGAFdX
+ VwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
+ ////////x///44H//4EB//+AAP//AAD//wAA//8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAIAAAAGAAAABgAAAAcAAAAPAAAAD4AAAB/AAAA/4D/A//////////////////////ygA
+ AAAwAAAAYAAAAAEAIAAAAAAAACQAAMMOAADDDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAf3+EAAAAAAAkJCQMBQUEQAAAAGcAAABSAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUAAAAAAAJCQlGxAQE1sUFBh7Dw8SUiUl
+ JRMeHyAABAQEAAAAAAADAwMAHx8fACwsLCoODgytBgcV8woNMv8GCB/6AAECyAAAAEIAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjIyAAAAAAAQEBE/CQkKzBoW
+ A/wuJgL/FxMD+gkJCrwUFBQ1CwsMAB8fHwAQEBAAExMTHgkJCMIOEkH/JjK+/zA+7v8rONb/Exle/wEB
+ A9gAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgACIi
+ Ii0ICAnXRjkA/7mYAP/VsAD/spIA/0M3AP8ICAfSGhsbLhEREQBeXl8EDw8MkgsPNv8sOtv/NET//zND
+ //80RP//Lz7q/w0SQ/8AAACdAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAA3NzcAaWlpAwsLD5YuJgH/yKUA/+i/AP/lvQD/6L8A/82pAP87MQH/DQ0Qp0JCQgoHBwQqBQYL3iAq
+ ov80RP//M0P//zND//8zQ///NET//yEsqP8BAgjkAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAjIyMAJCUmKAsLCeKEbQD/578A/+S8AP/kvAD/5LwA/+i/AP+ghAD/EQ8G7BUV
+ GD8AAABfCAol+C074P8zRP//M0P//zND//8zQ///M0P//y495/8JDDD/AAAAdgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAABISEgACAgIADxATbyMdA//FowD/5r4A/+S8AP/kvAD/5LwA/+W9
+ AP/QrAD/KyQC/gkKD3wAAACCDhI//jFA8v8zQ///M0P//zND//8zQ///M0P//zND//8YIHv/AAAAxwAA
+ ABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgAwMDARBwgLwl9OAP/juwD/5LwA/+S8
+ AP/kvAD/5LwA/+S8AP/dtgD/QjYB/wgJDp8AAACLDhNF/zFA9f8zQ///M0P//zND//8zQ///M0P//zRE
+ //8pNsz/BQYZ+AAAAFcAAAAAAQEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBgYABQUFAATFBdRFBEF96yN
+ AP/nvgD/5LwA/+S8AP/kvAD/5LwA/+S8AP/fuAD/RjoB/xobILMHBwKKDRFB/zFA8/8zQ///M0P//zND
+ //8zQ///M0P//zND//8yQvr/Exlg/wEBAMQZGRguMDAwBDs7OwI5OTkCOTk5Ajk5OQI5OTkCOTk5Ajk5
+ OQI5OTkCOTk5Ajk5OQI5OTkCOTk5Ajk5OQI3NzcCNDQ0AzAwMAMsLCwDKCgoAyMjIwQdHR0EERERBwEB
+ AScAAAO7Sz4A/9y2AP/lvAD/5LwA/+S8AP/kvAD/5LwA/+S8AP/dtgD/QDUB/w4PFKYbGhWLDhE8/zA/
+ 8P8zQ///M0P//zND//8zQ///M0P//zND//8zRP//KjjS/xocOP8ICAbhAQEBsgAAAKsBAQGrAQEBqwEB
+ AasBAQGrAQEBqwEBAasBAQGrAQEBqwEBAasBAQGrAQEBqwEBAasBAQGrAQEBrAAAAKwAAACsAAAArQAA
+ AK4AAACvAAAAtgICBNwyLBH+uJgB/+a+AP/kvAD/5LwA/+S8AP/kvAD/5LwA/+W9AP/ZswD/OS8A/wAA
+ AJUYFxJ9DA8z/i8+7P8zQ///M0P//zND//8zQ///M0P//zND//8wQf//YG3//8bI3/+SkpH/ampq/2Vl
+ Zf9lZWX/ZWVl/2VlZf9lZWX/ZWVl/2VlZf9lZWX/ZWVl/2VlZf9lZWX/ZWVl/2VlZf9lZWX/ZWVl/2Vl
+ Zf9mZmb/a2tr/25ubv9wcHD/dHR0/5eYmf/d2MD/68w5/+S7AP/kvAD/5LwA/+S8AP/kvAD/5LwA/+W9
+ AP/WsAD/MSkB/wECBpIAAABjCAsq+i496P8zQ///M0P//zND//8zQ///M0P//zBB//9SYP//09f/////
+ //////////////7+/v/////////////////+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+
+ /v/+/v7//v7+////////////////////////////////////////////+fLM/+jHLf/kuwD/5LwA/+S8
+ AP/kvAD/5LwA/+W9AP/RrQD/KiMC/xESFo0MCwZaCQsk+Sw63v8zRP//M0P//zND//8zQ///MEH//1Fe
+ ///Lz//////////////////////////////29vb/8vLy//v7+///////////////////////////////
+ /////////////////////////v7+//Dw8P/j4+P/8fHx//7+/v////////////////////////////jv
+ w//oxin/5LsA/+S8AP/kvAD/5LwA/+a9AP/KpwD/IhwC/g8QFHojIx9SCwwe9io30v80RP//M0P//zJC
+ //8xQf//XGn//9HV//////////////////////////////Pz8/9lZWX/NjY2/6ampv//////////////
+ ///////////////////////////////////x8fH/kJCQ/zs7O/8qKir/Pj4+/5eXl//09PT/////////
+ ///////////////////58Mf/6cky/+S7AP/kvAD/5LwA/+a+AP++nQD/FxMA+gAAA18SEg44BwgT6ycz
+ xP8yQv//MED//z5O//+Djf//4+X//////////////////////////////////+7u7v8yMjL/AAAA/4OD
+ g/////////////////////////////////////////////r6+v93d3f/EhIS/z4+Pv9UVFT/PT09/xQU
+ FP+BgYH//Pz8////////////////////////////+/XZ/+3UXP/lvwv/5LsA/+e+AP+ykwD/ExAF+Bsc
+ HlcoJyUqCgoR5Ccxsf9OXP//goz//8rO///6+v/////////////////////////////h4eH/rq6u/6Gh
+ of8iIiL/AAAA/1paWv+urq7/u7u7//f39////////////////////////////8nJyf8bGxv/UFBQ/3t7
+ e/97e3v/e3t7/0xMTP8gICD/0dHR//////////////////////////////////789f/367T/7dNa/+rG
+ Hv+jhwT/DQsF7hcXGT8sKysaCgsM1HR3mf/n6v///Pz/////////////////////////////////////
+ //+SkpL/AwMD/wMDA/8BAQH/AAAA/wICAv8CAgL/JCQk/97e3v///////////////////////////5yc
+ nP8YGBj/cHBw/3p6ev95eXn/enp6/25ubv8XFxf/paWl////////////////////////////////////
+ /////////v76///53P+ZkGr/CgoI5ygoKS1HR0cOCwsLw4GBgP//////////////////////////////
+ //////////////////+enp7/GRkZ/xcXF/8FBQX/AAAA/w0NDf8XFxf/ODg4/+Li4v//////////////
+ /////////////6Ghof8WFhb/bGxs/3p6ev95eXn/enp6/2pqav8VFRX/qqqq////////////////////
+ //////////////////////////////////+Hh4n/CgoK2DU1NR5YWFgEBwcHp2JiYv/+/v7/////////
+ ///////////////////////////////////x8fH/19fX/8fHx/8qKir/AAAA/29vb//Y2Nj/3t7e//z8
+ /P///////////////////////////9XV1f8hISH/PDw8/3V1df96enr/dHR0/zg4OP8nJyf/3Nzc//39
+ /f/Q0ND/z8/P//r6+v////////////////////////////////9ra2v/CgoKxUlJSQ8AAAAABQUFiUVF
+ Rf/19fX///////////////////////T09P/T09P/y8vL/+Xl5f/+/v7//////+7u7v8yMjL/AAAA/4SE
+ hP////////////////////////////////////////////7+/v+Tk5P/ExMT/yIiIv82Njb/ICAg/xcX
+ F/+dnZ3//////6ysrP8ZGRn/GRkZ/6mpqf////////////////////////////n5+f9OTk7/BgYGpVhY
+ WAMEBAQADAwMaCoqKv/k5OT/////////////////zc3N/1FRUf8eHh7/Gxsb/y8vL/+UlJT/9/f3//j4
+ +P+Li4v/ZmZm/76+vv/////////////////////////////////////////////////6+vr/tLS0/11d
+ Xf9CQkL/YGBg/7q6uv/8/Pz//////29vb/8AAAD/AAAA/2tra////////////////////////////+rq
+ 6v8wMDD/BgYGfwAAAAAaGhoAGBgYQxYWFvbHx8f////////////e3t7/NTU1/yEhIf9ZWVn/ZGRk/0RE
+ RP8UFBT/kJCQ////////////////////////////////////////////////////////////////////
+ //////////////v7+//19fX//Pz8//r6+v/19fX//////7e3t/8pKSn/KSkp/7e3t///////9vb2//f3
+ 9////////////8/Pz/8ZGRn8EBAQVxAQEAApKSkAJycnIQsLC+Cbm5v///////////+Li4v/FRUV/2lp
+ af97e3v/enp6/3t7e/9CQkL/LS0t/+Tk5P//////////////////////6+vr/8zMzP/y8vL/////////
+ //////////////Pz8//X19f/+fn5////////////4uLi/2FhYf9FRUX/t7e3//7+/v/i4uL/4uLi////
+ ///Jycn/TExM/1RUVP/T09P//////6Wlpf8NDQ3tJycnMigoKAAtLS0APDw8CQcHB7hmZmb//v7+//7+
+ /v9gYGD/Jycn/3l5ef95eXn/eXl5/3t7e/9gYGD/GBgY/8nJyf//////////////////////mpqa/xUV
+ Ff+6urr//////////////////////5qamv8aGhr/ubm5////////////lpaW/wEBAf8AAAD/SEhI//b2
+ 9v////////////7+/v9mZmb/AAAA/wAAAP93d3f//////25ubv8HBwfKMjIyES8vLwAiIiIAAAAAAAsL
+ C4E1NTX/7Ozs//////90dHT/HR0d/3R0dP96enr/eXl5/3t7e/9SUlL/Hh4e/9TU1P//////////////
+ ////////ysrK/35+fv/b29v//////////////////////8HBwf9iYmL/1NTU////////////sbGx/w8P
+ D/8AAAD/aGho//v7+/////////////////+FhYX/AwMD/wcHB/+ampr/8fHx/zo6Ov8KCgqW////ACoq
+ KgAAAAAAFxcXABgYGEcUFBT2wMDA//////++vr7/GBgY/0JCQv9ycnL/d3d3/2RkZP8bGxv/V1dX//f3
+ 9//////////////////////////////////////////////////////////////////9/f3/////////
+ ////////+Pj4/7Ozs/+dnZ3/5+fn//b29v+lpaX/kpKS/+Xl5f/v7+//o6Oj/6qqqv/39/f/xsbG/xYW
+ FvwbGxtbExMTAAAAAAAAAAAAHBwcAB8fHxMGBgbGa2tr//z8/P/7+/v/j4+P/xkZGf8ZGRn/IiIi/xAQ
+ EP88PDz/09PT////////////9fX1/6Kiov/ExMT/////////////////////////////////////////
+ ////////+fn5/6mpqf+2trb//v7+/////////////////6Kiov8ICAj/AAAA/2tra//8/Pz/////////
+ ///9/f3/cXFx/wgICNgvLy8gLi4uAAAAAAAAAAAAODg4AAAAAAAUFBRlGRkZ+rm5uf//////+/v7/8LC
+ wv97e3v/bGxs/5aWlv/k5OT/////////////////3Nzc/yAgIP9mZmb//v7+////////////////////
+ ////////////////////////6enp/y8vL/9JSUn/9vb2/////////////////46Ojv8AAAD/AAAA/11d
+ Xf/7+/v///////////+/v7//Gxsb/hAQEHoAAAAAKCgoAAAAAAAAAAAAAAAAAB8fHwAoKCgNCAgIqDEx
+ Mf/MzMz/////////////////////////////////////////////////+vr6/7+/v//Y2Nj/////////
+ /////////////////////////////////////////Pz8/8bGxv/Ozs7//////////////////////+Pj
+ 4/9sbGz/Xl5e/9HR0f///////////9DQ0P81NTX/CgoKui4uLhcmJiYAAAAAAAAAAAAAAAAAAAAAAF5e
+ XgAiIiIAJSUlMwgICOQrKyv/p6en/+3t7f/+/v7/////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////+/v7//v7+//7+/v/r6+v/pqam/y4uLv8ICAjOJCQkKw8PDwBdXV0AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAA/Pz8A////ARMTE30CAgL9CgoK/zc3N/9ubm7/nJyc/729vf/T09P/4ODg/+rq
+ 6v/w8PD/8vLy//Ly8v/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx8f/x8fH/8fHx//Hx
+ 8f/x8fH/8fHx/+7u7v/o6Oj/3t7e/9HR0f+5ubn/lpaW/2hoaP8zMzP/CAgI/wUFBekXFxdHBAQEABoa
+ GgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgACMjIxILCwulAwMD/gAAAP8AAAD/AgIC/wsL
+ C/8WFhb/IyMj/y8vL/82Njb/OTk5/zk5Of85OTn/OTk5/zk5Of85OTn/OTk5/zk5Of85OTn/OTk5/zk5
+ Of85OTn/OTk5/zk5Of84ODj/ODg4/zU1Nf8sLCz/ICAg/xQUFP8JCQn/AQEB/wAAAP8AAAD/CAgI6xYW
+ FmGEhIQBOjo6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhoaACgoKAAlJSUUGhoafAwM
+ DNsDAwP8AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/BAQE5gcHB40AAAB3AAAAeAAAAHgAAAB4AAAAeAAA
+ AHgAAAB4AAAAeAAAAHgAAAB4AAAAeAEBAXgICAi5AQEB/AAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/wYG
+ BvEMDAyvICAgQ2FhYQM/Pz8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AABTU1MAcnJyAS8vLyEVFRVcCgoKjQwMDLANDQ3GDAwM0wsLC9QLCwulFhYWPF5eXgIxMTEAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2NjAA0NDQAnJycUDg4OdgwMDMkKCgrWDg4O0Q8P
+ D8EKCgqeDw8PdB0dHTszMzMKJycnANXV1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+fn4Al5eXADo6OgVDQ0MNMTExFCoqKhU9PT0GPz8/AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9PT0ASkpKATMz
+ MxAlJSUWOzs7E01NTQtSUlICTU1NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////AAD///////8AAP///////wAA////////
+ AAD///////8AAOD/////BwAAwH////4DAACAP////AEAAAAf///4AAAAAB////gAAAAAH///+AAAAAAP
+ ///wAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAACAAAAAAAEAAIAA
+ AAAAAQAAgAAAAAABAACAAAAAAAEAAMAAAAAAAwAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA4AAAAAAH
+ AADwAAAAAA8AAPAAAAAAHwAA+AAAAAAfAAD8AAAAAD8AAP4AP/wA/wAA/+D//gf/AAD///////8AAP//
+ /////wAA////////AAD///////8AAP///////wAA////////AACJUE5HDQoaCgAAAA1JSERSAAABAAAA
+ AQAIBgAAAFxyqGYAAE+vSURBVHja7Z13eBzV2bfv2a7ee7XlIhfhXsDgBtiADQQMJIATwDRDqHlprxMI
+ pJDyvUmAJIRAcCCAcejVYKppxk0W7nKTLVtWs9pqtVptPd8fuytsaXallbRF1tzXNcHRzM6emZ3zm3Oe
+ 8xRJCIGCgsLQRBXuBigoKIQPRQAUFIYwigAoKAxhFAFQUBjCKAKgoDCEUQRAQWEIowiAgsIQRhEABYUh
+ jCIACgpDGEUAFBSGMIoAKCgMYRQBUFAYwigCoKAwhFEEQEFhCKMIgILCEEYRAAWFIYwiAAoKQxhFABQU
+ hjCKACgoDGEUAVBQGMIoAqCgMIRRBEBBYQijCICCwhBGEQAFhSGMIgAKCkMYRQAUFIYwigAoKAxhFAFQ
+ UBjCKAKgoDCEUQRAQWEIowiAgsIQRhEABYUhjCIACgpDGEUAFBSGMIoAKCgMYRQBUFAYwmjC3YBIQ5Ik
+ DZAAJAKxQDRgAHS475cKcACtQKUQoircbR5qSJKUC+Th/p20nj8LwIn7t7ECFsAMmACjEKI13O2ORCQh
+ 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
+
+
+
\ No newline at end of file