diff --git a/.vs/ToggleSwitch/v16/.suo b/.vs/ToggleSwitch/v16/.suo
new file mode 100644
index 0000000..df54d0d
Binary files /dev/null and b/.vs/ToggleSwitch/v16/.suo differ
diff --git a/Image70.png b/Image70.png
new file mode 100644
index 0000000..1fc785a
Binary files /dev/null and b/Image70.png differ
diff --git a/Images/060511_Switches.jpg b/Images/060511_Switches.jpg
new file mode 100644
index 0000000..dd37baf
Binary files /dev/null and b/Images/060511_Switches.jpg differ
diff --git a/Images/060511_Switches.psd b/Images/060511_Switches.psd
new file mode 100644
index 0000000..4499898
Binary files /dev/null and b/Images/060511_Switches.psd differ
diff --git a/Images/checkbox.psd b/Images/checkbox.psd
new file mode 100644
index 0000000..0bba2f8
Binary files /dev/null and b/Images/checkbox.psd differ
diff --git a/Images/checkbox2.psd b/Images/checkbox2.psd
new file mode 100644
index 0000000..944d903
Binary files /dev/null and b/Images/checkbox2.psd differ
diff --git a/Images/checkbox3.psd b/Images/checkbox3.psd
new file mode 100644
index 0000000..5fd3aef
Binary files /dev/null and b/Images/checkbox3.psd differ
diff --git a/Images/checkbox3b.psd b/Images/checkbox3b.psd
new file mode 100644
index 0000000..b925842
Binary files /dev/null and b/Images/checkbox3b.psd differ
diff --git a/Images/checkbox_off.png b/Images/checkbox_off.png
new file mode 100644
index 0000000..0fd118a
Binary files /dev/null and b/Images/checkbox_off.png differ
diff --git a/Images/checkbox_off3.png b/Images/checkbox_off3.png
new file mode 100644
index 0000000..bd02011
Binary files /dev/null and b/Images/checkbox_off3.png differ
diff --git a/Images/checkbox_on.png b/Images/checkbox_on.png
new file mode 100644
index 0000000..c523c14
Binary files /dev/null and b/Images/checkbox_on.png differ
diff --git a/Images/checkbox_on2.png b/Images/checkbox_on2.png
new file mode 100644
index 0000000..22e42ef
Binary files /dev/null and b/Images/checkbox_on2.png differ
diff --git a/Images/checkbox_on3.png b/Images/checkbox_on3.png
new file mode 100644
index 0000000..00cf3b3
Binary files /dev/null and b/Images/checkbox_on3.png differ
diff --git a/ToggleSwitch.bmp b/ToggleSwitch.bmp
new file mode 100644
index 0000000..748d55c
Binary files /dev/null and b/ToggleSwitch.bmp differ
diff --git a/ToggleSwitch.png b/ToggleSwitch.png
new file mode 100644
index 0000000..f303603
Binary files /dev/null and b/ToggleSwitch.png differ
diff --git a/ToggleSwitch.sln b/ToggleSwitch.sln
new file mode 100644
index 0000000..87b2aad
--- /dev/null
+++ b/ToggleSwitch.sln
@@ -0,0 +1,28 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.40629.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToggleSwitch", "ToggleSwitch\ToggleSwitch.csproj", "{49B88FFA-F02C-4709-BA65-9F8996444ECD}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToggleSwitchDemo", "ToggleSwitchDemo\ToggleSwitchDemo.csproj", "{2F7ADBD8-EC70-4407-8B09-474E8F2043AC}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {49B88FFA-F02C-4709-BA65-9F8996444ECD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {49B88FFA-F02C-4709-BA65-9F8996444ECD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {49B88FFA-F02C-4709-BA65-9F8996444ECD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {49B88FFA-F02C-4709-BA65-9F8996444ECD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2F7ADBD8-EC70-4407-8B09-474E8F2043AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2F7ADBD8-EC70-4407-8B09-474E8F2043AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2F7ADBD8-EC70-4407-8B09-474E8F2043AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2F7ADBD8-EC70-4407-8B09-474E8F2043AC}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/ToggleSwitch/GraphicsExtensionMethods.cs b/ToggleSwitch/GraphicsExtensionMethods.cs
new file mode 100644
index 0000000..90df29a
--- /dev/null
+++ b/ToggleSwitch/GraphicsExtensionMethods.cs
@@ -0,0 +1,16 @@
+using System.Drawing;
+
+namespace JCS
+{
+ public static class GraphicsExtensionMethods
+ {
+ public static Color ToGrayScale(this Color originalColor)
+ {
+ if (originalColor.Equals(Color.Transparent))
+ return originalColor;
+
+ int grayScale = (int)((originalColor.R * .299) + (originalColor.G * .587) + (originalColor.B * .114));
+ return Color.FromArgb(grayScale, grayScale, grayScale);
+ }
+ }
+}
diff --git a/ToggleSwitch/ImageHelper.cs b/ToggleSwitch/ImageHelper.cs
new file mode 100644
index 0000000..3b6d98e
--- /dev/null
+++ b/ToggleSwitch/ImageHelper.cs
@@ -0,0 +1,52 @@
+using System;
+using System.Drawing;
+using System.Drawing.Imaging;
+
+namespace ToggleSwitch
+{
+ public static class ImageHelper
+ {
+ private static float[][] _colorMatrixElements = {
+ new float[] {(float)0.299, (float)0.299, (float)0.299, 0, 0},
+ new float[] {(float)0.587, (float)0.587, (float)0.587, 0, 0},
+ new float[] {(float)0.114, (float)0.114, (float)0.114, 0, 0},
+ new float[] {0, 0, 0, 1, 0},
+ new float[] {0, 0, 0, 0, 1}
+ };
+
+ private static ColorMatrix _grayscaleColorMatrix = new ColorMatrix(_colorMatrixElements);
+
+ public static ImageAttributes GetGrayscaleAttributes()
+ {
+ ImageAttributes attr = new ImageAttributes();
+ attr.SetColorMatrix(_grayscaleColorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
+ return attr;
+ }
+
+ public static Size RescaleImageToFit(Size imageSize, Size canvasSize)
+ {
+ //Code "borrowed" from http://stackoverflow.com/questions/1940581/c-sharp-image-resizing-to-different-size-while-preserving-aspect-ratio
+ // and the Math.Min improvement from http://stackoverflow.com/questions/6501797/resize-image-proportionally-with-maxheight-and-maxwidth-constraints
+
+ // Figure out the ratio
+ double ratioX = (double)canvasSize.Width / (double)imageSize.Width;
+ double ratioY = (double)canvasSize.Height / (double)imageSize.Height;
+
+ // use whichever multiplier is smaller
+ double ratio = Math.Min(ratioX, ratioY);
+
+ // now we can get the new height and width
+ int newHeight = Convert.ToInt32(imageSize.Height * ratio);
+ int newWidth = Convert.ToInt32(imageSize.Width * ratio);
+
+ Size resizedSize = new Size(newWidth, newHeight);
+
+ if (resizedSize.Width > canvasSize.Width || resizedSize.Height > canvasSize.Height)
+ {
+ throw new Exception("ImageHelper.RescaleImageToFit - Resize failed!");
+ }
+
+ return resizedSize;
+ }
+ }
+}
diff --git a/ToggleSwitch/Properties/AssemblyInfo.cs b/ToggleSwitch/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..a18243e
--- /dev/null
+++ b/ToggleSwitch/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ToggleSwitch")]
+[assembly: AssemblyDescription("JCS ToggleSwitch Control Library")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("JC Software Solutions")]
+[assembly: AssemblyProduct("JCS ToggleSwitch")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("f1b1489e-7d6c-47ae-b71c-bb97ba895d96")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.1.0.0")]
+[assembly: AssemblyFileVersion("1.1.0.0")]
diff --git a/ToggleSwitch/RendererChangedEventArgs.cs b/ToggleSwitch/RendererChangedEventArgs.cs
new file mode 100644
index 0000000..20550ce
--- /dev/null
+++ b/ToggleSwitch/RendererChangedEventArgs.cs
@@ -0,0 +1,14 @@
+using JCS;
+
+namespace ToggleSwitch
+{
+ public class BeforeRenderingEventArgs
+ {
+ public ToggleSwitchRendererBase Renderer { get; set; }
+
+ public BeforeRenderingEventArgs(ToggleSwitchRendererBase renderer)
+ {
+ Renderer = renderer;
+ }
+ }
+}
diff --git a/ToggleSwitch/Renderers/ToggleSwitchAndroidRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchAndroidRenderer.cs
new file mode 100644
index 0000000..acb1547
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchAndroidRenderer.cs
@@ -0,0 +1,295 @@
+using System;
+using System.Drawing;
+using ToggleSwitch;
+
+namespace JCS
+{
+ public class ToggleSwitchAndroidRenderer : ToggleSwitchRendererBase
+ {
+ #region Constructor
+
+ public ToggleSwitchAndroidRenderer()
+ {
+ BorderColor = Color.FromArgb(255, 166, 166, 166);
+ BackColor = Color.FromArgb(255, 32, 32, 32);
+ LeftSideColor = Color.FromArgb(255, 32, 32, 32);
+ RightSideColor = Color.FromArgb(255, 32, 32, 32);
+ OffButtonColor = Color.FromArgb(255, 70, 70, 70);
+ OnButtonColor = Color.FromArgb(255, 27, 161, 226);
+ OffButtonBorderColor = Color.FromArgb(255, 70, 70, 70);
+ OnButtonBorderColor = Color.FromArgb(255, 27, 161, 226);
+ SlantAngle = 8;
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color BorderColor { get; set; }
+ public Color BackColor { get; set; }
+ public Color LeftSideColor { get; set; }
+ public Color RightSideColor { get; set; }
+ public Color OffButtonColor { get; set; }
+ public Color OnButtonColor { get; set; }
+ public Color OffButtonBorderColor { get; set; }
+ public Color OnButtonBorderColor { get; set; }
+ public int SlantAngle { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ Color borderColor = !ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled ? BorderColor.ToGrayScale() : BorderColor;
+
+ g.SetClip(borderRectangle);
+
+ using (Pen borderPen = new Pen(borderColor))
+ {
+ g.DrawRectangle(borderPen, borderRectangle.X, borderRectangle.Y, borderRectangle.Width - 1, borderRectangle.Height - 1);
+ }
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ Color leftColor = LeftSideColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ leftColor = leftColor.ToGrayScale();
+
+ Rectangle controlRectangle = GetInnerControlRectangle();
+
+ g.SetClip(controlRectangle);
+
+ int halfCathetusLength = GetHalfCathetusLengthBasedOnAngle();
+
+ Rectangle adjustedLeftRect = new Rectangle(leftRectangle.X, leftRectangle.Y, leftRectangle.Width + halfCathetusLength, leftRectangle.Height);
+
+ g.IntersectClip(adjustedLeftRect);
+
+ using (Brush leftBrush = new SolidBrush(leftColor))
+ {
+ g.FillRectangle(leftBrush, adjustedLeftRect);
+ }
+
+ g.ResetClip();
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ Color rightColor = RightSideColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ rightColor = rightColor.ToGrayScale();
+
+ Rectangle controlRectangle = GetInnerControlRectangle();
+
+ g.SetClip(controlRectangle);
+
+ int halfCathetusLength = GetHalfCathetusLengthBasedOnAngle();
+
+ Rectangle adjustedRightRect = new Rectangle(rightRectangle.X - halfCathetusLength, rightRectangle.Y, rightRectangle.Width + halfCathetusLength, rightRectangle.Height);
+
+ g.IntersectClip(adjustedRightRect);
+
+ using (Brush rightBrush = new SolidBrush(rightColor))
+ {
+ g.FillRectangle(rightBrush, adjustedRightRect);
+ }
+
+ g.ResetClip();
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ Rectangle controlRectangle = GetInnerControlRectangle();
+
+ g.SetClip(controlRectangle);
+
+ int fullCathetusLength = GetCathetusLengthBasedOnAngle();
+ int dblFullCathetusLength = 2*fullCathetusLength;
+
+ Point[] polygonPoints = new Point[4];
+
+ Rectangle adjustedButtonRect = new Rectangle(buttonRectangle.X - fullCathetusLength, controlRectangle.Y, buttonRectangle.Width + dblFullCathetusLength, controlRectangle.Height);
+
+ if (SlantAngle > 0)
+ {
+ polygonPoints[0] = new Point(adjustedButtonRect.X + fullCathetusLength, adjustedButtonRect.Y);
+ polygonPoints[1] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - 1, adjustedButtonRect.Y);
+ polygonPoints[2] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - fullCathetusLength - 1, adjustedButtonRect.Y + adjustedButtonRect.Height - 1);
+ polygonPoints[3] = new Point(adjustedButtonRect.X, adjustedButtonRect.Y + adjustedButtonRect.Height - 1);
+ }
+ else
+ {
+ polygonPoints[0] = new Point(adjustedButtonRect.X, adjustedButtonRect.Y);
+ polygonPoints[1] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - fullCathetusLength - 1, adjustedButtonRect.Y);
+ polygonPoints[2] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - 1, adjustedButtonRect.Y + adjustedButtonRect.Height - 1);
+ polygonPoints[3] = new Point(adjustedButtonRect.X + fullCathetusLength, adjustedButtonRect.Y + adjustedButtonRect.Height - 1);
+ }
+
+ g.IntersectClip(adjustedButtonRect);
+
+ Color buttonColor = ToggleSwitch.Checked ? OnButtonColor : OffButtonColor;
+ Color buttonBorderColor = ToggleSwitch.Checked ? OnButtonBorderColor : OffButtonBorderColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonColor = buttonColor.ToGrayScale();
+ buttonBorderColor = buttonBorderColor.ToGrayScale();
+ }
+
+ using (Pen buttonPen = new Pen(buttonBorderColor))
+ {
+ g.DrawPolygon(buttonPen, polygonPoints);
+ }
+
+ using (Brush buttonBrush = new SolidBrush(buttonColor))
+ {
+ g.FillPolygon(buttonBrush, polygonPoints);
+ }
+
+ Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage);
+ string buttonText = ToggleSwitch.Checked ? ToggleSwitch.OnText : ToggleSwitch.OffText;
+
+ if (buttonImage != null || !string.IsNullOrEmpty(buttonText))
+ {
+ ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment);
+
+ if (buttonImage != null)
+ {
+ Size imageSize = buttonImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)adjustedButtonRect.X;
+
+ bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit);
+
+ if (scaleImage)
+ {
+ Size canvasSize = adjustedButtonRect.Size;
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)adjustedButtonRect.X + (((float)adjustedButtonRect.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)adjustedButtonRect.X + (float)adjustedButtonRect.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)adjustedButtonRect.Y + (((float)adjustedButtonRect.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(buttonImage, imageRectangle);
+ }
+ else
+ {
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)adjustedButtonRect.X + (((float)adjustedButtonRect.Width - (float)imageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)adjustedButtonRect.X + (float)adjustedButtonRect.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)adjustedButtonRect.Y + (((float)adjustedButtonRect.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(buttonImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(buttonText))
+ {
+ Font buttonFont = ToggleSwitch.Checked ? ToggleSwitch.OnFont : ToggleSwitch.OffFont;
+ Color buttonForeColor = ToggleSwitch.Checked ? ToggleSwitch.OnForeColor : ToggleSwitch.OffForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ buttonForeColor = buttonForeColor.ToGrayScale();
+
+ SizeF textSize = g.MeasureString(buttonText, buttonFont);
+
+ float textXPos = adjustedButtonRect.X;
+
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ textXPos = (float)adjustedButtonRect.X + (((float)adjustedButtonRect.Width - (float)textSize.Width) / 2);
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ textXPos = (float)adjustedButtonRect.X + (float)adjustedButtonRect.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)adjustedButtonRect.Y + (((float)adjustedButtonRect.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ using (Brush textBrush = new SolidBrush(buttonForeColor))
+ {
+ g.DrawString(buttonText, buttonFont, textBrush, textRectangle);
+ }
+ }
+ }
+
+ g.ResetClip();
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public Rectangle GetInnerControlRectangle()
+ {
+ return new Rectangle(1, 1, ToggleSwitch.Width - 2, ToggleSwitch.Height - 2);
+ }
+
+ public int GetCathetusLengthBasedOnAngle()
+ {
+ if (SlantAngle == 0)
+ return 0;
+
+ double degrees = Math.Abs(SlantAngle);
+ double radians = degrees * (Math.PI / 180);
+ double length = Math.Tan(radians)*ToggleSwitch.Height;
+
+ return (int)length;
+ }
+
+ public int GetHalfCathetusLengthBasedOnAngle()
+ {
+ if (SlantAngle == 0)
+ return 0;
+
+ double degrees = Math.Abs(SlantAngle);
+ double radians = degrees * (Math.PI / 180);
+ double length = (Math.Tan(radians) * ToggleSwitch.Height) / 2;
+
+ return (int)length;
+ }
+
+ public override int GetButtonWidth()
+ {
+ double buttonWidth = (double)ToggleSwitch.Width / 2;
+ return (int) buttonWidth;
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height);
+ return buttonRect;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
diff --git a/ToggleSwitch/Renderers/ToggleSwitchBrushedMetalRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchBrushedMetalRenderer.cs
new file mode 100644
index 0000000..1f4a994
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchBrushedMetalRenderer.cs
@@ -0,0 +1,483 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using ToggleSwitch;
+
+namespace JCS
+{
+ public class ToggleSwitchBrushedMetalRenderer : ToggleSwitchRendererBase
+ {
+ #region Constructor
+
+ public ToggleSwitchBrushedMetalRenderer()
+ {
+ BorderColor1 = Color.FromArgb(255, 145, 146, 149);
+ BorderColor2 = Color.FromArgb(255, 227, 229, 232);
+ BackColor1 = Color.FromArgb(255, 125, 126, 128);
+ BackColor2 = Color.FromArgb(255, 224, 226, 228);
+ UpperShadowColor1 = Color.FromArgb(150, 0, 0, 0);
+ UpperShadowColor2 = Color.FromArgb(5, 0, 0, 0);
+ ButtonNormalBorderColor = Color.FromArgb(255, 144, 144, 145);
+ ButtonNormalSurfaceColor = Color.FromArgb(255, 251, 251, 251);
+ ButtonHoverBorderColor = Color.FromArgb(255, 166, 167, 168);
+ ButtonHoverSurfaceColor = Color.FromArgb(255, 238, 238, 238);
+ ButtonPressedBorderColor = Color.FromArgb(255, 123, 123, 123);
+ ButtonPressedSurfaceColor = Color.FromArgb(255, 184, 184, 184);
+
+ UpperShadowHeight = 8;
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color BorderColor1 { get; set; }
+ public Color BorderColor2 { get; set; }
+ public Color BackColor1 { get; set; }
+ public Color BackColor2 { get; set; }
+ public Color UpperShadowColor1 { get; set; }
+ public Color UpperShadowColor2 { get; set; }
+ public Color ButtonNormalBorderColor { get; set; }
+ public Color ButtonNormalSurfaceColor { get; set; }
+ public Color ButtonHoverBorderColor { get; set; }
+ public Color ButtonHoverSurfaceColor { get; set; }
+ public Color ButtonPressedBorderColor { get; set; }
+ public Color ButtonPressedSurfaceColor { get; set; }
+
+ public int UpperShadowHeight { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ //Draw outer border
+ using (GraphicsPath outerControlPath = GetRectangleClipPath(borderRectangle))
+ {
+ g.SetClip(outerControlPath);
+
+ Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BorderColor1.ToGrayScale() : BorderColor1;
+ Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BorderColor2.ToGrayScale() : BorderColor2;
+
+ using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(borderBrush, outerControlPath);
+ }
+
+ g.ResetClip();
+ }
+
+ //Draw inner background
+ Rectangle innercontrolRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 1, borderRectangle.Height - 2);
+
+ using (GraphicsPath innerControlPath = GetRectangleClipPath(innercontrolRectangle))
+ {
+ g.SetClip(innerControlPath);
+
+ Color backColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BackColor1.ToGrayScale() : BackColor1;
+ Color backColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BackColor2.ToGrayScale() : BackColor2;
+
+ using (Brush backgroundBrush = new LinearGradientBrush(borderRectangle, backColor1, backColor2, LinearGradientMode.Horizontal))
+ {
+ g.FillPath(backgroundBrush, innerControlPath);
+ }
+
+ //Draw inner top shadow
+ Rectangle upperShadowRectangle = new Rectangle(innercontrolRectangle.X, innercontrolRectangle.Y, innercontrolRectangle.Width, UpperShadowHeight);
+
+ g.IntersectClip(upperShadowRectangle);
+
+ using (Brush shadowBrush = new LinearGradientBrush(upperShadowRectangle, UpperShadowColor1, UpperShadowColor2, LinearGradientMode.Vertical))
+ {
+ g.FillRectangle(shadowBrush, upperShadowRectangle);
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ Rectangle innercontrolRectangle = new Rectangle(1, 1, ToggleSwitch.Width - 1, ToggleSwitch.Height - 2);
+
+ using (GraphicsPath innerControlPath = GetRectangleClipPath(innercontrolRectangle))
+ {
+ g.SetClip(innerControlPath);
+
+ //Draw image or text
+ if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ RectangleF fullRectangle = new RectangleF(leftRectangle.X + 2 - (totalToggleFieldWidth - leftRectangle.Width), 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4);
+
+ g.IntersectClip(fullRectangle);
+
+ if (ToggleSwitch.OnSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OnSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OnSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OnForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle);
+ }
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ Rectangle innercontrolRectangle = new Rectangle(1, 1, ToggleSwitch.Width - 1, ToggleSwitch.Height - 2);
+
+ using (GraphicsPath innerControlPath = GetRectangleClipPath(innercontrolRectangle))
+ {
+ g.SetClip(innerControlPath);
+
+ //Draw image or text
+ if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ RectangleF fullRectangle = new RectangleF(rightRectangle.X, 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4);
+
+ g.IntersectClip(fullRectangle);
+
+ if (ToggleSwitch.OffSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OffSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OffSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OffForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle);
+ }
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ g.SetClip(buttonRectangle);
+
+ //Draw button surface
+ Color buttonSurfaceColor = ButtonNormalSurfaceColor;
+
+ if (ToggleSwitch.IsButtonPressed)
+ buttonSurfaceColor = ButtonPressedSurfaceColor;
+ else if (ToggleSwitch.IsButtonHovered)
+ buttonSurfaceColor = ButtonHoverSurfaceColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ buttonSurfaceColor = buttonSurfaceColor.ToGrayScale();
+
+ using (Brush buttonSurfaceBrush = new SolidBrush(buttonSurfaceColor))
+ {
+ g.FillEllipse(buttonSurfaceBrush, buttonRectangle);
+ }
+
+ //Draw "metal" surface
+ PointF centerPoint1 = new PointF(buttonRectangle.X + (buttonRectangle.Width / 2f), buttonRectangle.Y + 1.2f*(buttonRectangle.Height / 2f));
+
+ using (PathGradientBrush firstMetalBrush = GetBrush(new Color[]
+ {
+ Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent,
+ Color.Transparent, Color.Transparent, Color.Transparent, Color.FromArgb(255, 110, 110, 110), Color.Transparent, Color.Transparent,
+ Color.Transparent
+ }, buttonRectangle, centerPoint1))
+ {
+ g.FillEllipse(firstMetalBrush, buttonRectangle);
+ }
+
+ PointF centerPoint2 = new PointF(buttonRectangle.X + 0.8f*(buttonRectangle.Width / 2f), buttonRectangle.Y + (buttonRectangle.Height / 2f));
+
+ using (PathGradientBrush secondMetalBrush = GetBrush(new Color[]
+ {
+ Color.FromArgb(255, 110, 110, 110), Color.Transparent, Color.Transparent, Color.Transparent,
+ Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent,
+ Color.FromArgb(255, 110, 110, 110)
+ }, buttonRectangle, centerPoint2))
+ {
+ g.FillEllipse(secondMetalBrush, buttonRectangle);
+ }
+
+ PointF centerPoint3 = new PointF(buttonRectangle.X + 1.2f*(buttonRectangle.Width / 2f), buttonRectangle.Y + (buttonRectangle.Height / 2f));
+
+ using (PathGradientBrush thirdMetalBrush = GetBrush(new Color[]
+ {
+ Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent,
+ Color.FromArgb(255, 98, 98, 98), Color.Transparent, Color.Transparent, Color.Transparent,
+ Color.Transparent
+ }, buttonRectangle, centerPoint3))
+ {
+ g.FillEllipse(thirdMetalBrush, buttonRectangle);
+ }
+
+ PointF centerPoint4 = new PointF(buttonRectangle.X + 0.9f*(buttonRectangle.Width / 2f), buttonRectangle.Y + 0.9f*(buttonRectangle.Height / 2f));
+
+ using (PathGradientBrush fourthMetalBrush = GetBrush(new Color[]
+ {
+ Color.Transparent, Color.FromArgb(255, 188, 188, 188), Color.FromArgb(255, 110, 110, 110), Color.Transparent, Color.Transparent, Color.Transparent,
+ Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent, Color.Transparent,
+ Color.Transparent
+ }, buttonRectangle, centerPoint4))
+ {
+ g.FillEllipse(fourthMetalBrush, buttonRectangle);
+ }
+
+ //Draw button border
+ Color buttonBorderColor = ButtonNormalBorderColor;
+
+ if (ToggleSwitch.IsButtonPressed)
+ buttonBorderColor = ButtonPressedBorderColor;
+ else if (ToggleSwitch.IsButtonHovered)
+ buttonBorderColor = ButtonHoverBorderColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ buttonBorderColor = buttonBorderColor.ToGrayScale();
+
+ using (Pen buttonBorderPen = new Pen(buttonBorderColor))
+ {
+ g.DrawEllipse(buttonBorderPen, buttonRectangle);
+ }
+
+ g.ResetClip();
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public GraphicsPath GetRectangleClipPath(Rectangle rect)
+ {
+ GraphicsPath borderPath = new GraphicsPath();
+ borderPath.AddArc(rect.X, rect.Y, rect.Height, rect.Height, 90, 180);
+ borderPath.AddArc(rect.Width - rect.Height, rect.Y, rect.Height, rect.Height, 270, 180);
+ borderPath.CloseFigure();
+
+ return borderPath;
+ }
+
+ public GraphicsPath GetButtonClipPath()
+ {
+ Rectangle buttonRectangle = GetButtonRectangle();
+
+ GraphicsPath buttonPath = new GraphicsPath();
+
+ buttonPath.AddArc(buttonRectangle.X, buttonRectangle.Y, buttonRectangle.Height, buttonRectangle.Height, 0, 360);
+
+ return buttonPath;
+ }
+
+ public override int GetButtonWidth()
+ {
+ return ToggleSwitch.Height - 2;
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 1, buttonWidth, buttonWidth);
+ return buttonRect;
+ }
+
+ private PathGradientBrush GetBrush(Color[] Colors, RectangleF r, PointF centerPoint)
+ {
+ int i = Colors.Length - 1;
+ PointF[] points = new PointF[i + 1];
+
+ float a = 0f;
+ int n = 0;
+ float cx = r.Width / 2f;
+ float cy = r.Height / 2f;
+
+ int w = (int)(Math.Floor((180.0 * (i - 2.0) / i) / 2.0));
+ double wi = w * Math.PI / 180.0;
+ double faktor = 1.0 / Math.Sin(wi);
+
+ float radx = (float)(cx * faktor);
+ float rady = (float)(cy * faktor);
+
+ while (a <= Math.PI * 2)
+ {
+ points[n] = new PointF((float)((cx + (Math.Cos(a) * radx))) + r.Left, (float)((cy + (Math.Sin(a) * rady))) + r.Top);
+ n += 1;
+ a += (float)(Math.PI * 2 / i);
+ }
+
+ points[i] = points[0];
+ GraphicsPath graphicsPath = new GraphicsPath();
+ graphicsPath.AddLines(points);
+
+ PathGradientBrush fBrush = new PathGradientBrush(graphicsPath);
+ fBrush.CenterPoint = centerPoint;
+ fBrush.CenterColor = Color.Transparent;
+ fBrush.SurroundColors = new Color[] { Color.White };
+
+ try
+ {
+ fBrush.SurroundColors = Colors;
+ }
+ catch (Exception ex)
+ {
+ throw new Exception("Too may colors!", ex);
+ }
+
+ return fBrush;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
diff --git a/ToggleSwitch/Renderers/ToggleSwitchCarbonRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchCarbonRenderer.cs
new file mode 100644
index 0000000..44dbfd0
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchCarbonRenderer.cs
@@ -0,0 +1,597 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using ToggleSwitch;
+
+namespace JCS
+{
+ public class ToggleSwitchCarbonRenderer : ToggleSwitchRendererBase, IDisposable
+ {
+ #region Constructor
+
+ private GraphicsPath _innerControlPath = null;
+
+ public ToggleSwitchCarbonRenderer()
+ {
+ OuterBorderColor = Color.FromArgb(255, 106, 106, 106);
+ InnerBorderColor1 = Color.FromArgb(255, 141, 151, 158);
+ InnerBorderColor2 = Color.FromArgb(255, 138, 139, 140);
+ LeftSideBackColor1 = Color.FromArgb(255, 61, 99, 119);
+ LeftSideBackColor2 = Color.FromArgb(255, 108, 148, 179);
+ RightSideBackColor1 = Color.FromArgb(255, 72, 72, 72);
+ RightSideBackColor2 = Color.FromArgb(255, 85, 85, 85);
+ ButtonNormalBorderColor1 = Color.FromArgb(255, 165, 167, 169);
+ ButtonNormalBorderColor2 = Color.FromArgb(255, 106, 106, 106);
+ ButtonNormalSurfaceColor1 = Color.FromArgb(255, 235, 235, 235);
+ ButtonNormalSurfaceColor2 = Color.FromArgb(255, 178, 180, 182);
+ ButtonHoverBorderColor1 = Color.FromArgb(255, 166, 168, 169);
+ ButtonHoverBorderColor2 = Color.FromArgb(255, 169, 171, 173);
+ ButtonHoverSurfaceColor1 = Color.FromArgb(255, 223, 224, 224);
+ ButtonHoverSurfaceColor2 = Color.FromArgb(255, 169, 171, 173);
+ ButtonPressedBorderColor1 = Color.FromArgb(255, 159, 159, 162);
+ ButtonPressedBorderColor2 = Color.FromArgb(255, 106, 106, 106);
+ ButtonPressedSurfaceColor1 = Color.FromArgb(255, 176, 177, 177);
+ ButtonPressedSurfaceColor2 = Color.FromArgb(255, 133, 135, 136);
+ ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0);
+ ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0);
+
+ ButtonShadowWidth = 7;
+ CornerRadius = 6;
+ }
+
+ public void Dispose()
+ {
+ if (_innerControlPath != null)
+ _innerControlPath.Dispose();
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color OuterBorderColor { get; set; }
+ public Color InnerBorderColor1 { get; set; }
+ public Color InnerBorderColor2 { get; set; }
+ public Color LeftSideBackColor1 { get; set; }
+ public Color LeftSideBackColor2 { get; set; }
+ public Color RightSideBackColor1 { get; set; }
+ public Color RightSideBackColor2 { get; set; }
+ public Color ButtonNormalBorderColor1 { get; set; }
+ public Color ButtonNormalBorderColor2 { get; set; }
+ public Color ButtonNormalSurfaceColor1 { get; set; }
+ public Color ButtonNormalSurfaceColor2 { get; set; }
+ public Color ButtonHoverBorderColor1 { get; set; }
+ public Color ButtonHoverBorderColor2 { get; set; }
+ public Color ButtonHoverSurfaceColor1 { get; set; }
+ public Color ButtonHoverSurfaceColor2 { get; set; }
+ public Color ButtonPressedBorderColor1 { get; set; }
+ public Color ButtonPressedBorderColor2 { get; set; }
+ public Color ButtonPressedSurfaceColor1 { get; set; }
+ public Color ButtonPressedSurfaceColor2 { get; set; }
+ public Color ButtonShadowColor1 { get; set; }
+ public Color ButtonShadowColor2 { get; set; }
+
+ public int ButtonShadowWidth { get; set; }
+ public int CornerRadius { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ //Draw outer border
+ using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius))
+ {
+ g.SetClip(outerBorderPath);
+
+ Color outerBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor.ToGrayScale() : OuterBorderColor;
+
+ using (Brush outerBorderBrush = new SolidBrush(outerBorderColor))
+ {
+ g.FillPath(outerBorderBrush, outerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ //Draw inner border
+ Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 2, borderRectangle.Height - 2);
+
+ using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius))
+ {
+ g.SetClip(innerBorderPath);
+
+ Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1;
+ Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2;
+
+ using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(borderBrush, innerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4);
+ _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius);
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ int buttonWidth = GetButtonWidth();
+
+ //Draw inner background
+ int gradientRectWidth = leftRectangle.Width + buttonWidth / 2;
+ Rectangle gradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y, gradientRectWidth, leftRectangle.Height);
+
+ Color leftSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor1.ToGrayScale() : LeftSideBackColor1;
+ Color leftSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor2.ToGrayScale() : LeftSideBackColor2;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(gradientRectangle);
+ }
+ else
+ {
+ g.SetClip(gradientRectangle);
+ }
+
+ using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, leftSideBackColor1, leftSideBackColor2, LinearGradientMode.Vertical))
+ {
+ g.FillRectangle(backgroundBrush, gradientRectangle);
+ }
+
+ g.ResetClip();
+
+ Rectangle leftShadowRectangle = new Rectangle();
+ leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth;
+ leftShadowRectangle.Y = leftRectangle.Y;
+ leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ leftShadowRectangle.Height = leftRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(leftShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(leftShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, leftShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OnSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OnSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OnSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OnForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ int buttonWidth = GetButtonWidth();
+
+ //Draw inner background
+ int gradientRectWidth = rightRectangle.Width + buttonWidth / 2;
+ Rectangle gradientRectangle = new Rectangle(rightRectangle.X - buttonWidth / 2, rightRectangle.Y, gradientRectWidth, rightRectangle.Height);
+
+ Color rightSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor1.ToGrayScale() : RightSideBackColor1;
+ Color rightSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor2.ToGrayScale() : RightSideBackColor2;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(gradientRectangle);
+ }
+ else
+ {
+ g.SetClip(gradientRectangle);
+ }
+
+ using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, rightSideBackColor1, rightSideBackColor2, LinearGradientMode.Vertical))
+ {
+ g.FillRectangle(backgroundBrush, gradientRectangle);
+ }
+
+ g.ResetClip();
+
+ Rectangle rightShadowRectangle = new Rectangle();
+ rightShadowRectangle.X = rightRectangle.X - CornerRadius;
+ rightShadowRectangle.Y = rightRectangle.Y;
+ rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ rightShadowRectangle.Height = rightRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(rightShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(rightShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, rightShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OffSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OffSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OffSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OffForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ buttonRectangle.Inflate(-1, -1);
+
+ using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, CornerRadius))
+ {
+ g.SetClip(buttonPath);
+
+ //Draw button surface
+ Color buttonSurfaceColor1 = ButtonNormalSurfaceColor1;
+ Color buttonSurfaceColor2 = ButtonNormalSurfaceColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonSurfaceColor1 = ButtonPressedSurfaceColor1;
+ buttonSurfaceColor2 = ButtonPressedSurfaceColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonSurfaceColor1 = ButtonHoverSurfaceColor1;
+ buttonSurfaceColor2 = ButtonHoverSurfaceColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonSurfaceColor1 = buttonSurfaceColor1.ToGrayScale();
+ buttonSurfaceColor2 = buttonSurfaceColor2.ToGrayScale();
+ }
+
+ using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonSurfaceColor1, buttonSurfaceColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(buttonSurfaceBrush, buttonPath);
+ }
+
+ //Draw button border
+ Color buttonBorderColor1 = ButtonNormalBorderColor1;
+ Color buttonBorderColor2 = ButtonNormalBorderColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonBorderColor1 = ButtonPressedBorderColor1;
+ buttonBorderColor2 = ButtonPressedBorderColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonBorderColor1 = ButtonHoverBorderColor1;
+ buttonBorderColor2 = ButtonHoverBorderColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonBorderColor1 = buttonBorderColor1.ToGrayScale();
+ buttonBorderColor2 = buttonBorderColor2.ToGrayScale();
+ }
+
+ using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical))
+ {
+ using (Pen buttonBorderPen = new Pen(buttonBorderBrush))
+ {
+ g.DrawPath(buttonBorderPen, buttonPath);
+ }
+ }
+
+ g.ResetClip();
+
+ //Draw button image
+ Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage);
+
+ if (buttonImage != null)
+ {
+ g.SetClip(buttonPath);
+
+ ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment);
+
+ Size imageSize = buttonImage.Size;
+
+ Rectangle imageRectangle;
+
+ int imageXPos = buttonRectangle.X;
+
+ bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit);
+
+ if (scaleImage)
+ {
+ Size canvasSize = buttonRectangle.Size;
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(buttonImage, imageRectangle);
+ }
+ else
+ {
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(buttonImage, imageRectangle);
+ }
+
+ g.ResetClip();
+ }
+ }
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ int diameter = 2*radius;
+
+ if (diameter > ToggleSwitch.Height)
+ diameter = ToggleSwitch.Height;
+
+ if (diameter > ToggleSwitch.Width)
+ diameter = ToggleSwitch.Width;
+
+ gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90);
+ gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90);
+ gp.CloseFigure();
+
+ return gp;
+ }
+
+ public override int GetButtonWidth()
+ {
+ float buttonWidth = 1.61f*(ToggleSwitch.Height - 2);
+ return (int) buttonWidth;
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height);
+ return buttonRect;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
diff --git a/ToggleSwitch/Renderers/ToggleSwitchFancyRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchFancyRenderer.cs
new file mode 100644
index 0000000..57d985d
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchFancyRenderer.cs
@@ -0,0 +1,642 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using ToggleSwitch;
+
+namespace JCS
+{
+ public class ToggleSwitchFancyRenderer : ToggleSwitchRendererBase, IDisposable
+ {
+ #region Constructor
+
+ private GraphicsPath _innerControlPath = null;
+
+ public ToggleSwitchFancyRenderer()
+ {
+ OuterBorderColor1 = Color.FromArgb(255, 197, 199, 201);
+ OuterBorderColor2 = Color.FromArgb(255, 207, 209, 212);
+ InnerBorderColor1 = Color.FromArgb(200, 205, 208, 207);
+ InnerBorderColor2 = Color.FromArgb(255, 207, 209, 212);
+ LeftSideBackColor1 = Color.FromArgb(255, 61, 110, 6);
+ LeftSideBackColor2 = Color.FromArgb(255, 93, 170, 9);
+ RightSideBackColor1 = Color.FromArgb(255, 149, 0, 0);
+ RightSideBackColor2 = Color.FromArgb(255, 198, 0, 0);
+ ButtonNormalBorderColor1 = Color.FromArgb(255, 212, 209, 211);
+ ButtonNormalBorderColor2 = Color.FromArgb(255, 197, 199, 201);
+ ButtonNormalUpperSurfaceColor1 = Color.FromArgb(255, 252, 251, 252);
+ ButtonNormalUpperSurfaceColor2 = Color.FromArgb(255, 247, 247, 247);
+ ButtonNormalLowerSurfaceColor1 = Color.FromArgb(255, 233, 233, 233);
+ ButtonNormalLowerSurfaceColor2 = Color.FromArgb(255, 225, 225, 225);
+ ButtonHoverBorderColor1 = Color.FromArgb(255, 212, 207, 209);
+ ButtonHoverBorderColor2 = Color.FromArgb(255, 223, 223, 223);
+ ButtonHoverUpperSurfaceColor1 = Color.FromArgb(255, 240, 239, 240);
+ ButtonHoverUpperSurfaceColor2 = Color.FromArgb(255, 235, 235, 235);
+ ButtonHoverLowerSurfaceColor1 = Color.FromArgb(255, 221, 221, 221);
+ ButtonHoverLowerSurfaceColor2 = Color.FromArgb(255, 214, 214, 214);
+ ButtonPressedBorderColor1 = Color.FromArgb(255, 176, 176, 176);
+ ButtonPressedBorderColor2 = Color.FromArgb(255, 176, 176, 176);
+ ButtonPressedUpperSurfaceColor1 = Color.FromArgb(255, 189, 188, 189);
+ ButtonPressedUpperSurfaceColor2 = Color.FromArgb(255, 185, 185, 185);
+ ButtonPressedLowerSurfaceColor1 = Color.FromArgb(255, 175, 175, 175);
+ ButtonPressedLowerSurfaceColor2 = Color.FromArgb(255, 169, 169, 169);
+ ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0);
+ ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0);
+
+ ButtonShadowWidth = 7;
+ CornerRadius = 6;
+ }
+
+ public void Dispose()
+ {
+ if (_innerControlPath != null)
+ _innerControlPath.Dispose();
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color OuterBorderColor1 { get; set; }
+ public Color OuterBorderColor2 { get; set; }
+ public Color InnerBorderColor1 { get; set; }
+ public Color InnerBorderColor2 { get; set; }
+ public Color LeftSideBackColor1 { get; set; }
+ public Color LeftSideBackColor2 { get; set; }
+ public Color RightSideBackColor1 { get; set; }
+ public Color RightSideBackColor2 { get; set; }
+ public Color ButtonNormalBorderColor1 { get; set; }
+ public Color ButtonNormalBorderColor2 { get; set; }
+ public Color ButtonNormalUpperSurfaceColor1 { get; set; }
+ public Color ButtonNormalUpperSurfaceColor2 { get; set; }
+ public Color ButtonNormalLowerSurfaceColor1 { get; set; }
+ public Color ButtonNormalLowerSurfaceColor2 { get; set; }
+ public Color ButtonHoverBorderColor1 { get; set; }
+ public Color ButtonHoverBorderColor2 { get; set; }
+ public Color ButtonHoverUpperSurfaceColor1 { get; set; }
+ public Color ButtonHoverUpperSurfaceColor2 { get; set; }
+ public Color ButtonHoverLowerSurfaceColor1 { get; set; }
+ public Color ButtonHoverLowerSurfaceColor2 { get; set; }
+ public Color ButtonPressedBorderColor1 { get; set; }
+ public Color ButtonPressedBorderColor2 { get; set; }
+ public Color ButtonPressedUpperSurfaceColor1 { get; set; }
+ public Color ButtonPressedUpperSurfaceColor2 { get; set; }
+ public Color ButtonPressedLowerSurfaceColor1 { get; set; }
+ public Color ButtonPressedLowerSurfaceColor2 { get; set; }
+ public Color ButtonShadowColor1 { get; set; }
+ public Color ButtonShadowColor2 { get; set; }
+
+ public int ButtonShadowWidth { get; set; }
+ public int CornerRadius { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ //Draw outer border
+ using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius))
+ {
+ g.SetClip(outerBorderPath);
+
+ Color outerBorderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor1.ToGrayScale() : OuterBorderColor1;
+ Color outerBorderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor2.ToGrayScale() : OuterBorderColor2;
+
+ using (Brush outerBorderBrush = new LinearGradientBrush(borderRectangle, outerBorderColor1, outerBorderColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(outerBorderBrush, outerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ //Draw inner border
+ Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 2, borderRectangle.Height - 2);
+
+ using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius))
+ {
+ g.SetClip(innerBorderPath);
+
+ Color innerBorderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1;
+ Color innerBorderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2;
+
+ using (Brush borderBrush = new LinearGradientBrush(borderRectangle, innerBorderColor1, innerBorderColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(borderBrush, innerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4);
+ _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius);
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ int buttonWidth = GetButtonWidth();
+
+ //Draw inner background
+ int gradientRectWidth = leftRectangle.Width + buttonWidth / 2;
+ Rectangle gradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y, gradientRectWidth, leftRectangle.Height);
+
+ Color leftSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor1.ToGrayScale() : LeftSideBackColor1;
+ Color leftSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor2.ToGrayScale() : LeftSideBackColor2;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(gradientRectangle);
+ }
+ else
+ {
+ g.SetClip(gradientRectangle);
+ }
+
+ using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, leftSideBackColor1, leftSideBackColor2, LinearGradientMode.Vertical))
+ {
+ g.FillRectangle(backgroundBrush, gradientRectangle);
+ }
+
+ g.ResetClip();
+
+ Rectangle leftShadowRectangle = new Rectangle();
+ leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth;
+ leftShadowRectangle.Y = leftRectangle.Y;
+ leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ leftShadowRectangle.Height = leftRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(leftShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(leftShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, leftShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OnSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OnSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OnSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OnForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ int buttonWidth = GetButtonWidth();
+
+ //Draw inner background
+ int gradientRectWidth = rightRectangle.Width + buttonWidth / 2;
+ Rectangle gradientRectangle = new Rectangle(rightRectangle.X - buttonWidth / 2, rightRectangle.Y, gradientRectWidth, rightRectangle.Height);
+
+ Color rightSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor1.ToGrayScale() : RightSideBackColor1;
+ Color rightSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor2.ToGrayScale() : RightSideBackColor2;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(gradientRectangle);
+ }
+ else
+ {
+ g.SetClip(gradientRectangle);
+ }
+
+ using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, rightSideBackColor1, rightSideBackColor2, LinearGradientMode.Vertical))
+ {
+ g.FillRectangle(backgroundBrush, gradientRectangle);
+ }
+
+ g.ResetClip();
+
+ Rectangle rightShadowRectangle = new Rectangle();
+ rightShadowRectangle.X = rightRectangle.X - CornerRadius;
+ rightShadowRectangle.Y = rightRectangle.Y;
+ rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ rightShadowRectangle.Height = rightRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(rightShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(rightShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, rightShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OffSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OffSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OffSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OffForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ //Draw button surface
+ Color buttonUpperSurfaceColor1 = ButtonNormalUpperSurfaceColor1;
+ Color buttonUpperSurfaceColor2 = ButtonNormalUpperSurfaceColor2;
+ Color buttonLowerSurfaceColor1 = ButtonNormalLowerSurfaceColor1;
+ Color buttonLowerSurfaceColor2 = ButtonNormalLowerSurfaceColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonUpperSurfaceColor1 = ButtonPressedUpperSurfaceColor1;
+ buttonUpperSurfaceColor2 = ButtonPressedUpperSurfaceColor2;
+ buttonLowerSurfaceColor1 = ButtonPressedLowerSurfaceColor1;
+ buttonLowerSurfaceColor2 = ButtonPressedLowerSurfaceColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonUpperSurfaceColor1 = ButtonHoverUpperSurfaceColor1;
+ buttonUpperSurfaceColor2 = ButtonHoverUpperSurfaceColor2;
+ buttonLowerSurfaceColor1 = ButtonHoverLowerSurfaceColor1;
+ buttonLowerSurfaceColor2 = ButtonHoverLowerSurfaceColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonUpperSurfaceColor1 = buttonUpperSurfaceColor1.ToGrayScale();
+ buttonUpperSurfaceColor2 = buttonUpperSurfaceColor2.ToGrayScale();
+ buttonLowerSurfaceColor1 = buttonLowerSurfaceColor1.ToGrayScale();
+ buttonLowerSurfaceColor2 = buttonLowerSurfaceColor2.ToGrayScale();
+ }
+
+ buttonRectangle.Inflate(-1, -1);
+
+ int upperHeight = buttonRectangle.Height/2;
+
+ Rectangle upperGradientRect = new Rectangle(buttonRectangle.X, buttonRectangle.Y, buttonRectangle.Width, upperHeight);
+ Rectangle lowerGradientRect = new Rectangle(buttonRectangle.X, buttonRectangle.Y + upperHeight, buttonRectangle.Width, buttonRectangle.Height - upperHeight);
+
+ using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, CornerRadius))
+ {
+ g.SetClip(buttonPath);
+ g.IntersectClip(upperGradientRect);
+
+ //Draw upper button surface gradient
+ using (Brush buttonUpperSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonUpperSurfaceColor1, buttonUpperSurfaceColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(buttonUpperSurfaceBrush, buttonPath);
+ }
+
+ g.ResetClip();
+
+ g.SetClip(buttonPath);
+ g.IntersectClip(lowerGradientRect);
+
+ //Draw lower button surface gradient
+ using (Brush buttonLowerSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonLowerSurfaceColor1, buttonLowerSurfaceColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(buttonLowerSurfaceBrush, buttonPath);
+ }
+
+ g.ResetClip();
+
+ g.SetClip(buttonPath);
+
+ //Draw button border
+ Color buttonBorderColor1 = ButtonNormalBorderColor1;
+ Color buttonBorderColor2 = ButtonNormalBorderColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonBorderColor1 = ButtonPressedBorderColor1;
+ buttonBorderColor2 = ButtonPressedBorderColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonBorderColor1 = ButtonHoverBorderColor1;
+ buttonBorderColor2 = ButtonHoverBorderColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonBorderColor1 = buttonBorderColor1.ToGrayScale();
+ buttonBorderColor2 = buttonBorderColor2.ToGrayScale();
+ }
+
+ using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical))
+ {
+ using (Pen buttonBorderPen = new Pen(buttonBorderBrush))
+ {
+ g.DrawPath(buttonBorderPen, buttonPath);
+ }
+ }
+
+ g.ResetClip();
+
+ //Draw button image
+ Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage);
+
+ if (buttonImage != null)
+ {
+ g.SetClip(buttonPath);
+
+ ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment);
+
+ Size imageSize = buttonImage.Size;
+
+ Rectangle imageRectangle;
+
+ int imageXPos = buttonRectangle.X;
+
+ bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit);
+
+ if (scaleImage)
+ {
+ Size canvasSize = buttonRectangle.Size;
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(buttonImage, imageRectangle);
+ }
+ else
+ {
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(buttonImage, imageRectangle);
+ }
+
+ g.ResetClip();
+ }
+ }
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ int diameter = 2*radius;
+
+ if (diameter > ToggleSwitch.Height)
+ diameter = ToggleSwitch.Height;
+
+ if (diameter > ToggleSwitch.Width)
+ diameter = ToggleSwitch.Width;
+
+ gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90);
+ gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90);
+ gp.CloseFigure();
+
+ return gp;
+ }
+
+ public override int GetButtonWidth()
+ {
+ float buttonWidth = 1.61f*ToggleSwitch.Height;
+ return (int) buttonWidth;
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height);
+ return buttonRect;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
diff --git a/ToggleSwitch/Renderers/ToggleSwitchIOS5Renderer.cs b/ToggleSwitch/Renderers/ToggleSwitchIOS5Renderer.cs
new file mode 100644
index 0000000..edf378c
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchIOS5Renderer.cs
@@ -0,0 +1,660 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using ToggleSwitch;
+
+namespace JCS
+{
+ public class ToggleSwitchIOS5Renderer : ToggleSwitchRendererBase
+ {
+ #region Constructor
+
+ public ToggleSwitchIOS5Renderer()
+ {
+ BorderColor = Color.FromArgb(255, 202, 202, 202);
+ LeftSideUpperColor1 = Color.FromArgb(255, 48, 115, 189);
+ LeftSideUpperColor2 = Color.FromArgb(255, 17, 123, 220);
+ LeftSideLowerColor1 = Color.FromArgb(255, 65, 143, 218);
+ LeftSideLowerColor2 = Color.FromArgb(255, 130, 190, 243);
+ LeftSideUpperBorderColor = Color.FromArgb(150, 123, 157, 196);
+ LeftSideLowerBorderColor = Color.FromArgb(150, 174, 208, 241);
+ RightSideUpperColor1 = Color.FromArgb(255, 191, 191, 191);
+ RightSideUpperColor2 = Color.FromArgb(255, 229, 229, 229);
+ RightSideLowerColor1 = Color.FromArgb(255, 232, 232, 232);
+ RightSideLowerColor2 = Color.FromArgb(255, 251, 251, 251);
+ RightSideUpperBorderColor = Color.FromArgb(150, 175, 175, 175);
+ RightSideLowerBorderColor = Color.FromArgb(150, 229, 230, 233);
+ ButtonShadowColor = Color.Transparent;
+ ButtonNormalOuterBorderColor = Color.FromArgb(255, 149, 172, 194);
+ ButtonNormalInnerBorderColor = Color.FromArgb(255, 235, 235, 235);
+ ButtonNormalSurfaceColor1 = Color.FromArgb(255, 216, 215, 216);
+ ButtonNormalSurfaceColor2 = Color.FromArgb(255, 251, 250, 251);
+ ButtonHoverOuterBorderColor = Color.FromArgb(255, 141, 163, 184);
+ ButtonHoverInnerBorderColor = Color.FromArgb(255, 223, 223, 223);
+ ButtonHoverSurfaceColor1 = Color.FromArgb(255, 205, 204, 205);
+ ButtonHoverSurfaceColor2 = Color.FromArgb(255, 239, 238, 239);
+ ButtonPressedOuterBorderColor = Color.FromArgb(255, 111, 128, 145);
+ ButtonPressedInnerBorderColor = Color.FromArgb(255, 176, 176, 176);
+ ButtonPressedSurfaceColor1 = Color.FromArgb(255, 162, 161, 162);
+ ButtonPressedSurfaceColor2 = Color.FromArgb(255, 187, 187, 187);
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color BorderColor { get; set; }
+ public Color LeftSideUpperColor1 { get; set; }
+ public Color LeftSideUpperColor2 { get; set; }
+ public Color LeftSideLowerColor1 { get; set; }
+ public Color LeftSideLowerColor2 { get; set; }
+ public Color LeftSideUpperBorderColor { get; set; }
+ public Color LeftSideLowerBorderColor { get; set; }
+ public Color RightSideUpperColor1 { get; set; }
+ public Color RightSideUpperColor2 { get; set; }
+ public Color RightSideLowerColor1 { get; set; }
+ public Color RightSideLowerColor2 { get; set; }
+ public Color RightSideUpperBorderColor { get; set; }
+ public Color RightSideLowerBorderColor { get; set; }
+ public Color ButtonShadowColor { get; set; }
+ public Color ButtonNormalOuterBorderColor { get; set; }
+ public Color ButtonNormalInnerBorderColor { get; set; }
+ public Color ButtonNormalSurfaceColor1 { get; set; }
+ public Color ButtonNormalSurfaceColor2 { get; set; }
+ public Color ButtonHoverOuterBorderColor { get; set; }
+ public Color ButtonHoverInnerBorderColor { get; set; }
+ public Color ButtonHoverSurfaceColor1 { get; set; }
+ public Color ButtonHoverSurfaceColor2 { get; set; }
+ public Color ButtonPressedOuterBorderColor { get; set; }
+ public Color ButtonPressedInnerBorderColor { get; set; }
+ public Color ButtonPressedSurfaceColor1 { get; set; }
+ public Color ButtonPressedSurfaceColor2 { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ //Draw this one AFTER the button is drawn in the RenderButton method
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+ int buttonWidth = GetButtonWidth();
+
+ //Draw upper gradient field
+ int gradientRectWidth = leftRectangle.Width + buttonWidth / 2;
+ int upperGradientRectHeight = (int)((double)0.8*(double)(leftRectangle.Height - 2));
+
+ Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height);
+ GraphicsPath controlClipPath = GetControlClipPath(controlRectangle);
+
+ Rectangle upperGradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y + 1, gradientRectWidth, upperGradientRectHeight - 1);
+
+ g.SetClip(controlClipPath);
+ g.IntersectClip(upperGradientRectangle);
+
+ using (GraphicsPath upperGradientPath = new GraphicsPath())
+ {
+ upperGradientPath.AddArc(upperGradientRectangle.X, upperGradientRectangle.Y, ToggleSwitch.Height, ToggleSwitch.Height, 135, 135);
+ upperGradientPath.AddLine(upperGradientRectangle.X, upperGradientRectangle.Y, upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y);
+ upperGradientPath.AddLine(upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y, upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y + upperGradientRectangle.Height);
+ upperGradientPath.AddLine(upperGradientRectangle.X, upperGradientRectangle.Y + upperGradientRectangle.Height, upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y + upperGradientRectangle.Height);
+
+ Color upperColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideUpperColor1.ToGrayScale() : LeftSideUpperColor1;
+ Color upperColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideUpperColor2.ToGrayScale() : LeftSideUpperColor2;
+
+ using (Brush upperGradientBrush = new LinearGradientBrush(upperGradientRectangle, upperColor1, upperColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(upperGradientBrush, upperGradientPath);
+ }
+ }
+
+ g.ResetClip();
+
+ //Draw lower gradient field
+ int lowerGradientRectHeight = (int)Math.Ceiling((double)0.5 * (double)(leftRectangle.Height - 2));
+
+ Rectangle lowerGradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y + (leftRectangle.Height / 2), gradientRectWidth, lowerGradientRectHeight);
+
+ g.SetClip(controlClipPath);
+ g.IntersectClip(lowerGradientRectangle);
+
+ using (GraphicsPath lowerGradientPath = new GraphicsPath())
+ {
+ lowerGradientPath.AddArc(1, lowerGradientRectangle.Y, (int) (0.75*(ToggleSwitch.Height - 1)), ToggleSwitch.Height - 1, 215, 45); //Arc from side to top
+ lowerGradientPath.AddLine(lowerGradientRectangle.X + buttonWidth/2, lowerGradientRectangle.Y, lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y);
+ lowerGradientPath.AddLine(lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y, lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y + lowerGradientRectangle.Height);
+ lowerGradientPath.AddLine(lowerGradientRectangle.X + buttonWidth/4, lowerGradientRectangle.Y + lowerGradientRectangle.Height, lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y + lowerGradientRectangle.Height);
+ lowerGradientPath.AddArc(1, 1, ToggleSwitch.Height - 1, ToggleSwitch.Height - 1, 90, 70); //Arc from side to bottom
+
+ Color lowerColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideLowerColor1.ToGrayScale() : LeftSideLowerColor1;
+ Color lowerColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideLowerColor2.ToGrayScale() : LeftSideLowerColor2;
+
+ using (Brush lowerGradientBrush = new LinearGradientBrush(lowerGradientRectangle, lowerColor1, lowerColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(lowerGradientBrush, lowerGradientPath);
+ }
+ }
+
+ g.ResetClip();
+
+ controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height);
+ controlClipPath = GetControlClipPath(controlRectangle);
+
+ g.SetClip(controlClipPath);
+
+ //Draw upper inside border
+ Color upperBordercolor = LeftSideUpperBorderColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ upperBordercolor = upperBordercolor.ToGrayScale();
+
+ using (Pen upperBorderPen = new Pen(upperBordercolor))
+ {
+ g.DrawLine(upperBorderPen, leftRectangle.X, leftRectangle.Y + 1, leftRectangle.X + leftRectangle.Width + (buttonWidth / 2), leftRectangle.Y + 1);
+ }
+
+ //Draw lower inside border
+ Color lowerBordercolor = LeftSideLowerBorderColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ lowerBordercolor = lowerBordercolor.ToGrayScale();
+
+ using (Pen lowerBorderPen = new Pen(lowerBordercolor))
+ {
+ g.DrawLine(lowerBorderPen, leftRectangle.X, leftRectangle.Y + leftRectangle.Height - 1, leftRectangle.X + leftRectangle.Width + (buttonWidth / 2), leftRectangle.Y + leftRectangle.Height - 1);
+ }
+
+ //Draw image or text
+ if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ RectangleF fullRectangle = new RectangleF(leftRectangle.X + 2 - (totalToggleFieldWidth - leftRectangle.Width), 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4);
+
+ g.IntersectClip(fullRectangle);
+
+ if (ToggleSwitch.OnSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OnSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OnSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OnForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle);
+ }
+ }
+ }
+
+ g.ResetClip();
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+ Rectangle buttonRectangle = GetButtonRectangle();
+
+ Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height);
+ GraphicsPath controlClipPath = GetControlClipPath(controlRectangle);
+
+ //Draw upper gradient field
+ int gradientRectWidth = rightRectangle.Width + buttonRectangle.Width / 2;
+ int upperGradientRectHeight = (int)((double)0.8 * (double)(rightRectangle.Height - 2));
+
+ Rectangle upperGradientRectangle = new Rectangle(rightRectangle.X - buttonRectangle.Width / 2, rightRectangle.Y + 1, gradientRectWidth - 1, upperGradientRectHeight - 1);
+
+ g.SetClip(controlClipPath);
+ g.IntersectClip(upperGradientRectangle);
+
+ using (GraphicsPath upperGradientPath = new GraphicsPath())
+ {
+ upperGradientPath.AddLine(upperGradientRectangle.X, upperGradientRectangle.Y, upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y);
+ upperGradientPath.AddArc(upperGradientRectangle.X + upperGradientRectangle.Width - ToggleSwitch.Height + 1, upperGradientRectangle.Y - 1, ToggleSwitch.Height, ToggleSwitch.Height, 270, 115);
+ upperGradientPath.AddLine(upperGradientRectangle.X + upperGradientRectangle.Width, upperGradientRectangle.Y + upperGradientRectangle.Height, upperGradientRectangle.X, upperGradientRectangle.Y + upperGradientRectangle.Height);
+ upperGradientPath.AddLine(upperGradientRectangle.X, upperGradientRectangle.Y + upperGradientRectangle.Height, upperGradientRectangle.X, upperGradientRectangle.Y);
+
+ Color upperColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideUpperColor1.ToGrayScale() : RightSideUpperColor1;
+ Color upperColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideUpperColor2.ToGrayScale() : RightSideUpperColor2;
+
+ using (Brush upperGradientBrush = new LinearGradientBrush(upperGradientRectangle, upperColor1, upperColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(upperGradientBrush, upperGradientPath);
+ }
+ }
+
+ g.ResetClip();
+
+ //Draw lower gradient field
+ int lowerGradientRectHeight = (int)Math.Ceiling((double)0.5 * (double)(rightRectangle.Height - 2));
+
+ Rectangle lowerGradientRectangle = new Rectangle(rightRectangle.X - buttonRectangle.Width / 2, rightRectangle.Y + (rightRectangle.Height / 2), gradientRectWidth - 1, lowerGradientRectHeight);
+
+ g.SetClip(controlClipPath);
+ g.IntersectClip(lowerGradientRectangle);
+
+ using (GraphicsPath lowerGradientPath = new GraphicsPath())
+ {
+ lowerGradientPath.AddLine(lowerGradientRectangle.X, lowerGradientRectangle.Y, lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y);
+ lowerGradientPath.AddArc(lowerGradientRectangle.X + lowerGradientRectangle.Width - (int)(0.75 * (ToggleSwitch.Height - 1)), lowerGradientRectangle.Y, (int)(0.75 * (ToggleSwitch.Height - 1)), ToggleSwitch.Height - 1, 270, 45); //Arc from top to side
+ lowerGradientPath.AddArc(ToggleSwitch.Width - ToggleSwitch.Height, 0, ToggleSwitch.Height, ToggleSwitch.Height, 20, 70); //Arc from side to bottom
+ lowerGradientPath.AddLine(lowerGradientRectangle.X + lowerGradientRectangle.Width, lowerGradientRectangle.Y + lowerGradientRectangle.Height, lowerGradientRectangle.X, lowerGradientRectangle.Y + lowerGradientRectangle.Height);
+ lowerGradientPath.AddLine(lowerGradientRectangle.X, lowerGradientRectangle.Y + lowerGradientRectangle.Height, lowerGradientRectangle.X, lowerGradientRectangle.Y);
+
+ Color lowerColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideLowerColor1.ToGrayScale() : RightSideLowerColor1;
+ Color lowerColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideLowerColor2.ToGrayScale() : RightSideLowerColor2;
+
+ using (Brush lowerGradientBrush = new LinearGradientBrush(lowerGradientRectangle, lowerColor1, lowerColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(lowerGradientBrush, lowerGradientPath);
+ }
+ }
+
+ g.ResetClip();
+
+ controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height);
+ controlClipPath = GetControlClipPath(controlRectangle);
+
+ g.SetClip(controlClipPath);
+
+ //Draw upper inside border
+ Color upperBordercolor = RightSideUpperBorderColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ upperBordercolor = upperBordercolor.ToGrayScale();
+
+ using (Pen upperBorderPen = new Pen(upperBordercolor))
+ {
+ g.DrawLine(upperBorderPen, rightRectangle.X - (buttonRectangle.Width / 2), rightRectangle.Y + 1, rightRectangle.X + rightRectangle.Width, rightRectangle.Y + 1);
+ }
+
+ //Draw lower inside border
+ Color lowerBordercolor = RightSideLowerBorderColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ lowerBordercolor = lowerBordercolor.ToGrayScale();
+
+ using (Pen lowerBorderPen = new Pen(lowerBordercolor))
+ {
+ g.DrawLine(lowerBorderPen, rightRectangle.X - (buttonRectangle.Width / 2), rightRectangle.Y + rightRectangle.Height - 1, rightRectangle.X + rightRectangle.Width, rightRectangle.Y + rightRectangle.Height - 1);
+ }
+
+ //Draw image or text
+ if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ RectangleF fullRectangle = new RectangleF(rightRectangle.X, 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4);
+
+ g.IntersectClip(fullRectangle);
+
+ if (ToggleSwitch.OffSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OffSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OffSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OffForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle);
+ }
+ }
+ }
+
+ g.ResetClip();
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ if (ToggleSwitch.IsButtonOnLeftSide)
+ buttonRectangle.X += 1;
+ else if (ToggleSwitch.IsButtonOnRightSide)
+ buttonRectangle.X -= 1;
+
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+ //Draw button shadow
+ buttonRectangle.Inflate(1, 1);
+
+ Rectangle shadowClipRectangle = new Rectangle(buttonRectangle.Location, buttonRectangle.Size);
+ shadowClipRectangle.Inflate(0, -1);
+
+ if (ToggleSwitch.IsButtonOnLeftSide)
+ {
+ shadowClipRectangle.X += shadowClipRectangle.Width / 2;
+ shadowClipRectangle.Width = shadowClipRectangle.Width / 2;
+ }
+ else if (ToggleSwitch.IsButtonOnRightSide)
+ {
+ shadowClipRectangle.Width = shadowClipRectangle.Width / 2;
+ }
+
+ g.SetClip(shadowClipRectangle);
+
+ Color buttonShadowColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? ButtonShadowColor.ToGrayScale() : ButtonShadowColor;
+
+ using (Pen buttonShadowPen = new Pen(buttonShadowColor))
+ {
+ g.DrawEllipse(buttonShadowPen, buttonRectangle);
+ }
+
+ g.ResetClip();
+
+ buttonRectangle.Inflate(-1, -1);
+
+ //Draw outer button border
+ Color buttonOuterBorderColor = ButtonNormalOuterBorderColor;
+
+ if (ToggleSwitch.IsButtonPressed)
+ buttonOuterBorderColor = ButtonPressedOuterBorderColor;
+ else if (ToggleSwitch.IsButtonHovered)
+ buttonOuterBorderColor = ButtonHoverOuterBorderColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ buttonOuterBorderColor = buttonOuterBorderColor.ToGrayScale();
+
+ using (Brush outerBorderBrush = new SolidBrush(buttonOuterBorderColor))
+ {
+ g.FillEllipse(outerBorderBrush, buttonRectangle);
+ }
+
+ //Draw inner button border
+ buttonRectangle.Inflate(-1, -1);
+
+ Color buttonInnerBorderColor = ButtonNormalInnerBorderColor;
+
+ if (ToggleSwitch.IsButtonPressed)
+ buttonInnerBorderColor = ButtonPressedInnerBorderColor;
+ else if (ToggleSwitch.IsButtonHovered)
+ buttonInnerBorderColor = ButtonHoverInnerBorderColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ buttonInnerBorderColor = buttonInnerBorderColor.ToGrayScale();
+
+ using (Brush innerBorderBrush = new SolidBrush(buttonInnerBorderColor))
+ {
+ g.FillEllipse(innerBorderBrush, buttonRectangle);
+ }
+
+ //Draw button surface
+ buttonRectangle.Inflate(-1, -1);
+
+ Color buttonUpperSurfaceColor = ButtonNormalSurfaceColor1;
+
+ if (ToggleSwitch.IsButtonPressed)
+ buttonUpperSurfaceColor = ButtonPressedSurfaceColor1;
+ else if (ToggleSwitch.IsButtonHovered)
+ buttonUpperSurfaceColor = ButtonHoverSurfaceColor1;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ buttonUpperSurfaceColor = buttonUpperSurfaceColor.ToGrayScale();
+
+ Color buttonLowerSurfaceColor = ButtonNormalSurfaceColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ buttonLowerSurfaceColor = ButtonPressedSurfaceColor2;
+ else if (ToggleSwitch.IsButtonHovered)
+ buttonLowerSurfaceColor = ButtonHoverSurfaceColor2;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ buttonLowerSurfaceColor = buttonLowerSurfaceColor.ToGrayScale();
+
+ using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonUpperSurfaceColor, buttonLowerSurfaceColor, LinearGradientMode.Vertical))
+ {
+ g.FillEllipse(buttonSurfaceBrush, buttonRectangle);
+ }
+
+ g.CompositingMode = CompositingMode.SourceOver;
+ g.CompositingQuality = CompositingQuality.HighQuality;
+
+ //Draw outer control border
+ Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height);
+
+ using (GraphicsPath borderPath = GetControlClipPath(controlRectangle))
+ {
+ Color controlBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BorderColor.ToGrayScale() : BorderColor;
+
+ using (Pen borderPen = new Pen(controlBorderColor))
+ {
+ g.DrawPath(borderPen, borderPath);
+ }
+ }
+
+ g.ResetClip();
+
+ //Draw button image
+ Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage);
+
+ if (buttonImage != null)
+ {
+ g.SetClip(GetButtonClipPath());
+
+ ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment);
+
+ Size imageSize = buttonImage.Size;
+
+ Rectangle imageRectangle;
+
+ int imageXPos = buttonRectangle.X;
+
+ bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit);
+
+ if (scaleImage)
+ {
+ Size canvasSize = buttonRectangle.Size;
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0,0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(buttonImage, imageRectangle);
+ }
+ else
+ {
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(buttonImage, imageRectangle);
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public GraphicsPath GetControlClipPath(Rectangle controlRectangle)
+ {
+ GraphicsPath borderPath = new GraphicsPath();
+ borderPath.AddArc(controlRectangle.X, controlRectangle.Y, controlRectangle.Height, controlRectangle.Height, 90, 180);
+ borderPath.AddArc(controlRectangle.X + controlRectangle.Width - controlRectangle.Height, controlRectangle.Y, controlRectangle.Height, controlRectangle.Height, 270, 180);
+ borderPath.CloseFigure();
+
+ return borderPath;
+ }
+
+ public GraphicsPath GetButtonClipPath()
+ {
+ Rectangle buttonRectangle = GetButtonRectangle();
+
+ GraphicsPath buttonPath = new GraphicsPath();
+
+ buttonPath.AddArc(buttonRectangle.X, buttonRectangle.Y, buttonRectangle.Height, buttonRectangle.Height, 0, 360);
+
+ return buttonPath;
+ }
+
+ public override int GetButtonWidth()
+ {
+ return ToggleSwitch.Height - 2;
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 1, buttonWidth, buttonWidth);
+ return buttonRect;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
diff --git a/ToggleSwitch/Renderers/ToggleSwitchIphoneRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchIphoneRenderer.cs
new file mode 100644
index 0000000..e3ad9b2
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchIphoneRenderer.cs
@@ -0,0 +1,605 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using ToggleSwitch;
+
+namespace JCS
+{
+ public class ToggleSwitchIphoneRenderer : ToggleSwitchRendererBase, IDisposable
+ {
+ #region Constructor
+
+ private GraphicsPath _innerControlPath = null;
+
+ public ToggleSwitchIphoneRenderer()
+ {
+ OuterBorderColor = Color.FromArgb(255, 205, 205, 207);
+ InnerBorderColor1 = Color.FromArgb(200, 205, 205, 207);
+ InnerBorderColor2 = Color.FromArgb(200, 205, 205, 207);
+ LeftSideBackColor1 = Color.FromArgb(255, 50, 101, 161);
+ LeftSideBackColor2 = Color.FromArgb(255, 123, 174, 229);
+ RightSideBackColor1 = Color.FromArgb(255, 161, 161, 161);
+ RightSideBackColor2 = Color.FromArgb(255, 250, 250, 250);
+ ButtonNormalBorderColor1 = Color.FromArgb(255, 172, 172, 172);
+ ButtonNormalBorderColor2 = Color.FromArgb(255, 196, 196, 196);
+ ButtonNormalSurfaceColor1 = Color.FromArgb(255, 216, 215, 216);
+ ButtonNormalSurfaceColor2 = Color.FromArgb(255, 251, 250, 251);
+ ButtonHoverBorderColor1 = Color.FromArgb(255, 163, 163, 163);
+ ButtonHoverBorderColor2 = Color.FromArgb(255, 185, 185, 185);
+ ButtonHoverSurfaceColor1 = Color.FromArgb(255, 205, 204, 205);
+ ButtonHoverSurfaceColor2 = Color.FromArgb(255, 239, 238, 239);
+ ButtonPressedBorderColor1 = Color.FromArgb(255, 129, 129, 129);
+ ButtonPressedBorderColor2 = Color.FromArgb(255, 146, 146, 146);
+ ButtonPressedSurfaceColor1 = Color.FromArgb(255, 162, 161, 162);
+ ButtonPressedSurfaceColor2 = Color.FromArgb(255, 188, 187, 188);
+ ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0);
+ ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0);
+
+ ButtonShadowWidth = 7;
+ CornerRadius = 6;
+ ButtonCornerRadius = 9;
+ }
+
+ public void Dispose()
+ {
+ if (_innerControlPath != null)
+ _innerControlPath.Dispose();
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color OuterBorderColor { get; set; }
+ public Color InnerBorderColor1 { get; set; }
+ public Color InnerBorderColor2 { get; set; }
+ public Color LeftSideBackColor1 { get; set; }
+ public Color LeftSideBackColor2 { get; set; }
+ public Color RightSideBackColor1 { get; set; }
+ public Color RightSideBackColor2 { get; set; }
+ public Color ButtonNormalBorderColor1 { get; set; }
+ public Color ButtonNormalBorderColor2 { get; set; }
+ public Color ButtonNormalSurfaceColor1 { get; set; }
+ public Color ButtonNormalSurfaceColor2 { get; set; }
+ public Color ButtonHoverBorderColor1 { get; set; }
+ public Color ButtonHoverBorderColor2 { get; set; }
+ public Color ButtonHoverSurfaceColor1 { get; set; }
+ public Color ButtonHoverSurfaceColor2 { get; set; }
+ public Color ButtonPressedBorderColor1 { get; set; }
+ public Color ButtonPressedBorderColor2 { get; set; }
+ public Color ButtonPressedSurfaceColor1 { get; set; }
+ public Color ButtonPressedSurfaceColor2 { get; set; }
+ public Color ButtonShadowColor1 { get; set; }
+ public Color ButtonShadowColor2 { get; set; }
+
+ public int ButtonShadowWidth { get; set; }
+ public int CornerRadius { get; set; }
+ public int ButtonCornerRadius { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ //Draw outer border
+ using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius))
+ {
+ g.SetClip(outerBorderPath);
+
+ Color outerBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor.ToGrayScale() : OuterBorderColor;
+
+ using (Brush outerBorderBrush = new SolidBrush(outerBorderColor))
+ {
+ g.FillPath(outerBorderBrush, outerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ //Draw inner border
+ Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 2, borderRectangle.Height - 2);
+
+ using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius))
+ {
+ g.SetClip(innerBorderPath);
+
+ Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1;
+ Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2;
+
+ using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(borderBrush, innerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4);
+ _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius);
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ int buttonWidth = GetButtonWidth();
+
+ //Draw inner background
+ int gradientRectWidth = leftRectangle.Width + buttonWidth / 2;
+ Rectangle gradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y, gradientRectWidth, leftRectangle.Height);
+
+ Color leftSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor1.ToGrayScale() : LeftSideBackColor1;
+ Color leftSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor2.ToGrayScale() : LeftSideBackColor2;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(gradientRectangle);
+ }
+ else
+ {
+ g.SetClip(gradientRectangle);
+ }
+
+ using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, leftSideBackColor1, leftSideBackColor2, LinearGradientMode.Vertical))
+ {
+ g.FillRectangle(backgroundBrush, gradientRectangle);
+ }
+
+ g.ResetClip();
+
+ Rectangle leftShadowRectangle = new Rectangle();
+ leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth;
+ leftShadowRectangle.Y = leftRectangle.Y;
+ leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ leftShadowRectangle.Height = leftRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(leftShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(leftShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, leftShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OnSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OnSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OnSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OnForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ int buttonWidth = GetButtonWidth();
+
+ //Draw inner background
+ int gradientRectWidth = rightRectangle.Width + buttonWidth / 2;
+ Rectangle gradientRectangle = new Rectangle(rightRectangle.X - buttonWidth / 2, rightRectangle.Y, gradientRectWidth, rightRectangle.Height);
+
+ Color rightSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor1.ToGrayScale() : RightSideBackColor1;
+ Color rightSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor2.ToGrayScale() : RightSideBackColor2;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(gradientRectangle);
+ }
+ else
+ {
+ g.SetClip(gradientRectangle);
+ }
+
+ using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, rightSideBackColor1, rightSideBackColor2, LinearGradientMode.Vertical))
+ {
+ g.FillRectangle(backgroundBrush, gradientRectangle);
+ }
+
+ g.ResetClip();
+
+ Rectangle rightShadowRectangle = new Rectangle();
+ rightShadowRectangle.X = rightRectangle.X - CornerRadius;
+ rightShadowRectangle.Y = rightRectangle.Y;
+ rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ rightShadowRectangle.Height = rightRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(rightShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(rightShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, rightShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OffSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OffSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OffSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OffForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, ButtonCornerRadius))
+ {
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(buttonRectangle);
+ }
+ else
+ {
+ g.SetClip(buttonRectangle);
+ }
+
+ //Draw button surface
+ Color buttonSurfaceColor1 = ButtonNormalSurfaceColor1;
+ Color buttonSurfaceColor2 = ButtonNormalSurfaceColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonSurfaceColor1 = ButtonPressedSurfaceColor1;
+ buttonSurfaceColor2 = ButtonPressedSurfaceColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonSurfaceColor1 = ButtonHoverSurfaceColor1;
+ buttonSurfaceColor2 = ButtonHoverSurfaceColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonSurfaceColor1 = buttonSurfaceColor1.ToGrayScale();
+ buttonSurfaceColor2 = buttonSurfaceColor2.ToGrayScale();
+ }
+
+ using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonSurfaceColor1, buttonSurfaceColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(buttonSurfaceBrush, buttonPath);
+ }
+
+ //Draw button border
+ Color buttonBorderColor1 = ButtonNormalBorderColor1;
+ Color buttonBorderColor2 = ButtonNormalBorderColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonBorderColor1 = ButtonPressedBorderColor1;
+ buttonBorderColor2 = ButtonPressedBorderColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonBorderColor1 = ButtonHoverBorderColor1;
+ buttonBorderColor2 = ButtonHoverBorderColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonBorderColor1 = buttonBorderColor1.ToGrayScale();
+ buttonBorderColor2 = buttonBorderColor2.ToGrayScale();
+ }
+
+ using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical))
+ {
+ using (Pen buttonBorderPen = new Pen(buttonBorderBrush))
+ {
+ g.DrawPath(buttonBorderPen, buttonPath);
+ }
+ }
+
+ g.ResetClip();
+
+ //Draw button image
+ Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage);
+
+ if (buttonImage != null)
+ {
+ g.SetClip(buttonPath);
+
+ ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment);
+
+ Size imageSize = buttonImage.Size;
+
+ Rectangle imageRectangle;
+
+ int imageXPos = buttonRectangle.X;
+
+ bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit);
+
+ if (scaleImage)
+ {
+ Size canvasSize = buttonRectangle.Size;
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(buttonImage, imageRectangle);
+ }
+ else
+ {
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(buttonImage, imageRectangle);
+ }
+
+ g.ResetClip();
+ }
+ }
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ int diameter = 2*radius;
+
+ if (diameter > ToggleSwitch.Height)
+ diameter = ToggleSwitch.Height;
+
+ if (diameter > ToggleSwitch.Width)
+ diameter = ToggleSwitch.Width;
+
+ gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90);
+ gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90);
+ gp.CloseFigure();
+
+ return gp;
+ }
+
+ public override int GetButtonWidth()
+ {
+ float buttonWidth = 1.57f*ToggleSwitch.Height;
+ return (int) buttonWidth;
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height);
+ return buttonRect;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
diff --git a/ToggleSwitch/Renderers/ToggleSwitchMetroRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchMetroRenderer.cs
new file mode 100644
index 0000000..2566f8e
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchMetroRenderer.cs
@@ -0,0 +1,324 @@
+using System.Drawing;
+using ToggleSwitch;
+
+namespace JCS
+{
+ public class ToggleSwitchMetroRenderer : ToggleSwitchRendererBase
+ {
+ #region Constructor
+
+ public ToggleSwitchMetroRenderer()
+ {
+ BackColor = Color.White;
+ LeftSideColor = Color.FromArgb(255, 23, 153, 0);
+ LeftSideColorHovered = Color.FromArgb(255, 36, 182, 9);
+ LeftSideColorPressed = Color.FromArgb(255, 121, 245, 100);
+ RightSideColor = Color.FromArgb(255, 166, 166, 166);
+ RightSideColorHovered = Color.FromArgb(255, 181, 181, 181);
+ RightSideColorPressed = Color.FromArgb(255, 189, 189, 189);
+ BorderColor = Color.FromArgb(255, 166, 166, 166);
+ ButtonColor = Color.Black;
+ ButtonColorHovered = Color.Black;
+ ButtonColorPressed = Color.Black;
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color BackColor { get; set; }
+ public Color LeftSideColor { get; set; }
+ public Color LeftSideColorHovered { get; set; }
+ public Color LeftSideColorPressed { get; set; }
+ public Color RightSideColor { get; set; }
+ public Color RightSideColorHovered { get; set; }
+ public Color RightSideColorPressed { get; set; }
+ public Color BorderColor { get; set; }
+ public Color ButtonColor { get; set; }
+ public Color ButtonColorHovered { get; set; }
+ public Color ButtonColorPressed { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ Color borderColor = !ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled ? BorderColor.ToGrayScale() : BorderColor;
+
+ g.SetClip(borderRectangle);
+
+ using (Pen borderPen = new Pen(borderColor))
+ {
+ g.DrawRectangle(borderPen, borderRectangle.X, borderRectangle.Y, borderRectangle.Width - 1, borderRectangle.Height - 1);
+ }
+
+ g.ResetClip();
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ Rectangle adjustedLeftRect = new Rectangle(leftRectangle.X + 2, 2, leftRectangle.Width - 2, leftRectangle.Height - 4);
+
+ if (adjustedLeftRect.Width > 0)
+ {
+ Color leftColor = LeftSideColor;
+
+ if (ToggleSwitch.IsLeftSidePressed)
+ leftColor = LeftSideColorPressed;
+ else if (ToggleSwitch.IsLeftSideHovered)
+ leftColor = LeftSideColorHovered;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ leftColor = leftColor.ToGrayScale();
+
+ g.SetClip(adjustedLeftRect);
+
+ using (Brush leftBrush = new SolidBrush(leftColor))
+ {
+ g.FillRectangle(leftBrush, adjustedLeftRect);
+ }
+
+ if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ RectangleF fullRectangle = new RectangleF(leftRectangle.X + 2 - (totalToggleFieldWidth - leftRectangle.Width), 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4);
+
+ g.IntersectClip(fullRectangle);
+
+ if (ToggleSwitch.OnSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OnSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OnSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float) fullRectangle.X + (((float) fullRectangle.Width - (float) textSize.Width)/2);
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ textXPos = (float) fullRectangle.X + (float)fullRectangle.Width - (float) textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OnForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle);
+ }
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ Rectangle adjustedRightRect = new Rectangle(rightRectangle.X, 2, rightRectangle.Width - 2, rightRectangle.Height - 4);
+
+ if (adjustedRightRect.Width > 0)
+ {
+ Color rightColor = RightSideColor;
+
+ if (ToggleSwitch.IsRightSidePressed)
+ rightColor = RightSideColorPressed;
+ else if (ToggleSwitch.IsRightSideHovered)
+ rightColor = RightSideColorHovered;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ rightColor = rightColor.ToGrayScale();
+
+ g.SetClip(adjustedRightRect);
+
+ using (Brush rightBrush = new SolidBrush(rightColor))
+ {
+ g.FillRectangle(rightBrush, adjustedRightRect);
+ }
+
+ if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ RectangleF fullRectangle = new RectangleF(rightRectangle.X, 2, totalToggleFieldWidth - 2, ToggleSwitch.Height - 4);
+
+ g.IntersectClip(fullRectangle);
+
+ if (ToggleSwitch.OffSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OffSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OffSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OffForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle);
+ }
+ }
+ }
+ }
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ Color buttonColor = ButtonColor;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonColor = ButtonColorPressed;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonColor = ButtonColorHovered;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ buttonColor = buttonColor.ToGrayScale();
+
+ g.SetClip(buttonRectangle);
+
+ using (Brush backBrush = new SolidBrush(buttonColor))
+ {
+ g.FillRectangle(backBrush, buttonRectangle);
+ }
+
+ g.ResetClip();
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public override int GetButtonWidth()
+ {
+ return (int)((double)ToggleSwitch.Height / 3 * 2);
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height);
+ return buttonRect;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
\ No newline at end of file
diff --git a/ToggleSwitch/Renderers/ToggleSwitchModernRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchModernRenderer.cs
new file mode 100644
index 0000000..a5f2f1f
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchModernRenderer.cs
@@ -0,0 +1,611 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using ToggleSwitch;
+
+namespace JCS
+{
+ public class ToggleSwitchModernRenderer : ToggleSwitchRendererBase, IDisposable
+ {
+ #region Constructor
+
+ private GraphicsPath _innerControlPath = null;
+
+ public ToggleSwitchModernRenderer()
+ {
+ OuterBorderColor = Color.FromArgb(255, 31, 31, 31);
+ InnerBorderColor1 = Color.FromArgb(255, 80, 80, 82);
+ InnerBorderColor2 = Color.FromArgb(255, 109, 110, 112);
+ LeftSideBackColor1 = Color.FromArgb(255, 57, 166, 222);
+ LeftSideBackColor2 = Color.FromArgb(255, 53, 155, 229);
+ RightSideBackColor1 = Color.FromArgb(255, 48, 49, 45);
+ RightSideBackColor2 = Color.FromArgb(255, 51, 52, 48);
+ ButtonNormalBorderColor1 = Color.FromArgb(255, 31, 31, 31);
+ ButtonNormalBorderColor2 = Color.FromArgb(255, 31, 31, 31);
+ ButtonNormalSurfaceColor1 = Color.FromArgb(255, 51, 52, 48);
+ ButtonNormalSurfaceColor2 = Color.FromArgb(255, 51, 52, 48);
+ ArrowNormalColor = Color.FromArgb(255, 53, 156, 230);
+ ButtonHoverBorderColor1 = Color.FromArgb(255, 29, 29, 29);
+ ButtonHoverBorderColor2 = Color.FromArgb(255, 29, 29, 29);
+ ButtonHoverSurfaceColor1 = Color.FromArgb(255, 48, 49, 45);
+ ButtonHoverSurfaceColor2 = Color.FromArgb(255, 48, 49, 45);
+ ArrowHoverColor = Color.FromArgb(255, 50, 148, 219);
+ ButtonPressedBorderColor1 = Color.FromArgb(255, 23, 23, 23);
+ ButtonPressedBorderColor2 = Color.FromArgb(255, 23, 23, 23);
+ ButtonPressedSurfaceColor1 = Color.FromArgb(255, 38, 39, 36);
+ ButtonPressedSurfaceColor2 = Color.FromArgb(255, 38, 39, 36);
+ ArrowPressedColor = Color.FromArgb(255, 39, 117, 172);
+ ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0);
+ ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0);
+
+ ButtonShadowWidth = 7;
+ CornerRadius = 6;
+ ButtonCornerRadius = 6;
+ }
+
+ public void Dispose()
+ {
+ if (_innerControlPath != null)
+ _innerControlPath.Dispose();
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color OuterBorderColor { get; set; }
+ public Color InnerBorderColor1 { get; set; }
+ public Color InnerBorderColor2 { get; set; }
+ public Color LeftSideBackColor1 { get; set; }
+ public Color LeftSideBackColor2 { get; set; }
+ public Color RightSideBackColor1 { get; set; }
+ public Color RightSideBackColor2 { get; set; }
+ public Color ButtonNormalBorderColor1 { get; set; }
+ public Color ButtonNormalBorderColor2 { get; set; }
+ public Color ButtonNormalSurfaceColor1 { get; set; }
+ public Color ButtonNormalSurfaceColor2 { get; set; }
+ public Color ArrowNormalColor { get; set; }
+ public Color ButtonHoverBorderColor1 { get; set; }
+ public Color ButtonHoverBorderColor2 { get; set; }
+ public Color ButtonHoverSurfaceColor1 { get; set; }
+ public Color ButtonHoverSurfaceColor2 { get; set; }
+ public Color ArrowHoverColor { get; set; }
+ public Color ButtonPressedBorderColor1 { get; set; }
+ public Color ButtonPressedBorderColor2 { get; set; }
+ public Color ButtonPressedSurfaceColor1 { get; set; }
+ public Color ButtonPressedSurfaceColor2 { get; set; }
+ public Color ArrowPressedColor { get; set; }
+ public Color ButtonShadowColor1 { get; set; }
+ public Color ButtonShadowColor2 { get; set; }
+
+ public int ButtonShadowWidth { get; set; }
+ public int CornerRadius { get; set; }
+ public int ButtonCornerRadius { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ //Draw outer border
+ using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius))
+ {
+ g.SetClip(outerBorderPath);
+
+ Color outerBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor.ToGrayScale() : OuterBorderColor;
+
+ using (Brush outerBorderBrush = new SolidBrush(outerBorderColor))
+ {
+ g.FillPath(outerBorderBrush, outerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ //Draw inner border
+ Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y + 1, borderRectangle.Width - 2, borderRectangle.Height - 2);
+
+ using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius))
+ {
+ g.SetClip(innerBorderPath);
+
+ Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1;
+ Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2;
+
+ using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(borderBrush, innerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4);
+ _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius);
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ int buttonWidth = GetButtonWidth();
+
+ //Draw inner background
+ int gradientRectWidth = leftRectangle.Width + buttonWidth / 2;
+ Rectangle gradientRectangle = new Rectangle(leftRectangle.X, leftRectangle.Y, gradientRectWidth, leftRectangle.Height);
+
+ Color leftSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor1.ToGrayScale() : LeftSideBackColor1;
+ Color leftSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? LeftSideBackColor2.ToGrayScale() : LeftSideBackColor2;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(gradientRectangle);
+ }
+ else
+ {
+ g.SetClip(gradientRectangle);
+ }
+
+ using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, leftSideBackColor1, leftSideBackColor2, LinearGradientMode.Vertical))
+ {
+ g.FillRectangle(backgroundBrush, gradientRectangle);
+ }
+
+ g.ResetClip();
+
+ Rectangle leftShadowRectangle = new Rectangle();
+ leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth;
+ leftShadowRectangle.Y = leftRectangle.Y;
+ leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ leftShadowRectangle.Height = leftRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(leftShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(leftShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, leftShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OnSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OnSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OnSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OnForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ int buttonWidth = GetButtonWidth();
+
+ //Draw inner background
+ int gradientRectWidth = rightRectangle.Width + buttonWidth / 2;
+ Rectangle gradientRectangle = new Rectangle(rightRectangle.X - buttonWidth / 2, rightRectangle.Y, gradientRectWidth, rightRectangle.Height);
+
+ Color rightSideBackColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor1.ToGrayScale() : RightSideBackColor1;
+ Color rightSideBackColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? RightSideBackColor2.ToGrayScale() : RightSideBackColor2;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(gradientRectangle);
+ }
+ else
+ {
+ g.SetClip(gradientRectangle);
+ }
+
+ using (Brush backgroundBrush = new LinearGradientBrush(gradientRectangle, rightSideBackColor1, rightSideBackColor2, LinearGradientMode.Vertical))
+ {
+ g.FillRectangle(backgroundBrush, gradientRectangle);
+ }
+
+ g.ResetClip();
+
+ Rectangle rightShadowRectangle = new Rectangle();
+ rightShadowRectangle.X = rightRectangle.X - CornerRadius;
+ rightShadowRectangle.Y = rightRectangle.Y;
+ rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ rightShadowRectangle.Height = rightRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(rightShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(rightShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, rightShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OffSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OffSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OffSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OffForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(buttonRectangle);
+ }
+ else
+ {
+ g.SetClip(buttonRectangle);
+ }
+
+ using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, ButtonCornerRadius))
+ {
+ //Draw button surface
+ Color buttonSurfaceColor1 = ButtonNormalSurfaceColor1;
+ Color buttonSurfaceColor2 = ButtonNormalSurfaceColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonSurfaceColor1 = ButtonPressedSurfaceColor1;
+ buttonSurfaceColor2 = ButtonPressedSurfaceColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonSurfaceColor1 = ButtonHoverSurfaceColor1;
+ buttonSurfaceColor2 = ButtonHoverSurfaceColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonSurfaceColor1 = buttonSurfaceColor1.ToGrayScale();
+ buttonSurfaceColor2 = buttonSurfaceColor2.ToGrayScale();
+ }
+
+ using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonSurfaceColor1, buttonSurfaceColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(buttonSurfaceBrush, buttonPath);
+ }
+
+ //Draw button border
+ Color buttonBorderColor1 = ButtonNormalBorderColor1;
+ Color buttonBorderColor2 = ButtonNormalBorderColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonBorderColor1 = ButtonPressedBorderColor1;
+ buttonBorderColor2 = ButtonPressedBorderColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonBorderColor1 = ButtonHoverBorderColor1;
+ buttonBorderColor2 = ButtonHoverBorderColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonBorderColor1 = buttonBorderColor1.ToGrayScale();
+ buttonBorderColor2 = buttonBorderColor2.ToGrayScale();
+ }
+
+ using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical))
+ {
+ using (Pen buttonBorderPen = new Pen(buttonBorderBrush))
+ {
+ g.DrawPath(buttonBorderPen, buttonPath);
+ }
+ }
+ }
+
+ g.ResetClip();
+
+ //Draw button arrows
+ Color arrowColor = ArrowNormalColor;
+
+ if (ToggleSwitch.IsButtonPressed)
+ arrowColor = ArrowPressedColor;
+ else if (ToggleSwitch.IsButtonHovered)
+ arrowColor = ArrowHoverColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ arrowColor = arrowColor.ToGrayScale();
+
+ Rectangle arrowRectangle = new Rectangle();
+ arrowRectangle.Height = 9;
+ arrowRectangle.Width = 22;
+ arrowRectangle.X = buttonRectangle.X + (int)(((double)buttonRectangle.Width - (double)arrowRectangle.Width) / 2);
+ arrowRectangle.Y = buttonRectangle.Y + (int)(((double)buttonRectangle.Height - (double)arrowRectangle.Height) / 2);
+
+ using (Brush arrowBrush = new SolidBrush(arrowColor))
+ {
+ using (GraphicsPath arrowLeftPath = GetArrowLeftPath(arrowRectangle))
+ {
+ g.FillPath(arrowBrush, arrowLeftPath);
+ }
+
+ using (GraphicsPath arrowRightPath = GetArrowRightPath(arrowRectangle))
+ {
+ g.FillPath(arrowBrush, arrowRightPath);
+ }
+ }
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ int diameter = 2*radius;
+
+ if (diameter > ToggleSwitch.Height)
+ diameter = ToggleSwitch.Height;
+
+ if (diameter > ToggleSwitch.Width)
+ diameter = ToggleSwitch.Width;
+
+ gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90);
+ gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90);
+ gp.CloseFigure();
+
+ return gp;
+ }
+
+ public GraphicsPath GetArrowLeftPath(Rectangle arrowRectangle)
+ {
+ GraphicsPath gp = new GraphicsPath();
+
+ Point top = new Point(arrowRectangle.X + 8, arrowRectangle.Y);
+ Point bottom = new Point(arrowRectangle.X + 8, arrowRectangle.Y + arrowRectangle.Height);
+ Point tip = new Point(arrowRectangle.X, arrowRectangle.Y + (arrowRectangle.Height/2));
+
+ gp.AddLine(top, bottom);
+ gp.AddLine(bottom, tip);
+ gp.AddLine(tip, top);
+
+ return gp;
+ }
+
+ public GraphicsPath GetArrowRightPath(Rectangle arrowRectangle)
+ {
+ GraphicsPath gp = new GraphicsPath();
+
+ Point top = new Point(arrowRectangle.X + 14, arrowRectangle.Y);
+ Point bottom = new Point(arrowRectangle.X + 14, arrowRectangle.Y + arrowRectangle.Height);
+ Point tip = new Point(arrowRectangle.X + arrowRectangle.Width, arrowRectangle.Y + (arrowRectangle.Height / 2));
+
+ gp.AddLine(top, bottom);
+ gp.AddLine(bottom, tip);
+ gp.AddLine(tip, top);
+
+ return gp;
+ }
+
+ public override int GetButtonWidth()
+ {
+ float buttonWidth = 1.41f*ToggleSwitch.Height;
+ return (int) buttonWidth;
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height);
+ return buttonRect;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
diff --git a/ToggleSwitch/Renderers/ToggleSwitchOSXRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchOSXRenderer.cs
new file mode 100644
index 0000000..f02e908
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchOSXRenderer.cs
@@ -0,0 +1,556 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using ToggleSwitch;
+
+namespace JCS
+{
+ public class ToggleSwitchOSXRenderer : ToggleSwitchRendererBase, IDisposable
+ {
+ #region Constructor
+
+ private GraphicsPath _innerControlPath = null;
+
+ public ToggleSwitchOSXRenderer()
+ {
+ OuterBorderColor = Color.FromArgb(255, 108, 108, 108);
+ InnerBorderColor1 = Color.FromArgb(255, 137, 138, 139);
+ InnerBorderColor2 = Color.FromArgb(255, 167, 168, 169);
+ BackColor1 = Color.FromArgb(255, 108, 108, 108);
+ BackColor2 = Color.FromArgb(255, 163, 163, 163);
+ ButtonNormalBorderColor1 = Color.FromArgb(255, 147, 147, 148);
+ ButtonNormalBorderColor2 = Color.FromArgb(255, 167, 168, 169);
+ ButtonNormalSurfaceColor1 = Color.FromArgb(255, 250, 250, 250);
+ ButtonNormalSurfaceColor2 = Color.FromArgb(255, 224, 224, 224);
+ ButtonHoverBorderColor1 = Color.FromArgb(255, 145, 146, 147);
+ ButtonHoverBorderColor2 = Color.FromArgb(255, 164, 165, 166);
+ ButtonHoverSurfaceColor1 = Color.FromArgb(255, 238, 238, 238);
+ ButtonHoverSurfaceColor2 = Color.FromArgb(255, 213, 213, 213);
+ ButtonPressedBorderColor1 = Color.FromArgb(255, 138, 138, 140);
+ ButtonPressedBorderColor2 = Color.FromArgb(255, 158, 158, 160);
+ ButtonPressedSurfaceColor1 = Color.FromArgb(255, 187, 187, 187);
+ ButtonPressedSurfaceColor2 = Color.FromArgb(255, 168, 168, 168);
+ ButtonShadowColor1 = Color.FromArgb(50, 0, 0, 0);
+ ButtonShadowColor2 = Color.FromArgb(0, 0, 0, 0);
+
+ ButtonShadowWidth = 7;
+ CornerRadius = 4;
+ }
+
+ public void Dispose()
+ {
+ if (_innerControlPath != null)
+ _innerControlPath.Dispose();
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color OuterBorderColor { get; set; }
+ public Color InnerBorderColor1 { get; set; }
+ public Color InnerBorderColor2 { get; set; }
+ public Color BackColor1 { get; set; }
+ public Color BackColor2 { get; set; }
+ public Color ButtonNormalBorderColor1 { get; set; }
+ public Color ButtonNormalBorderColor2 { get; set; }
+ public Color ButtonNormalSurfaceColor1 { get; set; }
+ public Color ButtonNormalSurfaceColor2 { get; set; }
+ public Color ButtonHoverBorderColor1 { get; set; }
+ public Color ButtonHoverBorderColor2 { get; set; }
+ public Color ButtonHoverSurfaceColor1 { get; set; }
+ public Color ButtonHoverSurfaceColor2 { get; set; }
+ public Color ButtonPressedBorderColor1 { get; set; }
+ public Color ButtonPressedBorderColor2 { get; set; }
+ public Color ButtonPressedSurfaceColor1 { get; set; }
+ public Color ButtonPressedSurfaceColor2 { get; set; }
+ public Color ButtonShadowColor1 { get; set; }
+ public Color ButtonShadowColor2 { get; set; }
+
+ public int ButtonShadowWidth { get; set; }
+ public int CornerRadius { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ //Draw outer border
+ using (GraphicsPath outerBorderPath = GetRoundedRectanglePath(borderRectangle, CornerRadius))
+ {
+ g.SetClip(outerBorderPath);
+
+ Color outerBorderColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? OuterBorderColor.ToGrayScale() : OuterBorderColor;
+
+ using (Brush outerBorderBrush = new SolidBrush(outerBorderColor))
+ {
+ g.FillPath(outerBorderBrush, outerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ //Draw inner border
+ Rectangle innerborderRectangle = new Rectangle(borderRectangle.X + 1, borderRectangle.Y +1 , borderRectangle.Width - 2, borderRectangle.Height - 2);
+
+ using (GraphicsPath innerBorderPath = GetRoundedRectanglePath(innerborderRectangle, CornerRadius))
+ {
+ g.SetClip(innerBorderPath);
+
+ Color borderColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor1.ToGrayScale() : InnerBorderColor1;
+ Color borderColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? InnerBorderColor2.ToGrayScale() : InnerBorderColor2;
+
+ using (Brush borderBrush = new LinearGradientBrush(borderRectangle, borderColor1, borderColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(borderBrush, innerBorderPath);
+ }
+
+ g.ResetClip();
+ }
+
+ //Draw inner background
+ Rectangle backgroundRectangle = new Rectangle(borderRectangle.X + 2, borderRectangle.Y + 2, borderRectangle.Width - 4, borderRectangle.Height - 4);
+
+ _innerControlPath = GetRoundedRectanglePath(backgroundRectangle, CornerRadius);
+
+ g.SetClip(_innerControlPath);
+
+ Color backColor1 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BackColor1.ToGrayScale() : BackColor1;
+ Color backColor2 = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? BackColor2.ToGrayScale() : BackColor2;
+
+ using (Brush backgroundBrush = new LinearGradientBrush(borderRectangle, backColor1, backColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(backgroundBrush, _innerControlPath);
+ }
+
+ g.ResetClip();
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ Rectangle leftShadowRectangle = new Rectangle();
+ leftShadowRectangle.X = leftRectangle.X + leftRectangle.Width - ButtonShadowWidth;
+ leftShadowRectangle.Y = leftRectangle.Y;
+ leftShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ leftShadowRectangle.Height = leftRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(leftShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(leftShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(leftShadowRectangle, ButtonShadowColor2, ButtonShadowColor1, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, leftShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OnSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ RectangleF fullRectangle = new RectangleF(leftRectangle.X + 1 - (totalToggleFieldWidth - leftRectangle.Width), 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OnSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OnSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OnSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OnText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OnText, ToggleSwitch.OnFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OnSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Near)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OnForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OnText, ToggleSwitch.OnFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ Rectangle rightShadowRectangle = new Rectangle();
+ rightShadowRectangle.X = rightRectangle.X - CornerRadius;
+ rightShadowRectangle.Y = rightRectangle.Y;
+ rightShadowRectangle.Width = ButtonShadowWidth + CornerRadius;
+ rightShadowRectangle.Height = rightRectangle.Height;
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(rightShadowRectangle);
+ }
+ else
+ {
+ g.SetClip(rightShadowRectangle);
+ }
+
+ using (Brush buttonShadowBrush = new LinearGradientBrush(rightShadowRectangle, ButtonShadowColor1, ButtonShadowColor2, LinearGradientMode.Horizontal))
+ {
+ g.FillRectangle(buttonShadowBrush, rightShadowRectangle);
+ }
+
+ g.ResetClip();
+
+ //Draw image or text
+ if (ToggleSwitch.OffSideImage != null || !string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ RectangleF fullRectangle = new RectangleF(rightRectangle.X, 1, totalToggleFieldWidth - 1, ToggleSwitch.Height - 2);
+
+ if (_innerControlPath != null)
+ {
+ g.SetClip(_innerControlPath);
+ g.IntersectClip(fullRectangle);
+ }
+ else
+ {
+ g.SetClip(fullRectangle);
+ }
+
+ if (ToggleSwitch.OffSideImage != null)
+ {
+ Size imageSize = ToggleSwitch.OffSideImage.Size;
+ Rectangle imageRectangle;
+
+ int imageXPos = (int)fullRectangle.X;
+
+ if (ToggleSwitch.OffSideScaleImageToFit)
+ {
+ Size canvasSize = new Size((int)fullRectangle.Width, (int)fullRectangle.Height);
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle);
+ }
+ else
+ {
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (((float)fullRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ imageXPos = (int)((float)fullRectangle.X + (float)fullRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)fullRectangle.Y + (((float)fullRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(ToggleSwitch.OnSideImage, imageRectangle, 0, 0, ToggleSwitch.OnSideImage.Width, ToggleSwitch.OnSideImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(ToggleSwitch.OffSideImage, imageRectangle);
+ }
+ }
+ else if (!string.IsNullOrEmpty(ToggleSwitch.OffText))
+ {
+ SizeF textSize = g.MeasureString(ToggleSwitch.OffText, ToggleSwitch.OffFont);
+
+ float textXPos = fullRectangle.X;
+
+ if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Center)
+ {
+ textXPos = (float)fullRectangle.X + (((float)fullRectangle.Width - (float)textSize.Width) / 2);
+ }
+ else if (ToggleSwitch.OffSideAlignment == ToggleSwitch.ToggleSwitchAlignment.Far)
+ {
+ textXPos = (float)fullRectangle.X + (float)fullRectangle.Width - (float)textSize.Width;
+ }
+
+ RectangleF textRectangle = new RectangleF(textXPos, (float)fullRectangle.Y + (((float)fullRectangle.Height - (float)textSize.Height) / 2), textSize.Width, textSize.Height);
+
+ Color textForeColor = ToggleSwitch.OffForeColor;
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ textForeColor = textForeColor.ToGrayScale();
+
+ using (Brush textBrush = new SolidBrush(textForeColor))
+ {
+ g.DrawString(ToggleSwitch.OffText, ToggleSwitch.OffFont, textBrush, textRectangle);
+ }
+ }
+
+ g.ResetClip();
+ }
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+ g.InterpolationMode = InterpolationMode.HighQualityBilinear;
+
+ buttonRectangle.Inflate(-1, -1);
+
+ using (GraphicsPath buttonPath = GetRoundedRectanglePath(buttonRectangle, CornerRadius))
+ {
+ g.SetClip(buttonPath);
+
+ //Draw button surface
+ Color buttonSurfaceColor1 = ButtonNormalSurfaceColor1;
+ Color buttonSurfaceColor2 = ButtonNormalSurfaceColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonSurfaceColor1 = ButtonPressedSurfaceColor1;
+ buttonSurfaceColor2 = ButtonPressedSurfaceColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonSurfaceColor1 = ButtonHoverSurfaceColor1;
+ buttonSurfaceColor2 = ButtonHoverSurfaceColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonSurfaceColor1 = buttonSurfaceColor1.ToGrayScale();
+ buttonSurfaceColor2 = buttonSurfaceColor2.ToGrayScale();
+ }
+
+ using (Brush buttonSurfaceBrush = new LinearGradientBrush(buttonRectangle, buttonSurfaceColor1, buttonSurfaceColor2, LinearGradientMode.Vertical))
+ {
+ g.FillPath(buttonSurfaceBrush, buttonPath);
+ }
+
+ //Draw button border
+ Color buttonBorderColor1 = ButtonNormalBorderColor1;
+ Color buttonBorderColor2 = ButtonNormalBorderColor2;
+
+ if (ToggleSwitch.IsButtonPressed)
+ {
+ buttonBorderColor1 = ButtonPressedBorderColor1;
+ buttonBorderColor2 = ButtonPressedBorderColor2;
+ }
+ else if (ToggleSwitch.IsButtonHovered)
+ {
+ buttonBorderColor1 = ButtonHoverBorderColor1;
+ buttonBorderColor2 = ButtonHoverBorderColor2;
+ }
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ {
+ buttonBorderColor1 = buttonBorderColor1.ToGrayScale();
+ buttonBorderColor2 = buttonBorderColor2.ToGrayScale();
+ }
+
+ using (Brush buttonBorderBrush = new LinearGradientBrush(buttonRectangle, buttonBorderColor1, buttonBorderColor2, LinearGradientMode.Vertical))
+ {
+ using (Pen buttonBorderPen = new Pen(buttonBorderBrush))
+ {
+ g.DrawPath(buttonBorderPen, buttonPath);
+ }
+ }
+
+ g.ResetClip();
+
+ //Draw button image
+ Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage);
+
+ if (buttonImage != null)
+ {
+ g.SetClip(buttonPath);
+
+ ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment);
+
+ Size imageSize = buttonImage.Size;
+
+ Rectangle imageRectangle;
+
+ int imageXPos = buttonRectangle.X;
+
+ bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit);
+
+ if (scaleImage)
+ {
+ Size canvasSize = buttonRectangle.Size;
+ Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
+
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)resizedImageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)resizedImageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImage(buttonImage, imageRectangle);
+ }
+ else
+ {
+ if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (((float)buttonRectangle.Width - (float)imageSize.Width) / 2));
+ }
+ else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
+ {
+ imageXPos = (int)((float)buttonRectangle.X + (float)buttonRectangle.Width - (float)imageSize.Width);
+ }
+
+ imageRectangle = new Rectangle(imageXPos, (int)((float)buttonRectangle.Y + (((float)buttonRectangle.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
+
+ if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
+ g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
+ else
+ g.DrawImageUnscaled(buttonImage, imageRectangle);
+ }
+
+ g.ResetClip();
+ }
+ }
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public GraphicsPath GetRoundedRectanglePath(Rectangle rectangle, int radius)
+ {
+ GraphicsPath gp = new GraphicsPath();
+ int diameter = 2*radius;
+
+ if (diameter > ToggleSwitch.Height)
+ diameter = ToggleSwitch.Height;
+
+ if (diameter > ToggleSwitch.Width)
+ diameter = ToggleSwitch.Width;
+
+ gp.AddArc(rectangle.X, rectangle.Y, diameter, diameter, 180, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y, diameter, diameter, 270, 90);
+ gp.AddArc(rectangle.X + rectangle.Width - diameter, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 0, 90);
+ gp.AddArc(rectangle.X, rectangle.Y + rectangle.Height - diameter, diameter, diameter, 90, 90);
+ gp.CloseFigure();
+
+ return gp;
+ }
+
+ public override int GetButtonWidth()
+ {
+ float buttonWidth = 1.53f*(ToggleSwitch.Height - 2);
+ return (int) buttonWidth;
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height);
+ return buttonRect;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
+
diff --git a/ToggleSwitch/Renderers/ToggleSwitchPlainAndSimpleRenderer.cs b/ToggleSwitch/Renderers/ToggleSwitchPlainAndSimpleRenderer.cs
new file mode 100644
index 0000000..9199ec9
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchPlainAndSimpleRenderer.cs
@@ -0,0 +1,204 @@
+using System.Drawing;
+using System.Drawing.Drawing2D;
+
+namespace JCS
+{
+ public class ToggleSwitchPlainAndSimpleRenderer : ToggleSwitchRendererBase
+ {
+ #region Constructor
+
+ public ToggleSwitchPlainAndSimpleRenderer()
+ {
+ BorderColorChecked = Color.Black;
+ BorderColorUnchecked = Color.Black;
+ BorderWidth = 2;
+ ButtonMargin = 1;
+ InnerBackgroundColor = Color.White;
+ ButtonColor = Color.Black;
+ }
+
+ #endregion Constructor
+
+ #region Public Properties
+
+ public Color BorderColorChecked { get; set; }
+ public Color BorderColorUnchecked { get; set; }
+ public int BorderWidth { get; set; }
+ public int ButtonMargin { get; set; }
+ public Color InnerBackgroundColor { get; set; }
+ public Color ButtonColor { get; set; }
+
+ #endregion Public Properties
+
+ #region Render Method Implementations
+
+ public override void RenderBorder(Graphics g, Rectangle borderRectangle)
+ {
+ //Draw this one AFTER the button is drawn in the RenderButton method
+ }
+
+ public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+ int buttonWidth = GetButtonWidth();
+
+ Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height);
+ GraphicsPath innerBorderClipPath = GetInnerBorderClipPath(controlRectangle);
+
+ g.SetClip(innerBorderClipPath);
+ g.IntersectClip(leftRectangle);
+
+ using (Brush innerBackgroundBrush = new SolidBrush(InnerBackgroundColor))
+ {
+ g.FillPath(innerBackgroundBrush, innerBorderClipPath);
+ }
+
+ g.ResetClip();
+ }
+
+ public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+ int buttonWidth = GetButtonWidth();
+
+ Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height);
+ GraphicsPath innerBorderClipPath = GetInnerBorderClipPath(controlRectangle);
+
+ g.SetClip(innerBorderClipPath);
+ g.IntersectClip(rightRectangle);
+
+ using (Brush innerBackgroundBrush = new SolidBrush(InnerBackgroundColor))
+ {
+ g.FillPath(innerBackgroundBrush, innerBorderClipPath);
+ }
+
+ g.ResetClip();
+ }
+
+ public override void RenderButton(Graphics g, Rectangle buttonRectangle)
+ {
+ g.SmoothingMode = SmoothingMode.HighQuality;
+ g.PixelOffsetMode = PixelOffsetMode.HighQuality;
+
+ GraphicsPath buttonClipPath = GetButtonClipPath();
+
+ Rectangle controlRectangle = new Rectangle(0, 0, ToggleSwitch.Width, ToggleSwitch.Height);
+ GraphicsPath outerBorderClipPath = GetControlClipPath(controlRectangle);
+ GraphicsPath innerBorderClipPath = GetInnerBorderClipPath(controlRectangle);
+
+ g.SetClip(innerBorderClipPath);
+ g.IntersectClip(buttonRectangle);
+
+ //Fill the button surface with the background color
+
+ using (Brush innerBackgroundBrush = new SolidBrush(InnerBackgroundColor))
+ {
+ g.FillRectangle(innerBackgroundBrush, buttonRectangle);
+ }
+
+ g.ResetClip();
+
+ g.SetClip(GetButtonClipPath());
+ g.IntersectClip(controlRectangle);
+
+ //Render the button
+
+ using (Brush buttonBrush = new SolidBrush(ButtonColor))
+ {
+ g.FillPath(buttonBrush, buttonClipPath);
+ }
+
+ g.ResetClip();
+
+ //Render the border
+
+ g.SetClip(outerBorderClipPath);
+ g.ExcludeClip(new Region(innerBorderClipPath));
+
+ Color borderColor = ToggleSwitch.Checked ? BorderColorChecked : BorderColorUnchecked;
+
+ using (Brush borderBrush = new SolidBrush(borderColor))
+ {
+ g.FillPath(borderBrush, outerBorderClipPath);
+ }
+
+ g.ResetClip();
+ }
+
+ #endregion Render Method Implementations
+
+ #region Helper Method Implementations
+
+ public GraphicsPath GetControlClipPath(Rectangle controlRectangle)
+ {
+ GraphicsPath borderPath = new GraphicsPath();
+ borderPath.AddArc(controlRectangle.X, controlRectangle.Y, controlRectangle.Height, controlRectangle.Height, 90, 180);
+ borderPath.AddArc(controlRectangle.X + controlRectangle.Width - controlRectangle.Height, controlRectangle.Y, controlRectangle.Height, controlRectangle.Height, 270, 180);
+ borderPath.CloseFigure();
+
+ return borderPath;
+ }
+
+ public GraphicsPath GetInnerBorderClipPath(Rectangle controlRectangle)
+ {
+ Rectangle innerBorderRectangle = new Rectangle(controlRectangle.X + BorderWidth,
+ controlRectangle.Y + BorderWidth,
+ controlRectangle.Width - (2 * BorderWidth),
+ controlRectangle.Height - (2 * BorderWidth));
+
+ GraphicsPath borderPath = new GraphicsPath();
+ borderPath.AddArc(innerBorderRectangle.X, innerBorderRectangle.Y, innerBorderRectangle.Height, innerBorderRectangle.Height, 90, 180);
+ borderPath.AddArc(innerBorderRectangle.X + innerBorderRectangle.Width - innerBorderRectangle.Height, innerBorderRectangle.Y, innerBorderRectangle.Height, innerBorderRectangle.Height, 270, 180);
+ borderPath.CloseFigure();
+
+ return borderPath;
+ }
+
+ public GraphicsPath GetButtonClipPath()
+ {
+ Rectangle buttonRectangle = GetButtonRectangle();
+
+ GraphicsPath buttonPath = new GraphicsPath();
+
+ buttonPath.AddArc(buttonRectangle.X + ButtonMargin, buttonRectangle.Y + ButtonMargin, buttonRectangle.Height - (2 * ButtonMargin), buttonRectangle.Height - (2 * ButtonMargin), 0, 360);
+
+ return buttonPath;
+ }
+
+ public override int GetButtonWidth()
+ {
+ int buttonWidth = ToggleSwitch.Height - (2 * BorderWidth);
+ return buttonWidth > 0 ? buttonWidth : 0;
+ }
+
+ public override Rectangle GetButtonRectangle()
+ {
+ int buttonWidth = GetButtonWidth();
+ return GetButtonRectangle(buttonWidth);
+ }
+
+ public override Rectangle GetButtonRectangle(int buttonWidth)
+ {
+ if (buttonWidth <= 0)
+ {
+ return Rectangle.Empty;
+ }
+
+ Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, BorderWidth, buttonWidth, buttonWidth);
+
+ if (buttonRect.X < BorderWidth + ButtonMargin - 1)
+ buttonRect.X = BorderWidth + ButtonMargin - 1;
+
+ if (buttonRect.X + buttonRect.Width > ToggleSwitch.Width - BorderWidth - ButtonMargin + 1)
+ buttonRect.X = ToggleSwitch.Width - buttonRect.Width - BorderWidth - ButtonMargin + 1;
+
+ return buttonRect;
+ }
+
+ #endregion Helper Method Implementations
+ }
+}
diff --git a/ToggleSwitch/Renderers/ToggleSwitchRendererBase.cs b/ToggleSwitch/Renderers/ToggleSwitchRendererBase.cs
new file mode 100644
index 0000000..b24c6f2
--- /dev/null
+++ b/ToggleSwitch/Renderers/ToggleSwitchRendererBase.cs
@@ -0,0 +1,101 @@
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace JCS
+{
+ public abstract class ToggleSwitchRendererBase
+ {
+ #region Private Members
+
+ private ToggleSwitch _toggleSwitch;
+
+ #endregion Private Members
+
+ #region Constructor
+
+ protected ToggleSwitchRendererBase()
+ {}
+
+ internal void SetToggleSwitch(ToggleSwitch toggleSwitch)
+ {
+ _toggleSwitch = toggleSwitch;
+ }
+
+ internal ToggleSwitch ToggleSwitch
+ {
+ get { return _toggleSwitch; }
+ }
+
+ #endregion Constructor
+
+ #region Render Methods
+
+ public void RenderBackground(PaintEventArgs e)
+ {
+ if (_toggleSwitch == null)
+ return;
+
+ e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
+
+ Rectangle controlRectangle = new Rectangle(0, 0, _toggleSwitch.Width, _toggleSwitch.Height);
+
+ FillBackground(e.Graphics, controlRectangle);
+
+ RenderBorder(e.Graphics, controlRectangle);
+ }
+
+ public void RenderControl(PaintEventArgs e)
+ {
+ if (_toggleSwitch == null)
+ return;
+
+ e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
+
+ Rectangle buttonRectangle = GetButtonRectangle();
+ int totalToggleFieldWidth = ToggleSwitch.Width - buttonRectangle.Width;
+
+ if (buttonRectangle.X > 0)
+ {
+ Rectangle leftRectangle = new Rectangle(0, 0, buttonRectangle.X, ToggleSwitch.Height);
+
+ if (leftRectangle.Width > 0)
+ RenderLeftToggleField(e.Graphics, leftRectangle, totalToggleFieldWidth);
+ }
+
+ if (buttonRectangle.X + buttonRectangle.Width < e.ClipRectangle.Width)
+ {
+ Rectangle rightRectangle = new Rectangle(buttonRectangle.X + buttonRectangle.Width, 0, ToggleSwitch.Width - buttonRectangle.X - buttonRectangle.Width, ToggleSwitch.Height);
+
+ if (rightRectangle.Width > 0)
+ RenderRightToggleField(e.Graphics, rightRectangle, totalToggleFieldWidth);
+ }
+
+ RenderButton(e.Graphics, buttonRectangle);
+ }
+
+ public void FillBackground(Graphics g, Rectangle controlRectangle)
+ {
+ Color backColor = (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled) ? ToggleSwitch.BackColor.ToGrayScale() : ToggleSwitch.BackColor;
+
+ using (Brush backBrush = new SolidBrush(backColor))
+ {
+ g.FillRectangle(backBrush, controlRectangle);
+ }
+ }
+
+ public abstract void RenderBorder(Graphics g, Rectangle borderRectangle);
+ public abstract void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth);
+ public abstract void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth);
+ public abstract void RenderButton(Graphics g, Rectangle buttonRectangle);
+
+ #endregion Render Methods
+
+ #region Helper Methods
+
+ public abstract int GetButtonWidth();
+ public abstract Rectangle GetButtonRectangle();
+ public abstract Rectangle GetButtonRectangle(int buttonWidth);
+
+ #endregion Helper Methods
+ }
+}
diff --git a/ToggleSwitch/ToggleSwitch.cs b/ToggleSwitch/ToggleSwitch.cs
new file mode 100644
index 0000000..41f7682
--- /dev/null
+++ b/ToggleSwitch/ToggleSwitch.cs
@@ -0,0 +1,1189 @@
+using System;
+using System.ComponentModel;
+using System.Drawing;
+using System.Windows.Forms;
+using ToggleSwitch;
+
+/**********************************************************************************/
+/* ToggleSwitch - Version 1.1 */
+/**********************************************************************************/
+/* http://www.codeproject.com/Articles/1029499/ToggleSwitch-Winforms-Control */
+/**********************************************************************************/
+
+
+namespace JCS
+{
+ [DefaultValue("Checked"), DefaultEvent("CheckedChanged"), ToolboxBitmap(typeof(CheckBox))]
+ public class ToggleSwitch : Control
+ {
+ #region Delegate and Event declarations
+
+ public delegate void CheckedChangedDelegate(object sender, EventArgs e);
+ [Description("Raised when the ToggleSwitch has changed state")]
+ public event CheckedChangedDelegate CheckedChanged;
+
+ public delegate void BeforeRenderingDelegate(object sender, BeforeRenderingEventArgs e);
+ [Description("Raised when the ToggleSwitch renderer is changed")]
+ public event BeforeRenderingDelegate BeforeRendering;
+
+ #endregion Delegate and Event declarations
+
+ #region Enums
+
+ public enum ToggleSwitchStyle
+ {
+ Metro,
+ Android,
+ IOS5,
+ BrushedMetal,
+ OSX,
+ Carbon,
+ Iphone,
+ Fancy,
+ Modern,
+ PlainAndSimpel
+ }
+
+ public enum ToggleSwitchAlignment
+ {
+ Near,
+ Center,
+ Far
+ }
+
+ public enum ToggleSwitchButtonAlignment
+ {
+ Left,
+ Center,
+ Right
+ }
+
+ #endregion Enums
+
+ #region Private Members
+
+ private readonly Timer _animationTimer = new Timer();
+ private ToggleSwitchRendererBase _renderer;
+
+ private ToggleSwitchStyle _style = ToggleSwitchStyle.Metro;
+ private bool _checked = false;
+ private bool _moving = false;
+ private bool _animating = false;
+ private bool _animationResult = false;
+ private int _animationTarget = 0;
+ private bool _useAnimation = true;
+ private int _animationInterval = 1;
+ private int _animationStep = 10;
+ private bool _allowUserChange = true;
+
+ private bool _isLeftFieldHovered = false;
+ private bool _isButtonHovered = false;
+ private bool _isRightFieldHovered = false;
+ private bool _isLeftFieldPressed = false;
+ private bool _isButtonPressed = false;
+ private bool _isRightFieldPressed = false;
+
+ private int _buttonValue = 0;
+ private int _savedButtonValue = 0;
+ private int _xOffset = 0;
+ private int _xValue = 0;
+ private int _thresholdPercentage = 50;
+ private bool _grayWhenDisabled = true;
+ private bool _toggleOnButtonClick = true;
+ private bool _toggleOnSideClick = true;
+
+ private MouseEventArgs _lastMouseEventArgs = null;
+
+ private bool _buttonScaleImage;
+ private ToggleSwitchButtonAlignment _buttonAlignment = ToggleSwitchButtonAlignment.Center;
+ private Image _buttonImage = null;
+
+ private string _offText = "";
+ private Color _offForeColor = Color.Black;
+ private Font _offFont;
+ private Image _offSideImage = null;
+ private bool _offSideScaleImage;
+ private ToggleSwitchAlignment _offSideAlignment = ToggleSwitchAlignment.Center;
+ private Image _offButtonImage = null;
+ private bool _offButtonScaleImage;
+ private ToggleSwitchButtonAlignment _offButtonAlignment = ToggleSwitchButtonAlignment.Center;
+
+ private string _onText = "";
+ private Color _onForeColor = Color.Black;
+ private Font _onFont;
+ private Image _onSideImage = null;
+ private bool _onSideScaleImage;
+ private ToggleSwitchAlignment _onSideAlignment = ToggleSwitchAlignment.Center;
+ private Image _onButtonImage = null;
+ private bool _onButtonScaleImage;
+ private ToggleSwitchButtonAlignment _onButtonAlignment = ToggleSwitchButtonAlignment.Center;
+
+ #endregion Private Members
+
+ #region Constructor Etc.
+
+ public ToggleSwitch()
+ {
+ SetStyle(ControlStyles.ResizeRedraw |
+ ControlStyles.SupportsTransparentBackColor |
+ ControlStyles.AllPaintingInWmPaint |
+ ControlStyles.UserPaint |
+ ControlStyles.OptimizedDoubleBuffer |
+ ControlStyles.DoubleBuffer, true);
+
+ OnFont = base.Font;
+ OffFont = base.Font;
+
+ SetRenderer(new ToggleSwitchMetroRenderer());
+
+ _animationTimer.Enabled = false;
+ _animationTimer.Interval = _animationInterval;
+ _animationTimer.Tick += AnimationTimer_Tick;
+ }
+
+ public void SetRenderer(ToggleSwitchRendererBase renderer)
+ {
+ renderer.SetToggleSwitch(this);
+ _renderer = renderer;
+
+ if (_renderer != null)
+ Refresh();
+ }
+
+ #endregion Constructor Etc.
+
+ #region Public Properties
+
+ [Bindable(false)]
+ [DefaultValue(typeof(ToggleSwitchStyle), "Metro")]
+ [Category("Appearance")]
+ [Description("Gets or sets the style of the ToggleSwitch")]
+ public ToggleSwitchStyle Style
+ {
+ get { return _style; }
+ set
+ {
+ if (value != _style)
+ {
+ _style = value;
+
+ switch (_style)
+ {
+ case ToggleSwitchStyle.Metro:
+ SetRenderer(new ToggleSwitchMetroRenderer());
+ break;
+ case ToggleSwitchStyle.Android:
+ SetRenderer(new ToggleSwitchAndroidRenderer());
+ break;
+ case ToggleSwitchStyle.IOS5:
+ SetRenderer(new ToggleSwitchIOS5Renderer());
+ break;
+ case ToggleSwitchStyle.BrushedMetal:
+ SetRenderer(new ToggleSwitchBrushedMetalRenderer());
+ break;
+ case ToggleSwitchStyle.OSX:
+ SetRenderer(new ToggleSwitchOSXRenderer());
+ break;
+ case ToggleSwitchStyle.Carbon:
+ SetRenderer(new ToggleSwitchCarbonRenderer());
+ break;
+ case ToggleSwitchStyle.Iphone:
+ SetRenderer(new ToggleSwitchIphoneRenderer());
+ break;
+ case ToggleSwitchStyle.Fancy:
+ SetRenderer(new ToggleSwitchFancyRenderer());
+ break;
+ case ToggleSwitchStyle.Modern:
+ SetRenderer(new ToggleSwitchModernRenderer());
+ break;
+ case ToggleSwitchStyle.PlainAndSimpel:
+ SetRenderer(new ToggleSwitchPlainAndSimpleRenderer());
+ break;
+ }
+ }
+
+ Refresh();
+ }
+ }
+
+ [Bindable(true)]
+ [DefaultValue(false)]
+ [Category("Data")]
+ [Description("Gets or sets the Checked value of the ToggleSwitch")]
+ public bool Checked
+ {
+ get { return _checked; }
+ set
+ {
+ if (value != _checked)
+ {
+ while (_animating)
+ {
+ Application.DoEvents();
+ }
+
+ if (value == true)
+ {
+ int buttonWidth = _renderer.GetButtonWidth();
+ _animationTarget = Width - buttonWidth;
+ BeginAnimation(true);
+ }
+ else
+ {
+ _animationTarget = 0;
+ BeginAnimation(false);
+ }
+ }
+ }
+ }
+
+ [Bindable(true)]
+ [DefaultValue(true)]
+ [Category("Behavior")]
+ [Description("Gets or sets whether the user can change the value of the button or not")]
+ public bool AllowUserChange
+ {
+ get { return _allowUserChange; }
+ set { _allowUserChange = value; }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public string CheckedString
+ {
+ get
+ {
+ return Checked ? (string.IsNullOrEmpty(OnText) ? "ON" : OnText) : (string.IsNullOrEmpty(OffText) ? "OFF" : OffText);
+ }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public Rectangle ButtonRectangle
+ {
+ get
+ {
+ return _renderer.GetButtonRectangle();
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(true)]
+ [Category("Appearance")]
+ [Description("Gets or sets if the ToggleSwitch should be grayed out when disabled")]
+ public bool GrayWhenDisabled
+ {
+ get { return _grayWhenDisabled; }
+ set
+ {
+ if (value != _grayWhenDisabled)
+ {
+ _grayWhenDisabled = value;
+
+ if (!Enabled)
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(true)]
+ [Category("Behavior")]
+ [Description("Gets or sets if the ToggleSwitch should toggle when the button is clicked")]
+ public bool ToggleOnButtonClick
+ {
+ get { return _toggleOnButtonClick; }
+ set { _toggleOnButtonClick = value; }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(true)]
+ [Category("Behavior")]
+ [Description("Gets or sets if the ToggleSwitch should toggle when the track besides the button is clicked")]
+ public bool ToggleOnSideClick
+ {
+ get { return _toggleOnSideClick; }
+ set { _toggleOnSideClick = value; }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(50)]
+ [Category("Behavior")]
+ [Description("Gets or sets how much the button need to be on the other side (in peercept) before it snaps")]
+ public int ThresholdPercentage
+ {
+ get { return _thresholdPercentage; }
+ set { _thresholdPercentage = value; }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(typeof(Color), "Black")]
+ [Category("Appearance")]
+ [Description("Gets or sets the forecolor of the text when Checked=false")]
+ public Color OffForeColor
+ {
+ get { return _offForeColor; }
+ set
+ {
+ if (value != _offForeColor)
+ {
+ _offForeColor = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(typeof(Font), "Microsoft Sans Serif, 8.25pt")]
+ [Category("Appearance")]
+ [Description("Gets or sets the font of the text when Checked=false")]
+ public Font OffFont
+ {
+ get { return _offFont; }
+ set
+ {
+ if (!value.Equals(_offFont))
+ {
+ _offFont = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue("")]
+ [Category("Appearance")]
+ [Description("Gets or sets the text when Checked=true")]
+ public string OffText
+ {
+ get { return _offText; }
+ set
+ {
+ if (value != _offText)
+ {
+ _offText = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(null)]
+ [Category("Appearance")]
+ [Description("Gets or sets the side image when Checked=false - Note: Settings the OffSideImage overrules the OffText property. Only the image will be shown")]
+ public Image OffSideImage
+ {
+ get { return _offSideImage; }
+ set
+ {
+ if (value != _offSideImage)
+ {
+ _offSideImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(false)]
+ [Category("Behavior")]
+ [Description("Gets or sets whether the side image visible when Checked=false should be scaled to fit")]
+ public bool OffSideScaleImageToFit
+ {
+ get { return _offSideScaleImage; }
+ set
+ {
+ if (value != _offSideScaleImage)
+ {
+ _offSideScaleImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(typeof(ToggleSwitchAlignment), "Center")]
+ [Category("Appearance")]
+ [Description("Gets or sets how the text or side image visible when Checked=false should be aligned")]
+ public ToggleSwitchAlignment OffSideAlignment
+ {
+ get { return _offSideAlignment; }
+ set
+ {
+ if (value != _offSideAlignment)
+ {
+ _offSideAlignment = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(null)]
+ [Category("Appearance")]
+ [Description("Gets or sets the button image when Checked=false and ButtonImage is not set")]
+ public Image OffButtonImage
+ {
+ get { return _offButtonImage; }
+ set
+ {
+ if (value != _offButtonImage)
+ {
+ _offButtonImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(false)]
+ [Category("Behavior")]
+ [Description("Gets or sets whether the button image visible when Checked=false should be scaled to fit")]
+ public bool OffButtonScaleImageToFit
+ {
+ get { return _offButtonScaleImage; }
+ set
+ {
+ if (value != _offButtonScaleImage)
+ {
+ _offButtonScaleImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(typeof(ToggleSwitchButtonAlignment), "Center")]
+ [Category("Appearance")]
+ [Description("Gets or sets how the button image visible when Checked=false should be aligned")]
+ public ToggleSwitchButtonAlignment OffButtonAlignment
+ {
+ get { return _offButtonAlignment; }
+ set
+ {
+ if (value != _offButtonAlignment)
+ {
+ _offButtonAlignment = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(typeof(Color), "Black")]
+ [Category("Appearance")]
+ [Description("Gets or sets the forecolor of the text when Checked=true")]
+ public Color OnForeColor
+ {
+ get { return _onForeColor; }
+ set
+ {
+ if (value != _onForeColor)
+ {
+ _onForeColor = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(typeof(Font), "Microsoft Sans Serif, 8,25pt")]
+ [Category("Appearance")]
+ [Description("Gets or sets the font of the text when Checked=true")]
+ public Font OnFont
+ {
+ get { return _onFont; }
+ set
+ {
+ if (!value.Equals(_onFont))
+ {
+ _onFont = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue("")]
+ [Category("Appearance")]
+ [Description("Gets or sets the text when Checked=true")]
+ public string OnText
+ {
+ get { return _onText; }
+ set
+ {
+ if (value != _onText)
+ {
+ _onText = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(null)]
+ [Category("Appearance")]
+ [Description("Gets or sets the side image visible when Checked=true - Note: Settings the OnSideImage overrules the OnText property. Only the image will be shown.")]
+ public Image OnSideImage
+ {
+ get { return _onSideImage; }
+ set
+ {
+ if (value != _onSideImage)
+ {
+ _onSideImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(false)]
+ [Category("Behavior")]
+ [Description("Gets or sets whether the side image visible when Checked=true should be scaled to fit")]
+ public bool OnSideScaleImageToFit
+ {
+ get { return _onSideScaleImage; }
+ set
+ {
+ if (value != _onSideScaleImage)
+ {
+ _onSideScaleImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(null)]
+ [Category("Appearance")]
+ [Description("Gets or sets the button image")]
+ public Image ButtonImage
+ {
+ get { return _buttonImage; }
+ set
+ {
+ if (value != _buttonImage)
+ {
+ _buttonImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(false)]
+ [Category("Behavior")]
+ [Description("Gets or sets whether the button image should be scaled to fit")]
+ public bool ButtonScaleImageToFit
+ {
+ get { return _buttonScaleImage; }
+ set
+ {
+ if (value != _buttonScaleImage)
+ {
+ _buttonScaleImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(typeof(ToggleSwitchButtonAlignment), "Center")]
+ [Category("Appearance")]
+ [Description("Gets or sets how the button image should be aligned")]
+ public ToggleSwitchButtonAlignment ButtonAlignment
+ {
+ get { return _buttonAlignment; }
+ set
+ {
+ if (value != _buttonAlignment)
+ {
+ _buttonAlignment = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(typeof(ToggleSwitchAlignment), "Center")]
+ [Category("Appearance")]
+ [Description("Gets or sets how the text or side image visible when Checked=true should be aligned")]
+ public ToggleSwitchAlignment OnSideAlignment
+ {
+ get { return _onSideAlignment; }
+ set
+ {
+ if (value != _onSideAlignment)
+ {
+ _onSideAlignment = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(null)]
+ [Category("Appearance")]
+ [Description("Gets or sets the button image visible when Checked=true and ButtonImage is not set")]
+ public Image OnButtonImage
+ {
+ get { return _onButtonImage; }
+ set
+ {
+ if (value != _onButtonImage)
+ {
+ _onButtonImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(false)]
+ [Category("Behavior")]
+ [Description("Gets or sets whether the button image visible when Checked=true should be scaled to fit")]
+ public bool OnButtonScaleImageToFit
+ {
+ get { return _onButtonScaleImage; }
+ set
+ {
+ if (value != _onButtonScaleImage)
+ {
+ _onButtonScaleImage = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(typeof(ToggleSwitchButtonAlignment), "Center")]
+ [Category("Appearance")]
+ [Description("Gets or sets how the button image visible when Checked=true should be aligned")]
+ public ToggleSwitchButtonAlignment OnButtonAlignment
+ {
+ get { return _onButtonAlignment; }
+ set
+ {
+ if (value != _onButtonAlignment)
+ {
+ _onButtonAlignment = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(true)]
+ [Category("Behavior")]
+ [Description("Gets or sets whether the toggle change should be animated or not")]
+ public bool UseAnimation
+ {
+ get { return _useAnimation; }
+ set { _useAnimation = value; }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(1)]
+ [Category("Behavior")]
+ [Description("Gets or sets the interval in ms between animation frames")]
+ public int AnimationInterval
+ {
+ get { return _animationInterval; }
+ set
+ {
+ if (value <= 0)
+ {
+ throw new ArgumentOutOfRangeException("AnimationInterval must larger than zero!");
+ }
+
+ _animationInterval = value;
+ }
+ }
+
+ [Bindable(false)]
+ [DefaultValue(10)]
+ [Category("Behavior")]
+ [Description("Gets or sets the step in pixes the button shouldbe moved between each animation interval")]
+ public int AnimationStep
+ {
+ get { return _animationStep; }
+ set
+ {
+ if (value <= 0)
+ {
+ throw new ArgumentOutOfRangeException("AnimationStep must larger than zero!");
+ }
+
+ _animationStep = value;
+ }
+ }
+
+ #region Hidden Base Properties
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public new string Text
+ {
+ get { return ""; }
+ set { base.Text = ""; }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public new Color ForeColor
+ {
+ get { return Color.Black; }
+ set { base.ForeColor = Color.Black; }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ public new Font Font
+ {
+ get { return base.Font; }
+ set { base.Font = new Font(base.Font, FontStyle.Regular); }
+ }
+
+ #endregion Hidden Base Properties
+
+ #endregion Public Properties
+
+ #region Internal Properties
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsButtonHovered
+ {
+ get { return _isButtonHovered && !_isButtonPressed; }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsButtonPressed
+ {
+ get { return _isButtonPressed; }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsLeftSideHovered
+ {
+ get { return _isLeftFieldHovered && !_isLeftFieldPressed; }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsLeftSidePressed
+ {
+ get { return _isLeftFieldPressed; }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsRightSideHovered
+ {
+ get { return _isRightFieldHovered && !_isRightFieldPressed; }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsRightSidePressed
+ {
+ get { return _isRightFieldPressed; }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal int ButtonValue
+ {
+ get
+ {
+ if (_animating || _moving)
+ return _buttonValue;
+ else if (_checked)
+ return Width - _renderer.GetButtonWidth();
+ else
+ return 0;
+ }
+ set
+ {
+ if (value != _buttonValue)
+ {
+ _buttonValue = value;
+ Refresh();
+ }
+ }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsButtonOnLeftSide
+ {
+ get { return (ButtonValue <= 0); }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsButtonOnRightSide
+ {
+ get { return (ButtonValue >= (Width - _renderer.GetButtonWidth())); }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsButtonMovingLeft
+ {
+ get { return (_animating && !IsButtonOnLeftSide && _animationResult == false); }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool IsButtonMovingRight
+ {
+ get { return (_animating && !IsButtonOnRightSide && _animationResult == true); }
+ }
+
+ [Browsable(false)]
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+ internal bool AnimationResult
+ {
+ get { return _animationResult; }
+ }
+
+ #endregion Private Properties
+
+ #region Overridden Control Methods
+
+ protected override Size DefaultSize
+ {
+ get { return new Size(50, 19); }
+ }
+
+ protected override void OnPaintBackground(PaintEventArgs pevent)
+ {
+ pevent.Graphics.ResetClip();
+
+ base.OnPaintBackground(pevent);
+
+ if (_renderer != null)
+ _renderer.RenderBackground(pevent);
+ }
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ e.Graphics.ResetClip();
+
+ base.OnPaint(e);
+
+ if (_renderer != null)
+ {
+ if (BeforeRendering != null)
+ {
+ BeforeRendering(this, new BeforeRenderingEventArgs(_renderer));
+ }
+
+ _renderer.RenderControl(e);
+ }
+ }
+
+ protected override void OnMouseMove(MouseEventArgs e)
+ {
+ _lastMouseEventArgs = e;
+
+ int buttonWidth = _renderer.GetButtonWidth();
+ Rectangle buttonRectangle = _renderer.GetButtonRectangle(buttonWidth);
+
+ if (_moving)
+ {
+ int val = _xValue + (e.Location.X - _xOffset);
+
+ if (val < 0)
+ val = 0;
+
+ if (val > Width - buttonWidth)
+ val = Width - buttonWidth;
+
+ ButtonValue = val;
+ Refresh();
+ return;
+ }
+
+ if (buttonRectangle.Contains(e.Location))
+ {
+ _isButtonHovered = true;
+ _isLeftFieldHovered = false;
+ _isRightFieldHovered = false;
+ }
+ else
+ {
+ if (e.Location.X > buttonRectangle.X + buttonRectangle.Width)
+ {
+ _isButtonHovered = false;
+ _isLeftFieldHovered = false;
+ _isRightFieldHovered = true;
+ }
+ else if (e.Location.X < buttonRectangle.X)
+ {
+ _isButtonHovered = false;
+ _isLeftFieldHovered = true;
+ _isRightFieldHovered = false;
+ }
+ }
+
+ Refresh();
+ }
+
+ protected override void OnMouseDown(MouseEventArgs e)
+ {
+ if (_animating || !AllowUserChange)
+ return;
+
+ int buttonWidth = _renderer.GetButtonWidth();
+ Rectangle buttonRectangle = _renderer.GetButtonRectangle(buttonWidth);
+
+ _savedButtonValue = ButtonValue;
+
+ if (buttonRectangle.Contains(e.Location))
+ {
+ _isButtonPressed = true;
+ _isLeftFieldPressed = false;
+ _isRightFieldPressed = false;
+
+ _moving = true;
+ _xOffset = e.Location.X;
+ _buttonValue = buttonRectangle.X;
+ _xValue = ButtonValue;
+ }
+ else
+ {
+ if (e.Location.X > buttonRectangle.X + buttonRectangle.Width)
+ {
+ _isButtonPressed = false;
+ _isLeftFieldPressed = false;
+ _isRightFieldPressed = true;
+ }
+ else if (e.Location.X < buttonRectangle.X)
+ {
+ _isButtonPressed = false;
+ _isLeftFieldPressed = true;
+ _isRightFieldPressed = false;
+ }
+ }
+
+ Refresh();
+ }
+
+ protected override void OnMouseUp(MouseEventArgs e)
+ {
+ if (_animating || !AllowUserChange)
+ return;
+
+ int buttonWidth = _renderer.GetButtonWidth();
+
+ bool wasLeftSidePressed = IsLeftSidePressed;
+ bool wasRightSidePressed = IsRightSidePressed;
+
+ _isButtonPressed = false;
+ _isLeftFieldPressed = false;
+ _isRightFieldPressed = false;
+
+ if (_moving)
+ {
+ int percentage = (int)((100*(double)ButtonValue)/((double) Width - (double) buttonWidth));
+
+ if (_checked)
+ {
+ if (percentage <= (100 - _thresholdPercentage))
+ {
+ _animationTarget = 0;
+ BeginAnimation(false);
+ }
+ else if (ToggleOnButtonClick && _savedButtonValue == ButtonValue)
+ {
+ _animationTarget = 0;
+ BeginAnimation(false);
+ }
+ else
+ {
+ _animationTarget = Width - buttonWidth;
+ BeginAnimation(true);
+ }
+ }
+ else
+ {
+ if (percentage >= _thresholdPercentage)
+ {
+ _animationTarget = Width - buttonWidth;
+ BeginAnimation(true);
+ }
+ else if (ToggleOnButtonClick && _savedButtonValue == ButtonValue)
+ {
+ _animationTarget = Width - buttonWidth;
+ BeginAnimation(true);
+ }
+ else
+ {
+ _animationTarget = 0;
+ BeginAnimation(false);
+ }
+ }
+
+ _moving = false;
+ return;
+ }
+
+ if (IsButtonOnRightSide)
+ {
+ _buttonValue = Width - buttonWidth;
+ _animationTarget = 0;
+ }
+ else
+ {
+ _buttonValue = 0;
+ _animationTarget = Width - buttonWidth;
+ }
+
+ if (wasLeftSidePressed && ToggleOnSideClick)
+ {
+ SetValueInternal(false);
+ }
+ else if (wasRightSidePressed && ToggleOnSideClick)
+ {
+ SetValueInternal(true);
+ }
+
+ Refresh();
+ }
+
+ protected override void OnMouseLeave(EventArgs e)
+ {
+ _isButtonHovered = false;
+ _isLeftFieldHovered = false;
+ _isRightFieldHovered = false;
+ _isButtonPressed = false;
+ _isLeftFieldPressed = false;
+ _isRightFieldPressed = false;
+
+ Refresh();
+ }
+
+ protected override void OnEnabledChanged(EventArgs e)
+ {
+ base.OnEnabledChanged(e);
+ Refresh();
+ }
+
+ protected override void OnRegionChanged(EventArgs e)
+ {
+ base.OnRegionChanged(e);
+ Refresh();
+ }
+
+ protected override void OnSizeChanged(EventArgs e)
+ {
+ if (_animationTarget > 0)
+ {
+ int buttonWidth = _renderer.GetButtonWidth();
+ _animationTarget = Width - buttonWidth;
+ }
+
+ base.OnSizeChanged(e);
+ }
+
+ #endregion Overridden Control Methods
+
+ #region Private Methods
+
+ private void SetValueInternal(bool checkedValue)
+ {
+ if (checkedValue == _checked)
+ return;
+
+ while (_animating)
+ {
+ Application.DoEvents();
+ }
+
+ BeginAnimation(checkedValue);
+ }
+
+ private void BeginAnimation(bool checkedValue)
+ {
+ _animating = true;
+ _animationResult = checkedValue;
+
+ if (_animationTimer != null && _useAnimation)
+ {
+ _animationTimer.Interval = _animationInterval;
+ _animationTimer.Enabled = true;
+ }
+ else
+ {
+ AnimationComplete();
+ }
+ }
+
+ private void AnimationTimer_Tick(object sender, EventArgs e)
+ {
+ _animationTimer.Enabled = false;
+
+ bool animationDone = false;
+ int newButtonValue;
+
+ if (IsButtonMovingRight)
+ {
+ newButtonValue = ButtonValue + _animationStep;
+
+ if (newButtonValue > _animationTarget)
+ newButtonValue = _animationTarget;
+
+ ButtonValue = newButtonValue;
+
+ animationDone = ButtonValue >= _animationTarget;
+ }
+ else
+ {
+ newButtonValue = ButtonValue - _animationStep;
+
+ if (newButtonValue < _animationTarget)
+ newButtonValue = _animationTarget;
+
+ ButtonValue = newButtonValue;
+
+ animationDone = ButtonValue <= _animationTarget;
+ }
+
+ if (animationDone)
+ AnimationComplete();
+ else
+ _animationTimer.Enabled = true;
+ }
+
+ private void AnimationComplete()
+ {
+ _animating = false;
+ _moving = false;
+ _checked = _animationResult;
+
+ _isButtonHovered = false;
+ _isButtonPressed = false;
+ _isLeftFieldHovered = false;
+ _isLeftFieldPressed = false;
+ _isRightFieldHovered = false;
+ _isRightFieldPressed = false;
+
+ Refresh();
+
+ if (CheckedChanged != null)
+ CheckedChanged(this, new EventArgs());
+
+ if (_lastMouseEventArgs != null)
+ OnMouseMove(_lastMouseEventArgs);
+
+ _lastMouseEventArgs = null;
+ }
+
+ #endregion Private Methods
+ }
+}
diff --git a/ToggleSwitch/ToggleSwitch.csproj b/ToggleSwitch/ToggleSwitch.csproj
new file mode 100644
index 0000000..503f39f
--- /dev/null
+++ b/ToggleSwitch/ToggleSwitch.csproj
@@ -0,0 +1,71 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {49B88FFA-F02C-4709-BA65-9F8996444ECD}
+ Library
+ Properties
+ ToggleSwitch
+ ToggleSwitch
+ v4.0
+ 512
+
+
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+ true
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Component
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ToggleSwitch/VersionHistory.txt b/ToggleSwitch/VersionHistory.txt
new file mode 100644
index 0000000..cdabfad
--- /dev/null
+++ b/ToggleSwitch/VersionHistory.txt
@@ -0,0 +1,11 @@
+
+Version 1.1
+-----------
+NEW: BeforeRendering event added to make it easier to customize the renderer properties
+NEW: Style and Renderer added: PlainAndSimple
+UPDATED: Demo app updated with the new features
+
+
+Version 1.0
+------------
+Initial Release
\ No newline at end of file
diff --git a/ToggleSwitch/bin/Debug/ToggleSwitch.dll b/ToggleSwitch/bin/Debug/ToggleSwitch.dll
new file mode 100644
index 0000000..6672741
Binary files /dev/null and b/ToggleSwitch/bin/Debug/ToggleSwitch.dll differ
diff --git a/ToggleSwitch/bin/Debug/ToggleSwitch.pdb b/ToggleSwitch/bin/Debug/ToggleSwitch.pdb
new file mode 100644
index 0000000..7075212
Binary files /dev/null and b/ToggleSwitch/bin/Debug/ToggleSwitch.pdb differ
diff --git a/ToggleSwitch/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs b/ToggleSwitch/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..5d01041
--- /dev/null
+++ b/ToggleSwitch/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")]
diff --git a/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferences.cache
new file mode 100644
index 0000000..57b3309
Binary files /dev/null and b/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ
diff --git a/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..740216d
Binary files /dev/null and b/ToggleSwitch/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/ToggleSwitch/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/ToggleSwitch/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..aafc425
Binary files /dev/null and b/ToggleSwitch/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.CoreCompileInputs.cache b/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..6bfab28
--- /dev/null
+++ b/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+b9f63ef76dca6d00d7314d042b5bc449c6f8367e
diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.FileListAbsolute.txt b/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..ec70b4b
--- /dev/null
+++ b/ToggleSwitch/obj/Debug/ToggleSwitch.csproj.FileListAbsolute.txt
@@ -0,0 +1,16 @@
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.dll
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.pdb
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.dll
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.pdb
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.csprojResolveAssemblyReference.cache
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.dll
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.pdb
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.csproj.CoreCompileInputs.cache
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.dll
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.pdb
+D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.dll
+D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\bin\Debug\ToggleSwitch.pdb
+D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.csprojAssemblyReference.cache
+D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.csproj.CoreCompileInputs.cache
+D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.dll
+D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitch\obj\Debug\ToggleSwitch.pdb
diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.csprojAssemblyReference.cache b/ToggleSwitch/obj/Debug/ToggleSwitch.csprojAssemblyReference.cache
new file mode 100644
index 0000000..4562619
Binary files /dev/null and b/ToggleSwitch/obj/Debug/ToggleSwitch.csprojAssemblyReference.cache differ
diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.csprojResolveAssemblyReference.cache b/ToggleSwitch/obj/Debug/ToggleSwitch.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..d79bc16
Binary files /dev/null and b/ToggleSwitch/obj/Debug/ToggleSwitch.csprojResolveAssemblyReference.cache differ
diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.dll b/ToggleSwitch/obj/Debug/ToggleSwitch.dll
new file mode 100644
index 0000000..6672741
Binary files /dev/null and b/ToggleSwitch/obj/Debug/ToggleSwitch.dll differ
diff --git a/ToggleSwitch/obj/Debug/ToggleSwitch.pdb b/ToggleSwitch/obj/Debug/ToggleSwitch.pdb
new file mode 100644
index 0000000..7075212
Binary files /dev/null and b/ToggleSwitch/obj/Debug/ToggleSwitch.pdb differ
diff --git a/ToggleSwitch/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache b/ToggleSwitch/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..d8f3461
Binary files /dev/null and b/ToggleSwitch/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/ToggleSwitch/obj/Release/ToggleSwitch.csproj.CoreCompileInputs.cache b/ToggleSwitch/obj/Release/ToggleSwitch.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..87aca2b
--- /dev/null
+++ b/ToggleSwitch/obj/Release/ToggleSwitch.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+1f5b776f29663f5f08aa19abd20108ea10358598
diff --git a/ToggleSwitch/obj/Release/ToggleSwitch.csproj.FileListAbsolute.txt b/ToggleSwitch/obj/Release/ToggleSwitch.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..340aaf1
--- /dev/null
+++ b/ToggleSwitch/obj/Release/ToggleSwitch.csproj.FileListAbsolute.txt
@@ -0,0 +1,9 @@
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\bin\Release\ToggleSwitch.dll
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\bin\Release\ToggleSwitch.pdb
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.dll
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.pdb
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\bin\Release\ToggleSwitch.dll
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\bin\Release\ToggleSwitch.pdb
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.csproj.CoreCompileInputs.cache
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.dll
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitch\obj\Release\ToggleSwitch.pdb
diff --git a/ToggleSwitch/obj/Release/ToggleSwitch.dll b/ToggleSwitch/obj/Release/ToggleSwitch.dll
new file mode 100644
index 0000000..c67609f
Binary files /dev/null and b/ToggleSwitch/obj/Release/ToggleSwitch.dll differ
diff --git a/ToggleSwitch/obj/Release/ToggleSwitch.pdb b/ToggleSwitch/obj/Release/ToggleSwitch.pdb
new file mode 100644
index 0000000..9210e58
Binary files /dev/null and b/ToggleSwitch/obj/Release/ToggleSwitch.pdb differ
diff --git a/ToggleSwitchDemo/DemoForm.Designer.cs b/ToggleSwitchDemo/DemoForm.Designer.cs
new file mode 100644
index 0000000..5f052ac
--- /dev/null
+++ b/ToggleSwitchDemo/DemoForm.Designer.cs
@@ -0,0 +1,1176 @@
+namespace ToggleSwitchDemo
+{
+ partial class DemoForm
+ {
+ ///
+ /// 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()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DemoForm));
+ this.TopPanel = new System.Windows.Forms.Panel();
+ this.InfoLabel = new System.Windows.Forms.Label();
+ this.DemoTabControl = new System.Windows.Forms.TabControl();
+ this.StylesTabPage = new System.Windows.Forms.TabPage();
+ this.OSXStyleOnLabel = new System.Windows.Forms.Label();
+ this.OSXStyleOffLabel = new System.Windows.Forms.Label();
+ this.OSXStyleLabel = new System.Windows.Forms.Label();
+ this.ModernStyleLabel = new System.Windows.Forms.Label();
+ this.IphoneStyleLabel = new System.Windows.Forms.Label();
+ this.IOS5StyleLabel = new System.Windows.Forms.Label();
+ this.FancyStyleLabel = new System.Windows.Forms.Label();
+ this.CarbonStyleLabel = new System.Windows.Forms.Label();
+ this.BrushedMetalStyleLabel = new System.Windows.Forms.Label();
+ this.AndroidStyleLabel = new System.Windows.Forms.Label();
+ this.MetroStyleLabel = new System.Windows.Forms.Label();
+ this.SemiImportantPropertiesTabPage = new System.Windows.Forms.TabPage();
+ this.label19 = new System.Windows.Forms.Label();
+ this.ToggleOnSideClickCheckBox = new System.Windows.Forms.CheckBox();
+ this.ToggleOnButtonClickCheckBox = new System.Windows.Forms.CheckBox();
+ this.label18 = new System.Windows.Forms.Label();
+ this.label17 = new System.Windows.Forms.Label();
+ this.label16 = new System.Windows.Forms.Label();
+ this.label15 = new System.Windows.Forms.Label();
+ this.ThresholdPercentageTrackBar = new System.Windows.Forms.TrackBar();
+ this.label11 = new System.Windows.Forms.Label();
+ this.label12 = new System.Windows.Forms.Label();
+ this.GrayWhenDisabledCheckBox = new System.Windows.Forms.CheckBox();
+ this.label13 = new System.Windows.Forms.Label();
+ this.label14 = new System.Windows.Forms.Label();
+ this.label10 = new System.Windows.Forms.Label();
+ this.label9 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label3 = new System.Windows.Forms.Label();
+ this.AllowUserChangeCheckBox = new System.Windows.Forms.CheckBox();
+ this.label2 = new System.Windows.Forms.Label();
+ this.label1 = new System.Windows.Forms.Label();
+ this.AllowUserChangeLabel = new System.Windows.Forms.Label();
+ this.SpecialCustomizationsTabPage = new System.Windows.Forms.TabPage();
+ this.label29 = new System.Windows.Forms.Label();
+ this.AnimatedGifPictureBox = new System.Windows.Forms.PictureBox();
+ this.label28 = new System.Windows.Forms.Label();
+ this.label26 = new System.Windows.Forms.Label();
+ this.label27 = new System.Windows.Forms.Label();
+ this.label25 = new System.Windows.Forms.Label();
+ this.label23 = new System.Windows.Forms.Label();
+ this.label24 = new System.Windows.Forms.Label();
+ this.label22 = new System.Windows.Forms.Label();
+ this.label21 = new System.Windows.Forms.Label();
+ this.label20 = new System.Windows.Forms.Label();
+ this.PlaygroundTabPage = new System.Windows.Forms.TabPage();
+ this.SimulateRestartBackgroundWorker = new System.ComponentModel.BackgroundWorker();
+ this.PlainAndSimpleStyleToggleSwitch = new JCS.ToggleSwitch();
+ this.FancyStyleToggleSwitch = new JCS.ToggleSwitch();
+ this.OSXStyleToggleSwitch = new JCS.ToggleSwitch();
+ this.CarbonStyleToggleSwitch = new JCS.ToggleSwitch();
+ this.ModernStyleToggleSwitch = new JCS.ToggleSwitch();
+ this.IphoneStyleToggleSwitch = new JCS.ToggleSwitch();
+ this.BrushedMetalStyleToggleSwitch = new JCS.ToggleSwitch();
+ this.AndroidStyleToggleSwitch = new JCS.ToggleSwitch();
+ this.IOS5StyleToggleSwitch = new JCS.ToggleSwitch();
+ this.MetroStyleToggleSwitch = new JCS.ToggleSwitch();
+ this.ToggleOnClickToggleSwitch = new JCS.ToggleSwitch();
+ this.ThresholdPercentageToggleSwitch = new JCS.ToggleSwitch();
+ this.GrayWhenDisabledToggleSwitch2 = new JCS.ToggleSwitch();
+ this.GrayWhenDisabledToggleSwitch1 = new JCS.ToggleSwitch();
+ this.SlowAnimationToggleSwitch = new JCS.ToggleSwitch();
+ this.FastAnimationToggleSwitch = new JCS.ToggleSwitch();
+ this.NoAnimationToggleSwitch = new JCS.ToggleSwitch();
+ this.AllowUserChangeToggleSwitch2 = new JCS.ToggleSwitch();
+ this.AllowUserChangeToggleSwitch1 = new JCS.ToggleSwitch();
+ this.AdvancedBehaviorFancyToggleSwitch = new JCS.ToggleSwitch();
+ this.CustomizedFancyToggleSwitch = new JCS.ToggleSwitch();
+ this.NormalFancyToggleSwitch = new JCS.ToggleSwitch();
+ this.CustomizedIOS5ToggleSwitch = new JCS.ToggleSwitch();
+ this.NormalIOS5ToggleSwitch = new JCS.ToggleSwitch();
+ this.CustomizedMetroToggleSwitch = new JCS.ToggleSwitch();
+ this.NormalMetroToggleSwitch = new JCS.ToggleSwitch();
+ this.PlaygroundToggleSwitch = new JCS.ToggleSwitch();
+ this.PlaygroundPropertyGrid = new System.Windows.Forms.PropertyGrid();
+ this.label30 = new System.Windows.Forms.Label();
+ this.NormalPlainAndSimpleToggleSwitch = new JCS.ToggleSwitch();
+ this.CustomizedPlainAndSimpleToggleSwitch = new JCS.ToggleSwitch();
+ this.label31 = new System.Windows.Forms.Label();
+ this.label32 = new System.Windows.Forms.Label();
+ this.TopPanel.SuspendLayout();
+ this.DemoTabControl.SuspendLayout();
+ this.StylesTabPage.SuspendLayout();
+ this.SemiImportantPropertiesTabPage.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.ThresholdPercentageTrackBar)).BeginInit();
+ this.SpecialCustomizationsTabPage.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.AnimatedGifPictureBox)).BeginInit();
+ this.PlaygroundTabPage.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // TopPanel
+ //
+ this.TopPanel.BackColor = System.Drawing.Color.White;
+ this.TopPanel.Controls.Add(this.InfoLabel);
+ this.TopPanel.Dock = System.Windows.Forms.DockStyle.Top;
+ this.TopPanel.Location = new System.Drawing.Point(0, 0);
+ this.TopPanel.Name = "TopPanel";
+ this.TopPanel.Size = new System.Drawing.Size(878, 100);
+ this.TopPanel.TabIndex = 0;
+ //
+ // InfoLabel
+ //
+ this.InfoLabel.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.InfoLabel.Location = new System.Drawing.Point(0, 0);
+ this.InfoLabel.Name = "InfoLabel";
+ this.InfoLabel.Padding = new System.Windows.Forms.Padding(5);
+ this.InfoLabel.Size = new System.Drawing.Size(878, 100);
+ this.InfoLabel.TabIndex = 0;
+ this.InfoLabel.Text = resources.GetString("InfoLabel.Text");
+ //
+ // DemoTabControl
+ //
+ this.DemoTabControl.Controls.Add(this.StylesTabPage);
+ this.DemoTabControl.Controls.Add(this.SemiImportantPropertiesTabPage);
+ this.DemoTabControl.Controls.Add(this.SpecialCustomizationsTabPage);
+ this.DemoTabControl.Controls.Add(this.PlaygroundTabPage);
+ this.DemoTabControl.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.DemoTabControl.Location = new System.Drawing.Point(0, 100);
+ this.DemoTabControl.Name = "DemoTabControl";
+ this.DemoTabControl.SelectedIndex = 0;
+ this.DemoTabControl.Size = new System.Drawing.Size(878, 505);
+ this.DemoTabControl.TabIndex = 1;
+ //
+ // StylesTabPage
+ //
+ this.StylesTabPage.Controls.Add(this.label30);
+ this.StylesTabPage.Controls.Add(this.PlainAndSimpleStyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.OSXStyleOnLabel);
+ this.StylesTabPage.Controls.Add(this.OSXStyleOffLabel);
+ this.StylesTabPage.Controls.Add(this.FancyStyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.OSXStyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.CarbonStyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.ModernStyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.IphoneStyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.BrushedMetalStyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.AndroidStyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.IOS5StyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.MetroStyleToggleSwitch);
+ this.StylesTabPage.Controls.Add(this.OSXStyleLabel);
+ this.StylesTabPage.Controls.Add(this.ModernStyleLabel);
+ this.StylesTabPage.Controls.Add(this.IphoneStyleLabel);
+ this.StylesTabPage.Controls.Add(this.IOS5StyleLabel);
+ this.StylesTabPage.Controls.Add(this.FancyStyleLabel);
+ this.StylesTabPage.Controls.Add(this.CarbonStyleLabel);
+ this.StylesTabPage.Controls.Add(this.BrushedMetalStyleLabel);
+ this.StylesTabPage.Controls.Add(this.AndroidStyleLabel);
+ this.StylesTabPage.Controls.Add(this.MetroStyleLabel);
+ this.StylesTabPage.Location = new System.Drawing.Point(4, 22);
+ this.StylesTabPage.Name = "StylesTabPage";
+ this.StylesTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.StylesTabPage.Size = new System.Drawing.Size(870, 479);
+ this.StylesTabPage.TabIndex = 0;
+ this.StylesTabPage.Text = "Styles";
+ this.StylesTabPage.UseVisualStyleBackColor = true;
+ //
+ // OSXStyleOnLabel
+ //
+ this.OSXStyleOnLabel.AutoSize = true;
+ this.OSXStyleOnLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.OSXStyleOnLabel.Location = new System.Drawing.Point(530, 312);
+ this.OSXStyleOnLabel.Name = "OSXStyleOnLabel";
+ this.OSXStyleOnLabel.Size = new System.Drawing.Size(31, 17);
+ this.OSXStyleOnLabel.TabIndex = 19;
+ this.OSXStyleOnLabel.Text = "ON";
+ //
+ // OSXStyleOffLabel
+ //
+ this.OSXStyleOffLabel.AutoSize = true;
+ this.OSXStyleOffLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.OSXStyleOffLabel.Location = new System.Drawing.Point(392, 312);
+ this.OSXStyleOffLabel.Name = "OSXStyleOffLabel";
+ this.OSXStyleOffLabel.Size = new System.Drawing.Size(38, 17);
+ this.OSXStyleOffLabel.TabIndex = 18;
+ this.OSXStyleOffLabel.Text = "OFF";
+ //
+ // OSXStyleLabel
+ //
+ this.OSXStyleLabel.AutoSize = true;
+ this.OSXStyleLabel.Location = new System.Drawing.Point(392, 280);
+ this.OSXStyleLabel.Name = "OSXStyleLabel";
+ this.OSXStyleLabel.Size = new System.Drawing.Size(64, 13);
+ this.OSXStyleLabel.TabIndex = 8;
+ this.OSXStyleLabel.Text = "Style = OSX";
+ //
+ // ModernStyleLabel
+ //
+ this.ModernStyleLabel.AutoSize = true;
+ this.ModernStyleLabel.Location = new System.Drawing.Point(623, 161);
+ this.ModernStyleLabel.Name = "ModernStyleLabel";
+ this.ModernStyleLabel.Size = new System.Drawing.Size(78, 13);
+ this.ModernStyleLabel.TabIndex = 7;
+ this.ModernStyleLabel.Text = "Style = Modern";
+ //
+ // IphoneStyleLabel
+ //
+ this.IphoneStyleLabel.AutoSize = true;
+ this.IphoneStyleLabel.Location = new System.Drawing.Point(392, 161);
+ this.IphoneStyleLabel.Name = "IphoneStyleLabel";
+ this.IphoneStyleLabel.Size = new System.Drawing.Size(75, 13);
+ this.IphoneStyleLabel.TabIndex = 6;
+ this.IphoneStyleLabel.Text = "Style = Iphone";
+ //
+ // IOS5StyleLabel
+ //
+ this.IOS5StyleLabel.AutoSize = true;
+ this.IOS5StyleLabel.Location = new System.Drawing.Point(392, 52);
+ this.IOS5StyleLabel.Name = "IOS5StyleLabel";
+ this.IOS5StyleLabel.Size = new System.Drawing.Size(66, 13);
+ this.IOS5StyleLabel.TabIndex = 5;
+ this.IOS5StyleLabel.Text = "Style = IOS5";
+ //
+ // FancyStyleLabel
+ //
+ this.FancyStyleLabel.AutoSize = true;
+ this.FancyStyleLabel.Location = new System.Drawing.Point(623, 280);
+ this.FancyStyleLabel.Name = "FancyStyleLabel";
+ this.FancyStyleLabel.Size = new System.Drawing.Size(71, 13);
+ this.FancyStyleLabel.TabIndex = 4;
+ this.FancyStyleLabel.Text = "Style = Fancy";
+ //
+ // CarbonStyleLabel
+ //
+ this.CarbonStyleLabel.AutoSize = true;
+ this.CarbonStyleLabel.Location = new System.Drawing.Point(161, 280);
+ this.CarbonStyleLabel.Name = "CarbonStyleLabel";
+ this.CarbonStyleLabel.Size = new System.Drawing.Size(76, 13);
+ this.CarbonStyleLabel.TabIndex = 3;
+ this.CarbonStyleLabel.Text = "Style = Carbon";
+ //
+ // BrushedMetalStyleLabel
+ //
+ this.BrushedMetalStyleLabel.AutoSize = true;
+ this.BrushedMetalStyleLabel.Location = new System.Drawing.Point(161, 161);
+ this.BrushedMetalStyleLabel.Name = "BrushedMetalStyleLabel";
+ this.BrushedMetalStyleLabel.Size = new System.Drawing.Size(107, 13);
+ this.BrushedMetalStyleLabel.TabIndex = 2;
+ this.BrushedMetalStyleLabel.Text = "Style = BrushedMetal";
+ //
+ // AndroidStyleLabel
+ //
+ this.AndroidStyleLabel.AutoSize = true;
+ this.AndroidStyleLabel.Location = new System.Drawing.Point(623, 52);
+ this.AndroidStyleLabel.Name = "AndroidStyleLabel";
+ this.AndroidStyleLabel.Size = new System.Drawing.Size(78, 13);
+ this.AndroidStyleLabel.TabIndex = 1;
+ this.AndroidStyleLabel.Text = "Style = Android";
+ //
+ // MetroStyleLabel
+ //
+ this.MetroStyleLabel.AutoSize = true;
+ this.MetroStyleLabel.Location = new System.Drawing.Point(161, 52);
+ this.MetroStyleLabel.Name = "MetroStyleLabel";
+ this.MetroStyleLabel.Size = new System.Drawing.Size(69, 13);
+ this.MetroStyleLabel.TabIndex = 0;
+ this.MetroStyleLabel.Text = "Style = Metro";
+ //
+ // SemiImportantPropertiesTabPage
+ //
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label19);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.ToggleOnSideClickCheckBox);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.ToggleOnButtonClickCheckBox);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label18);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label17);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label16);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label15);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.ThresholdPercentageTrackBar);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label11);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label12);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.GrayWhenDisabledCheckBox);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label13);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label14);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label10);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label9);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label8);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label7);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label6);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label5);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label4);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label3);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.AllowUserChangeCheckBox);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label2);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.label1);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.AllowUserChangeLabel);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.ToggleOnClickToggleSwitch);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.ThresholdPercentageToggleSwitch);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.GrayWhenDisabledToggleSwitch2);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.GrayWhenDisabledToggleSwitch1);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.SlowAnimationToggleSwitch);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.FastAnimationToggleSwitch);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.NoAnimationToggleSwitch);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.AllowUserChangeToggleSwitch2);
+ this.SemiImportantPropertiesTabPage.Controls.Add(this.AllowUserChangeToggleSwitch1);
+ this.SemiImportantPropertiesTabPage.Location = new System.Drawing.Point(4, 22);
+ this.SemiImportantPropertiesTabPage.Name = "SemiImportantPropertiesTabPage";
+ this.SemiImportantPropertiesTabPage.Padding = new System.Windows.Forms.Padding(3);
+ this.SemiImportantPropertiesTabPage.Size = new System.Drawing.Size(870, 479);
+ this.SemiImportantPropertiesTabPage.TabIndex = 1;
+ this.SemiImportantPropertiesTabPage.Text = "(Semi)-Important Properties";
+ this.SemiImportantPropertiesTabPage.UseVisualStyleBackColor = true;
+ //
+ // label19
+ //
+ this.label19.AutoSize = true;
+ this.label19.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label19.Location = new System.Drawing.Point(427, 444);
+ this.label19.Name = "label19";
+ this.label19.Size = new System.Drawing.Size(67, 13);
+ this.label19.TabIndex = 42;
+ this.label19.Text = "both or none";
+ //
+ // ToggleOnSideClickCheckBox
+ //
+ this.ToggleOnSideClickCheckBox.AutoSize = true;
+ this.ToggleOnSideClickCheckBox.Checked = true;
+ this.ToggleOnSideClickCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.ToggleOnSideClickCheckBox.Location = new System.Drawing.Point(205, 444);
+ this.ToggleOnSideClickCheckBox.Name = "ToggleOnSideClickCheckBox";
+ this.ToggleOnSideClickCheckBox.Size = new System.Drawing.Size(117, 17);
+ this.ToggleOnSideClickCheckBox.TabIndex = 41;
+ this.ToggleOnSideClickCheckBox.Text = "ToggleOnSideClick";
+ this.ToggleOnSideClickCheckBox.UseVisualStyleBackColor = true;
+ this.ToggleOnSideClickCheckBox.CheckedChanged += new System.EventHandler(this.ToggleOnSideClickCheckBox_CheckedChanged);
+ //
+ // ToggleOnButtonClickCheckBox
+ //
+ this.ToggleOnButtonClickCheckBox.AutoSize = true;
+ this.ToggleOnButtonClickCheckBox.Checked = true;
+ this.ToggleOnButtonClickCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.ToggleOnButtonClickCheckBox.Location = new System.Drawing.Point(205, 421);
+ this.ToggleOnButtonClickCheckBox.Name = "ToggleOnButtonClickCheckBox";
+ this.ToggleOnButtonClickCheckBox.Size = new System.Drawing.Size(127, 17);
+ this.ToggleOnButtonClickCheckBox.TabIndex = 40;
+ this.ToggleOnButtonClickCheckBox.Text = "ToggleOnButtonClick";
+ this.ToggleOnButtonClickCheckBox.UseVisualStyleBackColor = true;
+ this.ToggleOnButtonClickCheckBox.CheckedChanged += new System.EventHandler(this.ToggleOnButtonClickCheckBox_CheckedChanged);
+ //
+ // label18
+ //
+ this.label18.AutoSize = true;
+ this.label18.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label18.Location = new System.Drawing.Point(427, 419);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(436, 13);
+ this.label18.TabIndex = 39;
+ this.label18.Text = "Determines where you have to click to toggle the switch, on the button, besides t" +
+ "he button,";
+ //
+ // label17
+ //
+ this.label17.AutoSize = true;
+ this.label17.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label17.ForeColor = System.Drawing.Color.Gray;
+ this.label17.Location = new System.Drawing.Point(8, 384);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(399, 17);
+ this.label17.TabIndex = 37;
+ this.label17.Text = "ToggleOnButtonClick (boolean), ToggleOnSideClick (boolean)";
+ //
+ // label16
+ //
+ this.label16.AutoSize = true;
+ this.label16.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label16.Location = new System.Drawing.Point(427, 336);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(410, 13);
+ this.label16.TabIndex = 36;
+ this.label16.Text = "Determines how far you have to drag the slider button before it snaps to the othe" +
+ "r side";
+ //
+ // label15
+ //
+ this.label15.AutoSize = true;
+ this.label15.Location = new System.Drawing.Point(266, 336);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(125, 13);
+ this.label15.TabIndex = 35;
+ this.label15.Text = "Value = 50 (Default = 50)";
+ //
+ // ThresholdPercentageTrackBar
+ //
+ this.ThresholdPercentageTrackBar.BackColor = System.Drawing.Color.White;
+ this.ThresholdPercentageTrackBar.Location = new System.Drawing.Point(145, 336);
+ this.ThresholdPercentageTrackBar.Maximum = 100;
+ this.ThresholdPercentageTrackBar.Name = "ThresholdPercentageTrackBar";
+ this.ThresholdPercentageTrackBar.Size = new System.Drawing.Size(104, 45);
+ this.ThresholdPercentageTrackBar.TabIndex = 34;
+ this.ThresholdPercentageTrackBar.TickFrequency = 10;
+ this.ThresholdPercentageTrackBar.Value = 50;
+ this.ThresholdPercentageTrackBar.Scroll += new System.EventHandler(this.ThresholdPercentageTrackBar_Scroll);
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label11.ForeColor = System.Drawing.Color.Gray;
+ this.label11.Location = new System.Drawing.Point(8, 305);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(203, 17);
+ this.label11.TabIndex = 32;
+ this.label11.Text = "ThresholdPercentage (integer)";
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label12.Location = new System.Drawing.Point(427, 235);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(252, 13);
+ this.label12.TabIndex = 31;
+ this.label12.Text = "Affects the coloring of the control when it is disabled";
+ //
+ // GrayWhenDisabledCheckBox
+ //
+ this.GrayWhenDisabledCheckBox.AutoSize = true;
+ this.GrayWhenDisabledCheckBox.Checked = true;
+ this.GrayWhenDisabledCheckBox.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.GrayWhenDisabledCheckBox.Location = new System.Drawing.Point(319, 234);
+ this.GrayWhenDisabledCheckBox.Name = "GrayWhenDisabledCheckBox";
+ this.GrayWhenDisabledCheckBox.Size = new System.Drawing.Size(65, 17);
+ this.GrayWhenDisabledCheckBox.TabIndex = 30;
+ this.GrayWhenDisabledCheckBox.Text = "Enabled";
+ this.GrayWhenDisabledCheckBox.UseVisualStyleBackColor = true;
+ this.GrayWhenDisabledCheckBox.CheckedChanged += new System.EventHandler(this.GrayWhenDisabledCheckBox_CheckedChanged);
+ //
+ // label13
+ //
+ this.label13.AutoSize = true;
+ this.label13.Location = new System.Drawing.Point(116, 268);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(172, 13);
+ this.label13.TabIndex = 29;
+ this.label13.Text = "GrayWhenDisabled = true (Default)";
+ //
+ // label14
+ //
+ this.label14.AutoSize = true;
+ this.label14.Location = new System.Drawing.Point(116, 234);
+ this.label14.Name = "label14";
+ this.label14.Size = new System.Drawing.Size(133, 13);
+ this.label14.TabIndex = 28;
+ this.label14.Text = "GrayWhenDisabled = false";
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label10.ForeColor = System.Drawing.Color.Gray;
+ this.label10.Location = new System.Drawing.Point(8, 194);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(196, 17);
+ this.label10.TabIndex = 25;
+ this.label10.Text = "GrayWhenDisabled (boolean)";
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label9.Location = new System.Drawing.Point(8, 168);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(681, 13);
+ this.label9.TabIndex = 24;
+ this.label9.Text = "Different values for the two integer properties will affect the animation speed. " +
+ "Animation is turned off completely using the UseAnimation property";
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(621, 136);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(78, 13);
+ this.label8.TabIndex = 23;
+ this.label8.Text = "Slow animation";
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(360, 136);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(75, 13);
+ this.label7.TabIndex = 21;
+ this.label7.Text = "Fast animation";
+ //
+ // label6
+ //
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(123, 136);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(69, 13);
+ this.label6.TabIndex = 19;
+ this.label6.Text = "No animation";
+ //
+ // label5
+ //
+ this.label5.AutoSize = true;
+ this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label5.ForeColor = System.Drawing.Color.Gray;
+ this.label5.Location = new System.Drawing.Point(8, 96);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(491, 17);
+ this.label5.TabIndex = 17;
+ this.label5.Text = "AnimationInterval (integer), AnimationStep (integer), UseAnimation (boolean)";
+ //
+ // label4
+ //
+ this.label4.AutoSize = true;
+ this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label4.Location = new System.Drawing.Point(427, 61);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(158, 13);
+ this.label4.TabIndex = 16;
+ this.label4.Text = "you cannot change it in the GUI";
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label3.Location = new System.Drawing.Point(427, 37);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(397, 13);
+ this.label3.TabIndex = 15;
+ this.label3.Text = "Notice: You can set the Checked value from code, but if AllowUserChange = false,";
+ //
+ // AllowUserChangeCheckBox
+ //
+ this.AllowUserChangeCheckBox.AutoSize = true;
+ this.AllowUserChangeCheckBox.Location = new System.Drawing.Point(288, 37);
+ this.AllowUserChangeCheckBox.Name = "AllowUserChangeCheckBox";
+ this.AllowUserChangeCheckBox.Size = new System.Drawing.Size(69, 17);
+ this.AllowUserChangeCheckBox.TabIndex = 14;
+ this.AllowUserChangeCheckBox.Text = "Checked";
+ this.AllowUserChangeCheckBox.UseVisualStyleBackColor = true;
+ this.AllowUserChangeCheckBox.CheckedChanged += new System.EventHandler(this.AllowUserChangeCheckBox_CheckedChanged);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(85, 62);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(164, 13);
+ this.label2.TabIndex = 13;
+ this.label2.Text = "AllowUserChange = true (Default)";
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(85, 37);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(125, 13);
+ this.label1.TabIndex = 12;
+ this.label1.Text = "AllowUserChange = false";
+ //
+ // AllowUserChangeLabel
+ //
+ this.AllowUserChangeLabel.AutoSize = true;
+ this.AllowUserChangeLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AllowUserChangeLabel.ForeColor = System.Drawing.Color.Gray;
+ this.AllowUserChangeLabel.Location = new System.Drawing.Point(8, 3);
+ this.AllowUserChangeLabel.Name = "AllowUserChangeLabel";
+ this.AllowUserChangeLabel.Size = new System.Drawing.Size(184, 17);
+ this.AllowUserChangeLabel.TabIndex = 0;
+ this.AllowUserChangeLabel.Text = "AllowUserChange (boolean)";
+ //
+ // SpecialCustomizationsTabPage
+ //
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label31);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label32);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.CustomizedPlainAndSimpleToggleSwitch);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.NormalPlainAndSimpleToggleSwitch);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label29);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.AnimatedGifPictureBox);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label28);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label26);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label27);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label25);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label23);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label24);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label22);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label21);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.label20);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.AdvancedBehaviorFancyToggleSwitch);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.CustomizedFancyToggleSwitch);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.NormalFancyToggleSwitch);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.CustomizedIOS5ToggleSwitch);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.NormalIOS5ToggleSwitch);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.CustomizedMetroToggleSwitch);
+ this.SpecialCustomizationsTabPage.Controls.Add(this.NormalMetroToggleSwitch);
+ this.SpecialCustomizationsTabPage.Location = new System.Drawing.Point(4, 22);
+ this.SpecialCustomizationsTabPage.Name = "SpecialCustomizationsTabPage";
+ this.SpecialCustomizationsTabPage.Size = new System.Drawing.Size(870, 479);
+ this.SpecialCustomizationsTabPage.TabIndex = 2;
+ this.SpecialCustomizationsTabPage.Text = "Special Customizations";
+ this.SpecialCustomizationsTabPage.UseVisualStyleBackColor = true;
+ //
+ // label29
+ //
+ this.label29.AutoSize = true;
+ this.label29.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label29.ForeColor = System.Drawing.Color.Gray;
+ this.label29.Location = new System.Drawing.Point(19, 145);
+ this.label29.Name = "label29";
+ this.label29.Size = new System.Drawing.Size(331, 17);
+ this.label29.TabIndex = 33;
+ this.label29.Text = "Color Customization using RendererChanged event";
+ //
+ // AnimatedGifPictureBox
+ //
+ this.AnimatedGifPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("AnimatedGifPictureBox.Image")));
+ this.AnimatedGifPictureBox.Location = new System.Drawing.Point(512, 429);
+ this.AnimatedGifPictureBox.Name = "AnimatedGifPictureBox";
+ this.AnimatedGifPictureBox.Size = new System.Drawing.Size(36, 31);
+ this.AnimatedGifPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
+ this.AnimatedGifPictureBox.TabIndex = 2;
+ this.AnimatedGifPictureBox.TabStop = false;
+ //
+ // label28
+ //
+ this.label28.AutoSize = true;
+ this.label28.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label28.ForeColor = System.Drawing.Color.Gray;
+ this.label28.Location = new System.Drawing.Point(19, 337);
+ this.label28.Name = "label28";
+ this.label28.Size = new System.Drawing.Size(188, 17);
+ this.label28.TabIndex = 31;
+ this.label28.Text = "Advanced Behavior Example";
+ //
+ // label26
+ //
+ this.label26.AutoSize = true;
+ this.label26.Location = new System.Drawing.Point(349, 291);
+ this.label26.Name = "label26";
+ this.label26.Size = new System.Drawing.Size(61, 13);
+ this.label26.TabIndex = 30;
+ this.label26.Text = "Customized";
+ //
+ // label27
+ //
+ this.label27.AutoSize = true;
+ this.label27.Location = new System.Drawing.Point(126, 291);
+ this.label27.Name = "label27";
+ this.label27.Size = new System.Drawing.Size(40, 13);
+ this.label27.TabIndex = 29;
+ this.label27.Text = "Normal";
+ //
+ // label25
+ //
+ this.label25.AutoSize = true;
+ this.label25.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label25.ForeColor = System.Drawing.Color.Gray;
+ this.label25.Location = new System.Drawing.Point(19, 248);
+ this.label25.Name = "label25";
+ this.label25.Size = new System.Drawing.Size(255, 17);
+ this.label25.TabIndex = 26;
+ this.label25.Text = "Images in the button and the side fields";
+ //
+ // label23
+ //
+ this.label23.AutoSize = true;
+ this.label23.Location = new System.Drawing.Point(349, 110);
+ this.label23.Name = "label23";
+ this.label23.Size = new System.Drawing.Size(61, 13);
+ this.label23.TabIndex = 25;
+ this.label23.Text = "Customized";
+ //
+ // label24
+ //
+ this.label24.AutoSize = true;
+ this.label24.Location = new System.Drawing.Point(126, 110);
+ this.label24.Name = "label24";
+ this.label24.Size = new System.Drawing.Size(40, 13);
+ this.label24.TabIndex = 24;
+ this.label24.Text = "Normal";
+ //
+ // label22
+ //
+ this.label22.AutoSize = true;
+ this.label22.Location = new System.Drawing.Point(349, 52);
+ this.label22.Name = "label22";
+ this.label22.Size = new System.Drawing.Size(61, 13);
+ this.label22.TabIndex = 21;
+ this.label22.Text = "Customized";
+ //
+ // label21
+ //
+ this.label21.AutoSize = true;
+ this.label21.Location = new System.Drawing.Point(126, 52);
+ this.label21.Name = "label21";
+ this.label21.Size = new System.Drawing.Size(40, 13);
+ this.label21.TabIndex = 20;
+ this.label21.Text = "Normal";
+ //
+ // label20
+ //
+ this.label20.AutoSize = true;
+ this.label20.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.label20.ForeColor = System.Drawing.Color.Gray;
+ this.label20.Location = new System.Drawing.Point(19, 14);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(133, 17);
+ this.label20.TabIndex = 1;
+ this.label20.Text = "Color Customization";
+ //
+ // PlaygroundTabPage
+ //
+ this.PlaygroundTabPage.Controls.Add(this.PlaygroundToggleSwitch);
+ this.PlaygroundTabPage.Controls.Add(this.PlaygroundPropertyGrid);
+ this.PlaygroundTabPage.Location = new System.Drawing.Point(4, 22);
+ this.PlaygroundTabPage.Name = "PlaygroundTabPage";
+ this.PlaygroundTabPage.Size = new System.Drawing.Size(870, 479);
+ this.PlaygroundTabPage.TabIndex = 3;
+ this.PlaygroundTabPage.Text = "Playground";
+ this.PlaygroundTabPage.UseVisualStyleBackColor = true;
+ //
+ // SimulateRestartBackgroundWorker
+ //
+ this.SimulateRestartBackgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.SimulateRestartBackgroundWorker_DoWork);
+ this.SimulateRestartBackgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.SimulateRestartBackgroundWorker_RunWorkerCompleted);
+ //
+ // PlainAndSimpleStyleToggleSwitch
+ //
+ this.PlainAndSimpleStyleToggleSwitch.BackColor = System.Drawing.Color.Transparent;
+ this.PlainAndSimpleStyleToggleSwitch.Location = new System.Drawing.Point(164, 403);
+ this.PlainAndSimpleStyleToggleSwitch.Name = "PlainAndSimpleStyleToggleSwitch";
+ this.PlainAndSimpleStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.PlainAndSimpleStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.PlainAndSimpleStyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.PlainAndSimpleStyleToggleSwitch.TabIndex = 21;
+ //
+ // FancyStyleToggleSwitch
+ //
+ this.FancyStyleToggleSwitch.Location = new System.Drawing.Point(626, 309);
+ this.FancyStyleToggleSwitch.Name = "FancyStyleToggleSwitch";
+ this.FancyStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FancyStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FancyStyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.FancyStyleToggleSwitch.TabIndex = 17;
+ //
+ // OSXStyleToggleSwitch
+ //
+ this.OSXStyleToggleSwitch.Location = new System.Drawing.Point(434, 309);
+ this.OSXStyleToggleSwitch.Name = "OSXStyleToggleSwitch";
+ this.OSXStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.OSXStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.OSXStyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.OSXStyleToggleSwitch.TabIndex = 16;
+ //
+ // CarbonStyleToggleSwitch
+ //
+ this.CarbonStyleToggleSwitch.Location = new System.Drawing.Point(164, 309);
+ this.CarbonStyleToggleSwitch.Name = "CarbonStyleToggleSwitch";
+ this.CarbonStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CarbonStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CarbonStyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.CarbonStyleToggleSwitch.TabIndex = 15;
+ //
+ // ModernStyleToggleSwitch
+ //
+ this.ModernStyleToggleSwitch.Location = new System.Drawing.Point(626, 188);
+ this.ModernStyleToggleSwitch.Name = "ModernStyleToggleSwitch";
+ this.ModernStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.ModernStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.ModernStyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.ModernStyleToggleSwitch.TabIndex = 14;
+ //
+ // IphoneStyleToggleSwitch
+ //
+ this.IphoneStyleToggleSwitch.Location = new System.Drawing.Point(395, 188);
+ this.IphoneStyleToggleSwitch.Name = "IphoneStyleToggleSwitch";
+ this.IphoneStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.IphoneStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.IphoneStyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.IphoneStyleToggleSwitch.TabIndex = 13;
+ //
+ // BrushedMetalStyleToggleSwitch
+ //
+ this.BrushedMetalStyleToggleSwitch.Location = new System.Drawing.Point(164, 188);
+ this.BrushedMetalStyleToggleSwitch.Name = "BrushedMetalStyleToggleSwitch";
+ this.BrushedMetalStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.BrushedMetalStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.BrushedMetalStyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.BrushedMetalStyleToggleSwitch.TabIndex = 12;
+ //
+ // AndroidStyleToggleSwitch
+ //
+ this.AndroidStyleToggleSwitch.Location = new System.Drawing.Point(626, 79);
+ this.AndroidStyleToggleSwitch.Name = "AndroidStyleToggleSwitch";
+ this.AndroidStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AndroidStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AndroidStyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.AndroidStyleToggleSwitch.TabIndex = 11;
+ //
+ // IOS5StyleToggleSwitch
+ //
+ this.IOS5StyleToggleSwitch.Location = new System.Drawing.Point(395, 79);
+ this.IOS5StyleToggleSwitch.Name = "IOS5StyleToggleSwitch";
+ this.IOS5StyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.IOS5StyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.IOS5StyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.IOS5StyleToggleSwitch.TabIndex = 10;
+ //
+ // MetroStyleToggleSwitch
+ //
+ this.MetroStyleToggleSwitch.Location = new System.Drawing.Point(164, 79);
+ this.MetroStyleToggleSwitch.Name = "MetroStyleToggleSwitch";
+ this.MetroStyleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.MetroStyleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.MetroStyleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.MetroStyleToggleSwitch.TabIndex = 9;
+ //
+ // ToggleOnClickToggleSwitch
+ //
+ this.ToggleOnClickToggleSwitch.Location = new System.Drawing.Point(11, 419);
+ this.ToggleOnClickToggleSwitch.Name = "ToggleOnClickToggleSwitch";
+ this.ToggleOnClickToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.ToggleOnClickToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.ToggleOnClickToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.ToggleOnClickToggleSwitch.TabIndex = 38;
+ //
+ // ThresholdPercentageToggleSwitch
+ //
+ this.ThresholdPercentageToggleSwitch.Location = new System.Drawing.Point(11, 336);
+ this.ThresholdPercentageToggleSwitch.Name = "ThresholdPercentageToggleSwitch";
+ this.ThresholdPercentageToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.ThresholdPercentageToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.ThresholdPercentageToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.ThresholdPercentageToggleSwitch.TabIndex = 33;
+ //
+ // GrayWhenDisabledToggleSwitch2
+ //
+ this.GrayWhenDisabledToggleSwitch2.Location = new System.Drawing.Point(11, 262);
+ this.GrayWhenDisabledToggleSwitch2.Name = "GrayWhenDisabledToggleSwitch2";
+ this.GrayWhenDisabledToggleSwitch2.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.GrayWhenDisabledToggleSwitch2.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.GrayWhenDisabledToggleSwitch2.Size = new System.Drawing.Size(50, 19);
+ this.GrayWhenDisabledToggleSwitch2.TabIndex = 27;
+ //
+ // GrayWhenDisabledToggleSwitch1
+ //
+ this.GrayWhenDisabledToggleSwitch1.Location = new System.Drawing.Point(11, 228);
+ this.GrayWhenDisabledToggleSwitch1.Name = "GrayWhenDisabledToggleSwitch1";
+ this.GrayWhenDisabledToggleSwitch1.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.GrayWhenDisabledToggleSwitch1.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.GrayWhenDisabledToggleSwitch1.Size = new System.Drawing.Size(50, 19);
+ this.GrayWhenDisabledToggleSwitch1.TabIndex = 26;
+ //
+ // SlowAnimationToggleSwitch
+ //
+ this.SlowAnimationToggleSwitch.Location = new System.Drawing.Point(510, 130);
+ this.SlowAnimationToggleSwitch.Name = "SlowAnimationToggleSwitch";
+ this.SlowAnimationToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.SlowAnimationToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.SlowAnimationToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.SlowAnimationToggleSwitch.TabIndex = 22;
+ //
+ // FastAnimationToggleSwitch
+ //
+ this.FastAnimationToggleSwitch.Location = new System.Drawing.Point(252, 130);
+ this.FastAnimationToggleSwitch.Name = "FastAnimationToggleSwitch";
+ this.FastAnimationToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FastAnimationToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FastAnimationToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.FastAnimationToggleSwitch.TabIndex = 20;
+ //
+ // NoAnimationToggleSwitch
+ //
+ this.NoAnimationToggleSwitch.Location = new System.Drawing.Point(11, 130);
+ this.NoAnimationToggleSwitch.Name = "NoAnimationToggleSwitch";
+ this.NoAnimationToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NoAnimationToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NoAnimationToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.NoAnimationToggleSwitch.TabIndex = 18;
+ //
+ // AllowUserChangeToggleSwitch2
+ //
+ this.AllowUserChangeToggleSwitch2.Location = new System.Drawing.Point(11, 60);
+ this.AllowUserChangeToggleSwitch2.Name = "AllowUserChangeToggleSwitch2";
+ this.AllowUserChangeToggleSwitch2.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AllowUserChangeToggleSwitch2.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AllowUserChangeToggleSwitch2.Size = new System.Drawing.Size(50, 19);
+ this.AllowUserChangeToggleSwitch2.TabIndex = 11;
+ //
+ // AllowUserChangeToggleSwitch1
+ //
+ this.AllowUserChangeToggleSwitch1.Location = new System.Drawing.Point(11, 35);
+ this.AllowUserChangeToggleSwitch1.Name = "AllowUserChangeToggleSwitch1";
+ this.AllowUserChangeToggleSwitch1.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AllowUserChangeToggleSwitch1.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AllowUserChangeToggleSwitch1.Size = new System.Drawing.Size(50, 19);
+ this.AllowUserChangeToggleSwitch1.TabIndex = 10;
+ //
+ // AdvancedBehaviorFancyToggleSwitch
+ //
+ this.AdvancedBehaviorFancyToggleSwitch.Location = new System.Drawing.Point(22, 380);
+ this.AdvancedBehaviorFancyToggleSwitch.Name = "AdvancedBehaviorFancyToggleSwitch";
+ this.AdvancedBehaviorFancyToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AdvancedBehaviorFancyToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.AdvancedBehaviorFancyToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.AdvancedBehaviorFancyToggleSwitch.TabIndex = 32;
+ //
+ // CustomizedFancyToggleSwitch
+ //
+ this.CustomizedFancyToggleSwitch.Location = new System.Drawing.Point(238, 287);
+ this.CustomizedFancyToggleSwitch.Name = "CustomizedFancyToggleSwitch";
+ this.CustomizedFancyToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CustomizedFancyToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CustomizedFancyToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.CustomizedFancyToggleSwitch.TabIndex = 28;
+ //
+ // NormalFancyToggleSwitch
+ //
+ this.NormalFancyToggleSwitch.Location = new System.Drawing.Point(22, 287);
+ this.NormalFancyToggleSwitch.Name = "NormalFancyToggleSwitch";
+ this.NormalFancyToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NormalFancyToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NormalFancyToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.NormalFancyToggleSwitch.TabIndex = 27;
+ //
+ // CustomizedIOS5ToggleSwitch
+ //
+ this.CustomizedIOS5ToggleSwitch.Location = new System.Drawing.Point(238, 93);
+ this.CustomizedIOS5ToggleSwitch.Name = "CustomizedIOS5ToggleSwitch";
+ this.CustomizedIOS5ToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CustomizedIOS5ToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CustomizedIOS5ToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.CustomizedIOS5ToggleSwitch.TabIndex = 23;
+ //
+ // NormalIOS5ToggleSwitch
+ //
+ this.NormalIOS5ToggleSwitch.Location = new System.Drawing.Point(22, 93);
+ this.NormalIOS5ToggleSwitch.Name = "NormalIOS5ToggleSwitch";
+ this.NormalIOS5ToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NormalIOS5ToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NormalIOS5ToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.NormalIOS5ToggleSwitch.TabIndex = 22;
+ //
+ // CustomizedMetroToggleSwitch
+ //
+ this.CustomizedMetroToggleSwitch.Location = new System.Drawing.Point(238, 48);
+ this.CustomizedMetroToggleSwitch.Name = "CustomizedMetroToggleSwitch";
+ this.CustomizedMetroToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CustomizedMetroToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CustomizedMetroToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.CustomizedMetroToggleSwitch.TabIndex = 11;
+ //
+ // NormalMetroToggleSwitch
+ //
+ this.NormalMetroToggleSwitch.Location = new System.Drawing.Point(22, 48);
+ this.NormalMetroToggleSwitch.Name = "NormalMetroToggleSwitch";
+ this.NormalMetroToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NormalMetroToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NormalMetroToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.NormalMetroToggleSwitch.TabIndex = 10;
+ //
+ // PlaygroundToggleSwitch
+ //
+ this.PlaygroundToggleSwitch.Location = new System.Drawing.Point(51, 42);
+ this.PlaygroundToggleSwitch.Name = "PlaygroundToggleSwitch";
+ this.PlaygroundToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.PlaygroundToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.PlaygroundToggleSwitch.Size = new System.Drawing.Size(92, 33);
+ this.PlaygroundToggleSwitch.TabIndex = 11;
+ //
+ // PlaygroundPropertyGrid
+ //
+ this.PlaygroundPropertyGrid.Dock = System.Windows.Forms.DockStyle.Right;
+ this.PlaygroundPropertyGrid.Location = new System.Drawing.Point(459, 0);
+ this.PlaygroundPropertyGrid.Name = "PlaygroundPropertyGrid";
+ this.PlaygroundPropertyGrid.SelectedObject = this.PlaygroundToggleSwitch;
+ this.PlaygroundPropertyGrid.Size = new System.Drawing.Size(411, 479);
+ this.PlaygroundPropertyGrid.TabIndex = 0;
+ //
+ // label30
+ //
+ this.label30.AutoSize = true;
+ this.label30.Location = new System.Drawing.Point(161, 372);
+ this.label30.Name = "label30";
+ this.label30.Size = new System.Drawing.Size(115, 13);
+ this.label30.TabIndex = 22;
+ this.label30.Text = "Style = PlainAndSimple";
+ //
+ // NormalPlainAndSimpleToggleSwitch
+ //
+ this.NormalPlainAndSimpleToggleSwitch.BackColor = System.Drawing.Color.Transparent;
+ this.NormalPlainAndSimpleToggleSwitch.Location = new System.Drawing.Point(22, 187);
+ this.NormalPlainAndSimpleToggleSwitch.Name = "NormalPlainAndSimpleToggleSwitch";
+ this.NormalPlainAndSimpleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NormalPlainAndSimpleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.NormalPlainAndSimpleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.NormalPlainAndSimpleToggleSwitch.TabIndex = 34;
+ //
+ // CustomizedPlainAndSimpleToggleSwitch
+ //
+ this.CustomizedPlainAndSimpleToggleSwitch.BackColor = System.Drawing.Color.Transparent;
+ this.CustomizedPlainAndSimpleToggleSwitch.Location = new System.Drawing.Point(238, 187);
+ this.CustomizedPlainAndSimpleToggleSwitch.Name = "CustomizedPlainAndSimpleToggleSwitch";
+ this.CustomizedPlainAndSimpleToggleSwitch.OffFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CustomizedPlainAndSimpleToggleSwitch.OnFont = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.CustomizedPlainAndSimpleToggleSwitch.Size = new System.Drawing.Size(50, 19);
+ this.CustomizedPlainAndSimpleToggleSwitch.TabIndex = 35;
+ //
+ // label31
+ //
+ this.label31.AutoSize = true;
+ this.label31.Location = new System.Drawing.Point(349, 193);
+ this.label31.Name = "label31";
+ this.label31.Size = new System.Drawing.Size(61, 13);
+ this.label31.TabIndex = 37;
+ this.label31.Text = "Customized";
+ //
+ // label32
+ //
+ this.label32.AutoSize = true;
+ this.label32.Location = new System.Drawing.Point(126, 193);
+ this.label32.Name = "label32";
+ this.label32.Size = new System.Drawing.Size(40, 13);
+ this.label32.TabIndex = 36;
+ this.label32.Text = "Normal";
+ //
+ // DemoForm
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(878, 605);
+ this.Controls.Add(this.DemoTabControl);
+ this.Controls.Add(this.TopPanel);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.MaximizeBox = false;
+ this.Name = "DemoForm";
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+ this.Text = "JCS ToggleSwitch Demo Form";
+ this.TopPanel.ResumeLayout(false);
+ this.DemoTabControl.ResumeLayout(false);
+ this.StylesTabPage.ResumeLayout(false);
+ this.StylesTabPage.PerformLayout();
+ this.SemiImportantPropertiesTabPage.ResumeLayout(false);
+ this.SemiImportantPropertiesTabPage.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.ThresholdPercentageTrackBar)).EndInit();
+ this.SpecialCustomizationsTabPage.ResumeLayout(false);
+ this.SpecialCustomizationsTabPage.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.AnimatedGifPictureBox)).EndInit();
+ this.PlaygroundTabPage.ResumeLayout(false);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Panel TopPanel;
+ private System.Windows.Forms.Label InfoLabel;
+ private System.Windows.Forms.TabControl DemoTabControl;
+ private System.Windows.Forms.TabPage StylesTabPage;
+ private System.Windows.Forms.TabPage SemiImportantPropertiesTabPage;
+ private System.Windows.Forms.Label OSXStyleLabel;
+ private System.Windows.Forms.Label ModernStyleLabel;
+ private System.Windows.Forms.Label IphoneStyleLabel;
+ private System.Windows.Forms.Label IOS5StyleLabel;
+ private System.Windows.Forms.Label FancyStyleLabel;
+ private System.Windows.Forms.Label CarbonStyleLabel;
+ private System.Windows.Forms.Label BrushedMetalStyleLabel;
+ private System.Windows.Forms.Label AndroidStyleLabel;
+ private System.Windows.Forms.Label MetroStyleLabel;
+ private JCS.ToggleSwitch MetroStyleToggleSwitch;
+ private JCS.ToggleSwitch FancyStyleToggleSwitch;
+ private JCS.ToggleSwitch OSXStyleToggleSwitch;
+ private JCS.ToggleSwitch CarbonStyleToggleSwitch;
+ private JCS.ToggleSwitch ModernStyleToggleSwitch;
+ private JCS.ToggleSwitch IphoneStyleToggleSwitch;
+ private JCS.ToggleSwitch BrushedMetalStyleToggleSwitch;
+ private JCS.ToggleSwitch AndroidStyleToggleSwitch;
+ private JCS.ToggleSwitch IOS5StyleToggleSwitch;
+ private System.Windows.Forms.Label OSXStyleOffLabel;
+ private System.Windows.Forms.Label OSXStyleOnLabel;
+ private System.Windows.Forms.Label AllowUserChangeLabel;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label1;
+ private JCS.ToggleSwitch AllowUserChangeToggleSwitch2;
+ private JCS.ToggleSwitch AllowUserChangeToggleSwitch1;
+ private System.Windows.Forms.CheckBox AllowUserChangeCheckBox;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label5;
+ private JCS.ToggleSwitch NoAnimationToggleSwitch;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.Label label8;
+ private JCS.ToggleSwitch SlowAnimationToggleSwitch;
+ private System.Windows.Forms.Label label7;
+ private JCS.ToggleSwitch FastAnimationToggleSwitch;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.CheckBox GrayWhenDisabledCheckBox;
+ private System.Windows.Forms.Label label13;
+ private System.Windows.Forms.Label label14;
+ private JCS.ToggleSwitch GrayWhenDisabledToggleSwitch2;
+ private JCS.ToggleSwitch GrayWhenDisabledToggleSwitch1;
+ private System.Windows.Forms.Label label11;
+ private JCS.ToggleSwitch ThresholdPercentageToggleSwitch;
+ private System.Windows.Forms.TrackBar ThresholdPercentageTrackBar;
+ private System.Windows.Forms.Label label15;
+ private System.Windows.Forms.Label label16;
+ private System.Windows.Forms.Label label17;
+ private JCS.ToggleSwitch ToggleOnClickToggleSwitch;
+ private System.Windows.Forms.Label label18;
+ private System.Windows.Forms.CheckBox ToggleOnButtonClickCheckBox;
+ private System.Windows.Forms.CheckBox ToggleOnSideClickCheckBox;
+ private System.Windows.Forms.Label label19;
+ private System.Windows.Forms.TabPage SpecialCustomizationsTabPage;
+ private System.Windows.Forms.TabPage PlaygroundTabPage;
+ private JCS.ToggleSwitch PlaygroundToggleSwitch;
+ private System.Windows.Forms.PropertyGrid PlaygroundPropertyGrid;
+ private System.Windows.Forms.Label label22;
+ private System.Windows.Forms.Label label21;
+ private JCS.ToggleSwitch CustomizedMetroToggleSwitch;
+ private JCS.ToggleSwitch NormalMetroToggleSwitch;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.Label label23;
+ private System.Windows.Forms.Label label24;
+ private JCS.ToggleSwitch CustomizedIOS5ToggleSwitch;
+ private JCS.ToggleSwitch NormalIOS5ToggleSwitch;
+ private System.Windows.Forms.Label label26;
+ private System.Windows.Forms.Label label27;
+ private JCS.ToggleSwitch CustomizedFancyToggleSwitch;
+ private JCS.ToggleSwitch NormalFancyToggleSwitch;
+ private System.Windows.Forms.Label label25;
+ private JCS.ToggleSwitch AdvancedBehaviorFancyToggleSwitch;
+ private System.Windows.Forms.Label label28;
+ private System.ComponentModel.BackgroundWorker SimulateRestartBackgroundWorker;
+ private System.Windows.Forms.PictureBox AnimatedGifPictureBox;
+ private System.Windows.Forms.Label label29;
+ private JCS.ToggleSwitch PlainAndSimpleStyleToggleSwitch;
+ private System.Windows.Forms.Label label30;
+ private System.Windows.Forms.Label label31;
+ private System.Windows.Forms.Label label32;
+ private JCS.ToggleSwitch CustomizedPlainAndSimpleToggleSwitch;
+ private JCS.ToggleSwitch NormalPlainAndSimpleToggleSwitch;
+ }
+}
\ No newline at end of file
diff --git a/ToggleSwitchDemo/DemoForm.cs b/ToggleSwitchDemo/DemoForm.cs
new file mode 100644
index 0000000..8fe4b6c
--- /dev/null
+++ b/ToggleSwitchDemo/DemoForm.cs
@@ -0,0 +1,407 @@
+using System.Drawing;
+using System.Threading;
+using System.Windows.Forms;
+using JCS;
+using ToggleSwitchDemo.Properties;
+
+namespace ToggleSwitchDemo
+{
+ public partial class DemoForm : Form
+ {
+ public DemoForm()
+ {
+ InitializeComponent();
+ SetPropertiesForStylesTabSwitches();
+ SetPropertiesForPropertiesTabSwitches();
+ SetPropertiesForCustomizationsTabSwitches();
+ }
+
+ public void SetPropertiesForStylesTabSwitches()
+ {
+ //Set the properties for the ToggleSwitches on the "Styles" tab
+
+ MetroStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Metro; //Default
+ MetroStyleToggleSwitch.Size = new Size(75, 23);
+
+ IOS5StyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.IOS5;
+ IOS5StyleToggleSwitch.Size = new Size(98, 42);
+ IOS5StyleToggleSwitch.OnText = "ON";
+ IOS5StyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold);
+ IOS5StyleToggleSwitch.OnForeColor = Color.White;
+ IOS5StyleToggleSwitch.OffText = "OFF";
+ IOS5StyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold);
+ IOS5StyleToggleSwitch.OffForeColor = Color.FromArgb(141, 123, 141);
+
+ AndroidStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Android;
+ AndroidStyleToggleSwitch.Size = new Size(78, 23);
+ AndroidStyleToggleSwitch.OnText = "ON";
+ AndroidStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 8, FontStyle.Bold);
+ AndroidStyleToggleSwitch.OnForeColor = Color.White;
+ AndroidStyleToggleSwitch.OffText = "OFF";
+ AndroidStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 8, FontStyle.Bold);
+ AndroidStyleToggleSwitch.OffForeColor = Color.FromArgb(141, 123, 141);
+
+ BrushedMetalStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.BrushedMetal;
+ BrushedMetalStyleToggleSwitch.Size = new Size(93, 30);
+ BrushedMetalStyleToggleSwitch.OnText = "ON";
+ BrushedMetalStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ BrushedMetalStyleToggleSwitch.OnForeColor = Color.White;
+ BrushedMetalStyleToggleSwitch.OffText = "OFF";
+ BrushedMetalStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ BrushedMetalStyleToggleSwitch.OffForeColor = Color.White;
+
+ IphoneStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Iphone;
+ IphoneStyleToggleSwitch.Size = new Size(93, 30);
+ IphoneStyleToggleSwitch.OnText = "ON";
+ IphoneStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ IphoneStyleToggleSwitch.OnForeColor = Color.White;
+ IphoneStyleToggleSwitch.OffText = "OFF";
+ IphoneStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ IphoneStyleToggleSwitch.OffForeColor = Color.FromArgb(92, 92, 92);
+
+ ModernStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Modern;
+ ModernStyleToggleSwitch.Size = new Size(85, 32);
+ ModernStyleToggleSwitch.OnText = "ON";
+ ModernStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ ModernStyleToggleSwitch.OnForeColor = Color.White;
+ ModernStyleToggleSwitch.OffText = "OFF";
+ ModernStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ ModernStyleToggleSwitch.OffForeColor = Color.FromArgb(153, 153, 153);
+
+ CarbonStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Carbon;
+ CarbonStyleToggleSwitch.Size = new Size(93, 30);
+ CarbonStyleToggleSwitch.OnText = "On";
+ CarbonStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ CarbonStyleToggleSwitch.OnForeColor = Color.White;
+ CarbonStyleToggleSwitch.OffText = "Off";
+ CarbonStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ CarbonStyleToggleSwitch.OffForeColor = Color.White;
+
+ OSXStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.OSX;
+ OSXStyleToggleSwitch.Size = new Size(93, 25);
+
+ FancyStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy;
+ FancyStyleToggleSwitch.Size = new Size(100, 30);
+ FancyStyleToggleSwitch.OnText = "ON";
+ FancyStyleToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ FancyStyleToggleSwitch.OnForeColor = Color.White;
+ FancyStyleToggleSwitch.OffText = "OFF";
+ FancyStyleToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ FancyStyleToggleSwitch.OffForeColor = Color.White;
+ FancyStyleToggleSwitch.ButtonImage = Resources.handle;
+
+ PlainAndSimpleStyleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.PlainAndSimpel;
+ PlainAndSimpleStyleToggleSwitch.Size = new Size(44, 22);
+ }
+
+ public void SetPropertiesForPropertiesTabSwitches()
+ {
+ //Set the properties for the ToggleSwitches on the "(Semi)-Important Properties" tab
+
+ //AllowUserChange example:
+
+ AllowUserChangeToggleSwitch1.AllowUserChange = false;
+ AllowUserChangeToggleSwitch2.AllowUserChange = true;
+
+ //Animation example:
+
+ NoAnimationToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Carbon; //Only to provide an interesting look
+ NoAnimationToggleSwitch.Size = new Size(93, 30); //Only to provide an interesting look
+ NoAnimationToggleSwitch.OnText = "On"; //Only to provide an interesting look
+ NoAnimationToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ NoAnimationToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look
+ NoAnimationToggleSwitch.OffText = "Off"; //Only to provide an interesting look
+ NoAnimationToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ NoAnimationToggleSwitch.OffForeColor = Color.White; //Only to provide an interesting look
+ NoAnimationToggleSwitch.UseAnimation = false;
+
+ FastAnimationToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Carbon; //Only to provide an interesting look
+ FastAnimationToggleSwitch.Size = new Size(93, 30); //Only to provide an interesting look
+ FastAnimationToggleSwitch.OnText = "On"; //Only to provide an interesting look
+ FastAnimationToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ FastAnimationToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look
+ FastAnimationToggleSwitch.OffText = "Off"; //Only to provide an interesting look
+ FastAnimationToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ FastAnimationToggleSwitch.OffForeColor = Color.White; //Only to provide an interesting look
+ FastAnimationToggleSwitch.UseAnimation = true; //Default
+ FastAnimationToggleSwitch.AnimationInterval = 1; //Default
+ FastAnimationToggleSwitch.AnimationStep = 10; //Default
+
+ SlowAnimationToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Carbon; //Only to provide an interesting look
+ SlowAnimationToggleSwitch.Size = new Size(93, 30); //Only to provide an interesting look
+ SlowAnimationToggleSwitch.OnText = "On"; //Only to provide an interesting look
+ SlowAnimationToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ SlowAnimationToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look
+ SlowAnimationToggleSwitch.OffText = "Off"; //Only to provide an interesting look
+ SlowAnimationToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ SlowAnimationToggleSwitch.OffForeColor = Color.White; //Only to provide an interesting look
+ SlowAnimationToggleSwitch.UseAnimation = true; //Default
+ SlowAnimationToggleSwitch.AnimationInterval = 10;
+ SlowAnimationToggleSwitch.AnimationStep = 1;
+
+ //GrayWhenDisabled example:
+
+ GrayWhenDisabledToggleSwitch1.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch1.Size = new Size(100, 30); //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch1.OnText = "ON"; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch1.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch1.OnForeColor = Color.White; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch1.OffText = "OFF"; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch1.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch1.OffForeColor = Color.White; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch1.ButtonImage = Resources.arrowright; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch1.GrayWhenDisabled = false;
+
+ GrayWhenDisabledToggleSwitch2.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch2.Size = new Size(100, 30); //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch2.OnText = "ON"; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch2.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch2.OnForeColor = Color.White; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch2.OffText = "OFF"; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch2.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch2.OffForeColor = Color.White; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch2.ButtonImage = Resources.arrowright; //Only to provide an interesting look
+ GrayWhenDisabledToggleSwitch2.GrayWhenDisabled = true; //Default
+
+ //ThresholdPercentage example:
+
+ ThresholdPercentageToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.IOS5; //Only to provide an interesting look
+ ThresholdPercentageToggleSwitch.Size = new Size(98, 42); //Only to provide an interesting look
+ ThresholdPercentageToggleSwitch.OnText = "ON"; //Only to provide an interesting look
+ ThresholdPercentageToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); //Only to provide an interesting look
+ ThresholdPercentageToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look
+ ThresholdPercentageToggleSwitch.OffText = "OFF"; //Only to provide an interesting look
+ ThresholdPercentageToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold); //Only to provide an interesting look
+ ThresholdPercentageToggleSwitch.OffForeColor = Color.FromArgb(141, 123, 141); //Only to provide an interesting look
+ ThresholdPercentageToggleSwitch.ThresholdPercentage = 50; //Default
+
+ //ToggleOnButtonClick & ToggleOnSideClick example:
+
+ ToggleOnClickToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.BrushedMetal; //Only to provide an interesting look
+ ToggleOnClickToggleSwitch.Size = new Size(93, 30); //Only to provide an interesting look
+ ToggleOnClickToggleSwitch.OnText = "ON"; //Only to provide an interesting look
+ ToggleOnClickToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ ToggleOnClickToggleSwitch.OnForeColor = Color.White; //Only to provide an interesting look
+ ToggleOnClickToggleSwitch.OffText = "OFF"; //Only to provide an interesting look
+ ToggleOnClickToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold); //Only to provide an interesting look
+ ToggleOnClickToggleSwitch.OffForeColor = Color.White; //Only to provide an interesting look
+ ToggleOnClickToggleSwitch.ToggleOnButtonClick = true; //Default
+ ToggleOnClickToggleSwitch.ToggleOnSideClick = true; //Default
+ }
+
+ public void SetPropertiesForCustomizationsTabSwitches()
+ {
+ //Set the properties for the ToggleSwitches on the "Special Customizations" tab
+
+ //Color customization example, Metro Style ToggleSwitch:
+
+ NormalMetroToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Metro; //Default
+ NormalMetroToggleSwitch.Size = new Size(75, 23);
+
+ ToggleSwitchMetroRenderer customizedMetroRenderer = new ToggleSwitchMetroRenderer();
+ customizedMetroRenderer.LeftSideColor = Color.Red;
+ customizedMetroRenderer.LeftSideColorHovered = Color.FromArgb(210, 0, 0);
+ customizedMetroRenderer.LeftSideColorPressed = Color.FromArgb(190, 0, 0);
+ customizedMetroRenderer.RightSideColor = Color.Yellow;
+ customizedMetroRenderer.RightSideColorHovered = Color.FromArgb(245, 245, 0);
+ customizedMetroRenderer.RightSideColorPressed = Color.FromArgb(235, 235, 0);
+
+ CustomizedMetroToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Metro; //Default
+ CustomizedMetroToggleSwitch.Size = new Size(75, 23);
+ CustomizedMetroToggleSwitch.SetRenderer(customizedMetroRenderer);
+
+ //Color customization example, IOS5 Style ToggleSwitch:
+
+ NormalIOS5ToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.IOS5;
+ NormalIOS5ToggleSwitch.Size = new Size(98, 42);
+ NormalIOS5ToggleSwitch.OnText = "ON";
+ NormalIOS5ToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold);
+ NormalIOS5ToggleSwitch.OnForeColor = Color.White;
+ NormalIOS5ToggleSwitch.OffText = "OFF";
+ NormalIOS5ToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold);
+ NormalIOS5ToggleSwitch.OffForeColor = Color.FromArgb(141, 123, 141);
+
+ //Maybe not the prettiest color scheme in the world - It's just for demonstration :-)
+ ToggleSwitchIOS5Renderer customizedIos5Renderer = new ToggleSwitchIOS5Renderer();
+ customizedIos5Renderer.LeftSideUpperColor1 = Color.FromArgb(128, 0, 64);
+ customizedIos5Renderer.LeftSideUpperColor2 = Color.FromArgb(180, 0, 90);
+ customizedIos5Renderer.LeftSideLowerColor1 = Color.FromArgb(250, 0, 125);
+ customizedIos5Renderer.LeftSideLowerColor2 = Color.FromArgb(255, 120, 190);
+ customizedIos5Renderer.RightSideUpperColor1 = Color.FromArgb(0, 64, 128);
+ customizedIos5Renderer.RightSideUpperColor2 = Color.FromArgb(0, 90, 180);
+ customizedIos5Renderer.RightSideLowerColor1 = Color.FromArgb(0, 125, 250);
+ customizedIos5Renderer.RightSideLowerColor2 = Color.FromArgb(120, 190, 255);
+ customizedIos5Renderer.ButtonNormalOuterBorderColor = Color.Green;
+ customizedIos5Renderer.ButtonNormalInnerBorderColor = Color.Green;
+ customizedIos5Renderer.ButtonNormalSurfaceColor1 = Color.Red;
+ customizedIos5Renderer.ButtonNormalSurfaceColor2 = Color.Red;
+ customizedIos5Renderer.ButtonHoverOuterBorderColor = Color.Green;
+ customizedIos5Renderer.ButtonHoverInnerBorderColor = Color.Green;
+ customizedIos5Renderer.ButtonHoverSurfaceColor1 = Color.Red;
+ customizedIos5Renderer.ButtonHoverSurfaceColor2 = Color.Red;
+ customizedIos5Renderer.ButtonPressedOuterBorderColor = Color.Green;
+ customizedIos5Renderer.ButtonPressedInnerBorderColor = Color.Green;
+ customizedIos5Renderer.ButtonPressedSurfaceColor1 = Color.Red;
+ customizedIos5Renderer.ButtonPressedSurfaceColor2 = Color.Red;
+
+ CustomizedIOS5ToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.IOS5;
+ CustomizedIOS5ToggleSwitch.Size = new Size(98, 42);
+ CustomizedIOS5ToggleSwitch.OnText = "ON";
+ CustomizedIOS5ToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold);
+ CustomizedIOS5ToggleSwitch.OnForeColor = Color.White;
+ CustomizedIOS5ToggleSwitch.OffText = "OFF";
+ CustomizedIOS5ToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 12, FontStyle.Bold);
+ CustomizedIOS5ToggleSwitch.OffForeColor = Color.White; //OBS: Need to change this for text visibility
+ CustomizedIOS5ToggleSwitch.SetRenderer(customizedIos5Renderer);
+
+ //Color customization example using RendererChanged event
+
+ NormalPlainAndSimpleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.PlainAndSimpel;
+ NormalPlainAndSimpleToggleSwitch.Size = new Size(44, 22);
+
+ CustomizedPlainAndSimpleToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.PlainAndSimpel;
+ CustomizedPlainAndSimpleToggleSwitch.Size = new Size(44, 22);
+ CustomizedPlainAndSimpleToggleSwitch.BeforeRendering += CustomizedPlainAndSimpleToggleSwitch_BeforeRendering;
+
+ //Image customization example, Fancy Style ToggleSwitch:
+
+ NormalFancyToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy;
+ NormalFancyToggleSwitch.Size = new Size(100, 30);
+ NormalFancyToggleSwitch.OnText = "ON";
+ NormalFancyToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ NormalFancyToggleSwitch.OnForeColor = Color.White;
+ NormalFancyToggleSwitch.OffText = "OFF";
+ NormalFancyToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ NormalFancyToggleSwitch.OffForeColor = Color.White;
+
+ CustomizedFancyToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy;
+ CustomizedFancyToggleSwitch.Size = new Size(100, 30);
+ CustomizedFancyToggleSwitch.OffButtonImage = Resources.arrowright;
+ CustomizedFancyToggleSwitch.OffSideImage = Resources.cross;
+ CustomizedFancyToggleSwitch.OnButtonImage = Resources.arrowleft;
+ CustomizedFancyToggleSwitch.OnSideImage = Resources.check;
+
+ //Advanced behavior example, Fancy Style ToggleSwitch:
+
+ Color tempColor;
+
+ ToggleSwitchFancyRenderer customizedFancyRenderer = new ToggleSwitchFancyRenderer();
+ tempColor = customizedFancyRenderer.LeftSideBackColor1;
+ customizedFancyRenderer.LeftSideBackColor1 = customizedFancyRenderer.RightSideBackColor1;
+ customizedFancyRenderer.RightSideBackColor1 = tempColor;
+ tempColor = customizedFancyRenderer.LeftSideBackColor2;
+ customizedFancyRenderer.LeftSideBackColor2 = customizedFancyRenderer.RightSideBackColor2;
+ customizedFancyRenderer.RightSideBackColor2 = tempColor;
+
+ AdvancedBehaviorFancyToggleSwitch.Style = JCS.ToggleSwitch.ToggleSwitchStyle.Fancy;
+ AdvancedBehaviorFancyToggleSwitch.Size = new Size(150, 30);
+ AdvancedBehaviorFancyToggleSwitch.OnText = "Restart";
+ AdvancedBehaviorFancyToggleSwitch.OnFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ AdvancedBehaviorFancyToggleSwitch.OnForeColor = Color.White;
+ AdvancedBehaviorFancyToggleSwitch.OffText = "Online";
+ AdvancedBehaviorFancyToggleSwitch.OffFont = new Font(DemoTabControl.Font.FontFamily, 10, FontStyle.Bold);
+ AdvancedBehaviorFancyToggleSwitch.OffForeColor = Color.White;
+ AdvancedBehaviorFancyToggleSwitch.OffButtonImage = Resources.arrowright;
+ AdvancedBehaviorFancyToggleSwitch.UseAnimation = false;
+ AdvancedBehaviorFancyToggleSwitch.SetRenderer(customizedFancyRenderer);
+ AdvancedBehaviorFancyToggleSwitch.CheckedChanged += AdvancedBehaviorFancyToggleSwitch_CheckedChanged;
+
+ AnimatedGifPictureBox.Parent = AdvancedBehaviorFancyToggleSwitch; //Necessary to get the ToggleSwitch button to show through the picture box' transparent background
+ }
+
+ private void CustomizedPlainAndSimpleToggleSwitch_BeforeRendering(object sender, ToggleSwitch.BeforeRenderingEventArgs e)
+ {
+ if (e.Renderer is ToggleSwitchPlainAndSimpleRenderer)
+ {
+ ToggleSwitchPlainAndSimpleRenderer renderer = e.Renderer as ToggleSwitchPlainAndSimpleRenderer;
+
+ renderer.BorderColorChecked = Color.Green;
+ renderer.BorderColorUnchecked = Color.Red;
+
+ //Observe: in the BeforeRendering event, the Checked property will not yet have changed to the final state
+ if (!CustomizedPlainAndSimpleToggleSwitch.Checked)
+ {
+ renderer.ButtonColor = Color.DarkGray;
+ renderer.InnerBackgroundColor = Color.LightGray;
+ }
+ else
+ {
+ renderer.ButtonColor = Color.DarkBlue;
+ renderer.InnerBackgroundColor = Color.LightBlue;
+ }
+ }
+ }
+
+ private void AllowUserChangeCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ AllowUserChangeToggleSwitch1.Checked = AllowUserChangeCheckBox.Checked;
+ AllowUserChangeToggleSwitch2.Checked = AllowUserChangeCheckBox.Checked;
+ }
+
+ private void GrayWhenDisabledCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ GrayWhenDisabledToggleSwitch1.Enabled = GrayWhenDisabledCheckBox.Checked;
+ GrayWhenDisabledToggleSwitch2.Enabled = GrayWhenDisabledCheckBox.Checked;
+ }
+
+ private void ThresholdPercentageTrackBar_Scroll(object sender, System.EventArgs e)
+ {
+ label15.Text = string.Format("Value = {0} (Default = 50)", ThresholdPercentageTrackBar.Value);
+ ThresholdPercentageToggleSwitch.ThresholdPercentage = ThresholdPercentageTrackBar.Value;
+ }
+
+ private void ToggleOnButtonClickCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ ToggleOnClickToggleSwitch.ToggleOnButtonClick = ToggleOnButtonClickCheckBox.Checked;
+ }
+
+ private void ToggleOnSideClickCheckBox_CheckedChanged(object sender, System.EventArgs e)
+ {
+ ToggleOnClickToggleSwitch.ToggleOnSideClick = ToggleOnSideClickCheckBox.Checked;
+ }
+
+ private void AdvancedBehaviorFancyToggleSwitch_CheckedChanged(object sender, System.EventArgs e)
+ {
+ if (AdvancedBehaviorFancyToggleSwitch.Checked)
+ {
+ AdvancedBehaviorFancyToggleSwitch.AllowUserChange = false;
+ AdvancedBehaviorFancyToggleSwitch.OnText = "Restarting...";
+
+ PositionAniGifPictureBox();
+ AnimatedGifPictureBox.Visible = true;
+
+ if (!SimulateRestartBackgroundWorker.IsBusy)
+ SimulateRestartBackgroundWorker.RunWorkerAsync();
+ }
+ else
+ {
+ AdvancedBehaviorFancyToggleSwitch.AllowUserChange = true;
+ AdvancedBehaviorFancyToggleSwitch.OnText = "Restart";
+ }
+ }
+
+ private void PositionAniGifPictureBox()
+ {
+ //Position anigif picturebox
+
+ Rectangle buttonRectangle = AdvancedBehaviorFancyToggleSwitch.ButtonRectangle;
+
+ AnimatedGifPictureBox.Height = buttonRectangle.Height - 2;
+ AnimatedGifPictureBox.Width = AnimatedGifPictureBox.Height;
+ AnimatedGifPictureBox.Left = buttonRectangle.X + ((buttonRectangle.Width - AnimatedGifPictureBox.Width) / 2);
+ AnimatedGifPictureBox.Top = buttonRectangle.Y + ((buttonRectangle.Height - AnimatedGifPictureBox.Height) / 2);
+ }
+
+ private void SimulateRestartBackgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
+ {
+ //Simulate restart delay
+ Thread.Sleep(1500);
+ }
+
+ private void SimulateRestartBackgroundWorker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
+ {
+ AnimatedGifPictureBox.Visible = false;
+ AdvancedBehaviorFancyToggleSwitch.Checked = false;
+ }
+ }
+}
diff --git a/ToggleSwitchDemo/DemoForm.resx b/ToggleSwitchDemo/DemoForm.resx
new file mode 100644
index 0000000..336682d
--- /dev/null
+++ b/ToggleSwitchDemo/DemoForm.resx
@@ -0,0 +1,1880 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+ PLEASE NOTE!
+
+ALL ToggleSwitch controls on the demo form are default control instances. All other properties are set in code behind, and all event handlers have been added in code behind.
+
+This is done so that you don't have to go through and test all properties on a specific control to see exactly what has been done to make it look and behave as it does. You can get all the necessary information directly from the code.
+
+
+
+
+ R0lGODlhKwArAMQTAKmqrI+Pkefn6NfY2fr6+mxsbMfHyczNz5mZm7a3ueLi49zd3u3t7tLS1Hh5esDA
+ wvPz9KGipISEhf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBF
+ Mi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6
+ cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9
+ IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAg
+ ICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1z
+ eW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wUmlnaHRzPSJo
+ dHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvcmlnaHRzLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5h
+ ZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8x
+ LjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEu
+ MC8iIHhtcFJpZ2h0czpNYXJrZWQ9IkZhbHNlIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InV1aWQ6
+ M0I4QjcyREFCRDYxREYxMTlCRTZEMTI4QkIxRDIzN0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6
+ Nzg1MDlCNzBCMTU1MTFFMEJFNjZFRkYzMzg1MEFDRkIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6
+ Nzg1MDlCNkZCMTU1MTFFMEJFNjZFRkYzMzg1MEFDRkIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhv
+ dG9zaG9wIENTNSBNYWNpbnRvc2giPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0i
+ eG1wLmlpZDpGODdGMTE3NDA3MjA2ODExOTQ1N0NBNTQ4MkQyMTVGNCIgc3RSZWY6ZG9jdW1lbnRJRD0i
+ dXVpZDozQjhCNzJEQUJENjFERjExOUJFNkQxMjhCQjFEMjM3RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4g
+ PC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw
+ 7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0
+ s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4
+ d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08
+ Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEA
+ ACH5BAkAABMALAAAAAArACsAAAX/4CSOZGmeaKqmzOq+ggEEUm1Hj/DuxBEFQKCt5pA4Ag/CLuULOmlD
+ o6P4WJYgAAQisA1KoLbidBpQWCeKiFbLdQLeYOnY0VguEOr1NjGAlHoAcmMFBy9pankID34qDAlzBQ4F
+ dY0AEZdqCTo7AgiDU2YpCZiXCUpWEJ5TBQUSKQOWlhEJZySekaxVJgRvb7OntRMQAZKsDowksL0ALcEj
+ AristCUJvgAGziURxZElDMsAyNkTDKzmoSINy9jjJBHmBdMiD7EA6O0TBvCuI+DA+OXgkQCHrwS3AgN7
+ 6SooIoBAEd8UMhzh0NymCdXeLGRYkdXAagnkMWxgLgCJkCD/uxVUAGBjPpQJ7k00MQBmoZkoIMBMIA4n
+ CQMwKfksseCBUaM9hxI4avSAyjMQIDwtoYDpA6G1GAgQwGAqiQYPDIQ1MMBrCgJbtzJIesWA27cN2KJA
+ m5bBWhcM3h4wcODAArMiCDBQoEDtWsAjGPRdvFhB1z8QBBAubBgxCQYN+mZuwJnzgMkLQk+u+xjVgM6d
+ B6hWHXrBaLVSnTE43WA169avuVpeIXjB6tauXx+eKFgAbsJcYw+FaHf58hAAIfkECQAAEwAsAAAAACsA
+ KwAABf/gJI5kaZ5oqqbM6r7MkURIjQQIYAhvTzSACI1WwwWOuAehlxoAgkKiDYmUBAzMEiTxjEZtt9vR
+ KpEgeFnBcw2NJt7iark8YC7Y64hhAdEOEgFkcxIHLwp4TwZ9KluBZQ4SDnUqDIgJLT0CCHMOkJgoXGxK
+ WRMEEYMOASl3oqQkp52dDycEoU8JS64iEJuxDrkkTrafuhMCvg4JJg8AoYXFJAC+ElpvXAmL0CIMvgVo
+ In/WWNqvnQXJJDLWCuTpsQWqIw/WuO0jBA7n5yTzb7P2I8wVKMDvwbxnACcg0Edwm0GDCAEuzFfg08MH
+ Ee0tHNhQhIGH4xJSHEjCgMmPwNq6cePYccKAkwaIkTPAMp4IBQdOLki4caCyERAO5MyZEhoDlgV2kmgg
+ VKhSchFYOjAhoKnQbMWOsvxJ4gdTpgOKkhqAFOsIBg3SpmVndOuqAWobKBDL5MHACCoIDNjLdwHdhBMg
+ 8B0s4C9ACAsGLEi8eIEACEUJQIDAwPALxI0zK1igQIBnAZ09V9ZGQMDizQpSq+4cWgCD0eQgrFYN+rPo
+ 15aZSPbcWrTr17ATSmbg+vdryLnJAQfM/EQIACH5BAkAABMALAAAAAArACsAAAX/4CSOZGmeaKqmzOq+
+ TPMANB0BydG+L9EkteAtQkQADgReagAMOolQhLShLDFmTiEAGpF6AZDqRABsZh/obdQbQCyUioTc+Vgk
+ SYRFwotoBwJULmRyc0dhKhAPbH8BbyoED4Q4DzswAIyMhygGkYQGd0oEl4wSESkKaJ5iJKMSARIGJwSc
+ qZ+rIwQRfxKuoCOoaJGat2OvvBIPJge0DwPEJQnGriUQBsy+zwzHvAIkAtbWgc+sxw7JIwPL1t3jJA3l
+ piMH89bY4wQSDvkSJPPLB+1M8HJA0J0/ZwFJRMhXUESMBvMQJhSBgCDBSg0yNpA4MYJFByQGaBQ3kWFD
+ EQNExGa094zAR5C/UmasFPCAxQIISDBIKZJdQo8FHBRIgGcBzwEsVzEgGLSATxEKFhgd8PQZgKYF+FmR
+ KhVpOwVChQ41QSAqVwVJX0AIUKBt0GEjICgwu6BqFbZuC5w7IWDugqgC0qKAgCBv1kd9584NDEeC4QI0
+ T0AQkFgxA8Eirj4mmYIA5b6VGUBImuCx3lAMPqumHFkE3rwAqxBgkHo1ZXsR8jqwy2M2bdoCaMOdsLQt
+ 0Xu+f1+euIIAAQijmSv5Lb36iRAAIfkECQAAEwAsAAAAACsAKwAABf/gJI5kaZ5oqqbM6r7QYiQADdxP
+ 074vsTyJIM12KyYGBF5K8AAKg8VodKAsQQ5NJ7Qm7SZ2SobBkNUGs9FIGqAIj8nagyJJ8hnSkfzixTi8
+ swMQKxAGanl5CG0qEA1+Yw8HgjwMCYcRCBGSKAMHjgYNdEoElZeXACyNnQZUVSSVCLAIDScEA6kHoK11
+ ALGwoSMMDcKdmroiDL0BsyULto2KxiQPCAHUESW1zrnRJBDU1AECJAwDztDcIwkB6wEGJALltmDoIgPs
+ AacjC83lv/QQ9wKQ2BePnglwEgSK8EHwnMEJABJKkABMwb4FDg1GDDBxBwEFFjE+JBFxIsURIC+2jhzB
+ 0eQ7kBb9oSNgcuI4mAuK0RtQ89oICAJgihtZ0oGDB3UEBAUp0xgDCQ6gSnDIQCnIedwiGnWgsFvVpU2r
+ CNhq1B22r0oFhIWBgKyEpgTQKuXWlixSFBAYfFWAtUfdrV1p6UWrc4WAAFsLGM14drCAwigYAFBM2UGB
+ ZSviDl57rBDlzwUOiIIAoWkDdpYLqAbtADM9Batjyy4goW/W2bPvrjSAW/VRyAYDyMbHeOXXlchThAAA
+ IfkECQAAEwAsAAAAACsAKwAABf/gJI5kaZ5oqqbM6r6QMBjGY9vHAL08ITQHWu2WKBYfAwKPNTg4hbeH
+ 0QhILJYlwqIBfA5t0wSgOn60sJDBgOsVOg9S6niuWKbX7OCCoSQRFAZkc2NXLhALalxAC30pEAeDdCt/
+ iHg6SwxikTspAguVDQqNPQ+RCY6flXVYJKWDAyc+qQOirH6ac6MiEAoKn0m2JQyDEQ0mAr2fAsEmgQAR
+ EQBZyL6MzCUQ0Npnu9QLy9clBtoRByQM3pzhIwvaCKcj6L216yME0AjQ5wLU9SURCAIisIcOGTh/IhII
+ HCiCQUEFBxEqFMjNIb+I/gAIDHCuIMZ6AQMEYNjQo65wEBCtiBxJAoJFAerqDVgZQBrBgtzqJaBpwI9L
+ dDFR0gyAkYBDPhIDSFBK0g+Bk8wESFi6tCdCFARUTl0K9eqECFunWvXqB2zYpi4YDMi5QgCCsFM/pjBQ
+ oG4EtiaGSXCwl68DWEvqCi6AwABbAgciOFjMeK85LIMjOxiJgLHlxoCxRIg82EEBxp8vB8DLAwDn054b
+ P1gHwfTpz7D5JggaTgGAAJwnJ1hFNp7D3sBHhAAAIfkECQAAEwAsAAAAACsAKwAABf/gJI5kaZ5oqqbM
+ 6r4EoyxDYx/NIEBvH8+DoK1xKB4MhoOC0EtBZjThzYhEPgyKZokggEZr02P1QX4ceFquAhoEN6JiQ3ku
+ aKq9QQGDSeIOygmBgXUuXF1sAnwpBA1kgoMrMYczS00QBo+BLU4ChwuJWhMEmIEACQ+LnYeEoSIGpgCx
+ CycxDJ0KoK0iBA+wpoojkofAugyxxw0mELZdm7okB8emWwzMlc8kENIAzqLVnd3YIr3I2d874iUL0qgj
+ y8zE4gSxEbF93+HpE9tbEPH65OyJyKePREBuBV0kkJbQBYAIECM0VEEgYr2JKRZYTIARRQKLB0wwiBCA
+ Y0EICCKrpESQz0GBlwAKPkBAE0FMEy9zZhHHoCbNZDhzFgiARtc8nxH+JRA6FBsABAECQAV6wqVQBEV9
+ AIgKNcBNFAqYDt35QgDJqFyznjDA1CVCFQwSSECLlqyKB2IdOIhwZksDABLmCo5K1cWBtgX0OpBAM0Lg
+ x5CjztLCQIJQxZglLIb8OALBFw+sJk6cWW9kA+kgyH2JufTcB/+eCUgQwGVmBA9YdZxQ7fPugiEAACH5
+ BAkAABMALAAAAAArACsAAAX/4CSOZGmeaKqiBEOsMExAjKDc9yK4cT/XNtxiuBgUF7weiwHEKYjFgXTQ
+ GDCUpV8zR5xKG2DwAIKdtJiC4HPh/IYbB3jj6mNuFQLIi9RSwA+AgXQrZ0A2SSkECoAGB40Ggyk0hgJ7
+ MRANBpqbZCqTaYg+A5uaB4RAkWUND6ysAoQQnWUjBAetrJazShC3Dwu6sw0JwwkPwGUQxMOyxzEHyr/N
+ PQrKBiUPCQrSJgQJAMQkCAXjptskwwDfJOPjAeYkD9/pIwzsBe7vIvHpALL2+Pn2zRthz0E+EfwGirBX
+ IFUzAgkBkJBgz9q7BQmNjQBgD0E+AwkbkFBQ0KEuCBFTqDmwJ3EbSH4JTCQoqK0Zg4gDuLFbGSBXmW4R
+ EvrUt9OBR2AJIgQNmhNFgKIIhhJKqlRpzBQKVjrY6iDAqx43qyrtt2JA0a0ATJLghaAtgqo1VxjgylWC
+ BAANfEIYkCCA27/RYjSgW9dugKAAAij269dthLjTAtC1S9nwYsV/yep6IGFyZQmXFyMQ+fCB5M6VA4Be
+ HOGAVGAKHkT4DBqAga8HSdjJzbtECAAh+QQJAAATACwAAAAAKwArAAAF/+AkjmRpnmiqpszqvgQBMTQj
+ 1BDx7iI01zeBcCjI8VQEoG2oECieUMgRlVwyodiFYiHQTUlJomK53S7OaIX0O5IxjGCIAE1frNkwwWDP
+ H9zxLgQLfXteKBEFBQaABAoNDQOQCykJiYktgI6Pj5glEJaJA4ATBJEHjwOGI5WgnXgQB7GnAiagBRGj
+ IwuypyUKtrS5pAYHxAd/AKAIwroGzgbBIgGgi8wTAs8GoiO2rrkEBg/PJKAO1iPh4tUiyuciBw/xDyMM
+ 7e7w8pifBQ4Fy/cPEsQjl8iBOXcBEwgk0Y+fA1W5IChUOG9EAIMG1wlTMDHBARKV+jnAZc1Ax0kjFLmI
+ NOjtVQIALxP8mSABowMAzA4A2LmwRAKbDqLhYbATJoBtYIAigHiEwMuiCZhOeIBRggSSbB4U3YnyxEUH
+ Na9KRaJ1awIVDMJalYBA6AoGT7fONDHA4FqrMldAMLC1qIIXB9RKCEA4QYOZEBY8iNCXK48Bd60SJowA
+ ZoIICCJoZrz17xEBCNZOpoygdObNnCPkZWOA8ODRpkujZowUD4EHCGAHiL0ZQIOxbLABKL1btseW7mq4
+ W34iBAAh+QQJAAATACwAAAAAKwArAAAF/+AkjmRpnmiqpszqvigBQQQB3zGj67SNm4lCQdIqQXZIhu83
+ UUiEQoSJIKhWGYLdEnaAQgMnrHWc3a4MXiggdlQoBG+rGdVNF9YrAsPthgvmJQx2Ego3VHx9gCNPXgEQ
+ P1QLiAIpD2lgTCICC5xujyYQDo2KLwQKnJ1zQVAOhZkjBAOoC0UkjAUOeK8jAgOykiUKQg7EtbsTsb6y
+ W0HEBRHHwcoDxgiixAfRJAwNyq4i18SkTAQN5r4kxMQS2iXm5yS4xFLtIwsH7yMM6g7Q9SIDDuBrUIsf
+ vX8BBTZIt47dvwkHDAjMtsiBBIvjIBnYiI+ENQkgKbYTsFHiABIPLsCC1KVtwIOSlHhZBCnhUzQCD15u
+ tCkiAE0JCdq5zCnRREqaAWLugpAgZ85vIyD4nBohowoCBh40fQnIAMgAYFn+MJCg7NMUCKaGtVoCa1mz
+ BlQIAEs3AABjKxhofduU54kBdQMgQPDAL6gDABIDeKtURQO6gyM/GGCGwIIHihe/hbpiQVrBkRFEiLA4
+ Z+bTixu/gAAg9OjXqFEXfnXANezYiRMsuIlYNGzSpxM0YAuDwYEEAEZnfkDwoYkdzqOXCAEAIfkECQAA
+ EwAsAAAAACsAKwAABf/gJI5kaZ5oqqbM6r4KEBQ0jbw4CSVO7dOPHO7xKxYSwpVCYiwOkqlGr1kISAKH
+ EwECIeQMtJ64EDFAVgSGmuF1NQrjHqD1ggjWbKVjzw8IhHYCd2ptKAFxCIU5DIKDZygPfHs3UCIMCo15
+ JhASkgGKSQQCmIKaJAaSDn+VIwQKpAKgE4d7EgCsJZekdCMCtZ2PuCKur4KKkZ22wiWjxcETERLSEk/L
+ IxALrwq8E8nSsrgEC9mYJNNX1iXj5ObTEekkCuOvIwzTAbfwIgoD87zSVvLp4zev0JUrlPQNWDiORICH
+ D58tI9CA4QISMiBWS8eg4sJVIh5ADIAEnoIGHrm5CYCIIIBEVgQOoFwIKkKAlgiCWFMgE+XFEgdwIkDA
+ rRKEAz0bFJ1AYKhTAOBwUEQqcwC4Bk4RRChZaYABA0iVpgDgNMLWqCkofgV7YOMJCGbjbl2a4uiDtTJf
+ llCgVS4AMysgNHhA+C5YuiYWxAXAmLGBBaBcHUiQoPBaxCdimG3MGUBhyqAfVDaMGQWDBJ1TMwZNufAB
+ vS8GqOaMmjVhBRMHoFbNurICtFA6PqANIMFj2PDW6FueIgQAIfkECQAAEwAsAAAAACsAKwAABf/gJI5k
+ aZ5oqqbM6r5KEjhFbQeJ8u5QIhU0m9DmABB2KYNjSVsCh8MEssSYMZnPILQWmYoGkqvYgShrod7DeBk5
+ HEmMAwKNHDgk+LAE0FIxIjYGSAJ5d2QCSAwNiEgIeXgRb15IBo8SXZNTBAGPCJKZLw8SnJyMoCQEqSeO
+ pFKnqAyxECUCAba2fa8iEAKxDJ8Gtzi6cAK9vyQAwg3EI7zHsyMIwtHNBArGsSS20wjNJMbHJN0Irt8T
+ DNi9IwxlZQDnIgLq2iLu5fET89nj7pjnCgIaIxEBQcFI5wgsEJhrQgKDESIMOAchILaGByJGFPRNwEJs
+ 1dBpjBjylMKPAj6yTQAQgSUAjro8LlhoakQDlwD46CIwYGbAkhMI5ByaQKWmBT0/Gp0wYGjOB6cUDEi6
+ AOiIBE4BPFiq4lqDqTNrmoCQFUCChisgDGjwNSnXEQpythx6wCqqBQcOsAVrt8SCsjkPKChJgMECA3n1
+ tu1rQkBWrAkiJ0hs4IGBy4kXe2GANSdkyQ8SPBh9GbHiBW9XLIhsVnLk0aRN60U7iafr17BL601J8TBs
+ 2LsZE/OVr3iJEAAh+QQFAAATACwAAAAAKwArAAAF/+AkjmRpnmiqpszqvsKDSE5tI4ny7sQT0DSbozAc
+ ShKQXcrwkzgdQWGtQHU8lCVBxMnlQoXEMFXSwi5+za4TEZnZxNTCQdkIoCVNQCNJIhwiRXFUVy5ndnZ4
+ SCsMAEOCcisQCId2EQJKCgGPBWUoAJQBAARYE5KPEil1CJMIAKQkmoIJJwSrtqKvIwQSjycHtquXuSMK
+ vSYAwITDIwBxDiYMbNJ8yyMJEgidI3/SytUuCRHiEQPfOwDjEaPmLumu7O0A8t7wJ4zyEfT1Ip3o8/si
+ CEBYxwzfu3oMBDBgQHCCvIcNvxEQoJABtQkP/AFYUA8CxYUXGzwEoG9ZwooN77Y9vLiMgIKPDEskGDnH
+ HIOXFU2IHKktl0ucMUsQmPnwQUQsExW8XHh0wgB5MxMYWCZA6UeWJB5EBSC1qYqJC6wqVMEggdmzBrCm
+ cLkg7FKvIwScPfugAdyAAga0VfryLrG5Wh/UFRCRQMIBiPe+VIsiRmDBgg0YOIB4QIPLlRUTJkXAAOQH
+ kkMfGH25Qeawm3Mp8AxaNGnMicMyVuLygOTRr00nVhCUnUfLB0oj5u3328KeAJOHAAA7
+
+
+
+ 17, 17
+
+
+
+ AAABAA0AMDAQAAEABABoBgAA1gAAACAgEAABAAQA6AIAAD4HAAAYGBAAAQAEAOgBAAAmCgAAEBAQAAEA
+ BAAoAQAADgwAADAwAAABAAgAqA4AADYNAAAgIAAAAQAIAKgIAADeGwAAGBgAAAEACADIBgAAhiQAABAQ
+ AAABAAgAaAUAAE4rAACAgAAAAQAgACgIAQC2MAAAMDAAAAEAIACoJQAA3jgBACAgAAABACAAqBAAAIZe
+ AQAYGAAAAQAgAIgJAAAubwEAEBAAAAEAIABoBAAAtngBACgAAAAwAAAAYAAAAAEABAAAAAAAAAAAAAAA
+ AAAAAAAAEAAAAAAAAAD///8AAACAAACAAAAAgIAAgAAAAIAAgA2AgAANwMDAAICAgAAAAP8AAP8AAAD/
+ /wD/AAAA/wD/Df//AA0AAAAA////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ GTERER//////////////////////////EZk5ERkRH///////////////////////kZO5m5ORERn/////
+ ////////////////GTmbuTm5kZEZH//////////////////xE5m5m5Obm5kRGf/////////////////x
+ GZubmbk5ubmZgRkf///////////////5GTm5m5ubk5ubmZMRH/////////////8RmZubmbk5ObkzOTmR
+ H/////////////8RmTk5k5mTm5m5m5mJER////////////EZOZmRmTuZubmbk7mYmRH///////////E5
+ kZk5m5mbmTk5OZm5OJEf/////////xGRmTmbmbk5uZOTm5uTmYkR////////8ZGZOZm5k5OTmbm5uTk5
+ m5iRH///////ERmZm5OTOTk5OZOZOTmbmbl5Ef//////EZk5OTk5k5ObmTOTk5M5k5OYkf/////xGRmT
+ mZOTmTmZOZk5OTmbmTk4kx////8RGZk5OTk5k5OTk5OTk5k5k5OZeRH///8ZkTmZk5mTmTk5mTmZOTmT
+ mTk5OJH///GRGZk5OZk5OZmZOZOTmZk5k5OZiYEf/xkZkZmZmTmZk5OZk5mZOZOYmZk5N5Wf/xEZGTmT
+ k5mTmRmTmTk5k5mXt5OZmYMf/xkZmZOZGZOZOZk5GZmTmTmId3mTmXkf8RGRk5kZmTmRmZOZmZOZGZmH
+ eHeJk5gf8ZGZGRmTmZGZk5kZk5kZk5h4d4d5mXOf8RkRmZGZGRmTmRmTmRmTmZeHh3d3k5gf8RmRkZkZ
+ mZkZGZGZGZGZGYd3d3d5GYif8RkZGRmRkZGRmRmRkZkZmZh3d3d5mTgf8ZEZmZGZGRmZGZGZmRmZd5mA
+ d3eRmXif8RmZGRmRmZGRmRmRkZiHd4mZd3eZmIMf8ZEZkZGZGZkZkZGZGRd3d3iZl4kZOHkf8RGZGRmR
+ kZGZGZEZmZh3d3d4GRmZmHEf8RkZmZGZmRmRmRkYiZN3cHB4mZGVe1n//xkZGRmRkZkZkZmZN5mZiYmR
+ mRmbeBH//xGRkZkZGRmRmRmJGXeZkZGZGZuHiR///xEZmZGZmZGZGZiBERl3mZmZmYd3Ef////8RGRkZ
+ GRkZmHiR/xGYd3uIe3eRH/////8RkZmRkZmZl4Ef//ERmDeHeIkR///////xGRkZmRmHeRH////xEZEZ
+ EREf////////ERGRkZmJER//////8RERER////////////ERERERH///////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////RBX/////////////////////////////
+ ////8Af////////wAH/////w//AAD/////D/8AAB////8P/gAAD////w/+AAAB///+D/4AAAB///4P/A
+ AAAH///g/8AAAAH//8D/gAAAAP//wP+AAAAAf/+A/wAAAAA//4D+AAAAAB//APwAAAAAD/4A/AAAAAAP
+ /AD4AAAAAAf8APAAAAAAA/gA8AAAAAAD8ADgAAAAAAHwAMAAAAAAAeAAwAAAAAABwADAAAAAAAHAAIAA
+ AAAAAcAAgAAAAAABgACAAAAAAAGAAIAAAAAAAYAAgAAAAAABgACAAAAAAAGAAIAAAAAAAYAAgAAAAAAB
+ gACAAAAAAAGAAIAAAAAAA4AAwAAAAAADgADAAAAAAAfAAMAAAAAAD8AA8AAAwAAfwADwAAHgAD/wAPgA
+ A/gAf/AA/AAH/gH/+AD/gB/////8AP////////+A////////////////////////////////KAAAACAA
+ AABAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAP////8AAIAAAIAAAACAgACAAACAgACAgICA
+ AIDAwMDAgICAgAAA/wAA/wAAAP//AP8AAP//AP////8A/wAAAAD/////////////////////////////
+ ////////////////////////////////////////GRERH////////////////5Obk5ERH///////////
+ //8Zmbm5k5Gf///////////xE5uTM7mTkR//////////8Zm5uTmbOTlRH/////////k5OZmZuZObmRH/
+ //////8RmZObm5uZubmTH//////xGZOZOTk5m5OZiZH/////8ZmZuTk5OTk5uTOJH////xGTk5OTk5OT
+ k5OZORH///EZmTk5mTk5OTk5OTiR//8RmTmZk5OZk5OZk5OZiR//GRmTk5mZOZmZOTmZOTif8RGTmTmZ
+ OZk5k5mXeJmJH/GZGRmZOZOZk5k5l3eTmJ/xEZmZkZGZk5kZmYeHCZg/8ZGRkZkZGZkZkZgHd3mYn/kZ
+ GRkZmZGRmZmJl3d5mB/xkZmZkZGZGRmHeJh3kZef8RkZGRkZGRmZh3d5kZm4H/GZkZGRmZGYmYh3eJmX
+ eR/xERmZmRkZkReZmRmZh5H//xmRkZGZmXkRh7mZN3kf///xGRkZmYcR8RGYh3iR/////xGZmYiRH//x
+ ERERH//////xERERH///////////////////////////////////////////////////////////////
+ //////////////////////////////8B////AB///wAH//4AAf/+AAB//gAAP/wAAB/4AAAP+AAAB/AA
+ AAPgAAADwAAAAcAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAPAAAAH4ACAD/AB
+ 4B/4B///////////////////KAAAABgAAAAwAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAP//
+ //8AAIAAAIAAAACAgACAAACAgACAgICAAIDAwMDAgICAgAAA/wAA/wAAAP//AP8AAP//AP////8A/wAA
+ AAD///////////////////////////////////EZkREf//////////GTm5GZGf////////EZubmzkRH/
+ //////Gbk5uZuZUf/////xk5mTmbObkZH///8RmRm5uZm5OTkf//8Zmbk5k5uZm5gR//GRk5OTmTk5OT
+ mR/xGZOZk5k5OTk5mDHxkZk5mTmZk5OZOZMRmTmTk5k5OZl4mXkZGZGZGZGZkYh3iZgRmRkZmRmRmZd3
+ eYkZGZmRkZkZmJcHeZiRmRkZGZGZd3mXmYkZGZGZkZk5AHeRm3ERkZkZGZiYmZk5lxHxmRmZmXEZg5eQ
+ iR/xEZkZiJHxGYmJEf//8RGRER//8RER//////////////////////////////////////8A//////gH
+ ///4AP/4+AA/+PgAH/jwAAf44AAD8OAAAeDAAAHggAAAwIAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAgAABAIAIA4DgHg+A////4P////8oAAAAEAAAACAAAAABAAQAAAAAAAAAAAAAAAAAAAAAABAA
+ AAAAAAAA/////wAAgAAAgAAAAICAAIAAAICAAICAgIAAgMDAwMCAgICAAAD/AAD/AAAA//8A/wAA//8A
+ /////wD/AAAAAP////////////GTkZH/////+Tm5ORH////xk5Obkx///xOZObm5kf//GZuTk5M5P/GZ
+ OZk5k5iRGRmTk5k5k5iRmTmZk5l5ORkZkZkZl3eYkZkZGZmJB5kZkZmRlwiTmBkZkZOXmJlxEZGZiRmJ
+ eR/xGRkR8RER//////////////8MsuA////gD+A/4AfgD8AD4AfAAcADgADAAQAAgAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAABAACAgwAB//+AgygAAAAwAAAAYAAAAAEACAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA
+ AAACApL/aoLiADpGugACAs0ARka2gAYq0oC2tvKAHiaqwI6O3oACAq8ARkbiAAIS1QAiItr/Akbi/yJC
+ 6v9iYuYAjq78/wJe+v8CAp7/AiLikQIatP9+m/I5TmLu/xYaypsCAtb/AkXyuQ4Sof8CMuqTo6ry8Sou
+ +jkeSvIZAgLAmYSG6pEqNs6TCAqeGWJ68hkCUvaRRlbymf7+/hnCxvaXAhLeGSZK/JcCCtYRZoL2GWJy
+ 7vEiIqjxnp7u/w4q4v8SEtb/FjLm4K6u8uACCs3gAgKpwFZq1sACDq6AIirfAJK2/gACKuYAVm7uAAIK
+ vgAGUv4AEhraALm+9oCGpvYAAg7eACcytg1GWuYNEhK2DQI67ZEqNOJ3Rl7yEQIa3xk+Rv6ZCgrX8XJy
+ 5pkCAraXIirS8QJK8oiqsvaJBgqm/3KO+RGiovIRCg7K/2Ji0v8aGtn/cIrq/woGsv8CGtr/Okbi/56q
+ 9P8Cav74Bgae+E5m9vgSEqb4qqzy8BIavuA2Nt7gcnLrwAICloACOtKAjo7uAAQGrgACE9oAYm7qAAIm
+ 5AADBtcAAjbyAAIDxoB6lu6AAlr24MvM9v8uRv4AAg7ZACYuvg2vtvYNAg3SDQQGqf9YbNqRAi7uEQIK
+ xjcCWvr/v8D2GYqu/PFEXvx4Ah7i/wJO+pkeHt7/PFrqEQIC0v8CJr4RHibO/0pazv8+PsL/Albu/05e
+ 3v82Qs7/NlLy/xYarv9abv7/GEr+/xo+7v9+ft7/Kj7+/wJC7v+OmvL/bn7u/0JO3v8CIt7/Ynj+/0JQ
+ /v8mLq7+Dg6y/j5W/v4WHrb8GjLy+Iai9vg+Ssbwaobu4A4y5sAuOtrALi7egA4OqoBWavqAbGzmgE5c
+ /oCGlvKAmprugFZq7oBshP6ALjq6wCkq2uB6eurwVlrm+A5C7v+avv7/Ai7GABJS/gCKiu4NDg6eDW6G
+ +g2bpvKZClT8k4io/pguOuR5FhbG8SpO+pEyOvqTAmb+mX6e+pcWFtJ3Agq28Zq6/plecu4ZEhqmGV52
+ /odCUuZ5Hh668UZGvhkWKuKRAnL+kS4uvphuhuZ5ubr18Y+y/pFSZvKZEhaimQJW9pkiTvqRFBbY8Vhu
+ 1BkCDsKRAlb6kXaS+omlpvOZZmbO8Rwe2pF2duoZBgaaGQIGynhKSuIZAhbW8SQm2hlmZuaZAmL9mQMC
+ oncCNuqZpa7y8QIGwpEKCqKRZn7yicbK9nACFt6VAgra/xIy6hmwsvIZAg7KN5a6/okCLuabBArC/xYe
+ 2plCWuqRAj7uGQoO1pEmLtKHAk70/wIOppEODs6Zco7qEThG5pkEBqJ3Smb6/xIWqhk6Ot4ZAj7W/5KS
+ 7nsAAACR////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////AAAAAAAAAAAA////////////////////////////
+ ////////////////////////AAkNY68UFAkAAAAAAP//////////////////////////////////////
+ ////////ADsRWlpaWhERYxQAAAAAA///////////////////////////////////////////ADtqWhFa
+ WhFaWloRG687AAA7Cf////////////////////////////////////8AAAsTWlpaEVoRWhFaWhEREzsA
+ AAn///////////////////////////////////8AABgTWloRWlpaEVpaWlpaWhkxMAAAAAD/////////
+ //////////////////////8ACXxqERFaERERWloREREREVpaGR0XCQAAAP//////////////////////
+ /////wAAC3wbWloRWhERGRkRERERERERWhEeHRcAAP///////////////////////////wAJC3wZGWoZ
+ ExMTExsbGRERERFaGRFaHroFCQAA////////////////////////AAADE3x8fAsLfBMZEREREREZERkR
+ EREZERlIjkMAAP//////////////////////ADt8GAt8CxNqDRERGRkRGRkRGREZERkRGRERKUgMAAD/
+ //////////////////8AAHwLfAsLGxEZGRkZERkZERkZERkZGRENERkRGSmIDAAA////////////////
+ /wAAAwsLCxMZGRkZGRkNGRkZGRkZGRkZERkZGRkZGRkpJQwAAP//////////////AAAUCxgLGxkNahlq
+ GRkZag0ZGWoZDRkZahkZGRkZGRkZKVyfAAD/////////////AAADCwsbDRtqDRsNGw0bDWoNag1qag1q
+ DRlqGWoNahlqGSUlQwD///////////8AAAMLCxsbGxsbGxsbGxsbGxsbDRsNGxsNGxsNag1qDWoNag1c
+ JQkA/////////wAAAwsYExsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGw0bGxseiiEAAP///////wAU
+ AwMFExsTGxsTGxsbGxsbGxsbGxMbGxsbGxsbGxsbGxsbGxsbXFxDAP//////AAADAwMTExMTExMTExMT
+ ExMTExMTExsTGxMbExsTGxMTExMbE2oTHiNYCQD///8AADsDAwt8fBN8fBMTExN8ExMTExMTExMTExMT
+ ExMTEw0jWBsTExMTE1wjGgD///8AADsDAwt8fHx8fBN8C3x8fHx8fHx8fBN8fHx8E3x8fEIuEJBCE3wT
+ fIgrcQD///8AOwM7A3wLfBh8fBh8fAt8fAt8fHx8fAsTfHx8fHx8C4pZWVlOVXwLfMYrhwD//wAAOzsD
+ GAt8GHx8GHx8GHx8GHwLfBh8GBMYfHwTGHx8xi4cHBxOTkJ8fHwjFgD//wAJOwM7GAsLCwsLCwsLfBgL
+ fBh8C3wLfBh8GHwYfAsYLBwcHE4GBidYC3xcIwD//wAAAzs7GBgYGBgYGBgYGAsYCxgLGAsYCwsLCwsL
+ CxhgHBwcBgYGJycsGBglUAD//wAJOzsDAxgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBisBgYGBgYnJydY
+ GBhcFQn//wAJOzsDGBgYGAMYAxgYGBgDGBgDGBgYGBgYGBgYDAwwICcGBicnJyAYGHwrAQD//wAJOzsD
+ GAMYGBgYGAMYAxgYGBgYGBgYGAMYGAySHC4YGCAGJwYnBmAYAwwQFgD//wAJAzsDGBgYGBgDGBgYGBgY
+ AxgYAwMYAxgwIBwGBgYuAxhgBicnShgYGEIQgwD//wAJOzsDGAMYGBgYAxgYGAMYGBgDAAMYGBgYLgYG
+ BicGIAwDDA9KMBgDGBUQLQD//wAJOzsDGBgYGAMYGBgYAxgYGBgDAwBYGBgDDycnBgYnJwYPMAMYAxgY
+ OjgQCQD//wAAOzsDAxgDGBgDGAMYGBgDGAMYGAktLAwYDC4nJwYnJxwPMBgYGANYOMtBAP////8ACTsD
+ GBgYGBgYGBgYGAMYGBgYGAwJAhWfGBgMCpKSDBgDGBgYA1jLODUAAP////8ACTs7AxgYGAMYAxgYGBgY
+ AxgYYEoEAHFsUEUYAxgYGBgYAxgwwjg4bBoA//////8AAAA7AxgDGBgYGBgDGAMYGBiSIFMJAAAaNcsj
+ fwwwGBgLRQoQODgBXQD//////////wAJOxgYAxgYGBgYGBgDGA8cCAAA//8AAF0BODjLEBUQEDg4OIMA
+ AP///////////wAACTsYGBgYGBgYGBgMShzWCQD/////AAAAcTUBbBAQEFU1QQAA//////////////8A
+ AAkJMBgYGDAYDA8cCC0AAP////////8AAAAJAAkACQAAAAD/////////////////AAAAAAlDQ10MBARx
+ AAAA/////////////wAAAAAAAAAA////////////////////////AAAAAAAAAAAAAP//////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////8Af////////wAH/////w//AAD/////D/8AAB////8P/gAAD////w/+AAAB///+D/4AAAB///4P/A
+ AAAH///g/8AAAAH//8D/gAAAAP//wP+AAAAAf/+A/wAAAAA//4D+AAAAAB//APwAAAAAD/4A/AAAAAAP
+ /AD4AAAAAAf8APAAAAAAA/gA8AAAAAAD8ADgAAAAAAHwAMAAAAAAAeAAwAAAAAABwADAAAAAAAHAAIAA
+ AAAAAcAAgAAAAAABgACAAAAAAAGAAIAAAAAAAYAAgAAAAAABgACAAAAAAAGAAIAAAAAAAYAAgAAAAAAB
+ gACAAAAAAAGAAIAAAAAAA4AAwAAAAAADgADAAAAAAAfAAMAAAAAAD8AA8AAAwAAfwADwAAHgAD/wAPgA
+ A/gAf/AA/AAH/gH/+AD/gB/////8AP////////+A////////////////////////////////KAAAACAA
+ AABAAAAAAQAIAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAICkgJuhuZqAkbeOgICwgIGIsZGQkK2Bh4i
+ qrYCAqoeAgLWjgJC4gImJtZGtrr2AiZC5iKOlu4CQkLeIgIi4mICEtaOAlr2AmZm5gISEp4CAjLqAg4S
+ qn6Orv5OAgKeFgJC8gICEtICEhLWDnJy3gICArajHkL+KgIC0h4SIt4CoqryhH6e7ioCCtYIAhreYlZq
+ 7gIGCp5GMjrS/jJS6sICKuYCFj7qJgJO8gICZv5mWnL2YgIKyiJCXvqeAgq2DrK29hJ6lvIWDgqurv7+
+ /gI2QuYCnp7uVkJS6gICEt4iAjrqkgJW+gIGCppWHiLaAkpaygbCwvYSAibiuQJi+oYWGqYCsrLyJwoK
+ 1kYKCp4SNkLyAgICmioCAspGAibaAgIGqj4CBtYKNjLecpKi8gISFqYiEhaqAgIGnqoWGtoGanrucgIC
+ vqJSZvoKLjbqYgJW9hpWVuZwamrSCmaC8gI+SsI6NjK+niYu3gKWku4GDhLaTgZa/hISFqKqAjLuEpq+
+ /jYSEtJyAga2AhpO+gICCs6OqqryBIqq+gICDtZiAhriAlZu7gMCLuYCAlL2AmJ69no+SuoCVmrSywoK
+ pi4aGtoCBgaWJgIGxq8iKrICAlbuBL7C9lgCIuYCAhbaAgJe+gIKMua/Ah62io6y+kQCAqICAkryAn6a
+ /h4+Xv48Hj7uAoqK6gJ2jvoeJlL6Sj4+5j5KWuICOkbSThYazjYCMso2XnLeFg4q2loOTv4YcnLqGjY2
+ 3n4ODsYqAkLuAkpK2o56etpupqbyQj5K9gLKyvZiAi7SQhoeqiYuPuIOboryPhom4hY+RuIaTl7qhh4e
+ 0j6+vvZqgp72DgoKti6amu4uAm7+Dl528lYeHt5sJi62Tqau8oYCHtqaAgqiVhI+7mwCDsYuCgqyKTpG
+ 5noCFt5WAj7uDsbG9poCJuYCrrL2EgoOnooGBpoOBgaubgIG2psSGt4KWlrmiD5Oxi4mMuIWGk7+KgIO
+ 0jJabvICkrL+fnZ26hYCApYCAgLGmgICrl4CAtoSJibaXgYi4kICEtoeAlr6RhISohYCNuoCDhKuLgJG
+ 8m4CArq5AgbSjwIK2lJWavISAirqAgJO9iICav4UAgq6WLK69gICOu4CSl7KdgYm4qUCYv5mCg7WHAIG
+ ynYGBqoGBgbWAgYGnkqWlu4CFhaiJAYGtmaqrvICAg7aAwIe4gICLuqlBlL2AlZq1goGAqJmioruxl52
+ 9gICFuICDg6eEh5O/rAAAAACAAAAlgAAAAIAAAAEAAAAFgAAAEIAAAACAAAACgAAACYAAAACAAAAAgAA
+ AA4AAAByAAAAOAAAAAQAAABKAAAAEgAAADoAAAACAAAAkgAAAAD/////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////wAHAAAAAAD/////////////////////////////////AEcrdAKI
+ BAAAABz///////////////////////////8ARysrKysrKwIDFQAc////////////////////////AAcP
+ KysrKysrKysRHxwAAP////////////////////8AHBQrKysrESsRKysrEZkcAAD/////////////////
+ /wAQFBgUFBQUGBErEREREVMfAAD///////////////8AHBAPaGgUGBEYERgRERERER1TBwD/////////
+ ////AAcQaBAUERgRGBEYEREYERgRER0uBwD///////////8AA2gPGAkYGBgYGBgYGBgYGBgYGBEuBwD/
+ ////////AHoIDwkUGBQJGBQYCRQYCRgYCRgYGIMnAAD//////wAHEEcUFBQUFBQUFBQUFBQUFBQUFAkU
+ FH8KAP////8ABwMQDxQPFA8UFA8UFBQUFBQUFBQUDxQUHVJAAP///wAcCBAPDw8PDw8PDw8PDw8PDw8P
+ FCcJDw8Pf1gA//8AAAMQEGhoaGgQaGgPEGhoD2gPD2g0S0skD2gMUgD//wAcAwNoEGgQaGhoaBBoaBBo
+ aGhoEDYgIAtQEA8sQP//ABwDCBAICBAIEAgQCGgQaBAQEAgQNSALC3WEaCxz//8AAwMICAgICAgICAgI
+ CAgICBAICA4LCws9CwoIbHP//wADAwgICAgICAgICAgICAgICAgSChI9PT2BCGgxBv//BxwDCAgICAgD
+ CAgIAwMICAgSCws1CIQgCwoINDEH//8AHAMDCAgICAgICAgIB4cICDU9CwsgJhoaCBAxbgD//wAcAwgI
+ AwgICAgDCAgDBiQQDjUgIDVVCAgILHtAAP//AAAcCAgICAgICAgICA4mAFAnGggIAwgIGldgWAD/////
+ AAcDCAgIAwgICAhVG0AAADxXUjQpJlJ7e1gA////////AAcDCAgICAgKjBtAAP8AAEA8AQ0WFm4GAP//
+ ////////AAcch4cKDlYFAAD/////AAAABwAAAAD/////////////AAAABwBAAAD/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////wH///8A
+ H///AAf//gAB//4AAH/+AAA//AAAH/gAAA/4AAAH8AAAA+AAAAPAAAABwAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAAYAAAAGAAAABgAAAA8AAAAfgAIAP8AHgH/gH//////////////////8oAAAAGAAAADAA
+ AAABAAgAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAgKOAmqC4m42Qr4CAgLGAgom0gZCUsJCAiq+HgIC
+ rgICAtYCAkLuAiYuwiY6RuK2trbyJgIS1o5KSuJCAlr6AgIi4gICErYCcnLiZhoephKWlu4CEhLWDgIy
+ 5o4CAp4CHkLqAk5i7gICArYSAhrico6W8gICAs4eAlLqAh4i2hJWVuKiAgrWfv7+/gICGt4CAmb+VhYy
+ 5gYCCqIygoLqMhoiqgLGxvYWAk72AjIy4gIKCqpaDhLaAhYu4kIuOrYCAgKWsmpq0no6WvoOtr72/gIS
+ 3jZGWuaeAmL6QgIq5gISErICAjrqAgICpgYKCrYeAg7SSiYu4sImJqYCAgrGAkpeyhYCBtayIk76Cqau
+ 8goCBs42Alb2Ar6+9gJ2iu4CBgauAgIW2gICXvo2YnLukhoa3hIGBp4SGkb6Alpu7hYqKtpqWl7mAgoO
+ 2lKKkvIuHiaqAgYKmlZCXvJqAgrKZjpKwj4CNs42AkryJjIywpYyQuoOAhLaBgJa/hICJuICAhq2mpqm
+ 8hICNuoCAgKiGgICvgICHuKqhqb2igJO8gIeJt4CWlriVgIO2gICbv4CFj7mYgoKoj6Kiu5WGiKuCgpS
+ +hoKCrIGAgKaAgIu5iIWHroCAj7uvgIKvgJOXtYCAgbaAgYG0gq+wvYCFk76jlpy8gJKWu4CAgKSfnaS
+ 6j42QsYeHibSih4eqnYyTvImsrb2Pg4i3koqKrI6Qk7OFkJS5gJ2eupepqbyDs7O9g5ievZyKjbmNlJi
+ zg5yjvYCgqL+SjJK7noWPu6mNjbePh4e2soCRvICAg6mGoaG6i4OCq5uAg7CGgIGsj4GUvJOVlrmHgIC
+ sr4GAtaCHh6mChIS2poCMuoCAgK6XgIC0h4iItomAgrapgIe3gICav4CHiKqEgJS9gK6vvYKAhbeOgJi
+ /gICOu4CAgamxgYG1gIGBs6uAlb6Clpu8gYCDsoGBhLaAgZa/hICJuZaAh62PgYCoiYCHuYaBgKaAgIu
+ 6loCDr6SwsL2dhZO/gJKXu4CAAAAAgAAAAIAAAAmAAAABgAAAAIAAAACAAAAEgAAAAIAAAAOAAAAAgAA
+ AAIAAAACAAAAAgAAAFYAAAACAAAAAgAAAAIAAAACAAAAsgAAAAIAAABKAAAABgAAAAIAAAAKAAAAAgAA
+ AAYAAAAGAAAABgAAAJYAAAAWAAAABgAAAKoAAAACAAAAAgAAAAIAAAAGAAAAVgAAAAYAAACKAAAAXgAA
+ AAIAAAAOAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////////////////////////////////
+ ////////////////////////////////////FxcGBgcXAAD/////////////////////ABEkJCQeWREH
+ Fxr/////////////////FwMPJCQkJCQPBAcXF///////////////FwQPJA8PDw8PJA8uBwD/////////
+ //8XAxsWEBAWKg8PDw8PTh8XAP///////xcXDRsQFioPKioqKg8qKk4rBwD//////xcIGxYWKioWKhYq
+ DxYqKioqDgcA////FxoEFhYqFhYqFioWFioWKhYWDw4X//8XGg0QFhYQFhYWFhYWFhYWEBYWFjIKAP8X
+ Aw0QEBAQEBAQEBAQFhAQGBgWEE41FxcaAw0bGxsbEA0bEBsQGxsbfGEBJRsZOBcaCA0NDQ0bDRsNDRsN
+ Gw0QFAwMHA2DWBcDAwgICAgICAgICAgICAggegwpDAiDhwcaCAgICAgIAwgICAgIUCArJykpRwg1WBca
+ CAgDCAgICAgDCAgODCkUFSAnFQiPExcaAwgICAMICAgDOB8VQwwpFFAIA7IBABcHAwgICAgICAgVAgI1
+ jVAVAwgIT2YoF/8XBwgICAgICJMxExcTBUsZGYxmfygA//8XFxoDCAgVIDETF/8AFygFjgUvFxf/////
+ /xcXBxOGPhcX/////xcAFwAX////////////////////////////////////////////////////////
+ /////////////////wv/////+Af///gA//j4AD/4+AAf+PAAB/jgAAPw4AAB4MAAAeCAAADAgAAAgAAA
+ AIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAEAgAgDgOAeD4D////g/////ygAAAAQAAAAIAAAAAEA
+ CAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAACApICaoLuagJK5jYCAsYCBiLKCj5OzkICIrYCAgKqAgIC
+ 1gIqLsYCNkbSJgJa+joOEp62AibiAgIW2kpmZuYCAgKeAhIm4gICTvZyWm7WGj5W5pa+wvYSAjbqAhIO
+ 1gICGrYeAgrWTgIOogJOTuICEh7Gjiou3gICLuYCEhreHgJS9lYGCpoClpbu/gICzgICZv4CAgKaFgJC
+ 7gIqKq6CAga6GgIa3sYGCsICAgbaMgICpgpCVu4O/v7+FgoO2i4KCp4CTlrqajo63joOLuq2Clb+AgJK
+ 8kYqNrYCAgaSAoKG6hICMsoCUlLeAgYGsgouOsYCAmL6JgIq5iYOEtoCZn7iShI65gISRvYiRlrqpsrK
+ 9gICPu4CGh6uvgIO2nYuPtoGAlb2Apqm8gICbv5iCkbuGgoOngYCApYaAgbKWgIq1ipCVtpaBgKuCgIC
+ 2oomSvIeGhqiBgIm5kICFt4CCgaiOgpO+gJCVuoCwsL2MgI66jICCtoCUlbmAgIy6gIaGtoCAgLSmgJq
+ /gIGBpoCAkbyAi4utgICCrqGAh7iAgIOyh4GBtpaBgamAkpe5gIKMuYWMj66CoqS7oouOsoaAmL+CnZ2
+ 6goeMuICFha6AiY+5hYCVvoCqq7yAg4Onk4AAAACAAAABgAAAL4AAAAWAAAAWgAAAEoAAAACAAAAdgAA
+ ADYAAAAeAAAAHgAAADIAAACyAAAADgAAACoAAABCAAAAQgAAAHYAAACmAAAAzgAAAGIAAAAqAAAAUgAA
+ AHIAAACCAAAAMgAAABYAAAA2AAAAHgAAAAIAAAACAAAAhgAAAA4AAAACAAAAAgAAAAYAAABWAAAAAgAA
+ AAYAAAAeAAAAEgAAAAIAAAACAAAAAgAAACIAAAACAAAAAgAAAAIAAAAeAAAAAgAAALoAAAACAAAAAgAA
+ AAIAAAACAAAABgAAAAYAAAACAAAAWgAAAAIAAAAGAAAABgAAAAIAAAACAAAABgAAAAIAAAAGAAAAAgAA
+ AAIAAADCAAAAFgAAAEoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////////////////wAHOQYAACj/////
+ //////8AFiQkJAIEBwD/////////AA0LEhIkJBYEAP//////AChnDRYSEhILEh0H/////wcOFhISEgIS
+ EhISdAf//wcDDRYWFhYWFhYWFkIKAAAoZw0NDQ0NDQ0NFgINVHMHAw4ODQ5nDg0NDi0iLQ08BwMICAgI
+ DggICAhuFXYRCgcICAgICAgICB06D0Q4HwUHAwgICAgDAx8iRHEyFy1tAAMIAwgICAk8Xl4yDi0BAAAH
+ CAgIHzonADZRLQETDP//AAAoc2VGAP8AAEYAAP//////////////////////////RAjgP///4A/gP+AH
+ 4A/AA+AHwAHAA4AAwAEAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAgIMAAf//gIMoAAAAgAAAAAAB
+ AAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAJcQAACXrwAAl78AAJevAACXgAAAl4AAAJdAAACXMAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl4AAAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl98AAJe/AACXjwAAl3AAAJdAAACXEAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACXgAAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl/8AAJf/AACX3wAAl68AAJeAAACXQAAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJdAAACX/wAA
+ l/8AHbr/ADPK/wAzyv8AGbH/ABmx/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl98AAJefAACXcAAAlzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl3AAAJf/AACX/wASv/8AZf3/AGX9/wBl/f8AZf3/AGX9/wBf
+ 9/8ATOT/ADnQ/wAsxP8AGbH/AAad/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA
+ l+8AAJevAACXYAAAlyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXgAAA
+ l/8AAJf/AA/C/wBJ9P8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AFjw/wBF
+ 3f8AM8r/ABmx/wAGnf8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl98AAJePAACXUAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJeAAACX/wAAl/8AFNH/ADft/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBS6v8AP9f/ACa9/wAN
+ pP8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX7wAAl58AAJdgAACXEAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ l68AAJf/AACX/wAU0f8AIOb/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBY8P8BOtf/Aha3/wECnv8AAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl/8AAJf/AACXrwAAl2AUGf8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXzwAAl/8AAJf/ABnf/wAb5P8AV/j/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/A1z9/wQ+5P8HFcT/BAWr/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wEC
+ nv8CAqCvBAWsUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAJf/AACX/wACnP8AG+T/ABvk/wBO9f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8EV/3/CzTx/wsV0f8EBar/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AgKe7wMDoo8ICrkwAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQAAAl/8AAJf/AAiv/wAb5P8AG+T/AEDx/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AmH9/wlK/f8SI/H/DhHR/wUG
+ qv8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8EBai/CQu5YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAJeAAACX/wAAl/8ADr7/ABvk/wAb5P8AQPH/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8IT/3/EzL+/xUb6/8MDsT/AgKd/wAAl/8AAJf/AACX/wAA
+ l/8AAJf/AgKe3wQFpnAcIv4QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl88AAJf/AACX/wAW1v8AG+T/ABvk/wAu
+ 6v8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/B1T9/xUz/v8cI/7/EhbX/wcJsf8AAJf/AACX/wAAl/8AAJf/AACX/wICnu8AAJeAAACXEAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAJcgAACX/wAAl/8AApz/ABvk/wAb5P8AG+T/AC7q/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wdV/f8WNf7/HiX+/xoh
+ 8f8MDr7/AgKd/wAAl/8AAJf/AACX/wAAl/8AAJfvAACXgAAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl3AAAJf/AACX/wAKtP8AG+T/ABvk/wAb
+ 5P8ALer/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8IVf3/GDb+/yAn/v8eJfj/EBTL/wQFpP8AAJf/AACX/wAA
+ l/8AAJf/AACX7wAAl4AAAJcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACX3wAAl/8AAJf/ABTQ/wAa4/8AGuP/ABrj/wA67v8AZPz/AGT8/wBk/P8AZP3/AGT9/wBk
+ /f8AZP3/AGT9/wBk/f8AZP3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/DE79/x0w/v8iKf7/Iir+/xUa1/8EBaT/AACX/wAAl/8AAJf/AACX/wAAl+8AAJdgAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl0AAAJf/AACX/wADoP8AGuL/ABri/wAa
+ 4/8AGuP/AD7v/wBi/P8AYvz/AGL8/wBi/P8AYvz/AGL8/wBi/P8AYvz/AGL8/wBj/P8AY/z/AGP8/wBj
+ /P8AY/z/AGP8/wBj/P8AY/z/AGP8/wBk/P8AZPz/AGT9/wBk/f8AZP3/AGT9/wBk/f8AZP3/AGT9/wBl
+ /f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AmH9/xFI/v8hL/7/Iyz+/yMs
+ /v8WG9f/BQak/wAAl/8AAJf/AACX/wAAl/8AAJffAACXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACXrwAAl/8AAJf/AA7B/wAZ4v8AGeL/ABni/wAa4v8ARfH/AGD7/wBg+/8AYPv/AGD7/wBg
+ +/8AYPv/AGD7/wBh+/8AYfv/AGH7/wBh+/8AYfv/AGH7/wBh+/8AYfv/AGH8/wBh/P8AYvz/AGL8/wBi
+ /P8AYvz/AGL8/wBi/P8AYvz/AGL8/wBi/P8AY/z/AGP8/wBj/P8AY/z/AGP8/wBj/P8AY/z/AGP8/wBj
+ /P8AY/z/AGT8/wBk/P8AZP3/AGT9/wVd/f8cO/7/JS7+/yUu/v8lLv7/Fx3X/wUGpP8AAJf/AACX/wAA
+ l/8AAJf/AACXvwAAlyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJf/AACX/wAAl/8AF9z/ABnh/wAZ
+ 4f8AGeH/ABnh/wBM9P8AXvr/AF76/wBe+v8AXvr/AF76/wBe+v8AX/r/AF/6/wBf+v8AX/r/AF/7/wBf
+ +/8AX/v/AF/7/wBf+/8AX/v/AGD7/wBg+/8AYPv/AGD7/wBg+/8AYPv/AGD7/wBg+/8AYPv/AGH7/wBh
+ +/8AYfv/AGH7/wBh+/8AYfv/AGH7/wBh+/8AYfz/AGL8/wBi/P8AYvz/AGL8/wBi/P8AYvz/AGL8/wBi
+ /P8MUv3/JDP+/ycw/v8nMP7/JzD+/xQYy/8DA53/AACX/wAAl/8AAJf/AACX/wAAl4AAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACXnwAAl/8AAJf/AAmz/wAY4f8AGOH/ABnh/wAZ4f8AGeH/AFz5/wBc+f8AXPn/AFz5/wBc
+ +f8AXPr/AF36/wBd+v8AXfr/AF36/wBd+v8AXfr/AF36/wBd+v8AXfr/AF36/wBe+v8AXvr/AF76/wBe
+ +v8AXvr/AF76/wBe+v8AXvr/AF76/wBf+v8AX/r/AF/6/wBf+/8AX/v/AF/7/wBf+/8AX/v/AF/7/wBg
+ +/8AYPv/AGD7/wBg+/8AYPv/AGD7/wBg+/8AYPv/AGD7/wBg+/8DXvv/HED9/yky/v8pMv7/KTL+/yYv
+ +P8PE77/AACX/wAAl/8AAJf/AACX/wAAl88AAJcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJf/AACX/wAAl/8AFdf/ABjg/wAY
+ 4P8AGOD/ABjg/wAo5/8AWvn/AFr5/wBa+f8AWvn/AFr5/wBb+f8AW/n/AFv5/wBb+f8AW/n/AFv5/wBb
+ +f8AW/n/AFv5/wBc+f8AV/j/AEvz/wBL8/8APu//ADvt/wA77f8AO+3/ADvt/wA77v8AP+//AEz0/wBd
+ +v8AXfr/AF36/wBd+v8AXfr/AF36/wBd+v8AXvr/AF76/wBe+v8AXvr/AF76/wBe+v8AXvr/AF76/wBe
+ +v8AXvr/AF/6/wBf+v8AX/r/EE78/yc3/v8qNP7/KjT+/yo1/v8jK+v/Cw2x/wAAl/8AAJf/AACX/wAA
+ l/8AAJeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACXnwAAl/8AAJf/AAmy/wAX4P8AF+D/ABfg/wAX4P8AF+D/ADzt/wBY+P8AWPj/AFj4/wBY
+ +P8AWfj/AFn4/wBZ+P8AWfj/AFn4/wBN9P8AQe//ADns/wAo5v8AJOX/ABjg/wAY4P8AGOD/ABjh/wAY
+ 4f8AGOH/ABjh/wAY4f8AIOT/ADHq/wBB8P8ATvT/AFv5/wBb+f8AW/n/AFv5/wBb+f8AW/n/AFz5/wBc
+ +f8AXPn/AFz5/wBc+f8AXPn/AFz5/wBc+f8AXPr/AFz6/wBd+v8AXfr/AF36/wBd+v8AXfr/BVj6/yQ9
+ /f8sNv7/LDf+/yw3/v8sN/7/GR/R/wMEnf8AAJf/AACX/wAAl/8AAJfPAACXIAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlzAAAJf/AACX/wAAl/8AFNb/ABff/wAX
+ 3/8AF9//ABff/wAX3/8ATvT/AFb3/wBW9/8AVvf/AFf3/wBP9P8AP+7/ADPq/wAn5f8AF9//ABff/wAX
+ 3/8AF9//ABfg/wAX4P8AF+D/ABfg/wAX4P8AF+D/ABfg/wAr5/8APO7/AFD1/wBZ+P8AWfj/AFn4/wBZ
+ +P8AWfj/AFn4/wBZ+P8AWfj/AFn4/wBa+P8AWvj/AFr4/wBa+P8AWvn/AFr5/wBa+f8AWvn/AFr5/wBb
+ +f8AW/n/AFv5/wBb+f8AW/n/AFv5/wBb+f8AW/n/AFv5/xdJ/P8uOf7/Ljn+/y45/v8uOf7/KDLx/wwO
+ sf8AAJf/AACX/wAAl/8AAJfvAACXUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACXvwAAl/8AAJf/AAiy/wAW3v8AFt7/ABbe/wAW3v8AFt7/ACbk/wBU9v8ATPP/AD3t/wAu
+ 5/8AHuH/ABfe/wAX3v8AF9//ABff/wAX3/8AF9//ABff/wAX3/8AF9//ABff/wAX3/8AG+H/AC7o/wBC
+ 8P8AUvb/AFb3/wBX9/8AV/f/AFf3/wBX9/8AV/f/AFf3/wBX9/8AV/f/AFf3/wBX+P8AWPj/AFj4/wBY
+ +P8AWPj/AFj4/wBY+P8AWPj/AFj4/wBY+P8AWfj/AFn4/wBZ+P8AWfj/AFn4/wBZ+P8AWfj/AFn4/wBZ
+ +P8AWfj/AFr4/wxS+v8sPP7/MDv+/zA7/v8wO/7/MDv+/xsh0f8DBJ3/AACX/wAAl/8AAJf/AACXjwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl1AAAJf/AACX/wABm/8AFdn/ABbd/wAW
+ 3f8AFt3/ABbd/wAW3f8AIeL/AB7g/wAW3f8AFt7/ABbe/wAW3v8AFt7/ABbe/wAW3v8AFt7/ABbe/wAW
+ 3v8AFt7/ABbe/wAW3v8AKeb/AD3t/wBU9v8AVPb/AFT2/wBU9v8AVfb/AFX2/wBV9v8AVfb/AFX2/wBV
+ 9/8AVff/AFX3/wBV9/8AVff/AFb3/wBW9/8AVvf/AFb3/wBW9/8AVvf/AFb3/wBW9/8AVvf/AFf3/wBX
+ 9/8AV/f/AFf3/wBX9/8AV/f/AFf3/wBX9/8AV/f/AFj4/wBY+P8AWPj/AFj4/wZU+f8oQf3/MT3+/zE9
+ /v8xPf7/MT3+/ygy6/8JDKr/AACX/wAAl/8AAJf/AACXnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAJcQAACX3wAAl/8AAJf/AAu6/wAV3P8AFdz/ABXc/wAV3f8AFd3/ABXd/wAV3f8AFt3/ABbd/wAW
+ 3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAd4P8AN+v/AE70/wBS9f8AUvX/AFL1/wBS
+ 9f8AUvX/AFP2/wBT9v8AU/b/AFP2/wBT9v8AU/b/AFP2/wBT9v8AU/b/AFP2/wBU9v8AVPb/AFT2/wBU
+ 9v8AVPb/AFT2/wBU9v8AVPb/AFT2/wBV9v8AVfb/AFX2/wBV9v8AVfb/AFX3/wBV9/8AVff/AFX3/wBW
+ 9/8AVvf/AFb3/wBW9/8AVvf/AFb3/wBW9/8gR/v/Mz/+/zM//v8zP/7/Mz/+/zA7+P8QFLf/AACX/wAA
+ l/8AAJf/AACXvwAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl48AAJf/AACX/wADoP8AFdz/ABXc/wAV
+ 3P8AFdz/ABXc/wAV3P8AFdz/ABXc/wAV3P8AFdz/ABXc/wAV3P8AFdz/ABXc/wAV3P8AFdz/ABXc/wAk
+ 4v8AQe7/AFD0/wBQ9P8AUPT/AFD1/wBQ9f8AUPX/AFD1/wBR9f8AUfX/AFH1/wBR9f8AUfX/AFH1/wBR
+ 9f8AUfX/AFH1/wBS9f8AUvX/AFL1/wBS9f8AUvX/AFL1/wBS9f8AUvX/AFL1/wBS9f8AU/b/AFP2/wBT
+ 9v8AU/b/AFP2/wBT9v8AU/b/AFP2/wBT9v8AVPb/AFT2/wBU9v8AVPb/AFT2/wBU9v8AVPb/AFT2/wBU
+ 9v8UTfn/NUH+/zVB/v81Qf7/NUH+/zVC/v8bIcv/AACX/wAAl/8AAJf/AACXzwAAlxAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAJcwAACX/wAAl/8AAJf/AA/K/wAU2/8AFNv/ABTb/wAU2/8AFNv/ABTb/wAV2/8AFdv/ABXb/wAV
+ 2/8AFdv/ABXb/wAV2/8AFdv/ABXb/wAq5P8ARvH/AE70/wBO9P8ATvT/AE70/wBO9P8ATvT/AE70/wBO
+ 9P8AT/T/AE/0/wBP9P8AT/T/AE/0/wBP9P8AT/T/AE/0/wBP9P8AUPT/AFD0/wBQ9P8AUPT/AFD0/wBQ
+ 9P8AUPX/AFD1/wBQ9f8AUPX/AFH1/wBR9f8AUfX/AFH1/wBR9f8AUfX/AFH1/wBR9f8AUfX/AFL1/wBS
+ 9f8AUvX/AFL1/wBS9f8AUvX/AFL1/wBS9f8AUvX/AFL1/wBT9v8NTvj/M0T9/zZD/v83Q/7/N0T+/zdE
+ /v8iKtf/AACX/wAAl/8AAJf/AACX7wAAlzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl88AAJf/AACX/wAGrP8AFNr/ABTa/wAU
+ 2v8AFNr/ABTa/wAU2v8AFNr/ABTa/wAU2v8AFNr/ABTa/wAU2v8AFNv/ABTb/wAp5P8ARfD/AEzz/wBM
+ 8/8ATPP/AEzz/wBM8/8ATPP/AEzz/wBM8/8ATPP/AE3z/wBN8/8ATfP/AE3z/wBN8/8ATfP/AE3z/wBN
+ 8/8ATfP/AE7z/wBO9P8ATvT/AE70/wBO9P8ATvT/AE70/wBO9P8ATvT/AE/0/wBP9P8AT/T/AE/0/wBP
+ 9P8AT/T/AE/0/wBP9P8AT/T/AE/0/wBQ9P8AUPT/AFD0/wBQ9P8AUPT/AFD1/wBQ9f8AUPX/AFD1/wBQ
+ 9f8AUfX/AFH1/wBR9f8KTvf/MUb9/zhF/v84Rv7/OEb+/zhG/v8jLNf/AACX/wAAl/8AAJf/AACX7wAA
+ lzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAJeAAACX/wAAl/8AAZv/ABLV/wAT2f8AE9n/ABPZ/wAT2f8AE9n/ABPZ/wAT2v8AE9r/ABPa/wAT
+ 2v8AE9r/ABPa/wAk4f8AQ+//AEry/wBK8v8ASvL/AEry/wBK8v8ASvL/AEry/wBK8v8ASvL/AEry/wBL
+ 8v8AS/L/AEvy/wBL8v8AS/L/AEvz/wBL8/8AS/P/AEvz/wBM8/8ATPP/AEzz/wBM8/8ATPP/AEzz/wBM
+ 8/8ATPP/AEzz/wBN8/8ATfP/AE3z/wBN8/8ATfP/AE3z/wBN8/8ATfP/AE3z/wBN8/8ATvP/AE70/wBO
+ 9P8ATvT/AE70/wBO9P8ATvT/AE70/wBO9P8AT/T/AE/0/wBP9P8AT/T/AE/0/wBP9P8ETvX/L0j8/zpI
+ /v86SP7/Okj+/zpI/v8vO+v/BAWd/wAAl/8AAJf/AACX7wAAlzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXMAAAl/8AAJf/AACX/wAMwP8AE9j/ABPY/wAT
+ 2f8AE9n/ABPZ/wAT2f8AE9n/ABPZ/wAT2f8AE9n/ABPZ/wAd3v8AOuv/AEfx/wBI8f8ASPH/AEjx/wBI
+ 8f8ASPH/AEjx/wBI8f8ASPH/AEjx/wBJ8f8ASfH/AEny/wBJ8v8ASfL/AEny/wBJ8v8ASfL/AEny/wBJ
+ 8v8ASvL/AEry/wBK8v8ASvL/AEry/wBK8v8ASvL/AEry/wBK8v8AS/L/AEvy/wBL8v8AS/L/AEvy/wBL
+ 8v8AS/P/AEvz/wBL8/8AS/P/AEzz/wBM8/8ATPP/AEzz/wBM8/8ATPP/AEzz/wBM8/8ATPP/AE3z/wBN
+ 8/8ATfP/AE3z/wBN8/8ATfP/AE3z/wBN8/8ETfT/MEr8/zxK/v88Sv7/PEr+/zxK/v8xPOv/BAWd/wAA
+ l/8AAJf/AACX7wAAlzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ lxAAAJffAACX/wAAl/8ABqv/ABLY/wAS2P8AEtj/ABLY/wAS2P8AEtj/ABLY/wAS2P8AEtj/ABLY/wAV
+ 2v8AL+b/AEXw/wBF8P8ARvD/AEbw/wBG8P8ARvD/AEbw/wBG8P8ARvD/AEbx/wBG8f8AR/H/AEfx/wBH
+ 8f8AR/H/AEfx/wBH8f8AR/H/AEfx/wBH8f8AR/H/AEjx/wBI8f8ASPH/AEjx/wBI8f8ASPH/AEjx/wBI
+ 8f8ASPH/AEnx/wBJ8f8ASfL/AEny/wBJ8v8ASfL/AEny/wBJ8v8ASfL/AEny/wBK8v8ASvL/AEry/wBK
+ 8v8ASvL/AEry/wBK8v8ASvL/AEry/wBL8v8AS/L/AEvy/wBL8v8AS/L/AEvy/wBL8/8AS/P/AEvz/wBM
+ 8/8ATPP/Jkv6/z1M/v89TP7/PUz+/z1M/v8yPuv/BAWd/wAAl/8AAJf/AACX7wAAlzAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXnwAAl/8AAJf/AAGb/wAR1P8AEtj/ABLY/wAS
+ 2P8AEtj/ABLY/wAS2P8AEtj/ABLY/wAS2P8AHt7/AD3s/wBD7/8AQ+//AETv/wBE7/8ARPD/AETw/wBE
+ 8P8ARPD/AETw/wBE8P8ARPD/AEXw/wBF8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBG
+ 8P8ARvD/AEbw/wBG8P8ARvD/AEbw/wBG8f8ARvH/AEbx/wBH8f8AR/H/AEfx/wBH8f8AR/H/AEfx/wBH
+ 8f8AR/H/AEfx/wBI8f8ASPH/AEjx/wBI8f8ASPH/AEjx/wBI8f8ASPH/AEjx/wBI8f8ASfH/AEnx/wBJ
+ 8v8ASfL/AEny/wBJ8v8ASfL/AEny/wBJ8v8ASvL/AEry/wBK8v8ASvL/J0z6/z9O/v8/Tv7/P07+/z9O
+ /v8zQOv/BAWd/wAAl/8AAJf/AACX3wAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ l1AAAJf/AACX/wAAl/8ADMP/ABHX/wAR1/8AEdf/ABHX/wAR1/8AEdf/ABHX/wAR1/8AEdf/ACzk/wBB
+ 7/8AQe//AEHv/wBC7/8AQu//AELv/wBC7/8AQu//AELv/wBC7/8AQu//AELv/wBD7/8AQ+//AEPv/wBD
+ 7/8AQ+//AEPv/wBD7/8AQ+//AEPv/wBE7/8ARO//AETv/wBE8P8ARPD/AETw/wBE8P8ARPD/AETw/wBE
+ 8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBF8P8ARvD/AEbw/wBG8P8ARvD/AEbw/wBG
+ 8P8ARvD/AEbx/wBG8f8ARvH/AEfx/wBH8f8AR/H/AEfx/wBH8f8AR/H/AEfx/wBH8f8AR/H/AEjx/wBI
+ 8f8ASPH/AEjx/wBI8f8ASPH/KEz5/0FQ/v9BUP7/QVD+/0FQ/v81Qev/BAWd/wAAl/8AAJf/AACXzwAA
+ lxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcwAACX7wAAl/8AAJf/AAez/wAR1v8AEdb/ABHW/wAR
+ 1v8AEdb/ABHW/wAR1/8AEdf/ABfZ/wA26f8AP+7/AD/u/wBA7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBA
+ 7v8AQO7/AEDu/wBA7v8AQe7/AEHu/wBB7v8AQe7/AEHu/wBB7v8AQe7/AEHv/wBB7/8AQu//AELv/wBC
+ 7/8AQu//AELv/wBC7/8AQu//AELv/wBC7/8AQu//AEPv/wBD7/8AQ+//AEPv/wBD7/8AQ+//AEPv/wBD
+ 7/8AQ+//AETv/wBE7/8ARPD/AETw/wBE8P8ARPD/AETw/wBE8P8ARPD/AEXw/wBF8P8ARfD/AEXw/wBF
+ 8P8ARfD/AEXw/wBF8P8ARfD/AEXw/wBG8P8ARvD/AEbw/wBG8P8ARvD/AEbw/wBG8P8ARvH/KU35/0JS
+ /v9CUv7/Q1L+/0NS/v8yPuT/AACX/wAAl/8AAJf/AACXnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXEAAA
+ l88AAJf/AACX/wADo/8AD9H/ABDW/wAQ1v8AENb/ABDW/wAQ1v8AENb/ABDW/wAb3P8AOuv/AD3t/wA9
+ 7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+7f8APu3/AD/t/wA/7f8AP+3/AD/u/wA/
+ 7v8AP+7/AD/u/wA/7v8AP+7/AEDu/wBA7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBB
+ 7v8AQe7/AEHu/wBB7v8AQe7/AEHu/wBB7v8AQe//AEHv/wBC7/8AQu//AELv/wBC7/8AQu//AELv/wBC
+ 7/8AQu//AELv/wBD7/8AQ+//AEPv/wBD7/8AQ+//AEPv/wBD7/8AQ+//AEPv/wBD7/8ARO//AETv/wBE
+ 8P8ARPD/AETw/wBE8P8ARPD/AETw/wBE8P8ARfD/N1H7/0RU/v9EVP7/RFT+/0RV/v8rNdf/AACX/wAA
+ l/8AAJf/AACXcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJefAACX/wAAl/8AAZv/AAzJ/wAP1f8AD9X/ABDV/wAQ
+ 1f8AENX/ABDV/wAQ1f8AIN7/ADvs/wA77P8AO+z/ADzs/wA87P8APOz/ADzs/wA87P8APOz/ADzs/wA8
+ 7P8APO3/ADzt/wA97f8APe3/AD3t/wA97f8APe3/AD3t/wA97f8APe3/AD3t/wA+7f8APu3/AD7t/wA+
+ 7f8APu3/AD7t/wA+7f8APu3/AD7t/wA/7f8AP+3/AD/t/wA/7v8AP+7/AD/u/wA/7v8AP+7/AD/u/wA/
+ 7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBA7v8AQe7/AEHu/wBB7v8AQe7/AEHu/wBB
+ 7v8AQe7/AEHu/wBB7/8AQe//AELv/wBC7/8AQu//AELv/wBC7/8AQu//AELv/wBC7/8AQu//AEPv/wBD
+ 7/8ERPD/QVX9/0ZW/v9GVv7/Rlf9/0ZX/f8fJsT/AACX/wAAl/8AAJf/AACXMAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXYAAA
+ l/8AAJf/AACX/wAJvf8AD9T/AA/U/wAP1P8AD9T/AA/U/wAP1P8AD9T/ACTg/wA56/8AOev/ADnr/wA6
+ 6/8AOuv/ADrr/wA66/8AOuz/ADrs/wA67P8AOuz/ADrs/wA77P8AO+z/ADvs/wA77P8AO+z/ADvs/wA7
+ 7P8AO+z/ADvs/wA77P8APOz/ADzs/wA87P8APOz/ADzs/wA87P8APOz/ADzs/wA87f8APe3/AD3t/wA9
+ 7f8APe3/AD3t/wA97f8APe3/AD3t/wA97f8APe3/AD7t/wA+7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+
+ 7f8APu3/AD/t/wA/7f8AP+3/AD/u/wA/7v8AP+7/AD/u/wA/7v8AP+7/AD/u/wBA7v8AQO7/AEDu/wBA
+ 7v8AQO7/AEDu/wBA7v8AQO7/AEDu/wBB7v8AQe7/AEHu/wBB7v8NRfH/R1j9/0dY/f9IWf3/SFn9/0hZ
+ /f8OEar/AACX/wAAl/8AAJffAACXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl0AAAJf/AACX/wAAl/8ABrH/AA7T/wAP0/8AD9P/AA/T/wAP
+ 0/8AD9P/AA/T/wAo4v8AN+r/ADfq/wA36/8AOOv/ADjr/wA46/8AOOv/ADjr/wA46/8AOOv/ADjr/wA4
+ 6/8AOev/ADnr/wA56/8AOev/ADnr/wA56/8AOev/ADnr/wA56/8AOev/ADrr/wA66/8AOuv/ADrs/wA6
+ 7P8AOuz/ADrs/wA67P8AOuz/ADvs/wA77P8AO+z/ADvs/wA77P8AO+z/ADvs/wA77P8AO+z/ADzs/wA8
+ 7P8APOz/ADzs/wA87P8APOz/ADzs/wA87P8APOz/ADzt/wA97f8APe3/AD3t/wA97f8APe3/AD3t/wA9
+ 7f8APe3/AD3t/wA+7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+7f8APu3/AD7t/wA+7f8AP+3/AD/t/wA/
+ 7f8AP+7/AD/u/wA/7v8gS/T/SVr9/0la/f9JW/3/SVv9/0BP8P8FBp3/AACX/wAAl/8AAJePAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcgAACX7wAA
+ l/8AAJf/AASm/wAO0v8ADtL/AA7S/wAO0v8ADtL/AA7S/wAO0/8AId7/ADXq/wA16v8ANer/ADbq/wA2
+ 6v8ANur/ADbq/wA26v8ANur/ADbq/wA26v8ANur/ADfq/wA36v8AN+r/ADfq/wA36v8AN+r/ADfq/wA3
+ 6v8AN+r/ADfr/wA46/8AOOv/ADjr/wA46/8AOOv/ADjr/wA46/8AOOv/ADjr/wA56/8AOev/ADnr/wA5
+ 6/8AOev/ADnr/wA56/8AOev/ADnr/wA66/8AOuv/ADrr/wA66/8AOuz/ADrs/wA67P8AOuz/ADrs/wA6
+ 7P8AO+z/ADvs/wA77P8AO+z/ADvs/wA77P8AO+z/ADvs/wA77P8APOz/ADzs/wA87P8APOz/ADzs/wA8
+ 7P8APOz/ADzs/wA87f8APO3/AD3t/wA97f8APe3/AD3t/wA97f8APe3/AD3t/wA97f8zUvj/S139/0td
+ /f9LXf3/S139/zRA3f8AAJf/AACX/wAAl/8AAJdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACXEAAAl88AAJf/AACX/wACnv8ADM7/AA7S/wAO0v8ADtL/AA7S/wAO
+ 0v8ADtL/ABza/wAz6f8AM+n/ADPp/wA06f8ANOn/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/ADTp/wA1
+ 6f8ANen/ADXp/wA16f8ANer/ADXq/wA16v8ANer/ADXq/wA26v8ANur/ADbq/wA26v8ANur/ADbq/wA2
+ 6v8ANur/ADbq/wA26v8AN+r/ADfq/wA36v8AN+r/ADfq/wA36v8AN+r/ADfq/wA36v8AOOv/ADjr/wA4
+ 6/8AOOv/ADjr/wA46/8AOOv/ADjr/wA46/8AOOv/ADnr/wA56/8AOev/ADnr/wA56/8AOev/ADnr/wA5
+ 6/8AOev/ADrr/wA66/8AOuv/ADrr/wA67P8AOuz/ADrs/wA67P8AOuz/ADvs/wA77P8AO+z/ADvs/wA7
+ 7P8AO+z/ADvs/wA77P8AO+z/ADvs/wU+7f9HXPz/TF/9/01f/f9NX/3/TV/9/xget/8AAJf/AACX/wAA
+ l88AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJfPAACX/wAA
+ l/8AAZv/AAvG/wAN0f8ADdH/AA3R/wAN0f8ADdH/AA3R/wAW1/8AMej/ADHo/wAy6P8AMuj/ADLo/wAy
+ 6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy6P8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz
+ 6f8ANOn/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/ADXp/wA16f8ANen/ADXp/wA1
+ 6v8ANer/ADXq/wA16v8ANer/ADbq/wA26v8ANur/ADbq/wA26v8ANur/ADbq/wA26v8ANur/ADbq/wA3
+ 6v8AN+r/ADfq/wA36v8AN+r/ADfq/wA36v8AN+r/ADfr/wA46/8AOOv/ADjr/wA46/8AOOv/ADjr/wA4
+ 6/8AOOv/ADjr/wA56/8AOev/ADnr/wA56/8AOev/ADnr/wA56/8AOev/ADnr/wA56/8AOuv/ADrr/xhG
+ 8f9OYf3/TmH9/05h/f9OYf3/SVv3/wUGnf8AAJf/AACX/wAAl3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACXgAAAl/8AAJf/AACX/wAIu/8ADdD/AA3Q/wAN0P8ADdD/AA3Q/wAN
+ 0P8AEdP/AC3m/wAv5/8AMOf/ADDn/wAw5/8AMOf/ADDn/wAw6P8AMOj/ADDo/wAw6P8AMOj/ADHo/wAx
+ 6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx6P8AMej/ADLo/wAy6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy
+ 6P8AMuj/ADLp/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wA06f8ANOn/ADTp/wA0
+ 6f8ANOn/ADTp/wA06f8ANOn/ADTp/wA16f8ANen/ADXp/wA16f8ANen/ADXq/wA16v8ANer/ADXq/wA1
+ 6v8ANur/ADbq/wA26v8ANur/ADbq/wA26v8ANur/ADbq/wA26v8AN+r/ADfq/wA36v8AN+r/ADfq/wA3
+ 6v8AN+r/ADfq/wA36v8AN+v/ADjr/wA46/8AOOv/ADjr/zdV9/9QY/3/UGP9/1Bj/f9QY/3/Mj7X/wAA
+ l/8AAJf/AACX7wAAlxAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJfvAACX/wAA
+ l/8AB7f/AAzP/wAMz/8ADM//AAzP/wAMz/8ADM//AAzP/wAl4f8ALeb/AC7m/wAu5/8ALuf/AC7n/wAu
+ 5/8ALuf/AC7n/wAu5/8ALuf/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAw
+ 5/8AMOf/ADDn/wAw5/8AMOf/ADDo/wAw6P8AMOj/ADDo/wAx6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx
+ 6P8AMej/ADHo/wAx6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy6P8AM+n/ADPp/wAz
+ 6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/ADTp/wA0
+ 6f8ANOn/ADXp/wA16f8ANen/ADXp/wA16v8ANer/ADXq/wA16v8ANer/ADXq/wA26v8ANur/ADbq/wA2
+ 6v8ANur/BTnr/0xi/P9RZf3/UmX9/1Jl/f9SZf3/FBmx/wAAl/8AAJf/AACXgAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACXvwAAl/8AAJf/AAOl/wALz/8AC8//AAvP/wALz/8AC8//AAvP/wAL
+ z/8AGdn/ACvm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAt5v8ALeb/AC3m/wAt
+ 5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALub/AC7n/wAu5/8ALuf/AC7n/wAu5/8ALuf/AC7n/wAu
+ 5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/ADDn/wAw5/8AMOf/ADDn/wAw
+ 5/8AMOj/ADDo/wAw6P8AMOj/ADHo/wAx6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx6P8AMej/ADLo/wAy
+ 6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAz6f8AM+n/ADPp/wAz6f8AM+n/ADPp/wAz
+ 6f8AM+n/ADPp/wAz6f8ANOn/ADTp/wA06f8ANOn/ADTp/wA06f8ANOn/H0fx/1Nn/f9TZ/3/U2f9/1Nn
+ /f8/TeT/AACX/wAAl/8AAJfvAACXEAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl1AAAJf/AACX/wAA
+ l/8ACsj/AAvP/wALz/8AC8//AAvP/wALz/8AC8//AA/S/wAn4/8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq
+ 5f8AKuX/ACrl/wAq5f8AK+X/ACvl/wAr5f8AK+X/ACvl/wAr5f8AK+b/ACvm/wAr5v8AK+b/ACzm/wAs
+ 5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt
+ 5v8ALeb/AC3m/wAu5/8ALuf/AC7n/wAu5/8ALuf/AC7n/wAu5/8ALuf/AC7n/wAv5/8AL+f/AC/n/wAv
+ 5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAw5/8AMOf/ADDn/wAw5/8AMOf/ADDn/wAw6P8AMOj/ADDo/wAw
+ 6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx6P8AMej/ADHo/wAx6P8AMuj/ADLo/wAy6P8AMuj/ADLo/wAy
+ 6P8AMuj/ADLo/wAy6P8AMuj/P1v4/1Vp/f9Vaf3/VWn9/1Vp/f8VGrH/AACX/wAAl/8AAJeAAAAAAAAA
+ AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACX3wAAl/8AAJf/AAWy/wAKzv8ACs7/AArO/wAKzv8ACs7/AArO/wAK
+ zv8AHdz/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACnk/wAp5f8AKeX/ACnl/wAp
+ 5f8AKeX/ACnl/wAp5f8AKeX/ACnl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAr
+ 5f8AK+X/ACvl/wAr5f8AK+X/ACvl/wAr5v8AK+b/ACvm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs
+ 5v8ALOb/ACzm/wAs5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALub/AC7n/wAu
+ 5/8ALuf/AC7n/wAu5/8ALuf/AC7n/wAu5/8ALuf/AC/n/wAv5/8AL+f/AC/n/wAv5/8AL+f/AC/n/wAv
+ 5/8AL+f/ADDn/wAw5/8AMOf/ADDn/wAw5/8AMOj/ADDo/wAw6P8AMOj/ADDo/wAx6P8WP+3/Vmv9/1dr
+ /f9Xa/3/V2v9/0FQ5P8AAJf/AACX/wAAl+8AAJcQAAAAAAAAAAAAAAAA////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl3AAAJf/AACX/wAB
+ nv8ACcr/AArN/wAKzf8ACs3/AArN/wAKzf8ACs3/AA3Q/wAm4/8AJuP/ACbj/wAm4/8AJuP/ACbj/wAm
+ 5P8AJuT/ACbk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAo5P8AKOT/ACjk/wAo
+ 5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKeT/ACnl/wAp5f8AKeX/ACnl/wAp5f8AKeX/ACnl/wAp
+ 5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACvl/wAr5f8AK+X/ACvl/wAr
+ 5f8AK+b/ACvm/wAr5v8AK+b/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAt
+ 5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAt5v8ALeb/AC3m/wAu5v8ALuf/AC7n/wAu5/8ALuf/AC7n/wAu
+ 5/8ALuf/AC7n/wAv5/8AL+f/AC/n/wAv5/9CXfj/WG39/1ht/f9Ybf3/WG39/xYbsf8AAJf/AACX/wAA
+ l2AAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAJcQAACX7wAAl/8AAJf/AAa4/wAJzP8ACcz/AAnM/wAJzP8ACcz/AAnM/wAK
+ zP8AGtr/ACTj/wAk4/8AJOP/ACTj/wAk4/8AJOP/ACTj/wAk4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl
+ 4/8AJeP/ACXj/wAl4/8AJuP/ACbj/wAm4/8AJuP/ACbj/wAm4/8AJuP/ACbk/wAm5P8AJuT/ACfk/wAn
+ 5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo
+ 5P8AKOT/ACjk/wAp5P8AKeX/ACnl/wAp5f8AKeX/ACnl/wAp5f8AKeX/ACnl/wAq5f8AKuX/ACrl/wAq
+ 5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAr5f8AK+X/ACvl/wAr5f8AK+X/ACvl/wAr5v8AK+b/ACvm/wAr
+ 5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALOb/ACzm/wAs5v8ALeb/AC3m/wAt5v8ALeb/AC3m/xY9
+ 7P9ab/3/Wm/9/1pv/f9ab/3/OEbX/wAAl/8AAJf/AACXzwAAAAAAAAAAAAAAAP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl4AAAJf/AACX/wAB
+ nv8ACcv/AAnL/wAJy/8ACcv/AAnM/wAJzP8ACcz/AAzO/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAi
+ 4v8AIuL/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ACTi/wAk4v8AJOP/ACTj/wAk
+ 4/8AJOP/ACTj/wAk4/8AJOP/ACTj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAm
+ 4/8AJuP/ACbj/wAm4/8AJuP/ACbj/wAm4/8AJuT/ACbk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn
+ 5P8AJ+T/ACfk/wAn5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKeT/ACnk/wAp
+ 5f8AKeX/ACnl/wAp5f8AKeX/ACnl/wAp5f8AKeX/ACrl/wAq5f8AKuX/ACrl/wAq5f8AKuX/ACrl/wAq
+ 5f8AKuX/ACvl/wAr5f8AK+X/ACvl/wAr5f8AK+X/ACvm/0Rf9/9bcf3/XHH9/1xx/f9ccf3/Bged/wAA
+ l/8AAJf/AACXIAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
+ AAAAAAAAAAAAAAAAAAAAAJcQAACX7wAAl/8AAJf/AAa6/wAIy/8ACMv/AAjL/wAIy/8ACMv/AAnL/wAJ
+ y/8AFNb/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAh4f8AIeH/ACHh/wAh4f8AIeH/ACHh/wAh
+ 4f8AIeL/ACHi/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAj4v8AI+L/ACPi/wAj
+ 4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj4v8AJOL/ACTi/wAk4/8AJOP/ACTj/wAk4/8AJOP/ACTj/wAk
+ 4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACbj/wAm4/8AJuP/ACbj/wAm
+ 4/8AJuP/ACbk/wAm5P8AJuT/ACfk/wAn5P8AJ+T/ACfk/wAn5P8wUOn/SWXs/0Jf6/8yUun/GT3n/wAo
+ 5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAo5P8AKOT/ACjk/wAp5P8AKeX/ACnl/wAp5f8AKeX/ACnl/wAp
+ 5f8AKeX/Fzvr/11z/f9dc/3/XXP9/11z/f8pM8T/AACX/wAAl/8AAJePAAAAAAAAAAD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAl2AAAJf/AACX/wAB
+ of8ACMr/AAjK/wAIyv8ACMr/AAjK/wAIyv8ACMr/AAjK/wAc3/8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe
+ 4P8AH+D/AB/g/wAf4f8AH+H/AB/h/wAf4f8AH+H/AB/h/wAf4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAg
+ 4f8AIOH/ACDh/wAg4f8AIeH/ACHh/wAh4f8AIeH/ACHh/wAh4f8AIeH/ACHi/wAh4v8AIeL/ACLi/wAi
+ 4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj
+ 4v8AI+L/ACPi/wAk4v8AJOL/ACTj/wAk4/8AJOP/ACTj/wAk4/8AJOP/ACTj/wAl4/8AJeP/ACXj/wAl
+ 4/8AJeP/ACXj/0Fd6v+ElvL/hpjy/4iZ8v+Jm/L/gpXy/1hx7f8kROf/ACbj/wAm4/8AJuT/ACbk/wAm
+ 5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn5P8AJ+T/ACfk/wAn5P8AKOT/U2v6/191/f9fdf3/X3X9/01g
+ 6v8AAJf/AACX/wAAl88AAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAACX3wAAl/8AAJf/AAS2/wAHyf8AB8n/AAfJ/wAHyf8AB8n/AAfJ/wAH
+ yf8AD9L/ABzf/wAc3/8AHN//ABzf/wAc4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd
+ 4P8AHeD/AB7g/wAe4P8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe4P8AHuD/AB/g/wAf4P8AH+D/AB/h/wAf
+ 4f8AH+H/AB/h/wAf4f8AH+H/AB/h/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAh
+ 4f8AIeH/ACHh/wAh4f8AIeH/ACHh/wAh4f8AIeL/ACHi/wAi4v8AIuL/ACLi/wAi4v8AIuL/ACLi/wAi
+ 4v8AIuL/ACLi/wAi4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ZHnu/4eY8v+JmfL/ipvy/4yc
+ 8/+OnvP/kJ/z/5Gh8/9ug+//JUTn/wAk4/8AJOP/ACXj/wAl4/8AJeP/ACXj/wAl4/8AJeP/ACXj/wAl
+ 4/8AJeP/ACbj/wAm4/8qSe//YHf9/2B3/f9hd/3/YXj9/wwPpP8AAJf/AACX/wAAlyAAAAAA////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAl1AAAJf/AACX/wAB
+ nf8AB8j/AAfI/wAHyP8AB8j/AAfI/wAHyP8AB8j/AAfJ/wAV2f8AGt//ABrf/wAa3/8AGt//ABvf/wAb
+ 3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb3/8AG9//ABzf/wAc3/8AHN//ABzf/wAc3/8AHN//ABzf/wAc
+ 3/8AHOD/ABzg/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAe4P8AHuD/AB7g/wAe
+ 4P8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe4P8AH+D/AB/g/wAf4P8AH+H/AB/h/wAf4f8AH+H/AB/h/wAf
+ 4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/ACHh/wAh4f8AIeH/ACHh/wAh
+ 4f8AIeH/ACHh/wAh4v9vgu//ipny/4yb8v+NnPL/j57y/5Gf8v+SofL/lKLz/5ak8/+XpfP/aX7u/wor
+ 4/8AI+L/ACPi/wAj4v8AI+L/ACPi/wAj4v8AI+L/ACPi/wAk4v8AJOL/ACTj/wwu5v9ief3/Ynn9/2J5
+ /f9iev3/KzXE/wAAl/8AAJf/AACXYAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAAAAAAAAAAAAAAAAAACXrwAAl/8AAJf/AAOy/wAGx/8ABsf/AAbI/wAGyP8ABsj/AAbI/wAG
+ yP8ACMv/ABje/wAY3v8AGN7/ABje/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAa
+ 3v8AGt7/ABre/wAa3v8AGt//ABrf/wAa3/8AGt//ABrf/wAa3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb
+ 3/8AG9//ABvf/wAb3/8AHN//ABzf/wAc3/8AHN//ABzf/wAc3/8AHN//ABzf/wAc4P8AHOD/AB3g/wAd
+ 4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB7g/wAe4P8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe
+ 4P8AHuD/AB7g/wAf4P8AH+D/AB/h/wAf4f8AH+H/AB/h/wAf4f8AH+H/AB/h/4ua8f+Nm/H/j53y/5Ce
+ 8v+Sn/L/k6Hy/5Wi8/+XpPP/maXz/5qn8/+cqfT/lKHz/x475f8AIeH/ACHh/wAh4f8AIeH/ACHi/wAh
+ 4v8AIuL/ACLi/wAi4v8AIuL/ACLi/1Fq+P9ke/3/ZHv9/2R8/f9FVd3/AACX/wAAl/8AAJefAAAAAP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAlxAAAJf/AACX/wAA
+ l/8ABcT/AAbH/wAGx/8ABsf/AAbH/wAGx/8ABsf/AAbH/wAN0f8AFt3/ABbd/wAW3f8AF93/ABfd/wAX
+ 3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX3v8AGN7/ABje/wAY3v8AGN7/ABje/wAY3v8AGN7/ABje/wAY
+ 3v8AGN7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABre/wAa3v8AGt7/ABre/wAa
+ 3/8AGt//ABrf/wAa3/8AGt//ABrf/wAb3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb3/8AG9//ABvf/wAc
+ 3/8AHN//ABzf/wAc3/8AHN//ABzf/wAc3/8AHN//ABzg/wAd4P8AHeD/AB3g/wAd4P8AHeD/AB3g/wAd
+ 4P8AHeD/AB3g/wAd4P8jPeT/jpvx/5Cc8v+RnvL/k6Dy/5Wh8v+Wo/P/mKTz/5qm8/+bp/P/nanz/5+r
+ 8/+hrPT/oq30/z5V6P8AH+H/AB/h/wAf4f8AH+H/ACDh/wAg4f8AIOH/ACDh/wAg4f8AIOH/LEnt/2V9
+ /f9lff3/ZX79/1929/8AAJf/AACX/wAAl98AAAAA////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAAAAAAAAAAACXcAAAl/8AAJf/AAKp/wAFxv8ABcb/AAXG/wAFxv8ABcb/AAXG/wAF
+ xv8ABcb/ABLZ/wAU3P8AFNz/ABXc/wAV3P8AFdz/ABXc/wAV3f8AFd3/ABXd/wAV3f8AFd3/ABbd/wAW
+ 3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAX3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX
+ 3f8AF93/ABfe/wAY3v8AGN7/ABje/wAY3v8AGN7/ABje/wAY3v8AGN7/ABje/wAZ3v8AGd7/ABne/wAZ
+ 3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGt7/ABre/wAa3v8AGt//ABrf/wAa3/8AGt//ABrf/wAa
+ 3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb3/8AG9//ABvf/wAb3/8AG9//ABzf/1Fj6f+RnfL/kp7y/5Sg
+ 8v+WofL/mKPy/5mk8/+bpvP/najz/56p8/+gq/P/oqz0/6Ou9P+lr/T/p7H0/z9V6P8AHeD/AB7g/wAe
+ 4P8AHuD/AB7g/wAe4P8AHuD/AB7g/wAe4P8TMOb/Z3/9/2d//f9ngP3/Z4D9/w0QpP8AAJf/AACX/wAA
+ lxD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAJfPAACX/wAA
+ l/8AA7f/AAXG/wAFxv8ABcb/AAXG/wAFxv8ABcb/AAXG/wAHyv8AEtv/ABPc/wAT3P8AE9z/ABPc/wAT
+ 3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAU3P8AFNz/ABTc/wAU3P8AFNz/ABTc/wAU3P8AFNz/ABTc/wAU
+ 3P8AFdz/ABXc/wAV3P8AFdz/ABXd/wAV3f8AFd3/ABXd/wAV3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAW
+ 3f8AFt3/ABbd/wAW3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX3f8AF97/ABje/wAY
+ 3v8AGN7/ABje/wAY3v8AGN7/ABje/wAY3v8AGN7/ABne/wAZ3v8AGd7/ABne/wAZ3v8AGd7/ABne/wAZ
+ 3v8AGd7/ABne/wAa3v8AGt7/gI3v/5Se8v+VoPL/l6Ly/5mj8v+apfL/nKby/56o8/+fqfP/oavz/6Os
+ 9P+lrvT/pq/0/6ix9P+psvT/oavz/yA54/8AHN//ABzf/wAc3/8AHN//ABzf/wAc3/8AHN//ABzg/wAc
+ 4P9ogf3/aYH9/2mC/f9pgv3/ISm3/wAAl/8AAJf/AACXQP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wAAAAAAAACXEAAAl/8AAJf/AACa/wAExf8ABMX/AATF/wAExf8ABMX/AATG/wAE
+ xv8ABMb/AAvR/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR2/8AEtv/ABLb/wAS
+ 2/8AEtv/ABLb/wAS2/8AEtv/ABLb/wAS2/8AE9z/ABPc/wAT3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAT
+ 3P8AE9z/ABTc/wAU3P8AFNz/ABTc/wAU3P8AFNz/ABTc/wAU3P8AFNz/ABXc/wAV3P8AFdz/ABXc/wAV
+ 3f8AFd3/ABXd/wAV3f8AFd3/ABXd/wAW3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAW3f8AFt3/ABbd/wAX
+ 3f8AF93/ABfd/wAX3f8AF93/ABfd/wAX3f8AF93/ABfd/wAY3v8AGN7/ABje/xwx4f+Vn/H/lqDx/5ii
+ 8v+ao/L/nKXy/52n8v+fqPP/oarz/6Kr8/+krfP/pq7z/6ew8/+psfT/q7P0/6y09P+utvT/mqTy/wsk
+ 4P8AGt7/ABrf/wAa3/8AGt//ABrf/wAa3/8AGt//ABvf/1Bp9f9qg/3/aoT9/2qE/f81Qsr/AACX/wAA
+ l/8AAJdg////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAJdgAACX/wAA
+ l/8AAaj/AATF/wAExf8ABMX/AATF/wAExf8ABMX/AATF/wAExf8ADdb/AA/a/wAP2v8AD9r/AA/a/wAP
+ 2v8AD9r/AA/a/wAP2v8AD9r/ABDa/wAQ2v8AENr/ABDa/wAQ2v8AENv/ABDb/wAQ2/8AENv/ABHb/wAR
+ 2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAS2/8AEtv/ABLb/wAS2/8AEtv/ABLb/wAS
+ 2/8AEtv/ABLb/wAT3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAU3P8AFNz/ABTc/wAU
+ 3P8AFNz/ABTc/wAU3P8AFNz/ABTc/wAU3P8AFdz/ABXc/wAV3P8AFdz/ABXd/wAV3f8AFd3/ABXd/wAV
+ 3f8AFt3/ABbd/wAW3f8AFt3/Xmzq/5ih8f+ZovL/m6Ty/52m8v+ep/L/oKny/6Kq8v+kq/L/pa3z/6ev
+ 8/+psPP/qrL0/6yz9P+ttfT/r7f1/7G49f+zuvX/cX7s/wAY3v8AGN7/ABje/wAY3v8AGN7/ABje/wAZ
+ 3v8AGd7/PFXv/2yF/f9shv3/bIb9/0pc3f8AAJf/AACX/wAAl4D///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAAAAAAAAl58AAJf/AACX/wACs/8AA8T/AAPE/wADxP8AA8T/AAPE/wAD
+ xP8AA8T/AATH/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAO2v8ADtr/AA7a/wAO
+ 2v8ADtr/AA7a/wAO2v8ADtr/AA7a/wAP2v8AD9r/AA/a/wAP2v8AD9r/AA/a/wAP2v8AD9r/AA/a/wAQ
+ 2v8AENr/ABDa/wAQ2v8AENr/ABDb/wAQ2/8AENv/ABDb/wAQ2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR
+ 2/8AEdv/ABHb/wAR2/8AEtv/ABLb/wAS2/8AEtv/ABLb/wAS2/8AEtv/ABLb/wAS2/8AEtz/ABPc/wAT
+ 3P8AE9z/ABPc/wAT3P8AE9z/ABPc/wAT3P8AE9z/ABTc/wAU3P8AFNz/ABTc/wod3f+ZofH/m6Px/5yk
+ 8f+epvH/oKfy/6Gp8v+jqvL/pazz/6eu8/+or/P/qrH0/6uy9P+ttPT/r7X0/7C39f+yufX/tLr1/7W8
+ 9f+3vfX/LkDj/wAW3f8AFt3/ABbd/wAW3f8AF93/ABfd/wAX3f83T+3/bYf9/26I/f9uiP3/Umbk/wAA
+ l/8AAJf/AACXn////wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAACX3wAA
+ l/8AAJf/AALA/wADw/8AA8P/AAPD/wADw/8AA8P/AAPD/wADw/8ABsz/AAvY/wAL2P8AC9j/AAvZ/wAL
+ 2f8AC9n/AAvZ/wAM2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAM2f8ADdn/AA3Z/wAN
+ 2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN2f8ADtn/AA7a/wAO2v8ADtr/AA7a/wAO2v8ADtr/AA7a/wAO
+ 2v8ADtr/AA/a/wAP2v8AD9r/AA/a/wAP2v8AD9r/AA/a/wAP2v8AD9r/ABDa/wAQ2v8AENr/ABDa/wAQ
+ 2v8AENv/ABDb/wAQ2/8AENv/ABDb/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAR2/8AEdv/ABHb/wAS
+ 2/8AEtv/ABLb/wAS2/8AEtv/TVrm/5yj8f+epPH/n6bx/6Go8v+jqfL/pKvy/6as8/+orvP/qbDz/6ux
+ 9P+ss/T/rrT0/7C29P+yt/T/s7n0/7W79P+3vfX/uL71/7q/9f+Nlu//ABTc/wAU3P8AFdz/ABXc/wAV
+ 3P8AFdz/ABXd/yM55/9vif3/b4r9/2+K/f9hePD/AACX/wAAl/8AAJe/////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAlxAAAJf/AACX/wAAn/8AAsL/AALC/wACwv8AAsL/AALC/wAC
+ wv8AAsL/AALD/wAG0f8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAJ2P8ACtj/AArY/wAK2P8ACtj/AArY/wAK
+ 2P8ACtj/AArY/wAK2P8ACtj/AAvY/wAL2P8AC9j/AAvY/wAL2P8AC9n/AAvZ/wAL2f8AC9n/AAzZ/wAM
+ 2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN
+ 2f8ADdn/AA3Z/wAO2f8ADtr/AA7a/wAO2v8ADtr/AA7a/wAO2v8ADtr/AA7a/wAP2v8AD9r/AA/a/wAP
+ 2v8AD9r/AA/a/wAP2v8AD9r/AA/a/wAP2v8AENr/ABDa/wAQ2v8AENr/ABDa/xQi3f+do/H/n6Xx/6Cm
+ 8f+iqPL/pKny/6Wr8v+nrfP/qa7z/6qw8/+ssvP/rrPz/6+18/+xt/T/s7j0/7W69P+2u/X/uL31/7q+
+ 9f+7wPb/vMH2/7zB9v8jM+D/ABPc/wAT3P8AE9z/ABPc/wAT3P8AE9z/HDHk/3GL/f9xjP3/cYz9/3GM
+ /f8AAJf/AACX/wAAl7////8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACXQAAA
+ l/8AAJf/AAGn/wACwf8AAsL/AALC/wACwv8AAsL/AALC/wACwv8AAsL/AAbV/wAH1/8AB9f/AAfX/wAH
+ 1/8AB9f/AAjX/wAI1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI1/8ACNf/AAnX/wAJ1/8ACdj/AAnY/wAJ
+ 2P8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAK2P8ACtj/AArY/wAK2P8ACtj/AArY/wAK2P8ACtj/AArY/wAK
+ 2P8AC9j/AAvY/wAL2P8AC9j/AAvY/wAL2f8AC9n/AAvZ/wAL2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/wAM
+ 2f8ADNn/AAzZ/wAM2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA3Z/wAN2f8ADdn/AA7a/wAO
+ 2v8ADtr/AA7a/wAO2v8ADtr/d37r/6Cl8f+ip/H/o6jy/6Wq8v+nrPL/qK3y/6qv8v+ssPP/rbLz/6+0
+ 8/+xtfT/srf0/7S59P+2uvX/t7z1/7m99f+7v/X/vMD2/7zA9v+8wPb/vMD2/wwc3P8AEdv/ABHb/wAR
+ 2/8AEdv/ABHb/wAR2/8dMOT/co39/3KO/f9yjv3/c479/wAAl/8AAJf/AACXv////wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAJeAAACX/wAAl/8AAa7/AAHB/wABwf8AAcH/AAHB/wAB
+ wf8AAcH/AAHB/wACxf8ABdb/AAXW/wAF1v8ABdb/AAXW/wAG1v8ABtb/AAbW/wAG1v8ABtb/AAbW/wAG
+ 1/8ABtf/AAbX/wAH1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAH1/8ACNf/AAjX/wAI
+ 1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI1/8ACdf/AAnY/wAJ2P8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAJ
+ 2P8ACdj/AArY/wAK2P8ACtj/AArY/wAK2P8ACtj/AArY/wAK2P8ACtj/AAvY/wAL2P8AC9j/AAvY/wAL
+ 2P8AC9j/AAvZ/wAL2f8AC9n/AAvZ/wAM2f8ADNn/AAzZ/wAM2f8ADNn/AAzZ/0ZP5P+hpvH/o6fx/6Sp
+ 8f+mqvH/qKzy/6mt8v+rr/L/rbHz/66z8/+wtPP/srb0/7O49P+1ufT/t7r0/7m89f+6vvX/vL/1/7zA
+ 9f+8wPX/vMD1/7zA9f+wtfP/AA/a/wAP2v8AD9r/AA/a/wAP2v8AD9r/AA/a/x0v4/90j/3/dJD9/3SQ
+ /f90kP3/AACX/wAAl/8AAJe/////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
+ l58AAJf/AACX/wABtv8AAcD/AAHA/wABwP8AAcD/AAHA/wABwP8AAcD/AALJ/wAD1f8AA9X/AAPV/wAD
+ 1f8ABNX/AATV/wAE1v8ABNb/AATW/wAE1v8ABNb/AATW/wAE1v8ABdb/AAXW/wAF1v8ABdb/AAXW/wAF
+ 1v8ABdb/AAXW/wAF1v8ABdb/AAbW/wAG1v8ABtb/AAbW/wAG1v8ABtb/AAbX/wAG1/8ABtf/AAfX/wAH
+ 1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAI1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI
+ 1/8ACNf/AAjX/wAJ1/8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAJ2P8ACdj/AAnY/wAK2P8ACtj/AArY/wAK
+ 2P8ACtj/AArY/wAK2P8UHdv/oqbw/6Sn8f+mqfH/p6vy/6ms8v+qrvL/rLDz/66y8/+ws/P/sbXz/7O3
+ 9P+1uPT/trr0/7i79P+6vfT/u771/7y/9f+8v/X/vL/1/7y/9f+8v/X/vMD1/4GI7P8ADdn/AA3Z/wAN
+ 2f8ADdn/AA3Z/wAN2f8ADdn/HS7i/3WR/P92kvz/dpL8/3aS/P8AAJf/AACX/wAAl7////8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8AAACXvwAAl/8AAJf/AAC6/wAAv/8AAL//AAC//wAA
+ v/8AAL//AAC//wAAv/8AAcz/AAHV/wAB1f8AAdX/AALV/wAC1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC
+ 1f8AAtX/AAPV/wAD1f8AA9X/AAPV/wAD1f8AA9X/AAPV/wAD1f8AA9X/AAPV/wAE1f8ABNb/AATW/wAE
+ 1v8ABNb/AATW/wAE1v8ABNb/AATW/wAF1v8ABdb/AAXW/wAF1v8ABdb/AAXW/wAF1v8ABdb/AAXW/wAG
+ 1v8ABtb/AAbW/wAG1v8ABtb/AAbW/wAG1v8ABtf/AAbX/wAG1/8AB9f/AAfX/wAH1/8AB9f/AAfX/wAH
+ 1/8AB9f/AAfX/wAH1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI1/8ACNf/AAjX/wAI1/98gOv/p6rx/6ir
+ 8v+qrfL/rK/y/62x8v+vsvP/sbTz/7K18/+0t/P/trjz/7i69P+5vPT/u731/7y/9f+8v/X/vL/1/7y/
+ 9f+8v/X/vL/1/7y/9f+8v/X/Ulnl/wAL2P8AC9j/AAvZ/wAL2f8AC9n/AAvZ/wAM2f87T+r/d5P8/3eT
+ /P93lPz/d5T8/wAAl/8AAJf/AACXv////wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAJe/AACX/wAAl/8AAL//AAC//wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAA0P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAB1P8AAdT/AAHU/wAB1P8AAdT/AAHU/wAB
+ 1P8AAdX/AAHV/wAB1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC1f8AA9X/AAPV/wAD
+ 1f8AA9X/AAPV/wAD1f8AA9X/AAPV/wAD1f8ABNX/AATV/wAE1v8ABNb/AATW/wAE1v8ABNb/AATW/wAE
+ 1v8ABNb/AAXW/wAF1v8ABdb/AAXW/wAF1v8ABdb/AAXW/wAF1v8ABdb/AAbW/wAG1v8ABtb/AAbW/wAG
+ 1v8ABtb/AAbX/wAG1/8ABtf/AAbX/wsR2P+Ul+7/q67y/62v8v+vsfL/sLLy/7K08/+0tvP/tbfz/7e5
+ 9P+5u/T/u7z1/7y+9f+8vvX/vL71/7y+9f+8vvX/vL71/7y/9f+8v/X/vL/1/7y/9f8YH9v/AAnY/wAJ
+ 2P8ACdj/AAnY/wAJ2P8ACtj/AArY/zxP6v95lfz/eZX8/3mW/P9qg+//AACX/wAAl/8AAJe/////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AAAAl/8AAJf/AACX/wAAv/8AAL//AAC//wAA
+ v/8AAL//AAC//wAAv/8AAL//AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AAHU/wAB1P8AAdT/AAHU/wAB1P8AAdT/AAHU/wAB1f8AAdX/AALV/wAC
+ 1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC1f8AAtX/AALV/wAD1f8AA9X/AAPV/wAD1f8AA9X/AAPV/wAD
+ 1f8AA9X/AAPV/wAE1f8ABNX/AATW/wAE1v8ABNb/AATW/wAE1v8fI9v/Ki3d/wAF1v8ABdb/AAXW/yAk
+ 2/+jpfD/sLHy/7Kz8/+ztPP/tbbz/7e49P+4uvT/urv0/7y99P+8vvT/vL70/7y+9P+8vvX/vL71/7y+
+ 9f+8vvX/vL71/7y+9f+8vvX/jZDt/wAH1/8AB9f/AAfX/wAH1/8AB9f/AAjX/wAI1/8ACNf/XHPz/3qX
+ /P96mPz/e5j8/1xy4/8AAJf/AACX/wAAl5////8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAACX/wAAl/8AAJ//AAC//wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAAwv8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AAdT/AAHU/wAB1P8AAdT/AAHU/wAB1P8AAdX/AAHV/wAB1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC
+ 1f8AAtX/NDbd/52d7v+Ule3/AAPV/wAD1f8AA9X/AAPV/yEk2v+nqPH/tLXz/7a38/+4ufP/ubrz/7u8
+ 9P+8vfT/vL30/7y99P+8vfT/vL30/7y99P+8vfT/vL70/7y+9P+8vvT/vL70/7y+9P8vM97/AAXW/wAF
+ 1v8ABdb/AAXW/wAG1v8ABtb/AAbW/wAG1v90kPr/fJn8/3yZ/P98mvz/VWrc/wAAl/8AAJf/AACXgP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJf/AACX/wAAof8AAL//AAC//wAA
+ v/8AAL//AAC//wAAv/8AAL//AADE/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/CgvW/3Nz5/+oqPD/qqrx/6us8f9WV+P/AAHU/wAB
+ 1P8AAdT/AAHU/yIj2v+srPH/ubnz/7u78/+8vfT/vL30/7y99P+8vfT/vL30/7y99P+8vfT/vL30/7y9
+ 9P+8vfT/vL30/7y99P+8vfT/jY7s/wAD1f8AA9X/AAPV/wAD1f8ABNX/AATW/wAE1v8ABNb/GCDd/32b
+ /P9+m/z/fpv8/36c/P8/Tsr/AACX/wAAl/8AAJdg////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAl/8AAJf/AACh/wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAAv/8AAMf/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/CgrW/1NT
+ 4v+dne7/qanx/6ur8f+trfH/rq7y/7Cw8v8hIdr/AADU/wAA1P8AANT/AADU/wwM1v+YmO7/vLz0/7y8
+ 9P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vfT/vL30/7y99P+8vfT/vL30/7y99P8vMNz/AAHV/wAB
+ 1f8AAtX/AALV/wAC1f8AAtX/AALV/wAC1f8/UOj/f538/3+d/P9/nfz/f578/ygxt/8AAJf/AACX/wAA
+ l0D///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACX/wAAl/8AAJz/AAC//wAA
+ v/8AAL//AAC//wAAv/8AAL//AAC//wAAyv8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/NDTd/2ho5v+dne7/qanw/6qq8f+srPH/rq7y/6+v8v+xsfL/s7Py/5OT
+ 7P8LC9b/AADU/wAA1P8AANT/AADU/wAA1P9qaub/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y8
+ 9P+8vPT/vLz0/7y89P+8vPT/amrm/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/3GL
+ 9/+Bn/z/gZ/8/4Gf/P+BoPz/EBSk/wAAl/8AAJf/AAAAAP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wAAAJfvAACX/wAAl/8AAL//AAC//wAAv/8AAL//AAC//wAAv/8AAL//AADK/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/xQU1/9bW+P/e3vo/6Wl8P+np/D/qKjw/6qq
+ 8f+srPH/ra3x/6+v8v+xsfL/srLy/7S08v+2tvL/uLjz/4uL6/8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8vL9z/paXw/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/6Wl8P8MDNb/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8hKN7/gqH8/4Kh/P+Cofz/g6H8/3KN7/8AAJf/AACX/wAA
+ l88AAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAl78AAJf/AACX/wAA
+ v/8AAL//AAC//wAAv/8AAL//AAC//wAAv/8AAMr/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAAyf8AAL3/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/KSnb/6Sk7/+mpvD/qKjw/6mp8f+rq/H/ra3x/6+v8v+wsPL/srLy/7Oz8v+1tfL/t7fz/7m5
+ 8/+6uvP/vLz0/3Z26P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/Xl7k/7Cw8v+8vPT/vLz0/7y8
+ 9P+8vPT/vLz0/7y89P+wsPL/IyPa/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/1Jm
+ 7f+Eo/z/hKP8/4Sj/P+Eo/z/UmbW/wAAl/8AAJf/AACXnwAAAAD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAACXvwAAl/8AAJf/AAC1/wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAA
+ yv8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AAND/AACX/wAAl/8AAK7/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8KCtb/p6fw/6mp8P+qqvH/rKzx/66u
+ 8v+wsPL/sbHy/7Oz8v+1tfL/trby/7i48/+6uvP/u7v0/7y89P+8vPT/vLz0/3Z26P8MDNb/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/DAzW/15e5P+lpfD/vLz0/7y89P+8vPT/vLz0/zs73v8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8RFdn/haX8/4Wl/P+Gpfz/hqX8/4al/P8qNLf/AACX/wAA
+ l/8AAJdQAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJeAAACX/wAA
+ l/8AALP/AAC//wAAv/8AAL//AAC//wAAv/8AAL//AADK/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAAzP8AAJf/AACX/wAAl/8AAMH/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P+Kiuv/rKzx/62t8f+vr/L/sbHy/7Oz8v+0tPL/trby/7i48/+5ufP/u7vz/7y8
+ 9P+8vPT/vLz0/7y89P+8vPT/vLz0/5mZ7v8YGNj/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P87O97/dnbo/6Wl8P9HR+D/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/2V9
+ 8v+Hp/z/h6f8/4en/P+Hp/z/f532/wAAl/8AAJf/AACX/wAAlxAAAAAA////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAl2AAAJf/AACX/wAAqf8AAL//AAC//wAAv/8AAL//AAC//wAA
+ v/8AAMr/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAAsv8AAJf/AACX/wAA
+ m/8pM93/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/2Fh5f+vr/L/sLDy/7Ky
+ 8v+0tPL/tbXy/7e38/+5ufP/u7vz/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7Cw
+ 8v9HR+D/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8iKt7/ian8/4mp/P+Jqfz/ian8/4mp/P9Vatb/AACX/wAA
+ l/8AAJevAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACXMAAA
+ l/8AAJf/AACf/wAAv/8AAL//AAC//wAAv/8AAL//AAC//wAAyv8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADQ/wAAov8AAJf/AACX/yEpsP9LXev/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/ISHa/7Ky8v+zs/L/tbXy/7e38v+4uPP/urrz/7y89P+8vPT/vLz0/7y8
+ 9P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+Njez/Ly/c/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/CQvX/3mV
+ 9/+Kq/z/iqv8/4qr/P+Kq/z/iqv8/xogqv8AAJf/AACX/wAAl2AAAAAAAAAAAP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAAAAAACX7wAAl/8AAJf/AAC9/wAAv/8AAL//AAC//wAA
+ v/8AAL//AADH/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADJ/wAA
+ l/8AAJf/AACX/0xe0P9lffL/CQvX/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/np7u/7a2
+ 8v+4uPP/ubnz/7u79P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y8
+ 9P+8vPT/vLz0/7y89P+8vPT/mZnu/1JS4v8YGNj/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P9XbO3/i6z8/4us/P+LrPz/i6z8/4us/P9ogeP/AACX/wAA
+ l/8AAJfvAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
+ AAAAAJefAACX/wAAl/8AALD/AAC//wAAv/8AAL//AAC//wAAv/8AAMT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AAC2/wAAl/8AAJf/AACX/2+J6f+An/r/Iive/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P9FReD/ubnz/7u78/+8vPT/vLz0/7y89P+8vPT/vLz0/7y8
+ 9P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/42N
+ 7P8YGNj/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/NEHj/4us
+ /P+LrPz/i6z8/4us/P+LrPz/i6z8/yMrsP8AAJf/AACX/wAAl4AAAAAAAAAAAAAAAAD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAl2AAAJf/AACX/wAAof8AAL//AAC//wAA
+ v/8AAL//AAC//wAAwP8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AACm/wAAl/8AAJf/CQud/3mW7/+Lq/z/RVbo/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P+kpPD/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y8
+ 9P+8vPT/vLz0/7y89P+8vPT/vLz0/4GB6v8vL9z/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/xog3P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P9ogeP/AACX/wAA
+ l/8AAJfvAACXEAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAAAAAACXEAAAl+8AAJf/AACX/wAAuv8AAL//AAC//wAAv/8AAL//AAC//wAA0/8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AAND/AACf/wAAl/8AAJf/GiCq/4Kh
+ 9v+LrPz/aIHy/xEW2f8AANT/AADU/wAA1P8AANT/AADU/yMj2v92duj/paXw/7y89P+8vPT/vLz0/7y8
+ 9P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/vLz0/7y89P+8vPT/jY3s/1JS4v8YGNj/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8aINz/gqH6/4us
+ /P+LrPz/i6z8/4us/P+LrPz/i6z8/xogqv8AAJf/AACX/wAAl4AAAAAAAAAAAAAAAAAAAAAA////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAACXnwAAl/8AAJf/AACm/wAA
+ v/8AAL//AAC//wAAv/8AAL//AADN/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wwM1v8vL9H/BASc/wAAl/8AAJf/GiCq/4Kh9v+LrPz/gqH6/z1L5v8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/GBjY/0dH4P9eXuT/gYHq/42N7P+Njez/jY3s/42N7P+Njez/jY3s/2pq
+ 5v9eXuT/Ly/c/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/GiDc/4Kh+v+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P9OYdD/AACX/wAA
+ l/8AAJfvAACXEAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAAAAAAAAAAAAAJcgAACX/wAAl/8AAJf/AAC6/wAAv/8AAL//AAC//wAAv/8AAMj/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8FBdX/QkLf/0tL4f84OMr/AACX/wAA
+ l/8AAJf/GiCq/4Kh9v+LrPz/i6z8/2iB8v8aINz/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/zRB4/+Cofr/i6z8/4us
+ /P+LrPz/i6z8/4us/P+LrPz/cYzp/wkLnf8AAJf/AACX/wAAl3AAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAJe/AACX/wAA
+ l/8AAKb/AAC//wAAv/8AAL//AAC//wAAwv8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/BQXV/0FB3/9UVOL/WVnj/15e5P8+Psj/AACX/wAAl/8AAJf/GiCq/4Kh9v+LrPz/i6z8/4us
+ /P9OYev/CQvX/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P9OYev/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4Kh9v8aIKr/AACX/wAA
+ l/8AAJe/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAAAAAAAAAAAAAAAAAlzAAAJf/AACX/wAAl/8AALX/AAC//wAAv/8AAL//AAC//wAA
+ 0P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wYG1f9ISOD/XFzk/2Fh5P9mZuX/a2vm/0xM
+ zv8AAJf/AACX/wAAl/8AAJf/CQud/3GM6f+LrPz/i6z8/4us/P+Cofr/Rlbo/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8aINz/cYz1/4us/P+LrPz/i6z8/4us
+ /P+LrPz/i6z8/4us/P+LrPz/NEG9/wAAl/8AAJf/AACX7wAAlyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA
+ l58AAJf/AACX/wAAnP8AAL3/AAC//wAAv/8AAL//AADI/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8GBtX/Tk7h/2Rk5f9paeb/bm7n/3Nz5/9oaN7/Bwec/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/05h
+ 0P+LrPz/i6z8/4us/P+LrPz/epf3/z1L5v8JC9f/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8JC9f/TmHr/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/zRBvf8AAJf/AACX/wAA
+ l/8AAJdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAACXEAAAl+8AAJf/AACX/wAApv8AAL//AAC//wAA
+ v/8AAMD/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/BwfV/1VV4v9sbOb/cXHn/3Z26P97e+n/eHjk/xgY
+ pv8AAJf/AACX/wAAl88AAJdQAACX7wAAl/8AAJf/AACX/yMrsP96l+//i6z8/4us/P+LrPz/i6z8/4Kh
+ +v9OYev/ERbZ/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8JC9f/Rlbo/4Kh+v+LrPz/i6z8/4us/P+LrPz/i6z8/4us
+ /P+LrPz/i6z8/4us/P80Qb3/AACX/wAAl/8AAJf/AACXjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACXUAAAl/8AAJf/AACX/wAAsP8AAL//AAC//wAAv/8AAMz/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wcH
+ 1f9bW+T/dHTo/3p66P9/f+n/hITq/4mJ6/80NLf/AACX/wAAl/8AAJfvAACXMAAAAAAAAJcQAACXzwAA
+ l/8AAJf/AACX/wkLnf9OYdD/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/cYz1/z1L5v8RFtn/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8rNuH/V2zt/4Kh
+ +v+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/NEG9/wAAl/8AAJf/AACX/wAA
+ l58AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXjwAAl/8AAJf/AACX/wAA
+ sP8AAL//AAC//wAAwv8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8ICNX/YmLl/3196f+Cgur/h4fr/4yM7P+Rkez/Nze3/wAA
+ l/8AAJf/AACX/wAAl2AAAAAAAAAAAAAAAAAAAAAAAACXgAAAl/8AAJf/AACX/wAAl/8jK7D/cYzp/4us
+ /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P96l/f/V2zt/z1L5v8jK97/GiDc/wAA1P8AANT/AADU/wAA
+ 1P8aINz/Iyve/0ZW6P9gdvD/gqH6/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us
+ /P+LrPz/gqH2/yMrsP8AAJf/AACX/wAAl/8AAJefAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACXvwAAl/8AAJf/AACX/wAAsP8AAMD/AADA/wAAyv8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/GBjY/3Fx
+ 5/+Fher/iorr/4+P7P+Vle3/mpru/zo6uP8AAJf/AACX/wAAl/8AAJeAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACXMAAAl98AAJf/AACX/wAAl/8AAJf/NEG9/3qX7/+LrPz/i6z8/4us/P+LrPz/i6z8/4us
+ /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us
+ /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/2iB4/8JC53/AACX/wAAl/8AAJf/AACXnwAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXzwAA
+ l/8AAJf/AACX/wAAsf8AAMH/AADC/wAA0v8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/yoq2/+AgOr/jo7s/5OT7f+YmO7/nZ3u/6Ki7/89Pbj/AACX/wAA
+ l/8AAJf/AACXnwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl4AAAJf/AACX/wAA
+ l/8AAJf/AACX/zRBvf96l+//i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us
+ /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/3qX
+ 7/80Qb3/AACX/wAAl/8AAJf/AACX/wAAl3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXzwAAl/8AAJf/AACX/wAAqv8AAML/AADI/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P9ISOD/kZHs/5aW
+ 7f+bm+7/oKDv/6Wl8P+fn+v/ICCo/wAAl/8AAJf/AACX/wAAl58AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJe/AACX/wAAl/8AAJf/AACX/wAAl/8rNrf/YHbc/4us
+ /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us
+ /P+LrPz/i6z8/4us/P+LrPz/i6z8/3qX7/89S8P/AACX/wAAl/8AAJf/AACX/wAAl+8AAJdAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAJcQAACXzwAAl/8AAJf/AACX/wAAov8AAL7/AADN/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8TE9f/eXno/5mZ7v+enu//o6Pv/6mp8P+urvH/eXnV/wsLnf8AAJf/AACX/wAA
+ l/8AAJefAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAJdAAACXvwAAl/8AAJf/AACX/wAAl/8AAJf/ERak/z1Lw/9gdtz/i6z8/4us/P+LrPz/i6z8/4us
+ /P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/i6z8/4us/P+LrPz/gqH2/1ds2v8rNrf/AACX/wAA
+ l/8AAJf/AACX/wAAl/8AAJefAACXEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXrwAAl/8AAJf/AACX/wAA
+ mv8AALD/AADR/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/TU3h/5OT7f+hoe//p6fw/6ys
+ 8f+xsfL/qqrt/zk5tP8AAJf/AACX/wAAl/8AAJf/AACXYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXQAAAl68AAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl/8AAJf/Iyuw/0ZWyv9gdtz/aIHj/4Kh9v+LrPz/i6z8/4us/P+LrPz/i6z8/2iB
+ 4/9gdtz/RlbK/yMrsP8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJe/AACXQAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACXcAAAl/8AAJf/AACX/wAAl/8AAJ7/AAC9/wAA1P8ICNX/BATV/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/PDze/4yM7P+lpfD/qqrx/6+v8v+0tPL/ra3t/11dxf8MDJ3/AACX/wAAl/8AAJf/AACX3wAA
+ lzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlyAAAJePAACX3wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA
+ l/8AAJe/AACXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXMAAA
+ l88AAJf/AACX/wAAl/8AAJf/AACf/wQEvv85Odr/Kirb/wYG1f8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8KCtb/PT3e/4+P7P+oqPD/ra3x/7Ky8v+3t/P/o6Po/15e
+ xf8MDJ3/AACX/wAAl/8AAJf/AACX/wAAl68AAJcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAACXMAAAl48AAJfPAACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl88AAJdwAACXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAl3AAAJfvAACX/wAAl/8AAJf/AACX/wUF
+ nP8iIrT/PT3L/0ND3/8kJNr/BwfV/wAA1P8AANT/AADU/wAA1P8AANT/AADU/xQU1/88PN7/Zmbl/5yc
+ 7v+rq/H/sLDy/7W18v+uru3/dXXR/zs7tP8AAJf/AACX/wAAl/8AAJf/AACX/wAAl98AAJdAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXQAAA
+ l4AAAJevAACXvwAAl98AAJf/AACX/wAAl/8AAJf/AACX7wAAl78AAJevAACXgAAAl1AAAJcQAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAlxAAAJeAAACX7wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/x4eq/83N7v/QkLI/0VF
+ 0f9kZOH/cXHn/3V16P+Wlu3/pKTw/6mp8P+YmOb/hYXb/3Jy0P9RUb//IyOo/wAAl/8AAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl98AAJdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcQAACXcAAA
+ l88AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl78AAJdgAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlzAAAJeAAACXzwAAl/8AAJf/AACX/wAA
+ l/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACX/wAAl/8AAJf/AACXvwAA
+ l3AAAJcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACXEAAAl0AAAJeAAACXnwAAl78AAJfPAACX/wAAl/8AAJf/AACX/wAA
+ l/8AAJfPAACXvwAAl58AAJdwAACXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////8A////////////////////AAH///////////////
+ ///wAAD/////////////////8AAAD/////////////////AAAAD////////////////wAAAAH///////
+ ////////8AAAAAH///////////////AAAAAAP//////////////wAAAAAA//////////////8AAAAAAB
+ /////////////+AAAAAAAH/////////////gAAAAAAAP////////////4AAAAAAAA////////////8AA
+ AAAAAAD////////////AAAAAAAAAP///////////wAAAAAAAAB///////////4AAAAAAAAAH////////
+ //+AAAAAAAAAAf//////////AAAAAAAAAAD//////////wAAAAAAAAAAP/////////4AAAAAAAAAAB//
+ ///////+AAAAAAAAAAAH/////////AAAAAAAAAAAA/////////wAAAAAAAAAAAH////////4AAAAAAAA
+ AAAA////////8AAAAAAAAAAAAD////////AAAAAAAAAAAAAf///////gAAAAAAAAAAAAD///////4AAA
+ AAAAAAAAAAf//////8AAAAAAAAAAAAAD//////+AAAAAAAAAAAAAAf//////AAAAAAAAAAAAAAD/////
+ /wAAAAAAAAAAAAAAf/////4AAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA/////+AAAAAAAAAAAAAAA
+ H/////gAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAH////4AAAAAAAAAAAAAAAB////8AAAAAAAAAA
+ AAAAAAP///+AAAAAAAAAAAAAAAAD////gAAAAAAAAAAAAAAAAf///wAAAAAAAAAAAAAAAAD///4AAAAA
+ AAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAAB///wAAAAAAAAAAAAAAAAAP//4
+ AAAAAAAAAAAAAAAAAD//8AAAAAAAAAAAAAAAAAA///AAAAAAAAAAAAAAAAAAH//gAAAAAAAAAAAAAAAA
+ AB//4AAAAAAAAAAAAAAAAAAf/+AAAAAAAAAAAAAAAAAAD//AAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAA
+ AAAAAAAP/4AAAAAAAAAAAAAAAAAAD/+AAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAH/wAAAAAA
+ AAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/4A
+ AAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAA
+ AAf+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAA
+ AAAAAAAH/gAAAAAAAAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAP/gAAAAAA
+ AAAAAAAAAAAAD/4AAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAD/4A
+ AAAAAAAAAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAAf/wAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAA
+ AD//AAAAAAAAAAAAAAAAAAA//wAAAAAAAAAAAAAAAAAAf/+AAAAAAAAAAAAAAAAAAH//gAAAAAAAAAAA
+ AAAAAAD//8AAAAAAAAAAAAAAAAAB///AAAAAAAAAAAAAAAAAAf//4AAAAAAAAAAAAAAAAAP//+AAAAAA
+ AAAAAAAAAAAH///wAAAAAAAAEAAAAAAAD///+AAAAAAAADwAAAAAAB////wAAAAAAAB+AAAAAAA////8
+ AAAAAAAA/4AAAAAAf////gAAAAAAAf/AAAAAAP////8AAAAAAAP/8AAAAAH/////gAAAAAAH//wAAAAH
+ /////+AAAAAAD///AAAAH//////wAAAAAB///+AAAH///////AAAAAB////8AAP///////4AAAAB////
+ ////////////gAAAB/////////////////AAAB/////////////////+AAH/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////KAAAADAA
+ AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAlzUAAZjdAAGX1wAAkr8AAJCqAACRlQAAk3UAAJU5AACWCf///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAlDoADaz8AETg/wA60f8ALcX/ACS8/wAbsv8AD6b+AAOa2QAA
+ k6EAAJNqAACWQgAAlhb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AAAAklQACLX/AE35/wBw//8Aa///AGj//wBl
+ /f8AYvr/AFXt/wA+1v8BG7X/AQOc/wEAl/EAAJGwAgOfSgoMyA3///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAkocACr7/ADbx/wBn
+ /v8AZf3/AGb+/wBm/v8AZv//AGn//wBr//8AZv7/AVfz/wJE4v8GKtD/Bgav/wIAm+QAAJasBQarVwUH
+ qwP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACXBAAA
+ lcsAD8j/ACzu/wBk/f8AZv3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZv7/AGj//wBr//8Baf//B1H9/w0p
+ 4f8IB7D/AgCY/wEBmswDBKE9////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAACWMAABmPkAFNb/ACrr/wBk/P8AZv3/AGX9/wBl/f8AZf3/AGX9/wBl/f8AZf3/AGX9/wBl
+ /f8AZf3/AGr+/wJm//8IVP3/ETDp/xUU0P8FA6L5AACQwgAAlFgAAJcD////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAACUagAGqv8AFuH/ADHr/wBi/P8AYfz/AGH8/wBh/P8AY/z/AGT9/wBl
+ /f8AZf3/AGX9/wBk/P8AY/z/AGP9/wBk/f8AaP7/AmX//xBR//8bMfL/FBTG/wUFo/8AAJS1AACWOAAA
+ lwH///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAJYQAACX2QAT0f8AFeL/AD7v/wBi/P8AX/v/AGH7/wBe
+ +v8AWvn/AFT3/wBL9P8ARvH/AEnz/wBZ+P8AX/v/AF77/wBe+/8AX/r/AGD6/wBj+/8CYf7/Gkj//ysu
+ +v8VGMn/AACT/wAAk4D///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJOGAAWn/wAW4P8AG+H/AEny/wBM
+ 8/8AQu//ADns/wAt5/8AHuL/ACDk/wAn5v8AMur/AEHw/wBW+P8AWvn/AFr5/wBa+f8AWvn/AFv5/wBb
+ +f8AXfn/Alz6/xdK/v8qPv//ICTZ/wcJpv8AAJK1AACWIf///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAljMAAJT6AA7D/wAX
+ 4P8AGt//ABzg/wAW3f8AEtz/ABHb/wAa3/8ANuv/AE30/wBT9v8AV/f/AFj3/wBU9/8AVPf/AFX3/wBV
+ 9/8AVff/AFb3/wBW9/8AVvf/AFf3/wBa9/8IU/n/LkT//zI6+P8TGL7/AACT4QAAljj///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAA
+ lKsACbX/ABXd/wAU3P8AE9v/ABLa/wAT2/8AKeT/AD7t/wBK8v8AUfX/AFD1/wBP9P8AT/T/AE/0/wBQ
+ 9f8AUPX/AFD1/wBQ9P8AUfT/AFH1/wBQ9f8AUfX/AFL1/wBS9f8AU/X/BFH2/yZJ/f88Rf//HiXO/wAA
+ luoAAJVS////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAACVaAADn/8AEtf/ABTb/wAS2f8AEdj/ABjb/wA46v8ATPP/AEzz/wBK8v8ASfL/AEry/wBK
+ 8v8ASvL/AEvy/wBL8/8AS/P/AEvz/wBM8/8ATPP/AEzz/wBM8/8ATfP/AE3z/wBN9P8ATfT/AE/z/wFO
+ 9P8mS/v/Qk7//yEp0f8AAJH6AACVVP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wAAAJYeAACV3wALv/8AE9r/ABDX/wAR1/8ALOX/AD/u/wBG8f8ARPD/AETw/wBF
+ 8P8ARfD/AEXw/wBF8P8ARvH/AEbx/wBG8f8AR/H/AEfx/wBH8f8AR/H/AEjx/wBI8f8ASPL/AEjy/wBJ
+ 8v8ASfL/AEny/wBK8v8ASvH/I0z6/0NQ/v8kLdD/AQKY7AAAlT////8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAlxgAAJS+AAey/wAR2f8ADtX/ABXZ/wAw5v8AQe//AEDu/wA+
+ 7v8APu7/AD/u/wA/7v8AP+7/AEDu/wBA7v8AQO7/AEHv/wBB7/8AQe//AEHv/wBC7/8AQu//AELv/wBC
+ 7/8AQ+//AEPw/wBD8P8AQ/D/AETw/wBE8P8ARPD/AETw/yhO+f9MW///Ji/Q/wAAkt8AAJYi////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AAAAlKwAAp//AA7Q/wAO1P8AFdj/ADLo/wA8
+ 7P8AOev/ADns/wA67P8AOuz/ADrr/wA67P8AO+z/ADvs/wA77P8AO+z/ADzt/wA87f8APO3/AD3s/wA9
+ 7P8APe3/AD3t/wA+7f8APu3/AD7u/wA+7v8AP+7/AD/t/wA/7v8AP+7/AEDu/wNB7v89Vvz/Tl3//xcc
+ t/8AAJKf////AP///wD///8A////AP///wD///8A////AP///wD///8AAACVZQACnvoAC8b/AA7U/wAS
+ 1P8ALub/ADfr/wA06v8ANOr/ADXq/wA16v8ANer/ADXq/wA26v8ANur/ADbq/wA26/8AN+v/ADfr/wA3
+ 6/8AOOv/ADnr/wA56/8AOOv/ADnr/wA57P8AOez/ADns/wA67P8AO+z/ADrs/wA77P8AO+z/ADvs/wA6
+ 6/8OQu//R17//0dW8/8JC6L/AACUYP///wD///8A////AP///wD///8A////AP///wAAAJY8AACW/AAK
+ wv8ADdT/AAzQ/wAk4P8AMej/AC/n/wAv6P8AMOj/ADDo/wAw6P8AMOj/ADHo/wAx6P8AMej/ADLo/wAy
+ 6f8AMun/ADLp/wAz6f8AM+n/ADPp/wAz6f8ANOn/ADTp/wA06v8ANOr/ADXq/wA16v8ANer/ADbq/wA2
+ 6v8ANur/ADbq/wA36v8ANOn/HUjx/1pt//8rNcz/AACR7gAAlx////8A////AP///wD///8A////AP//
+ /wAAAJW0AAaz/wAL0f8ACc7/ABra/wAr5v8AKuX/ACrl/wAr5v8AK+b/ACvm/wAr5f8ALOX/ACzm/wAs
+ 5v8ALOb/AC3m/wAt5v8ALef/AC7n/wAu5v8ALub/AC3n/wAv5/8AL+f/AC/n/wAv5/8AMOj/ADDo/wAv
+ 5/8AMOf/ADDo/wAx6P8AMej/ADLo/wAy6f8AMen/AzPp/0Je+v9Xafv/FRqv/wAAk2r///8A////AP//
+ /wD///8A////AAAAlWAAAZ7/AAnL/wAKzv8ACsz/ACDf/wAm5P8AJeP/ACbj/wAm5P8AJuT/ACbk/wAn
+ 5P8AJ+T/ACfk/wAn5P8AKOT/ACjk/wAo5P8AKeX/ACnl/wAp5f8AKeX/ACrl/wAq5f8AKuX/ACrl/wAr
+ 5f8AK+b/ACvm/wAr5v8AKub/ACfl/wAm5f8AKub/AC3m/wAt5/8ALef/ACvl/xk/7P9gdf//QE/f/wAA
+ lcIAAJYC////AP///wD///8AAACXFgAAlOAABK//AAnN/wAHyv8AENL/ACDh/wAg4f8AIeH/ACHi/wAh
+ 4v8AIeL/ACLi/wAi4v8AIuL/ACPi/wAj4v8AI+L/ACPj/wAk4/8AJOP/ACTj/wAk4/8AJeP/ACXj/wAl
+ 4/8AJeP/ACbk/wAm5P8AJuT/ACfk/wAj4/8hQ+j/VW/t/zta6/8NMuX/ACHj/wAm5f8AKeX/ACjl/wEo
+ 5P9KZPn/X3T8/xEVqf8AAJRP////AP///wD///8AAACWVAABnP8ABsP/AAfJ/wAHyf8AFtv/ABvg/wAb
+ 3/8AG9//ABvg/wAc4P8AHOD/ABzg/wAc4P8AHeD/AB3g/wAd4P8AHuD/AB7h/wAe4f8AHuH/AB/h/wAf
+ 4f8AH+H/AB/h/wAg4f8AIOH/ACDi/wAg4v8AIeL/ACHi/wAZ4P9CWun/nar0/5mm8/+GlvH/P1nq/wYn
+ 4/8AIeL/ACPj/wAg4f81UfH/a4H//yQsvP8AAJGS////AP///wD///8AAACVnAADsv8ABsr/AAXG/wAL
+ zv8AFt7/ABbd/wAW3f8AFt3/ABfe/wAX3v8AF97/ABfd/wAY3f8AGN7/ABje/wAZ3v8AGd7/ABnf/wAZ
+ 3/8AGt//ABre/wAa3v8AGt//ABvf/wAb3/8AG9//ABzg/wAc4P8AHOD/ABvf/wAX3/9hcuz/mqbz/5ik
+ 8/+gq/P/rLX1/25/7f8AF9//AB3g/wAc3/8VMuf/bIb//zZDzP8AAJG2////AP///wAAAJYZAAGa6QAE
+ wP8ABMb/AAPF/wAM0/8AEtz/ABHb/wAR3P8AEtz/ABLc/wAS3P8AE9z/ABPc/wAT3P8AE9z/ABTc/wAU
+ 3f8AFN3/ABTd/wAV3f8AFt3/ABXd/wAW3f8AFt3/ABbd/wAW3v8AF97/ABfe/wAX3v8AGN7/ABPd/xcr
+ 4f+OmfH/naby/5+o8/+jrPP/qbL0/6629f9GWef/ABXe/wAY3/8EHuD/YXv+/01f3/8AAJbL////AP//
+ /wAAAJVjAAGh/wADxP8AA8T/AAPE/wAK1f8ADNr/AAzZ/wAN2v8ADdr/AA3a/wAN2v8ADtr/AA7a/wAO
+ 2v8AD9r/AA/a/wAP2/8AD9v/ABDb/wAQ2/8AENv/ABHb/wAR2/8AEdv/ABHb/wAS3P8AEtz/ABLc/wAS
+ 3P8AEtz/AA3a/2Jt6f+nrfP/oqny/6et8/+rsfT/r7X0/7e99f+8wfb/NUbk/wAO3P8AFNz/TWb1/2V8
+ 8f8EBZve////AP///wAAAJWjAAGn/wACw/8AAsH/AALE/wAH1v8AB9f/AAfX/wAI1/8ACNj/AAjY/wAI
+ 2P8ACdf/AAnX/wAJ2P8ACtj/AArY/wAJ2P8AC9n/AAvZ/wAL2f8AC9j/AAzY/wAM2f8ADNn/AA3Z/wAN
+ 2f8ADdr/AA3a/wAN2v8AB9j/Ljng/6On8f+nq/L/qq7z/66z8/+yt/T/t7v1/7u/9f/Kzvf/YWzp/wAF
+ 2f8AC9r/Rl3x/3ON+f8HCZ3i////AP///wAAAJTPAACq/wAAwv8AAL7/AAHG/wAC1f8AA9X/AAPV/wAD
+ 1f8AA9X/AATV/wAE1f8ABNb/AATW/wAF1v8ABdb/AAXW/wAG1v8ABtb/AAbW/wAG1v8AB9f/AAfX/wAH
+ 1/8ACNf/AAjX/wAI1/8ACNj/AAnY/wAE1/8AANX/VFrk/7i79P+sr/L/sLPz/7W49P+5vPX/vL/1/73A
+ 9f/Cxfb/O0Th/wAD1/8ACdj/UGfy/3aR+P8HCZ3i////AP///wAAAJXpAACt/wAAwv8AAL7/AADK/wAA
+ 1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AAHU/wAB1f8AAdX/AAHU/wAB1P8AAdT/AAHU/wAC
+ 1P8AAtX/AALV/wAC1f8AAtX/AALV/wAB1f8AANT/AADU/xse2f8mKdv/CArX/4OF6//Cw/X/urz0/7u8
+ 9P+8vvX/vL71/8bI9v+Qk+3/AwnX/wAD1v8EC9j/bIb6/2uE7f8EBZra////AP///wAAAJXwAACv/wAA
+ wf8AAL//AADN/wAA1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1v8AANX/AADU/wAA1P8AANT/AADU/wMD1f8ZGdn/SEjh/52d7/+bm+7/GRnX/wcH
+ 1P9zc+f/wsH1/8LD9f+8vPT/v8D0/7m58/8vL9z/AADU/wAA0/8hKt//hqb//1Ro2v8AAJTF////AP//
+ /wAAAJThAACr/wAAwv8AAL//AADO/wAA1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADT/wAAyv8AANP/AADU/wAA1P8AANP/EhLX/4WF6v+mpvD/tLTz/7W1
+ 8//BwfT/j4/s/wEB0v8AANH/Ojre/6ys8f/Kyvf/z8/3/3Nz6P8AANP/AADU/wAA0v9PYuz/krX//zxJ
+ xf8AAJCo////AP///wAAAJXAAACo/wAAwf8AAL//AADO/wAA1f8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANX/AADQ/wAAnv8HCMH/BAXY/wAA1P8AANP/CwvW/5qa
+ 7/+3t/P/trbz/7m58/+8vPT/wcH1/3t76f8gINn/AADQ/x0d2P9kZOX/dXXo/xYW1/8AANP/AADT/woM
+ 1v9zj/f/ja///ycxtP8AAJKA////AP///wAAAJWGAACj/wAAwP8AAL//AADN/wAA1f8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADW/wAAv/8OEqD/Lzva/wMD
+ 1v8AANP/AADS/2Fh5P/IyPX/vr70/7299P+9vfT/vr70/8jI9v+6uvT/bGzn/xAQ1v8AANL/AADT/wAA
+ 0/8AANT/AADT/1Zq7f+Wuv//fZrx/wkLnfEAAJUl////AP///wAAAJYxAACb+AAAvP8AAL//AADK/wAA
+ 1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1/8AAKr/Hyeq/2J58P8iKuD/AADQ/yMj2v+cnO//vLz0/8PD9f/Dw/X/wsL1/7y89P+jo/D/Z2fm/xsb
+ 2f8AANP/AADU/wAA1P8AANH/OUbl/5G0//+Psf7/Ljm5/wAAk4P///8A////AP///wD///8AAACVqgAA
+ rf8AAMH/AADG/wAA1f8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1f8nJ9j/EhGl/zhFuv9/nfj/Kzbj/wAA0/8BANP/KCjb/0hI4P9KSuD/R0fg/yoq
+ 2/8GBtX/AADS/wAA0/8AANT/AADT/wAA0v83ROT/iqv8/5i8//9YbNb/AACS+wAAljb///8A////AP//
+ /wD///8AAACWSgAAmP8AALX/AADD/wAA0f8AANX/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AgLU/zQ03f9wcO3/PDzD/wAAjv0kLK/+epfv/3OO+f8vO+T/AQHS/wAA
+ 0P8AANH/AADS/wAA0v8AANP/AADT/wAA0v8AANH/Fx3b/1xz7/+Psf7/lrr//3GN6v8PE6H/AACUcv//
+ /wD///8A////AP///wD///8AAACXBAAAlasAAJ//AAC9/wAAzv8AANX/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8BAdT/R0fg/4mJ7v9gYNP/CQmc7gAAlVcAAJKWDRCf/Vds
+ 0/+LrPr/Z4H1/zlH5f8hKd7/ERbZ/wgJ1v8JC9b/Exja/ygx4P9CUuf/f5z5/5a6//+VuP//b4ro/xEV
+ ov8AAJOG////AP///wD///8A////AP///wD///8A////AP///wAAAJWoAACf/wAAw/8AANb/AADV/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADT/wYG1P9iYuX/paX0/35+3f8MDJz/AACUd///
+ /wD///8AAACUSQAAktsTGKX/aoPi/5a6//+Ttv//i6z+/4am/P+Fpfz/iKj8/5Cy//+Yu///mLz//4yt
+ +/9IWsz/BgeZ/wAAk4P///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJcjAACVxwAA
+ pP8AAMH/AADW/wAA1v8AANT/AADU/wAA1P8AANT/AADU/wAA0/8CAtT/IiLb/3Fx6f+oqPD/Z2fN/w0N
+ nP8AAJSF////AP///wD///8A////AAAAlyIAAJOcAgOW5ScwtP9WatX/bYfl/36b8f+Eo/b/haX3/36c
+ 8v9wi+j/WW7Y/ygytP4AAJLaAACVdv///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8AAACXAwAAlZ8AAJb/AACu/w0Nz/8ICNb/AwPX/wYG2f8JCdr/Cwva/x8f3P9ra+f/rq7x/46O
+ 3P8jI6j/AACT5AAAlU7///8A////AP///wD///8A////AP///wD///8AAACWEgAAk14AAJPDAgKY9wYI
+ nPwICp3/CAqd/wcInP0DA5n6AACT0AAAkmYAAJcF////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AAAAlwMAAJY0AACUkwYGnO0PD6n/Dw+w/xISt/8dHbv/LS29/0RE
+ vv9ERLf/ISGn/wUFmNgAAJRrAACXGv///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAJcEAACWHQAAljgAAJVFAACVSQAAljwAAJYmAACXB////wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAAAliAAAJV3AACTrwAA
+ ktkAAJLwAACS8AAAktIAAJKfAACVUgAAlxD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///////wAA////////AAD///////8AAP///////wAA//AH////AAD/8AB///8AAP/w
+ AA///wAA//AAAf//AAD/4AAA//8AAP/gAAAf/wAA/+AAAAf/AAD/wAAAB/8AAP/AAAAB/wAA/4AAAAD/
+ AAD/gAAAAH8AAP8AAAAAPwAA/gAAAAAfAAD8AAAAAA8AAPwAAAAADwAA+AAAAAAHAADwAAAAAAMAAPAA
+ AAAAAwAA4AAAAAABAADAAAAAAAEAAMAAAAAAAQAAwAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAAB
+ AACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAEAAIAAAAAAAQAAgAAAAAABAACAAAAAAAMAAMAA
+ AAAAAwAAwAAAAAAHAADAAAAAAA8AAPAAAMAAHwAA8AAB4AA/AAD4AAP4AH8AAPwAB/4B/wAA/4Af////
+ AAD///////8AAP///////wAA////////AAD///////8lsCgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAllEAC6PgAAuivwACmpwAAJV0AACRRQAAkxb///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAACTZgAu0f8AZP3/AFXt/wBE3P8AMsn/ABy07gEGnrkBAJWCAQGXPwYH
+ tAf///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAJaIACTY/wBm//8Aaf//AGv//wBs//8AZv7/AVn0/wNB
+ 4P8FIMT/BQWp1gQAoH0GB64f////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8AAACVBAACoMoAI+T/AGL9/wBm/f8AZf3/AGb9/wBn
+ //8Aaf//AGz//wFo//8HUff/DCrZ/woJsvABAJWPAACTHv///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJJEAAm4/wAq6/8AYPz/AGX9/wBj
+ /f8AYPv/AF36/wBc+v8AYfz/AGP8/wBn/v8CZv//DU79/xgn4P8MCa3sAACSdAAAlQb///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAABmrMAEdP/ADPs/wBN
+ 9P8AO+3/ADDp/wAu6f8AOOz/AEjy/wBX+P8AW/n/AFv6/wBd+v8AYPr/B1r//x9B/P8dH9H/BASbvwAA
+ kyP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJNXAAq3/wAX
+ 4P8AF93/ABXc/wAd4P8ANOr/AEjy/wBS9v8AVPb/AFP2/wBT9v8AVPb/AFT3/wBU9/8AVvb/AVf5/xxN
+ //8sNer/Cgqn3wAAkjj///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AAACVGwAD
+ odsAEtb/ABLa/wAa3f8ANOn/AEny/wBN9P8ATPP/AErz/wBL8/8AS/P/AEzz/wBM8/8ATPT/AE30/wBN
+ 9P8AT/T/AE/0/xlP/f81QvP/DhCs6wAAkj////8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAJeoAAzG/wAR2v8AIuD/AD7u/wBF8P8AQvD/AELv/wBD8P8AQ/D/AEPw/wBE8P8ARPD/AEXw/wBF
+ 8f8ARfH/AEbx/wBG8f8AR/H/AEjx/xhN+v88SvT/DhCp5AAAkyr///8A////AP///wD///8A////AP//
+ /wD///8AAACUdwAItv8AD9f/ACPg/wA77f8AO+z/ADrs/wA67P8AO+z/ADvt/wA77f8APO3/ADzt/wA9
+ 7f8APe3/AD3t/wA+7v8APu7/AD/u/wA/7v8AP+7/AD/t/yZQ+/8/S+v/BQacwAAAlQf///8A////AP//
+ /wD///8A////AAAAlE4ABav8AAzS/wAc2/8AM+n/ADLp/wAy6f8AMun/ADPp/wAz6f8ANOn/ADTq/wA0
+ 6v8ANer/ADXq/wA26v8ANur/ADbr/wA36/8AN+v/ADjr/wA46/8AOOv/ADns/z5d/v8yO9H/AACTbf//
+ /wD///8A////AP///wAAAJUPAAKe0wAJyv8AENT/ACjk/wAq5f8AKuX/ACrm/wAr5v8AK+b/ACzm/wAs
+ 5v8ALOf/AC3n/wAt5/8ALuf/AC7n/wAu5/8AL+j/AC/o/wAu6P8AKuf/AC3n/wAx6P8AL+j/Ej7u/1Jm
+ +f8SFanaAACTEf///wD///8A////AAAAlXAABrb/AAjO/wAX2P8AI+T/ACLi/wAi4v8AI+P/ACPj/wAk
+ 4/8AJOP/ACTj/wAl5P8AJeT/ACbk/wAm5P8AJuT/ACfk/wAn5f8AJ+X/CjHm/zJS6v8XPej/ACTk/wAn
+ 5f8AKOX/QF77/zlF0f8AAJJZ////AP///wAAAJYIAAGe0QAHxv8ACMv/ABjd/wAa4P8AGt//ABvf/wAb
+ 4P8AHOD/ABzg/wAd4P8AHeD/AB3g/wAe4f8AHuH/AB/h/wAf4f8AH+H/ACDh/wAa4f8nQOb/k6Hz/5Kg
+ 8/9Xbuz/BiTj/wAc4f8ePu3/VWnu/wQFmpz///8A////AAAAlEIAA63/AATI/wAJzv8AE93/ABLc/wAT
+ 3P8AE9z/ABTd/wAU3f8AFd3/ABXd/wAV3f8AFt3/ABbe/wAX3v8AF97/ABfe/wAY3v8AGN7/ABDd/05d
+ 6P+iq/P/pKzz/7O79v9qee3/ABff/wci4/9cdff/EhanyP///wD///8AAACXgQACt/8AAsT/AAfR/wAL
+ 2f8AC9j/AAvZ/wAM2f8ADNr/AAza/wAN2v8ADdr/AA3a/wAO2v8AD9v/AA/b/wAQ2/8AENv/ABDb/wAM
+ 2v8SIt3/jZTv/6qv8/+ssfT/trv1/7zA9v8sPOP/ABDd/1lx9v8iKbPh////AP///wAAAJnJAAC8/wAA
+ wv8AAtL/AAPW/wAD1f8ABNb/AATW/wAE1v8ABdb/AAXW/wAG1/8ABtf/AAfX/wAH1/8AB9f/AAjX/wAH
+ 1/8ABNf/AADV/z9E4f+3uvT/s7b0/7e69P++wfX/vL/2/yQu3/8ACdr/YHn2/yYuteP///8A////AAAA
+ m/AAAL3/AADC/wAA0/8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1f8AANf/AADU/wAB
+ 1f8AAdX/AADU/xgZ2f9mZ+b/HiDa/2Vm5f/Fxfb/xMX1/8jK9/+Ji+z/AADV/wwS2/90jvj/Gh+r0P//
+ /wD///8AAACa4QAAvP8AAMT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADR/wAA
+ x/8AANX/AADT/wkJ1v9ycej/paXw/8PD9f+JiOv/BQXV/0BA3/+np/H/sLDy/yYm2v8AAND/OETm/3mW
+ 8v8HCZyl////AP///wAAAJidAAC3/wAAxP8AANP/AADU/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1f8AANL/AgKq/xYbzv8DBNj/AgLT/5qa7v/Jyfb/wMD1/8rK9v+fn+//NTXd/xAQ1/8bG9n/AADS/woM
+ 1v98mvz/VmrT/wAAk2P///8A////AAAAlVAAAKv/AADE/wAA0/8AANT/AADU/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1v8AAMf/ISiz/0lb4f8TGN7/NDPc/5ST7f+oqPD/pqbw/5aW7v9ZWeT/CAjV/wAA
+ 0f8CAtT/XnXx/46w+v8ZH6jaAACTEv///wD///8AAACWCAAAm8wAALv/AADQ/wAA1f8AANT/AADU/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADU/z8/5f80M73/Eheg/Vxx3/5BUev/DRDZ/wIB1P8AANP/AADS/wAA
+ 0P8AANL/FBja/2eA8/+YvP//PUvD/wAAkl7///8A////AP///wD///8AAACVRwAAo/kAAMf/AADX/wAA
+ 1P8AANT/AADU/wAA1P8AANT/AADT/wIC1P9UVOf/c3Pe/xISo9IAAJI/BwmZqUhayf9vifD/VGnx/zVC
+ 5/8nMeH/NEHk/1lt8P+Mrv//kLP8/z5NxP8AAJSF////AP///wD///8A////AP///wD///8AAACVYAAA
+ o/gAAMr/AgLZ/wAA1/8AANX/AADU/wAA1P8eHt3/d3fr/3p62P8WFqHYAACUK////wAAAJYCAACSXBQY
+ pNNLXMr/bYfk/4Cd9P+Jqfj/fpzv/1Zr1f8cI6vpAACTZ////wD///8A////AP///wD///8A////AP//
+ /wD///8AAACVPQAAm8cJCbX/Dw/H/xIS0v8lJdf/SUnZ/2tr0v9DQ7b6BQWXnwAAlRj///8A////AP//
+ /wD///8AAACVCAAAkkkCA5eKCQudsAkMnbkEBpuiAACTagAAkxn///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAACWBQEBlEQEBJiVBgac2wwMnfMREZ3LAwOWfQAAky3///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A/////////////////wH///8AH///AAf//gAB//4A
+ AH/+AAA//AAAH/gAAA/4AAAH8AAAA+AAAAPAAAABwAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA
+ AAGAAAABgAAAA8AAAAfgAIAP8AHgH/gH//////////////////8oAAAAGAAAADAAAAABACAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAA////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAJUFAAqjtwAo
+ v9oAHbS2AA6llAADmWwAAJE8AACPDf///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wAAAJIPABC05ABj//8AaP//AGL6/wBT6/8BNM7+Ahm14wUG
+ rJMEAaNDCAm0B////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wAAAJJMAA/A/wBY/f8Aaf//AGj//wBq//8Abf//AWf//wRR8/8IJ9D/CQuzyAIAl1QAAJIH////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wAAAp+wABzd/wBa+/8AYPv/AFn4/wBU
+ 9/8AV/j/AGD8/wBl/v8BZf//CFP6/xUt4f8MCa7TAACSVv///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AAAAk0cADL/7AB/l/wAv5/8AJuT/ACzn/wA+7v8ATPP/AFb4/wBY+P8AWPj/AFz5/wRb
+ /v8bRvr/HyTT/gQCmZEAAJME////AP///wD///8A////AP///wD///8AAACUCQAEpckAEtf/ABLb/wAh
+ 4f8AO+z/AEvz/wBQ9P8ATvT/AE70/wBO9P8ATvT/AE/0/wBR9P8AU/b/F0///ys25f8HB56pAACTB///
+ /wD///8A////AP///wD///8AAAGalQAMyf8AGd7/ADDm/wBD7/8ARPD/AEPv/wBD7/8AQ+//AETw/wBE
+ 8P8ARfD/AEXw/wBG8P8ARvH/AEfw/xVN+/8xQej/CgqhpQAAlAP///8A////AP///wAAAJZvAAi9/wAW
+ 2/8AMun/ADns/wA36/8AN+v/ADjr/wA56/8AOev/ADrr/wA67P8AO+z/ADvs/wA87f8APO3/AD3t/wA8
+ 7P8gTvr/OETg/wEBlXn///8A////AAAAlTcABbD0AA7T/wAn4/8AL+j/AC3n/wAu5/8ALuf/AC/n/wAv
+ 6P8AMOj/ADDo/wAx6P8AMej/ADLo/wAz6f8AMOj/AC/o/wAy6f8AM+n/OVn6/yUswOQAAJIb////AAAB
+ nrIACMf/ABbY/wAk4/8AI+L/ACTj/wAk4/8AJeP/ACXj/wAm4/8AJuT/ACfk/wAo5P8AKOT/ACjl/wAo
+ 5f8XPOf/HkPo/wMq5f8AJOT/Fj3u/0dZ5/8CAph9AACVPAAEs/sACMv/ABXa/wAZ3/8AGd7/ABne/wAa
+ 3/8AG9//ABvf/wAc3/8AHOD/AB3g/wAd4P8AHuD/AB3g/wAa4P9gcez/m6fz/3aI7/8WMuT/ABzi/0Jd
+ 8/8bIK+9AACZlgADvv8AB8z/AA/a/wAP2v8AENv/ABDb/wAR2/8AEdv/ABLb/wAS3P8AE9z/ABPc/wAU
+ 3P8AFNz/ABHc/w0h3/+MlvD/p6/z/7e99f+Ik/D/ABPc/zNN8P81QMTeAAGf0gABv/8AA83/AAXX/wAF
+ 1v8ABtb/AAbX/wAH1/8AB9f/AAjX/wAJ2P8ACdj/AArY/wAJ2P8ABNj/AADW/1Vb5f+4vPX/srb0/73A
+ 9v+xtfT/BRLa/zNI7v9AT8zoAACk8AAAv/8AAM7/AADV/wAA1P8AANT/AADU/wAA1P8AANT/AADU/wAB
+ 1v8AAdX/AADU/wME1f8eINr/Wl3k/zY33v+Fhuv/x8f2/8/P9/92eOn/AADT/0lb7/86SMPaAACh3gAA
+ v/8AAM//AADV/wAA1P8AANT/AADU/wAA1P8AANT/AADW/wAAxf8EBc7/AADT/0lI4P+2tfP/x8f2/4qK
+ 7P8eHtn/VVXi/4GB6v8TEtb/DBDY/3OO9P8YHqeyAACZpgAAu/8AAM//AADV/wAA1P8AANT/AADU/wAA
+ 1P8AANT/AADW/wAAxP8XHbj/Hibf/yEh2/+mpfD/vLz0/8LC9f+VlO3/Hh7Z/wAA0v8AANL/W3Dy/2qC
+ 4P8AAJVlAACWPgAArPoAAM3/AADW/wAA1P8AANT/AADU/wAA1P8AANT/AADT/xkZ3v8yMsP+NEG8+0FR
+ 5P8mLOH/KSnb/x4c2f8FA9T/AADU/wkM2P9YbfD/haT2/xwiqcMAAJMG////AAAAl4MAALT/AADW/wAA
+ 1v8AANT/AADU/wAA1P8AANT/MjLh/3Bw4P8eHqnDAACRNRkfprVMX9T/WW/t/0ld7f9NYO//YXj1/4Kh
+ /P91ken/GyGpygAAkx3///8A////AAAAlgEAAJd/AACx/AYG0P8DA9b/BATW/xMT2P9ZWeL/aWnR/xwc
+ pLsAAJMd////AAAAlAYBAZRSHiWqt0FRwvRQY837S13K/C45t+MHCZp/AACTE////wD///8A////AP//
+ /wD///8AAACUNQUFnZEKCqrVExOw8CoqsuUmJqetAwOVVwAAlAj///8A////AP///wD///8AAACUAgAA
+ kRwAAJA1AACQLwAAkg7///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///4H4B///+AD///gA
+ P//4AB//8AAH/+AAA//gAAH/wAAB/4AAAP+AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/4AA
+ Af+ACAP/4B4P//////////+QKAAAABAAAAAgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD///8A////AP///wAAAJQJABu1yAAzyMsAILekAAyicgAAmTcGA68G////AP///wD///8A////AP//
+ /wD///8A////AP///wD///8AAACUHgAq1vkAb///AGv//wBh+P8CSeT7ByHJzgYEpnEAAJAL////AP//
+ /wD///8A////AP///wD///8A////AAABnXMALuT/AFb5/wBO9f8AVfj/AGX//wJi//8KRez/EBzEzwMA
+ mFD///8A////AP///wD///8A////AAAAkyAACbvpABzi/wAq5f8APe3/AE70/wBS9f8AVPb/AFj5/wtU
+ /v8dMuD/CAegdv///wD///8A////AP///wAAA6etABbZ/wAy6P8AQ+//AEXx/wBE8P8ARfD/AEXx/wBG
+ 8f8ASPH/CUz5/yU+5v8JCJ52////AP///wAAAZx+AA7L/wAs5/8ANuv/ADXq/wA06f8ANur/ADfq/wA4
+ 6v8AOev/ADfr/wA16/8QRfX/Lj3a9wIBlS8AAJYnAAW5+AAZ3f8AKOX/ACbj/wAn5P8AJ+T/ACjl/wAp
+ 5P8AKuX/ACnl/woz5/8QOef/ACbm/ydK8v8YHK+TAAGfhwAGyP8AFdv/ABje/wAY3v8AGd7/ABnf/wAb
+ 3/8AG9//ABzg/wAU3v8+VOf/m6fz/0Vb6f8NLur/LTrJ0gABqNIABMv/AAnY/wAJ1/8ACdj/AArY/wAL
+ 2P8ADNr/AA3Z/wAF2P8BDtr/i5Lu/77D9v+orvL/Eibj/zVF0uoAAKvxAADN/wAA1f8AANT/AADU/wAA
+ 1P8AANT/AADU/wEB1f8rLNz/TU/i/2Zn5v/BwvX/g4Tr/xEZ3/8+Ts/gAACn2AAAzf8AANb/AADU/wAA
+ 1P8AANX/AADQ/wcJw/8OENr/lpTt/8rJ9v93d+n/OTjd/xEP1v9DVOr/Mj26rgAAm34AAMX/AADX/wAA
+ 1P8AANT/AADU/wUF2P8rLMf/LjjF+E5Y6P9TVeb/Ozvf/wsO2P9DVOz/ZHzg/wcJmUUAAJUQAAClxQEB
+ zv8CAtj/BgbZ/xgY2/9RUdz/KSiupAMEkjoqNbe+Q1Xa+ktf5v9ogez/WW7W6wwOnW7///8A////AAAA
+ lQ4CAp54Bwex0BUVue4vL7fMGRmhcAAAlAj///8AAACTAgQFmDMPE59fCw2dWAAAlCH///8A////AP//
+ /wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
+ /wD//+n/4D/o/+AP6P/gB+n/wAPp/8AB+v+AAMDkAACSGwAA/wAAAJ6yAADH/wAA2P8AAOP/AAHi/4CD
+ 4////wRw
+
+
+
\ No newline at end of file
diff --git a/ToggleSwitchDemo/Program.cs b/ToggleSwitchDemo/Program.cs
new file mode 100644
index 0000000..702caa7
--- /dev/null
+++ b/ToggleSwitchDemo/Program.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Windows.Forms;
+
+namespace ToggleSwitchDemo
+{
+ static class Program
+ {
+ ///
+ /// The main entry point for the application.
+ ///
+ [STAThread]
+ static void Main()
+ {
+ Application.EnableVisualStyles();
+ Application.SetCompatibleTextRenderingDefault(false);
+ Application.Run(new DemoForm());
+ }
+ }
+}
diff --git a/ToggleSwitchDemo/Properties/AssemblyInfo.cs b/ToggleSwitchDemo/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..0dfb431
--- /dev/null
+++ b/ToggleSwitchDemo/Properties/AssemblyInfo.cs
@@ -0,0 +1,36 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyTitle("ToggleSwitchDemo")]
+[assembly: AssemblyDescription("JCS ToggleSwitch Demo Application")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("JC Software Solutions")]
+[assembly: AssemblyProduct("JCS ToggleSwitch")]
+[assembly: AssemblyCopyright("Copyright © 2015")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+
+// The following GUID is for the ID of the typelib if this project is exposed to COM
+[assembly: Guid("6fd40b22-0c51-4557-af5c-879774fec629")]
+
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Build and Revision Numbers
+// by using the '*' as shown below:
+// [assembly: AssemblyVersion("1.0.*")]
+[assembly: AssemblyVersion("1.0.0.0")]
+[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/ToggleSwitchDemo/Properties/Resources.Designer.cs b/ToggleSwitchDemo/Properties/Resources.Designer.cs
new file mode 100644
index 0000000..3b18344
--- /dev/null
+++ b/ToggleSwitchDemo/Properties/Resources.Designer.cs
@@ -0,0 +1,113 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.34209
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ToggleSwitchDemo.Properties {
+ using System;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Resources {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Resources() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("ToggleSwitchDemo.Properties.Resources", typeof(Resources).Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap arrowleft {
+ get {
+ object obj = ResourceManager.GetObject("arrowleft", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap arrowright {
+ get {
+ object obj = ResourceManager.GetObject("arrowright", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap check {
+ get {
+ object obj = ResourceManager.GetObject("check", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap cross {
+ get {
+ object obj = ResourceManager.GetObject("cross", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap handle {
+ get {
+ object obj = ResourceManager.GetObject("handle", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+ }
+}
diff --git a/ToggleSwitchDemo/Properties/Resources.resx b/ToggleSwitchDemo/Properties/Resources.resx
new file mode 100644
index 0000000..a7ba297
--- /dev/null
+++ b/ToggleSwitchDemo/Properties/Resources.resx
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+ ..\Resources\arrowleft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Image70.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\check.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\cross.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\handle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
\ No newline at end of file
diff --git a/ToggleSwitchDemo/Properties/Settings.Designer.cs b/ToggleSwitchDemo/Properties/Settings.Designer.cs
new file mode 100644
index 0000000..c13ee02
--- /dev/null
+++ b/ToggleSwitchDemo/Properties/Settings.Designer.cs
@@ -0,0 +1,30 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.34209
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace ToggleSwitchDemo.Properties
+{
+
+
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
+ internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
+ {
+
+ private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
+
+ public static Settings Default
+ {
+ get
+ {
+ return defaultInstance;
+ }
+ }
+ }
+}
diff --git a/ToggleSwitchDemo/Properties/Settings.settings b/ToggleSwitchDemo/Properties/Settings.settings
new file mode 100644
index 0000000..3964565
--- /dev/null
+++ b/ToggleSwitchDemo/Properties/Settings.settings
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/ToggleSwitchDemo/Resources/Image70.png b/ToggleSwitchDemo/Resources/Image70.png
new file mode 100644
index 0000000..1fc785a
Binary files /dev/null and b/ToggleSwitchDemo/Resources/Image70.png differ
diff --git a/ToggleSwitchDemo/Resources/arrowleft.png b/ToggleSwitchDemo/Resources/arrowleft.png
new file mode 100644
index 0000000..25d1578
Binary files /dev/null and b/ToggleSwitchDemo/Resources/arrowleft.png differ
diff --git a/ToggleSwitchDemo/Resources/check.png b/ToggleSwitchDemo/Resources/check.png
new file mode 100644
index 0000000..5233a8f
Binary files /dev/null and b/ToggleSwitchDemo/Resources/check.png differ
diff --git a/ToggleSwitchDemo/Resources/cross.png b/ToggleSwitchDemo/Resources/cross.png
new file mode 100644
index 0000000..25572fc
Binary files /dev/null and b/ToggleSwitchDemo/Resources/cross.png differ
diff --git a/ToggleSwitchDemo/Resources/handle.png b/ToggleSwitchDemo/Resources/handle.png
new file mode 100644
index 0000000..33fbf6b
Binary files /dev/null and b/ToggleSwitchDemo/Resources/handle.png differ
diff --git a/ToggleSwitchDemo/ToggleSwitchDemo.csproj b/ToggleSwitchDemo/ToggleSwitchDemo.csproj
new file mode 100644
index 0000000..2a89ba8
--- /dev/null
+++ b/ToggleSwitchDemo/ToggleSwitchDemo.csproj
@@ -0,0 +1,107 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {2F7ADBD8-EC70-4407-8B09-474E8F2043AC}
+ WinExe
+ Properties
+ ToggleSwitchDemo
+ ToggleSwitchDemo
+ v4.0
+ 512
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\
+ DEBUG;TRACE
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Form
+
+
+ DemoForm.cs
+
+
+
+
+ DemoForm.cs
+
+
+ ResXFileCodeGenerator
+ Resources.Designer.cs
+ Designer
+
+
+ True
+ Resources.resx
+ True
+
+
+ SettingsSingleFileGenerator
+ Settings.Designer.cs
+
+
+ True
+ Settings.settings
+ True
+
+
+
+
+
+
+
+ {49b88ffa-f02c-4709-ba65-9f8996444ecd}
+ ToggleSwitch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ToggleSwitchDemo/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs b/ToggleSwitchDemo/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..5d01041
--- /dev/null
+++ b/ToggleSwitchDemo/obj/Debug/.NETFramework,Version=v4.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.0", FrameworkDisplayName = ".NET Framework 4")]
diff --git a/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferences.cache
new file mode 100644
index 0000000..d16ec53
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ
diff --git a/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..bff5900
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/ToggleSwitchDemo/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/ToggleSwitchDemo/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..846209a
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.DemoForm.resources b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.DemoForm.resources
new file mode 100644
index 0000000..360c712
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.DemoForm.resources differ
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.Properties.Resources.resources b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.Properties.Resources.resources
new file mode 100644
index 0000000..baccf3d
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.Properties.Resources.resources differ
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CopyComplete b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CoreCompileInputs.cache b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..ef32b4a
--- /dev/null
+++ b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+a3b23e74090a80e3128188f6cf3a320fb2c4b627
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.FileListAbsolute.txt b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..3bfca64
--- /dev/null
+++ b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.FileListAbsolute.txt
@@ -0,0 +1,25 @@
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitchDemo.exe
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitchDemo.pdb
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitch.dll
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitch.pdb
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csprojResolveAssemblyReference.cache
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.DemoForm.resources
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.Properties.Resources.resources
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csproj.GenerateResource.Cache
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.exe
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.pdb
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitchDemo.exe
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitchDemo.pdb
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitch.dll
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Debug\ToggleSwitch.pdb
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csprojAssemblyReference.cache
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.DemoForm.resources
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.Properties.Resources.resources
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csproj.GenerateResource.cache
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csproj.CoreCompileInputs.cache
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csproj.CopyComplete
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.exe
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.pdb
+D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.csprojAssemblyReference.cache
+D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.exe
+D:\CKMAI_Documents\Programming\GitHub\ToggleSwitch\ToggleSwitchDemo\obj\Debug\ToggleSwitchDemo.pdb
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.GenerateResource.cache b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.GenerateResource.cache
new file mode 100644
index 0000000..f390b92
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csproj.GenerateResource.cache differ
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojAssemblyReference.cache b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojAssemblyReference.cache
new file mode 100644
index 0000000..5ee7ea3
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojAssemblyReference.cache differ
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojResolveAssemblyReference.cache b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..3203e46
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.csprojResolveAssemblyReference.cache differ
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.exe b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.exe
new file mode 100644
index 0000000..c7e9206
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.exe differ
diff --git a/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.pdb b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.pdb
new file mode 100644
index 0000000..779440e
Binary files /dev/null and b/ToggleSwitchDemo/obj/Debug/ToggleSwitchDemo.pdb differ
diff --git a/ToggleSwitchDemo/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache b/ToggleSwitchDemo/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache
new file mode 100644
index 0000000..9ed1cab
Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/DesignTimeResolveAssemblyReferencesInput.cache differ
diff --git a/ToggleSwitchDemo/obj/Release/TempPE/Properties.Resources.Designer.cs.dll b/ToggleSwitchDemo/obj/Release/TempPE/Properties.Resources.Designer.cs.dll
new file mode 100644
index 0000000..b56a34c
Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/TempPE/Properties.Resources.Designer.cs.dll differ
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.DemoForm.resources b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.DemoForm.resources
new file mode 100644
index 0000000..360c712
Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.DemoForm.resources differ
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.Properties.Resources.resources b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.Properties.Resources.resources
new file mode 100644
index 0000000..baccf3d
Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.Properties.Resources.resources differ
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CopyComplete b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CoreCompileInputs.cache b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..ad76e5f
--- /dev/null
+++ b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+fd4dbdbc4ebb23053bb7500549871212fffaf366
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.FileListAbsolute.txt b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..de9128d
--- /dev/null
+++ b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.FileListAbsolute.txt
@@ -0,0 +1,22 @@
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitchDemo.exe
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitchDemo.pdb
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitch.dll
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitch.pdb
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csprojResolveAssemblyReference.cache
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.DemoForm.resources
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.Properties.Resources.resources
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csproj.GenerateResource.Cache
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.exe
+C:\Users\Johnny\Documents\_Visual Studio Projects\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.pdb
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitchDemo.exe
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitchDemo.pdb
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitch.dll
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\bin\Release\ToggleSwitch.pdb
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csprojAssemblyReference.cache
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.DemoForm.resources
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.Properties.Resources.resources
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csproj.GenerateResource.cache
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csproj.CoreCompileInputs.cache
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.csproj.CopyComplete
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.exe
+D:\Projekt\CodeProject\ToggleSwitch\ToggleSwitchDemo\obj\Release\ToggleSwitchDemo.pdb
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.GenerateResource.cache b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.GenerateResource.cache
new file mode 100644
index 0000000..f390b92
Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csproj.GenerateResource.cache differ
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojAssemblyReference.cache b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojAssemblyReference.cache
new file mode 100644
index 0000000..5a14c66
Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojAssemblyReference.cache differ
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojResolveAssemblyReference.cache b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojResolveAssemblyReference.cache
new file mode 100644
index 0000000..e9150e5
Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.csprojResolveAssemblyReference.cache differ
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.exe b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.exe
new file mode 100644
index 0000000..035e320
Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.exe differ
diff --git a/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.pdb b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.pdb
new file mode 100644
index 0000000..b8cc348
Binary files /dev/null and b/ToggleSwitchDemo/obj/Release/ToggleSwitchDemo.pdb differ
diff --git a/arrowleft.png b/arrowleft.png
new file mode 100644
index 0000000..25d1578
Binary files /dev/null and b/arrowleft.png differ
diff --git a/check.png b/check.png
new file mode 100644
index 0000000..5233a8f
Binary files /dev/null and b/check.png differ
diff --git a/cross.png b/cross.png
new file mode 100644
index 0000000..25572fc
Binary files /dev/null and b/cross.png differ
diff --git a/favicon.ico b/favicon.ico
new file mode 100644
index 0000000..affdba5
Binary files /dev/null and b/favicon.ico differ
diff --git a/handle.png b/handle.png
new file mode 100644
index 0000000..33fbf6b
Binary files /dev/null and b/handle.png differ
diff --git a/loading-circle.gif b/loading-circle.gif
new file mode 100644
index 0000000..be46af8
Binary files /dev/null and b/loading-circle.gif differ