Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/sn4k3/UVtools.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Conceição <Tiago_caza@hotmail.com>2020-06-29 07:18:33 +0300
committerTiago Conceição <Tiago_caza@hotmail.com>2020-06-29 07:18:33 +0300
commit2cbb3f377a7931cc66fae4145c84e99154028327 (patch)
treea9aa4801e580a9e39e1ce3001e4e162789ff1bf6 /UVtools.GUI
parent6d401eb774bc4d9a0014e24b2d48c4f5e156d912 (diff)
v0.6.0.0v0.6.0.0
* (Add) UVtools now notify when a new version available is detected * (Add) Mutator "Flip" * (Add) Mutator "Rotate" * (Add) User Settings - Many parameters can now be customized to needs * (Add) File load elapsed time into Title bar * (Add) Outline - Print Volume bounds * (Add) Outline - Layer bounds * (Add) Outline - Hollow areas * (Add) Double click layer picture to Zoom To Fit * (Improvement) Huge performance boost in layer reparing and in every mutator * (Improvement) Layer preview is now faster * (Improvement) Islands detection is now better and don't skip any pixel, more islands will show or the region will be bigger * (Improvement) Islands search are now faster, it will jump from island to insland instead of search in every pixel by pixel * (Improvement) ResinTrap detection and corrected some cases where it can't detect a drain * (Improvement) Better memory optimization by dispose all objects on operations * (Improvement) Image engine changed to use only OpenCV Mat instead of two and avoid converting from one to another, as result there's a huge performance gain in some operations (#6) * (Improvement) UVtools now rely on UVtools.Core, and drop the UVtools.Parser. The Core now perform all operations and transformations inplace of the GUI * (Improvement) If error occur during save it will show a message with the error * (Improvement) When rotate layer it will zoom to fit * (Improvement) Allow zoom to fit to print volume area instead of whole build volume * (Removed) ImageSharp dependency * (Removed) UVtools.Parser project * (Fix) Nova3D Elfin printer values changed to Display Width : 131mm / Height : 73mm & Screen X: 2531 / Y: 1410 (#5) * (Fix) Fade resizes make image offset a pixel from layer to layer because of integer placement, now it matain the correct position * (Fix) sl1: AbsoluteCorrection, GammaCorrection, MinExposureTime, MaxExposureTime, FastTiltTime, SlowTiltTime and AreaFill was byte and float values prevents the file from open (#4) * (Fix) zcodex: XCorrection and YCorrection was byte and float values prevents the file from open (#4) * (Fix) cws: XCorrection and YCorrection was byte and float values prevents the file from open (#4) * (Fix) cws: Wrong # char on .gcode file prevent from printing (#4)
Diffstat (limited to 'UVtools.GUI')
-rw-r--r--UVtools.GUI/App.config114
-rw-r--r--UVtools.GUI/Forms/FrmAbout.cs8
-rw-r--r--UVtools.GUI/Forms/FrmMutation.cs21
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs296
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneComoboBox.cs182
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneComoboBox.resx131
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs289
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs173
-rw-r--r--UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx131
-rw-r--r--UVtools.GUI/Forms/FrmMutationResize.Designer.cs152
-rw-r--r--UVtools.GUI/Forms/FrmSettings.Designer.cs1112
-rw-r--r--UVtools.GUI/Forms/FrmSettings.cs157
-rw-r--r--UVtools.GUI/Forms/FrmSettings.resx2204
-rw-r--r--UVtools.GUI/FrmMain.Designer.cs145
-rw-r--r--UVtools.GUI/FrmMain.cs610
-rw-r--r--UVtools.GUI/FrmMain.resx122
-rw-r--r--UVtools.GUI/Images/settings-16x16.pngbin0 -> 290 bytes
-rw-r--r--UVtools.GUI/Mutation.cs26
-rw-r--r--UVtools.GUI/Properties/Resources.Designer.cs10
-rw-r--r--UVtools.GUI/Properties/Resources.resx63
-rw-r--r--UVtools.GUI/Properties/Settings.Designer.cs420
-rw-r--r--UVtools.GUI/Properties/Settings.settings116
-rw-r--r--UVtools.GUI/UVtools.GUI.csproj51
-rw-r--r--UVtools.GUI/packages.config9
24 files changed, 6069 insertions, 473 deletions
diff --git a/UVtools.GUI/App.config b/UVtools.GUI/App.config
index d896ff5..6e67ee6 100644
--- a/UVtools.GUI/App.config
+++ b/UVtools.GUI/App.config
@@ -1,5 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
+ <configSections>
+ <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+ <section name="UVtools.GUI.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
+ </sectionGroup>
+ </configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
@@ -23,4 +28,113 @@
</dependentAssembly>
</assemblyBinding>
</runtime>
+ <userSettings>
+ <UVtools.GUI.Properties.Settings>
+ <setting name="PreviousNextLayerColor" serializeAs="String">
+ <value>Red</value>
+ </setting>
+ <setting name="IslandColor" serializeAs="String">
+ <value>Yellow</value>
+ </setting>
+ <setting name="ResinTrapColor" serializeAs="String">
+ <value>Orange</value>
+ </setting>
+ <setting name="TouchingBoundsColor" serializeAs="String">
+ <value>Red</value>
+ </setting>
+ <setting name="PreviousLayerColor" serializeAs="String">
+ <value>Magenta</value>
+ </setting>
+ <setting name="NextLayerColor" serializeAs="String">
+ <value>Cyan</value>
+ </setting>
+ <setting name="UpdateSettings" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="StartMaximized" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="CheckForUpdatesOnStartup" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="LayerAutoRotateBestView" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="LayerDifferenceDefault" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="ComputeIssuesOnLoad" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="LayerZoomToFit" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="ComputeIslands" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="ComputeResinTraps" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="IslandRequiredAreaToProcessCheck" serializeAs="String">
+ <value>1</value>
+ </setting>
+ <setting name="IslandRequiredPixelBrightnessToProcessCheck" serializeAs="String">
+ <value>1</value>
+ </setting>
+ <setting name="IslandRequiredPixelsToSupport" serializeAs="String">
+ <value>10</value>
+ </setting>
+ <setting name="IslandRequiredPixelBrightnessToSupport" serializeAs="String">
+ <value>150</value>
+ </setting>
+ <setting name="ResinTrapRequiredAreaToProcessCheck" serializeAs="String">
+ <value>17</value>
+ </setting>
+ <setting name="ResinTrapRequiredBlackPixelsToDrain" serializeAs="String">
+ <value>10</value>
+ </setting>
+ <setting name="ResinTrapMaximumPixelBrightnessToDrain" serializeAs="String">
+ <value>30</value>
+ </setting>
+ <setting name="AutoComputeIssuesClickOnTab" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="OutlinePrintVolumeBoundsColor" serializeAs="String">
+ <value>Lime</value>
+ </setting>
+ <setting name="OutlinePrintVolumeBoundsLineThickness" serializeAs="String">
+ <value>3</value>
+ </setting>
+ <setting name="OutlineLayerBoundsColor" serializeAs="String">
+ <value>Lime</value>
+ </setting>
+ <setting name="OutlineLayerBoundsLineThickness" serializeAs="String">
+ <value>3</value>
+ </setting>
+ <setting name="OutlineHollowAreasColor" serializeAs="String">
+ <value>Orange</value>
+ </setting>
+ <setting name="OutlineHollowAreasLineThickness" serializeAs="String">
+ <value>3</value>
+ </setting>
+ <setting name="OutlinePrintVolumeBounds" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="OutlineLayerBounds" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="OutlineHollowAreas" serializeAs="String">
+ <value>False</value>
+ </setting>
+ <setting name="ZoomToFitPrintVolumeBounds" serializeAs="String">
+ <value>True</value>
+ </setting>
+ <setting name="ResinTrapBinaryThreshold" serializeAs="String">
+ <value>127</value>
+ </setting>
+ <setting name="IslandBinaryThreshold" serializeAs="String">
+ <value>0</value>
+ </setting>
+ </UVtools.GUI.Properties.Settings>
+ </userSettings>
</configuration>
diff --git a/UVtools.GUI/Forms/FrmAbout.cs b/UVtools.GUI/Forms/FrmAbout.cs
index feeb862..baeebdc 100644
--- a/UVtools.GUI/Forms/FrmAbout.cs
+++ b/UVtools.GUI/Forms/FrmAbout.cs
@@ -46,13 +46,7 @@ namespace UVtools.GUI.Forms
}
}
- public static string AssemblyVersion
- {
- get
- {
- return Assembly.GetExecutingAssembly().GetName().Version.ToString();
- }
- }
+ public static string AssemblyVersion => Assembly.GetExecutingAssembly().GetName().Version.ToString();
public static string AssemblyDescription
{
diff --git a/UVtools.GUI/Forms/FrmMutation.cs b/UVtools.GUI/Forms/FrmMutation.cs
index 0729e88..be92c0e 100644
--- a/UVtools.GUI/Forms/FrmMutation.cs
+++ b/UVtools.GUI/Forms/FrmMutation.cs
@@ -8,6 +8,7 @@
using System;
using System.Windows.Forms;
+using UVtools.Core;
namespace UVtools.GUI.Forms
{
@@ -49,15 +50,21 @@ namespace UVtools.GUI.Forms
#endregion
#region Constructors
- public FrmMutation(Mutation mutation, uint defaultIterations = 1)
+
+ public FrmMutation()
{
InitializeComponent();
+ }
+
+ public FrmMutation(Mutation mutation, uint defaultIterations = 1) : this()
+ {
+
Mutation = mutation;
DialogResult = DialogResult.Cancel;
if (defaultIterations == 0 ||
- mutation.Mutate == Mutation.Mutates.PyrDownUp ||
- mutation.Mutate == Mutation.Mutates.Solidify)
+ mutation.Mutate == LayerManager.Mutate.PyrDownUp ||
+ mutation.Mutate == LayerManager.Mutate.Solidify)
{
lbIterationsStart.Enabled =
numIterationsStart.Enabled =
@@ -72,8 +79,8 @@ namespace UVtools.GUI.Forms
numIterationsStart.Select();
}
- if (Mutation.Mutate == Mutation.Mutates.SmoothGaussian ||
- Mutation.Mutate == Mutation.Mutates.SmoothMedian)
+ if (Mutation.Mutate == LayerManager.Mutate.SmoothGaussian ||
+ Mutation.Mutate == LayerManager.Mutate.SmoothMedian)
{
lbIterationsStop.Enabled =
nmIterationsEnd.Enabled =
@@ -185,8 +192,8 @@ namespace UVtools.GUI.Forms
return;
}
- if (Mutation.Mutate == Mutation.Mutates.SmoothGaussian ||
- Mutation.Mutate == Mutation.Mutates.SmoothMedian)
+ if (Mutation.Mutate == LayerManager.Mutate.SmoothGaussian ||
+ Mutation.Mutate == LayerManager.Mutate.SmoothMedian)
{
if (IterationsFade)
{
diff --git a/UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs b/UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs
new file mode 100644
index 0000000..4742fbf
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneComoboBox.Designer.cs
@@ -0,0 +1,296 @@
+using UVtools.GUI.Controls;
+
+namespace UVtools.GUI.Forms
+{
+ partial class FrmMutationOneComboBox
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMutationOneComboBox));
+ this.lbDescription = new System.Windows.Forms.Label();
+ this.lbValue = new System.Windows.Forms.Label();
+ this.lbLayerRange = new System.Windows.Forms.Label();
+ this.nmLayerRangeStart = new System.Windows.Forms.NumericUpDown();
+ this.nmLayerRangeEnd = new System.Windows.Forms.NumericUpDown();
+ this.lbLayerRangeTo = new System.Windows.Forms.Label();
+ this.cmLayerRange = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.btnLayerRangeAllLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.btnMutate = new System.Windows.Forms.Button();
+ this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.cbValue = new System.Windows.Forms.ComboBox();
+ this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
+ this.cbMakeCopy = new System.Windows.Forms.CheckBox();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit();
+ this.cmLayerRange.SuspendLayout();
+ this.SuspendLayout();
+ //
+ // lbDescription
+ //
+ this.lbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)));
+ this.lbDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbDescription.Location = new System.Drawing.Point(13, 14);
+ this.lbDescription.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbDescription.Name = "lbDescription";
+ this.lbDescription.Size = new System.Drawing.Size(584, 128);
+ this.lbDescription.TabIndex = 0;
+ this.lbDescription.Text = "Description";
+ //
+ // lbValue
+ //
+ this.lbValue.Location = new System.Drawing.Point(2, 185);
+ this.lbValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbValue.Name = "lbValue";
+ this.lbValue.Size = new System.Drawing.Size(108, 20);
+ this.lbValue.TabIndex = 3;
+ this.lbValue.Text = "Label:";
+ this.lbValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // lbLayerRange
+ //
+ this.lbLayerRange.AutoSize = true;
+ this.lbLayerRange.Location = new System.Drawing.Point(13, 150);
+ this.lbLayerRange.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbLayerRange.Name = "lbLayerRange";
+ this.lbLayerRange.Size = new System.Drawing.Size(97, 20);
+ this.lbLayerRange.TabIndex = 9;
+ this.lbLayerRange.Text = "Layer range:";
+ this.toolTip.SetToolTip(this.lbLayerRange, resources.GetString("lbLayerRange.ToolTip"));
+ //
+ // nmLayerRangeStart
+ //
+ this.nmLayerRangeStart.Location = new System.Drawing.Point(118, 147);
+ this.nmLayerRangeStart.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmLayerRangeStart.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmLayerRangeStart.Name = "nmLayerRangeStart";
+ this.nmLayerRangeStart.Size = new System.Drawing.Size(120, 26);
+ this.nmLayerRangeStart.TabIndex = 0;
+ //
+ // nmLayerRangeEnd
+ //
+ this.nmLayerRangeEnd.Location = new System.Drawing.Point(314, 147);
+ this.nmLayerRangeEnd.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmLayerRangeEnd.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmLayerRangeEnd.Name = "nmLayerRangeEnd";
+ this.nmLayerRangeEnd.Size = new System.Drawing.Size(120, 26);
+ this.nmLayerRangeEnd.TabIndex = 1;
+ //
+ // lbLayerRangeTo
+ //
+ this.lbLayerRangeTo.AutoSize = true;
+ this.lbLayerRangeTo.Location = new System.Drawing.Point(275, 150);
+ this.lbLayerRangeTo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbLayerRangeTo.Name = "lbLayerRangeTo";
+ this.lbLayerRangeTo.Size = new System.Drawing.Size(31, 20);
+ this.lbLayerRangeTo.TabIndex = 12;
+ this.lbLayerRangeTo.Text = "To:";
+ //
+ // cmLayerRange
+ //
+ this.cmLayerRange.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btnLayerRangeAllLayers,
+ this.btnLayerRangeCurrentLayer,
+ this.btnLayerRangeBottomLayers,
+ this.btnLayerRangeNormalLayers});
+ this.cmLayerRange.Name = "cmLayerRange";
+ this.cmLayerRange.Size = new System.Drawing.Size(226, 92);
+ //
+ // btnLayerRangeAllLayers
+ //
+ this.btnLayerRangeAllLayers.Name = "btnLayerRangeAllLayers";
+ this.btnLayerRangeAllLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.A)));
+ this.btnLayerRangeAllLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeAllLayers.Text = "&All Layers";
+ this.btnLayerRangeAllLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeCurrentLayer
+ //
+ this.btnLayerRangeCurrentLayer.Name = "btnLayerRangeCurrentLayer";
+ this.btnLayerRangeCurrentLayer.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.C)));
+ this.btnLayerRangeCurrentLayer.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeCurrentLayer.Text = "&Current Layer";
+ this.btnLayerRangeCurrentLayer.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeBottomLayers
+ //
+ this.btnLayerRangeBottomLayers.Name = "btnLayerRangeBottomLayers";
+ this.btnLayerRangeBottomLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.B)));
+ this.btnLayerRangeBottomLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeBottomLayers.Text = "&Bottom Layers";
+ this.btnLayerRangeBottomLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeNormalLayers
+ //
+ this.btnLayerRangeNormalLayers.Name = "btnLayerRangeNormalLayers";
+ this.btnLayerRangeNormalLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.N)));
+ this.btnLayerRangeNormalLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeNormalLayers.Text = "&Normal Layers";
+ this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
+ this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCancel.Location = new System.Drawing.Point(434, 230);
+ this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(150, 48);
+ this.btnCancel.TabIndex = 6;
+ this.btnCancel.Text = "&Cancel";
+ this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnMutate
+ //
+ this.btnMutate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnMutate.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
+ this.btnMutate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnMutate.Location = new System.Drawing.Point(276, 230);
+ this.btnMutate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnMutate.Name = "btnMutate";
+ this.btnMutate.Size = new System.Drawing.Size(150, 48);
+ this.btnMutate.TabIndex = 5;
+ this.btnMutate.Text = "&Mutate";
+ this.btnMutate.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnMutate.UseVisualStyleBackColor = true;
+ this.btnMutate.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // toolTip
+ //
+ this.toolTip.AutoPopDelay = 32767;
+ this.toolTip.InitialDelay = 500;
+ this.toolTip.IsBalloon = true;
+ this.toolTip.ReshowDelay = 100;
+ this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.toolTip.ToolTipTitle = "Information";
+ //
+ // cbValue
+ //
+ this.cbValue.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.cbValue.FormattingEnabled = true;
+ this.cbValue.Location = new System.Drawing.Point(117, 181);
+ this.cbValue.Name = "cbValue";
+ this.cbValue.Size = new System.Drawing.Size(121, 28);
+ this.cbValue.TabIndex = 13;
+ //
+ // btnLayerRangeSelect
+ //
+ this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146);
+ this.btnLayerRangeSelect.Menu = this.cmLayerRange;
+ this.btnLayerRangeSelect.Name = "btnLayerRangeSelect";
+ this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26);
+ this.btnLayerRangeSelect.TabIndex = 2;
+ this.btnLayerRangeSelect.Text = "Select";
+ this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
+ //
+ // cbMakeCopy
+ //
+ this.cbMakeCopy.AutoSize = true;
+ this.cbMakeCopy.Location = new System.Drawing.Point(244, 183);
+ this.cbMakeCopy.Name = "cbMakeCopy";
+ this.cbMakeCopy.Size = new System.Drawing.Size(104, 24);
+ this.cbMakeCopy.TabIndex = 14;
+ this.cbMakeCopy.Text = "Make copy";
+ this.cbMakeCopy.UseVisualStyleBackColor = true;
+ //
+ // FrmMutationOneComboBox
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.btnCancel;
+ this.ClientSize = new System.Drawing.Size(599, 292);
+ this.Controls.Add(this.cbMakeCopy);
+ this.Controls.Add(this.cbValue);
+ this.Controls.Add(this.btnLayerRangeSelect);
+ this.Controls.Add(this.lbLayerRangeTo);
+ this.Controls.Add(this.nmLayerRangeEnd);
+ this.Controls.Add(this.nmLayerRangeStart);
+ this.Controls.Add(this.lbLayerRange);
+ this.Controls.Add(this.btnMutate);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.lbValue);
+ this.Controls.Add(this.lbDescription);
+ this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.KeyPreview = true;
+ this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FrmMutationOneComboBox";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.Text = "Form1";
+ this.TopMost = true;
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit();
+ this.cmLayerRange.ResumeLayout(false);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lbDescription;
+ private System.Windows.Forms.Label lbValue;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Button btnMutate;
+ private System.Windows.Forms.Label lbLayerRange;
+ private System.Windows.Forms.NumericUpDown nmLayerRangeStart;
+ private System.Windows.Forms.NumericUpDown nmLayerRangeEnd;
+ private System.Windows.Forms.Label lbLayerRangeTo;
+ private Controls.SplitButton btnLayerRangeSelect;
+ private System.Windows.Forms.ContextMenuStrip cmLayerRange;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeAllLayers;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeCurrentLayer;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeBottomLayers;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeNormalLayers;
+ private System.Windows.Forms.ToolTip toolTip;
+ private System.Windows.Forms.ComboBox cbValue;
+ private System.Windows.Forms.CheckBox cbMakeCopy;
+ }
+} \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmMutationOneComoboBox.cs b/UVtools.GUI/Forms/FrmMutationOneComoboBox.cs
new file mode 100644
index 0000000..b68012f
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneComoboBox.cs
@@ -0,0 +1,182 @@
+/*
+ * GNU AFFERO GENERAL PUBLIC LICENSE
+ * Version 3, 19 November 2007
+ * Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ * Everyone is permitted to copy and distribute verbatim copies
+ * of this license document, but changing it is not allowed.
+ */
+
+using System;
+using System.Windows.Forms;
+using UVtools.Core;
+
+namespace UVtools.GUI.Forms
+{
+ public partial class FrmMutationOneComboBox : Form
+ {
+ #region Properties
+
+ private Mutation Mutation { get; }
+
+ public uint LayerRangeStart
+ {
+ get => (uint) nmLayerRangeStart.Value;
+ set => nmLayerRangeStart.Value = value;
+ }
+
+ public uint LayerRangeEnd
+ {
+ get => (uint)Math.Min(nmLayerRangeEnd.Value, Program.SlicerFile.LayerCount-1);
+ set => nmLayerRangeEnd.Value = value;
+ }
+
+ public int SelectedValue
+ {
+ get => cbValue.SelectedIndex;
+ set => cbValue.SelectedIndex = value;
+ }
+
+ public bool MakeCopy
+ {
+ get => cbMakeCopy.Checked;
+ set => cbMakeCopy.Checked = value;
+ }
+ #endregion
+
+ #region Constructors
+ public FrmMutationOneComboBox(Mutation mutation)
+ {
+ InitializeComponent();
+ Mutation = mutation;
+ DialogResult = DialogResult.Cancel;
+
+ Text = $"Mutate: {mutation.Mutate}";
+ lbDescription.Text = Mutation.Description;
+
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
+
+ switch (mutation.Mutate)
+ {
+ case LayerManager.Mutate.Flip:
+ lbValue.Text = "Flip Direction";
+ cbValue.Items.AddRange(new object[]
+ {
+ "Horizontally",
+ "Vertically",
+ "Both"
+ });
+ break;
+ }
+
+ SelectedValue = 0;
+ }
+ #endregion
+
+ #region Overrides
+ protected override void OnKeyUp(KeyEventArgs e)
+ {
+ base.OnKeyUp(e);
+ if (e.KeyCode == Keys.Enter)
+ {
+ btnMutate.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if ((ModifierKeys & Keys.Shift) == Keys.Shift && (ModifierKeys & Keys.Control) == Keys.Control)
+ {
+ if (e.KeyCode == Keys.A)
+ {
+ btnLayerRangeAllLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.C)
+ {
+ btnLayerRangeCurrentLayer.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.B)
+ {
+ btnLayerRangeBottomLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.N)
+ {
+ btnLayerRangeNormalLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+ }
+ }
+
+ #endregion
+
+ #region Events
+ private void ItemClicked(object sender, EventArgs e)
+ {
+ if (ReferenceEquals(sender, btnLayerRangeAllLayers))
+ {
+ nmLayerRangeStart.Value = 0;
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeCurrentLayer))
+ {
+ nmLayerRangeStart.Value = Program.FrmMain.ActualLayer;
+ nmLayerRangeEnd.Value = Program.FrmMain.ActualLayer;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeBottomLayers))
+ {
+ nmLayerRangeStart.Value = 0;
+ nmLayerRangeEnd.Value = Program.SlicerFile.InitialLayerCount-1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeNormalLayers))
+ {
+ nmLayerRangeStart.Value = Program.SlicerFile.InitialLayerCount - 1;
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount - 1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnMutate))
+ {
+ if (!btnMutate.Enabled) return;
+ if (LayerRangeStart > LayerRangeEnd)
+ {
+ MessageBox.Show("Layer range start can't be higher than layer end.\nPlease fix and try again.", Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ nmLayerRangeStart.Select();
+ return;
+ }
+
+ if (MessageBox.Show($"Are you sure you want to {Mutation.Mutate}?", Text, MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnCancel))
+ {
+ DialogResult = DialogResult.Cancel;
+ return;
+ }
+ }
+
+ #endregion
+
+
+ }
+}
diff --git a/UVtools.GUI/Forms/FrmMutationOneComoboBox.resx b/UVtools.GUI/Forms/FrmMutationOneComoboBox.resx
new file mode 100644
index 0000000..ceac7ae
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneComoboBox.resx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>148, 17</value>
+ </metadata>
+ <data name="lbLayerRange.ToolTip" xml:space="preserve">
+ <value>Selects the layers range within start layer and end layer where mutator will operate.
+Select same layer start as end to operate only within that layer.
+Note: "Layer Start" start can't be higher than "Layer End".</value>
+ </data>
+ <metadata name="cmLayerRange.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+</root> \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs
new file mode 100644
index 0000000..8e83792
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.Designer.cs
@@ -0,0 +1,289 @@
+using UVtools.GUI.Controls;
+
+namespace UVtools.GUI.Forms
+{
+ partial class FrmMutationOneNumericalInput
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.components = new System.ComponentModel.Container();
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMutationOneNumericalInput));
+ this.lbDescription = new System.Windows.Forms.Label();
+ this.lbValue = new System.Windows.Forms.Label();
+ this.lbLayerRange = new System.Windows.Forms.Label();
+ this.nmLayerRangeStart = new System.Windows.Forms.NumericUpDown();
+ this.nmLayerRangeEnd = new System.Windows.Forms.NumericUpDown();
+ this.lbLayerRangeTo = new System.Windows.Forms.Label();
+ this.cmLayerRange = new System.Windows.Forms.ContextMenuStrip(this.components);
+ this.btnLayerRangeAllLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.btnMutate = new System.Windows.Forms.Button();
+ this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.nmValue = new System.Windows.Forms.NumericUpDown();
+ this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit();
+ this.cmLayerRange.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmValue)).BeginInit();
+ this.SuspendLayout();
+ //
+ // lbDescription
+ //
+ this.lbDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)));
+ this.lbDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lbDescription.Location = new System.Drawing.Point(13, 14);
+ this.lbDescription.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbDescription.Name = "lbDescription";
+ this.lbDescription.Size = new System.Drawing.Size(584, 128);
+ this.lbDescription.TabIndex = 0;
+ this.lbDescription.Text = "Description";
+ //
+ // lbValue
+ //
+ this.lbValue.Location = new System.Drawing.Point(13, 185);
+ this.lbValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbValue.Name = "lbValue";
+ this.lbValue.Size = new System.Drawing.Size(293, 20);
+ this.lbValue.TabIndex = 3;
+ this.lbValue.Text = "Label:";
+ this.lbValue.TextAlign = System.Drawing.ContentAlignment.TopRight;
+ //
+ // lbLayerRange
+ //
+ this.lbLayerRange.AutoSize = true;
+ this.lbLayerRange.Location = new System.Drawing.Point(13, 150);
+ this.lbLayerRange.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbLayerRange.Name = "lbLayerRange";
+ this.lbLayerRange.Size = new System.Drawing.Size(97, 20);
+ this.lbLayerRange.TabIndex = 9;
+ this.lbLayerRange.Text = "Layer range:";
+ this.toolTip.SetToolTip(this.lbLayerRange, resources.GetString("lbLayerRange.ToolTip"));
+ //
+ // nmLayerRangeStart
+ //
+ this.nmLayerRangeStart.Location = new System.Drawing.Point(118, 147);
+ this.nmLayerRangeStart.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmLayerRangeStart.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmLayerRangeStart.Name = "nmLayerRangeStart";
+ this.nmLayerRangeStart.Size = new System.Drawing.Size(120, 26);
+ this.nmLayerRangeStart.TabIndex = 0;
+ //
+ // nmLayerRangeEnd
+ //
+ this.nmLayerRangeEnd.Location = new System.Drawing.Point(314, 147);
+ this.nmLayerRangeEnd.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmLayerRangeEnd.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmLayerRangeEnd.Name = "nmLayerRangeEnd";
+ this.nmLayerRangeEnd.Size = new System.Drawing.Size(120, 26);
+ this.nmLayerRangeEnd.TabIndex = 1;
+ //
+ // lbLayerRangeTo
+ //
+ this.lbLayerRangeTo.AutoSize = true;
+ this.lbLayerRangeTo.Location = new System.Drawing.Point(275, 150);
+ this.lbLayerRangeTo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.lbLayerRangeTo.Name = "lbLayerRangeTo";
+ this.lbLayerRangeTo.Size = new System.Drawing.Size(31, 20);
+ this.lbLayerRangeTo.TabIndex = 12;
+ this.lbLayerRangeTo.Text = "To:";
+ //
+ // cmLayerRange
+ //
+ this.cmLayerRange.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.btnLayerRangeAllLayers,
+ this.btnLayerRangeCurrentLayer,
+ this.btnLayerRangeBottomLayers,
+ this.btnLayerRangeNormalLayers});
+ this.cmLayerRange.Name = "cmLayerRange";
+ this.cmLayerRange.Size = new System.Drawing.Size(226, 92);
+ //
+ // btnLayerRangeAllLayers
+ //
+ this.btnLayerRangeAllLayers.Name = "btnLayerRangeAllLayers";
+ this.btnLayerRangeAllLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.A)));
+ this.btnLayerRangeAllLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeAllLayers.Text = "&All Layers";
+ this.btnLayerRangeAllLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeCurrentLayer
+ //
+ this.btnLayerRangeCurrentLayer.Name = "btnLayerRangeCurrentLayer";
+ this.btnLayerRangeCurrentLayer.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.C)));
+ this.btnLayerRangeCurrentLayer.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeCurrentLayer.Text = "&Current Layer";
+ this.btnLayerRangeCurrentLayer.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeBottomLayers
+ //
+ this.btnLayerRangeBottomLayers.Name = "btnLayerRangeBottomLayers";
+ this.btnLayerRangeBottomLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.B)));
+ this.btnLayerRangeBottomLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeBottomLayers.Text = "&Bottom Layers";
+ this.btnLayerRangeBottomLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnLayerRangeNormalLayers
+ //
+ this.btnLayerRangeNormalLayers.Name = "btnLayerRangeNormalLayers";
+ this.btnLayerRangeNormalLayers.ShortcutKeys = ((System.Windows.Forms.Keys)(((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.Shift)
+ | System.Windows.Forms.Keys.N)));
+ this.btnLayerRangeNormalLayers.Size = new System.Drawing.Size(225, 22);
+ this.btnLayerRangeNormalLayers.Text = "&Normal Layers";
+ this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
+ this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCancel.Location = new System.Drawing.Point(434, 230);
+ this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(150, 48);
+ this.btnCancel.TabIndex = 6;
+ this.btnCancel.Text = "&Cancel";
+ this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCancel.UseVisualStyleBackColor = true;
+ this.btnCancel.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // btnMutate
+ //
+ this.btnMutate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnMutate.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
+ this.btnMutate.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnMutate.Location = new System.Drawing.Point(276, 230);
+ this.btnMutate.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnMutate.Name = "btnMutate";
+ this.btnMutate.Size = new System.Drawing.Size(150, 48);
+ this.btnMutate.TabIndex = 5;
+ this.btnMutate.Text = "&Mutate";
+ this.btnMutate.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnMutate.UseVisualStyleBackColor = true;
+ this.btnMutate.Click += new System.EventHandler(this.ItemClicked);
+ //
+ // toolTip
+ //
+ this.toolTip.AutoPopDelay = 32767;
+ this.toolTip.InitialDelay = 500;
+ this.toolTip.IsBalloon = true;
+ this.toolTip.ReshowDelay = 100;
+ this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.toolTip.ToolTipTitle = "Information";
+ //
+ // nmValue
+ //
+ this.nmValue.Location = new System.Drawing.Point(314, 183);
+ this.nmValue.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmValue.Maximum = new decimal(new int[] {
+ 100000,
+ 0,
+ 0,
+ 0});
+ this.nmValue.Name = "nmValue";
+ this.nmValue.Size = new System.Drawing.Size(120, 26);
+ this.nmValue.TabIndex = 13;
+ //
+ // btnLayerRangeSelect
+ //
+ this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146);
+ this.btnLayerRangeSelect.Menu = this.cmLayerRange;
+ this.btnLayerRangeSelect.Name = "btnLayerRangeSelect";
+ this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26);
+ this.btnLayerRangeSelect.TabIndex = 2;
+ this.btnLayerRangeSelect.Text = "Select";
+ this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
+ //
+ // FrmMutationOneNumericalInput
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.btnCancel;
+ this.ClientSize = new System.Drawing.Size(599, 292);
+ this.Controls.Add(this.nmValue);
+ this.Controls.Add(this.btnLayerRangeSelect);
+ this.Controls.Add(this.lbLayerRangeTo);
+ this.Controls.Add(this.nmLayerRangeEnd);
+ this.Controls.Add(this.nmLayerRangeStart);
+ this.Controls.Add(this.lbLayerRange);
+ this.Controls.Add(this.btnMutate);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.lbValue);
+ this.Controls.Add(this.lbDescription);
+ this.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+ this.KeyPreview = true;
+ this.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FrmMutationOneNumericalInput";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.Text = "Form1";
+ this.TopMost = true;
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit();
+ this.cmLayerRange.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.nmValue)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label lbDescription;
+ private System.Windows.Forms.Label lbValue;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Button btnMutate;
+ private System.Windows.Forms.Label lbLayerRange;
+ private System.Windows.Forms.NumericUpDown nmLayerRangeStart;
+ private System.Windows.Forms.NumericUpDown nmLayerRangeEnd;
+ private System.Windows.Forms.Label lbLayerRangeTo;
+ private Controls.SplitButton btnLayerRangeSelect;
+ private System.Windows.Forms.ContextMenuStrip cmLayerRange;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeAllLayers;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeCurrentLayer;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeBottomLayers;
+ private System.Windows.Forms.ToolStripMenuItem btnLayerRangeNormalLayers;
+ private System.Windows.Forms.ToolTip toolTip;
+ private System.Windows.Forms.NumericUpDown nmValue;
+ }
+} \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs
new file mode 100644
index 0000000..a44bc21
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.cs
@@ -0,0 +1,173 @@
+/*
+ * GNU AFFERO GENERAL PUBLIC LICENSE
+ * Version 3, 19 November 2007
+ * Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ * Everyone is permitted to copy and distribute verbatim copies
+ * of this license document, but changing it is not allowed.
+ */
+
+using System;
+using System.Windows.Forms;
+using UVtools.Core;
+
+namespace UVtools.GUI.Forms
+{
+ public partial class FrmMutationOneNumericalInput : Form
+ {
+ #region Properties
+
+ private Mutation Mutation { get; }
+
+ public uint LayerRangeStart
+ {
+ get => (uint) nmLayerRangeStart.Value;
+ set => nmLayerRangeStart.Value = value;
+ }
+
+ public uint LayerRangeEnd
+ {
+ get => (uint)Math.Min(nmLayerRangeEnd.Value, Program.SlicerFile.LayerCount-1);
+ set => nmLayerRangeEnd.Value = value;
+ }
+
+ public decimal Value
+ {
+ get => nmValue.Value;
+ set => nmValue.Value = value;
+ }
+ #endregion
+
+ #region Constructors
+ public FrmMutationOneNumericalInput(Mutation mutation)
+ {
+ InitializeComponent();
+ Mutation = mutation;
+ DialogResult = DialogResult.Cancel;
+
+ Text = $"Mutate: {mutation.Mutate}";
+ lbDescription.Text = Mutation.Description;
+
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
+
+ switch (mutation.Mutate)
+ {
+ case LayerManager.Mutate.Rotate:
+ lbValue.Text = "Rotation degrees:";
+ nmValue.Maximum = 360;
+ nmValue.Minimum = -360;
+ nmValue.DecimalPlaces = 2;
+
+ Value = 90;
+ break;
+ }
+ }
+ #endregion
+
+ #region Overrides
+ protected override void OnKeyUp(KeyEventArgs e)
+ {
+ base.OnKeyUp(e);
+ if (e.KeyCode == Keys.Enter)
+ {
+ btnMutate.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if ((ModifierKeys & Keys.Shift) == Keys.Shift && (ModifierKeys & Keys.Control) == Keys.Control)
+ {
+ if (e.KeyCode == Keys.A)
+ {
+ btnLayerRangeAllLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.C)
+ {
+ btnLayerRangeCurrentLayer.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.B)
+ {
+ btnLayerRangeBottomLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+
+ if (e.KeyCode == Keys.N)
+ {
+ btnLayerRangeNormalLayers.PerformClick();
+ e.Handled = true;
+ return;
+ }
+ }
+ }
+
+ #endregion
+
+ #region Events
+ private void ItemClicked(object sender, EventArgs e)
+ {
+ if (ReferenceEquals(sender, btnLayerRangeAllLayers))
+ {
+ nmLayerRangeStart.Value = 0;
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount-1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeCurrentLayer))
+ {
+ nmLayerRangeStart.Value = Program.FrmMain.ActualLayer;
+ nmLayerRangeEnd.Value = Program.FrmMain.ActualLayer;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeBottomLayers))
+ {
+ nmLayerRangeStart.Value = 0;
+ nmLayerRangeEnd.Value = Program.SlicerFile.InitialLayerCount-1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnLayerRangeNormalLayers))
+ {
+ nmLayerRangeStart.Value = Program.SlicerFile.InitialLayerCount - 1;
+ nmLayerRangeEnd.Value = Program.SlicerFile.LayerCount - 1;
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnMutate))
+ {
+ if (!btnMutate.Enabled) return;
+ if (LayerRangeStart > LayerRangeEnd)
+ {
+ MessageBox.Show("Layer range start can't be higher than layer end.\nPlease fix and try again.", Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
+ nmLayerRangeStart.Select();
+ return;
+ }
+
+ if (MessageBox.Show($"Are you sure you want to {Mutation.Mutate}?", Text, MessageBoxButtons.YesNo,
+ MessageBoxIcon.Question) == DialogResult.Yes)
+ {
+ DialogResult = DialogResult.OK;
+ Close();
+ }
+
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnCancel))
+ {
+ DialogResult = DialogResult.Cancel;
+ return;
+ }
+ }
+
+ #endregion
+
+
+ }
+}
diff --git a/UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx
new file mode 100644
index 0000000..ceac7ae
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmMutationOneNumericalInput.resx
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="toolTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>148, 17</value>
+ </metadata>
+ <data name="lbLayerRange.ToolTip" xml:space="preserve">
+ <value>Selects the layers range within start layer and end layer where mutator will operate.
+Select same layer start as end to operate only within that layer.
+Note: "Layer Start" start can't be higher than "Layer End".</value>
+ </data>
+ <metadata name="cmLayerRange.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+</root> \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmMutationResize.Designer.cs b/UVtools.GUI/Forms/FrmMutationResize.Designer.cs
index 97af6c4..8eb1ef1 100644
--- a/UVtools.GUI/Forms/FrmMutationResize.Designer.cs
+++ b/UVtools.GUI/Forms/FrmMutationResize.Designer.cs
@@ -34,7 +34,6 @@ namespace UVtools.GUI.Forms
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMutationResize));
this.lbDescription = new System.Windows.Forms.Label();
this.lbX = new System.Windows.Forms.Label();
- this.nmX = new System.Windows.Forms.NumericUpDown();
this.lbLayerRange = new System.Windows.Forms.Label();
this.nmLayerRangeStart = new System.Windows.Forms.NumericUpDown();
this.nmLayerRangeEnd = new System.Windows.Forms.NumericUpDown();
@@ -44,20 +43,21 @@ namespace UVtools.GUI.Forms
this.btnLayerRangeCurrentLayer = new System.Windows.Forms.ToolStripMenuItem();
this.btnLayerRangeBottomLayers = new System.Windows.Forms.ToolStripMenuItem();
this.btnLayerRangeNormalLayers = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolTip = new System.Windows.Forms.ToolTip(this.components);
+ this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
this.btnCancel = new System.Windows.Forms.Button();
this.btnMutate = new System.Windows.Forms.Button();
+ this.nmX = new System.Windows.Forms.NumericUpDown();
+ this.label1 = new System.Windows.Forms.Label();
this.lbY = new System.Windows.Forms.Label();
this.nmY = new System.Windows.Forms.NumericUpDown();
- this.cbConstrainXY = new System.Windows.Forms.CheckBox();
- this.toolTip = new System.Windows.Forms.ToolTip(this.components);
- this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
- this.btnLayerRangeSelect = new UVtools.GUI.Controls.SplitButton();
+ this.cbConstrainXY = new System.Windows.Forms.CheckBox();
this.cbFade = new System.Windows.Forms.CheckBox();
- ((System.ComponentModel.ISupportInitialize)(this.nmX)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).BeginInit();
this.cmLayerRange.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmX)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.nmY)).BeginInit();
this.SuspendLayout();
//
@@ -84,31 +84,6 @@ namespace UVtools.GUI.Forms
this.lbX.Text = "X:";
this.toolTip.SetToolTip(this.lbX, resources.GetString("lbX.ToolTip"));
//
- // nmX
- //
- this.nmX.DecimalPlaces = 2;
- this.nmX.Location = new System.Drawing.Point(118, 187);
- this.nmX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
- this.nmX.Maximum = new decimal(new int[] {
- 1000,
- 0,
- 0,
- 0});
- this.nmX.Minimum = new decimal(new int[] {
- 1,
- 0,
- 0,
- 0});
- this.nmX.Name = "nmX";
- this.nmX.Size = new System.Drawing.Size(120, 26);
- this.nmX.TabIndex = 3;
- this.nmX.Value = new decimal(new int[] {
- 100,
- 0,
- 0,
- 0});
- this.nmX.ValueChanged += new System.EventHandler(this.EventValueChanged);
- //
// lbLayerRange
//
this.lbLayerRange.AutoSize = true;
@@ -202,6 +177,25 @@ namespace UVtools.GUI.Forms
this.btnLayerRangeNormalLayers.Text = "&Normal Layers";
this.btnLayerRangeNormalLayers.Click += new System.EventHandler(this.ItemClicked);
//
+ // toolTip
+ //
+ this.toolTip.AutoPopDelay = 32767;
+ this.toolTip.InitialDelay = 500;
+ this.toolTip.IsBalloon = true;
+ this.toolTip.ReshowDelay = 100;
+ this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
+ this.toolTip.ToolTipTitle = "Information";
+ //
+ // btnLayerRangeSelect
+ //
+ this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146);
+ this.btnLayerRangeSelect.Menu = this.cmLayerRange;
+ this.btnLayerRangeSelect.Name = "btnLayerRangeSelect";
+ this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26);
+ this.btnLayerRangeSelect.TabIndex = 2;
+ this.btnLayerRangeSelect.Text = "Select";
+ this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
+ //
// btnCancel
//
this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
@@ -233,6 +227,42 @@ namespace UVtools.GUI.Forms
this.btnMutate.UseVisualStyleBackColor = true;
this.btnMutate.Click += new System.EventHandler(this.ItemClicked);
//
+ // nmX
+ //
+ this.nmX.DecimalPlaces = 2;
+ this.nmX.Location = new System.Drawing.Point(118, 187);
+ this.nmX.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.nmX.Maximum = new decimal(new int[] {
+ 1000,
+ 0,
+ 0,
+ 0});
+ this.nmX.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmX.Name = "nmX";
+ this.nmX.Size = new System.Drawing.Size(120, 26);
+ this.nmX.TabIndex = 3;
+ this.nmX.Value = new decimal(new int[] {
+ 100,
+ 0,
+ 0,
+ 0});
+ this.nmX.ValueChanged += new System.EventHandler(this.EventValueChanged);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(246, 190);
+ this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(23, 20);
+ this.label1.TabIndex = 16;
+ this.label1.Text = "%";
+ this.toolTip.SetToolTip(this.label1, resources.GetString("label1.ToolTip"));
+ //
// lbY
//
this.lbY.AutoSize = true;
@@ -269,38 +299,6 @@ namespace UVtools.GUI.Forms
0,
0});
//
- // cbConstrainXY
- //
- this.cbConstrainXY.AutoSize = true;
- this.cbConstrainXY.Checked = true;
- this.cbConstrainXY.CheckState = System.Windows.Forms.CheckState.Checked;
- this.cbConstrainXY.Location = new System.Drawing.Point(470, 188);
- this.cbConstrainXY.Name = "cbConstrainXY";
- this.cbConstrainXY.Size = new System.Drawing.Size(126, 24);
- this.cbConstrainXY.TabIndex = 15;
- this.cbConstrainXY.Text = "Constrain X/Y";
- this.cbConstrainXY.CheckedChanged += new System.EventHandler(this.EventCheckedChanged);
- //
- // toolTip
- //
- this.toolTip.AutoPopDelay = 32767;
- this.toolTip.InitialDelay = 500;
- this.toolTip.IsBalloon = true;
- this.toolTip.ReshowDelay = 100;
- this.toolTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
- this.toolTip.ToolTipTitle = "Information";
- //
- // label1
- //
- this.label1.AutoSize = true;
- this.label1.Location = new System.Drawing.Point(246, 190);
- this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
- this.label1.Name = "label1";
- this.label1.Size = new System.Drawing.Size(23, 20);
- this.label1.TabIndex = 16;
- this.label1.Text = "%";
- this.toolTip.SetToolTip(this.label1, resources.GetString("label1.ToolTip"));
- //
// label2
//
this.label2.AutoSize = true;
@@ -312,15 +310,17 @@ namespace UVtools.GUI.Forms
this.label2.Text = "%";
this.toolTip.SetToolTip(this.label2, resources.GetString("label2.ToolTip"));
//
- // btnLayerRangeSelect
+ // cbConstrainXY
//
- this.btnLayerRangeSelect.Location = new System.Drawing.Point(446, 146);
- this.btnLayerRangeSelect.Menu = this.cmLayerRange;
- this.btnLayerRangeSelect.Name = "btnLayerRangeSelect";
- this.btnLayerRangeSelect.Size = new System.Drawing.Size(138, 26);
- this.btnLayerRangeSelect.TabIndex = 2;
- this.btnLayerRangeSelect.Text = "Select";
- this.btnLayerRangeSelect.UseVisualStyleBackColor = true;
+ this.cbConstrainXY.AutoSize = true;
+ this.cbConstrainXY.Checked = true;
+ this.cbConstrainXY.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.cbConstrainXY.Location = new System.Drawing.Point(470, 188);
+ this.cbConstrainXY.Name = "cbConstrainXY";
+ this.cbConstrainXY.Size = new System.Drawing.Size(126, 24);
+ this.cbConstrainXY.TabIndex = 15;
+ this.cbConstrainXY.Text = "Constrain X/Y";
+ this.cbConstrainXY.CheckedChanged += new System.EventHandler(this.EventCheckedChanged);
//
// cbFade
//
@@ -364,10 +364,10 @@ namespace UVtools.GUI.Forms
this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
this.Text = "Form1";
this.TopMost = true;
- ((System.ComponentModel.ISupportInitialize)(this.nmX)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeStart)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nmLayerRangeEnd)).EndInit();
this.cmLayerRange.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.nmX)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.nmY)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -378,7 +378,6 @@ namespace UVtools.GUI.Forms
private System.Windows.Forms.Label lbDescription;
private System.Windows.Forms.Label lbX;
- private System.Windows.Forms.NumericUpDown nmX;
private System.Windows.Forms.Button btnCancel;
private System.Windows.Forms.Button btnMutate;
private System.Windows.Forms.Label lbLayerRange;
@@ -391,12 +390,13 @@ namespace UVtools.GUI.Forms
private System.Windows.Forms.ToolStripMenuItem btnLayerRangeCurrentLayer;
private System.Windows.Forms.ToolStripMenuItem btnLayerRangeBottomLayers;
private System.Windows.Forms.ToolStripMenuItem btnLayerRangeNormalLayers;
- private System.Windows.Forms.Label lbY;
- private System.Windows.Forms.NumericUpDown nmY;
- private System.Windows.Forms.CheckBox cbConstrainXY;
private System.Windows.Forms.ToolTip toolTip;
+ private System.Windows.Forms.NumericUpDown nmX;
private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Label lbY;
+ private System.Windows.Forms.NumericUpDown nmY;
private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.CheckBox cbConstrainXY;
private System.Windows.Forms.CheckBox cbFade;
}
} \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmSettings.Designer.cs b/UVtools.GUI/Forms/FrmSettings.Designer.cs
new file mode 100644
index 0000000..9456992
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmSettings.Designer.cs
@@ -0,0 +1,1112 @@
+namespace UVtools.GUI.Forms
+{
+ partial class FrmSettings
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSettings));
+ this.label1 = new System.Windows.Forms.Label();
+ this.btnPreviousNextLayerColor = new System.Windows.Forms.Button();
+ this.colorDialog = new System.Windows.Forms.ColorDialog();
+ this.btnPreviousLayerColor = new System.Windows.Forms.Button();
+ this.label2 = new System.Windows.Forms.Label();
+ this.btnNextLayerColor = new System.Windows.Forms.Button();
+ this.label3 = new System.Windows.Forms.Label();
+ this.btnTouchingBoundsColor = new System.Windows.Forms.Button();
+ this.label4 = new System.Windows.Forms.Label();
+ this.label5 = new System.Windows.Forms.Label();
+ this.label6 = new System.Windows.Forms.Label();
+ this.btnResinTrapColor = new System.Windows.Forms.Button();
+ this.btnIslandColor = new System.Windows.Forms.Button();
+ this.btnSave = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.groupGeneral = new System.Windows.Forms.GroupBox();
+ this.cbCheckForUpdatesOnStartup = new System.Windows.Forms.CheckBox();
+ this.cbStartMaximized = new System.Windows.Forms.CheckBox();
+ this.groupLayerPreview = new System.Windows.Forms.GroupBox();
+ this.cbZoomToFitPrintVolumeBounds = new System.Windows.Forms.CheckBox();
+ this.cbOutlineHollowAreas = new System.Windows.Forms.CheckBox();
+ this.label18 = new System.Windows.Forms.Label();
+ this.nmOutlineHollowAreasLineThickness = new System.Windows.Forms.NumericUpDown();
+ this.label19 = new System.Windows.Forms.Label();
+ this.btnOutlineHollowAreasColor = new System.Windows.Forms.Button();
+ this.cbOutlineLayerBounds = new System.Windows.Forms.CheckBox();
+ this.label16 = new System.Windows.Forms.Label();
+ this.nmOutlineLayerBoundsLineThickness = new System.Windows.Forms.NumericUpDown();
+ this.label17 = new System.Windows.Forms.Label();
+ this.btnOutlineLayerBoundsColor = new System.Windows.Forms.Button();
+ this.cbOutlinePrintVolumeBounds = new System.Windows.Forms.CheckBox();
+ this.label15 = new System.Windows.Forms.Label();
+ this.nmOutlinePrintVolumeBoundsLineThickness = new System.Windows.Forms.NumericUpDown();
+ this.label14 = new System.Windows.Forms.Label();
+ this.btnOutlinePrintVolumeBoundsColor = new System.Windows.Forms.Button();
+ this.cbLayerZoomToFit = new System.Windows.Forms.CheckBox();
+ this.cbLayerDifferenceDefault = new System.Windows.Forms.CheckBox();
+ this.cbLayerAutoRotateBestView = new System.Windows.Forms.CheckBox();
+ this.cbComputeIssuesOnLoad = new System.Windows.Forms.CheckBox();
+ this.btnReset = new System.Windows.Forms.Button();
+ this.cbComputeIslands = new System.Windows.Forms.CheckBox();
+ this.cbComputeResinTraps = new System.Windows.Forms.CheckBox();
+ this.gbIssues = new System.Windows.Forms.GroupBox();
+ this.groupBox3 = new System.Windows.Forms.GroupBox();
+ this.nmResinTrapMaximumPixelBrightnessToDrain = new System.Windows.Forms.NumericUpDown();
+ this.label13 = new System.Windows.Forms.Label();
+ this.nmResinTrapRequiredBlackPixelsToDrain = new System.Windows.Forms.NumericUpDown();
+ this.label12 = new System.Windows.Forms.Label();
+ this.nmResinTrapRequiredAreaToProcessCheck = new System.Windows.Forms.NumericUpDown();
+ this.label11 = new System.Windows.Forms.Label();
+ this.groupBox2 = new System.Windows.Forms.GroupBox();
+ this.label10 = new System.Windows.Forms.Label();
+ this.nmIslandRequiredPixelBrightnessToSupport = new System.Windows.Forms.NumericUpDown();
+ this.label9 = new System.Windows.Forms.Label();
+ this.nmIslandRequiredPixelsToSupport = new System.Windows.Forms.NumericUpDown();
+ this.nmIslandRequiredAreaToProcessCheck = new System.Windows.Forms.NumericUpDown();
+ this.label7 = new System.Windows.Forms.Label();
+ this.label8 = new System.Windows.Forms.Label();
+ this.nmIslandRequiredPixelBrightnessToProcessCheck = new System.Windows.Forms.NumericUpDown();
+ this.groupBox1 = new System.Windows.Forms.GroupBox();
+ this.cbAutoComputeIssuesClickOnTab = new System.Windows.Forms.CheckBox();
+ this.nmResinTrapBinaryThreshold = new System.Windows.Forms.NumericUpDown();
+ this.label20 = new System.Windows.Forms.Label();
+ this.nmIslandBinaryThreshold = new System.Windows.Forms.NumericUpDown();
+ this.label21 = new System.Windows.Forms.Label();
+ this.groupGeneral.SuspendLayout();
+ this.groupLayerPreview.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlineHollowAreasLineThickness)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlineLayerBoundsLineThickness)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlinePrintVolumeBoundsLineThickness)).BeginInit();
+ this.gbIssues.SuspendLayout();
+ this.groupBox3.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapMaximumPixelBrightnessToDrain)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredBlackPixelsToDrain)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredAreaToProcessCheck)).BeginInit();
+ this.groupBox2.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToSupport)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelsToSupport)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredAreaToProcessCheck)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToProcessCheck)).BeginInit();
+ this.groupBox1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapBinaryThreshold)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandBinaryThreshold)).BeginInit();
+ this.SuspendLayout();
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(7, 30);
+ this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(202, 18);
+ this.label1.TabIndex = 0;
+ this.label1.Text = "Previous and next layer color:";
+ //
+ // btnPreviousNextLayerColor
+ //
+ this.btnPreviousNextLayerColor.BackColor = System.Drawing.Color.White;
+ this.btnPreviousNextLayerColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnPreviousNextLayerColor.FlatAppearance.BorderSize = 2;
+ this.btnPreviousNextLayerColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnPreviousNextLayerColor.Location = new System.Drawing.Point(217, 23);
+ this.btnPreviousNextLayerColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnPreviousNextLayerColor.Name = "btnPreviousNextLayerColor";
+ this.btnPreviousNextLayerColor.Size = new System.Drawing.Size(32, 32);
+ this.btnPreviousNextLayerColor.TabIndex = 1;
+ this.btnPreviousNextLayerColor.UseVisualStyleBackColor = false;
+ this.btnPreviousNextLayerColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // colorDialog
+ //
+ this.colorDialog.AnyColor = true;
+ this.colorDialog.FullOpen = true;
+ //
+ // btnPreviousLayerColor
+ //
+ this.btnPreviousLayerColor.BackColor = System.Drawing.Color.White;
+ this.btnPreviousLayerColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnPreviousLayerColor.FlatAppearance.BorderSize = 2;
+ this.btnPreviousLayerColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnPreviousLayerColor.Location = new System.Drawing.Point(217, 63);
+ this.btnPreviousLayerColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnPreviousLayerColor.Name = "btnPreviousLayerColor";
+ this.btnPreviousLayerColor.Size = new System.Drawing.Size(32, 32);
+ this.btnPreviousLayerColor.TabIndex = 3;
+ this.btnPreviousLayerColor.UseVisualStyleBackColor = false;
+ this.btnPreviousLayerColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // label2
+ //
+ this.label2.AutoSize = true;
+ this.label2.Location = new System.Drawing.Point(7, 70);
+ this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label2.Name = "label2";
+ this.label2.Size = new System.Drawing.Size(139, 18);
+ this.label2.TabIndex = 2;
+ this.label2.Text = "Previous layer color";
+ //
+ // btnNextLayerColor
+ //
+ this.btnNextLayerColor.BackColor = System.Drawing.Color.White;
+ this.btnNextLayerColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnNextLayerColor.FlatAppearance.BorderSize = 2;
+ this.btnNextLayerColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnNextLayerColor.Location = new System.Drawing.Point(217, 103);
+ this.btnNextLayerColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnNextLayerColor.Name = "btnNextLayerColor";
+ this.btnNextLayerColor.Size = new System.Drawing.Size(32, 32);
+ this.btnNextLayerColor.TabIndex = 5;
+ this.btnNextLayerColor.UseVisualStyleBackColor = false;
+ this.btnNextLayerColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // label3
+ //
+ this.label3.AutoSize = true;
+ this.label3.Location = new System.Drawing.Point(7, 110);
+ this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label3.Name = "label3";
+ this.label3.Size = new System.Drawing.Size(111, 18);
+ this.label3.TabIndex = 4;
+ this.label3.Text = "Next layer color";
+ //
+ // btnTouchingBoundsColor
+ //
+ this.btnTouchingBoundsColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnTouchingBoundsColor.BackColor = System.Drawing.Color.White;
+ this.btnTouchingBoundsColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnTouchingBoundsColor.FlatAppearance.BorderSize = 2;
+ this.btnTouchingBoundsColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnTouchingBoundsColor.Location = new System.Drawing.Point(566, 103);
+ this.btnTouchingBoundsColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnTouchingBoundsColor.Name = "btnTouchingBoundsColor";
+ this.btnTouchingBoundsColor.Size = new System.Drawing.Size(32, 32);
+ this.btnTouchingBoundsColor.TabIndex = 7;
+ this.btnTouchingBoundsColor.UseVisualStyleBackColor = false;
+ this.btnTouchingBoundsColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // label4
+ //
+ this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label4.AutoSize = true;
+ this.label4.Location = new System.Drawing.Point(402, 30);
+ this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label4.Name = "label4";
+ this.label4.Size = new System.Drawing.Size(88, 18);
+ this.label4.TabIndex = 6;
+ this.label4.Text = "Island color:";
+ //
+ // label5
+ //
+ this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label5.AutoSize = true;
+ this.label5.Location = new System.Drawing.Point(402, 70);
+ this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label5.Name = "label5";
+ this.label5.Size = new System.Drawing.Size(117, 18);
+ this.label5.TabIndex = 8;
+ this.label5.Text = "Resin trap color:";
+ //
+ // label6
+ //
+ this.label6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.label6.AutoSize = true;
+ this.label6.Location = new System.Drawing.Point(402, 110);
+ this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label6.Name = "label6";
+ this.label6.Size = new System.Drawing.Size(156, 18);
+ this.label6.TabIndex = 9;
+ this.label6.Text = "Touching bound color:";
+ //
+ // btnResinTrapColor
+ //
+ this.btnResinTrapColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnResinTrapColor.BackColor = System.Drawing.Color.White;
+ this.btnResinTrapColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnResinTrapColor.FlatAppearance.BorderSize = 2;
+ this.btnResinTrapColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnResinTrapColor.Location = new System.Drawing.Point(566, 63);
+ this.btnResinTrapColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnResinTrapColor.Name = "btnResinTrapColor";
+ this.btnResinTrapColor.Size = new System.Drawing.Size(32, 32);
+ this.btnResinTrapColor.TabIndex = 10;
+ this.btnResinTrapColor.UseVisualStyleBackColor = false;
+ this.btnResinTrapColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // btnIslandColor
+ //
+ this.btnIslandColor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnIslandColor.BackColor = System.Drawing.Color.White;
+ this.btnIslandColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnIslandColor.FlatAppearance.BorderSize = 2;
+ this.btnIslandColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnIslandColor.Location = new System.Drawing.Point(566, 23);
+ this.btnIslandColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnIslandColor.Name = "btnIslandColor";
+ this.btnIslandColor.Size = new System.Drawing.Size(32, 32);
+ this.btnIslandColor.TabIndex = 11;
+ this.btnIslandColor.UseVisualStyleBackColor = false;
+ this.btnIslandColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // btnSave
+ //
+ this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnSave.Image = global::UVtools.GUI.Properties.Resources.Ok_24x24;
+ this.btnSave.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnSave.Location = new System.Drawing.Point(290, 891);
+ this.btnSave.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnSave.Name = "btnSave";
+ this.btnSave.Size = new System.Drawing.Size(150, 48);
+ this.btnSave.TabIndex = 12;
+ this.btnSave.Text = "&Save";
+ this.btnSave.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnSave.UseVisualStyleBackColor = true;
+ this.btnSave.Click += new System.EventHandler(this.EventClick);
+ //
+ // btnCancel
+ //
+ this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
+ this.btnCancel.Image = global::UVtools.GUI.Properties.Resources.Cancel_24x24;
+ this.btnCancel.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnCancel.Location = new System.Drawing.Point(448, 891);
+ this.btnCancel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(150, 48);
+ this.btnCancel.TabIndex = 13;
+ this.btnCancel.Text = "&Cancel";
+ this.btnCancel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnCancel.UseVisualStyleBackColor = true;
+ //
+ // groupGeneral
+ //
+ this.groupGeneral.Controls.Add(this.cbCheckForUpdatesOnStartup);
+ this.groupGeneral.Controls.Add(this.cbStartMaximized);
+ this.groupGeneral.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupGeneral.Location = new System.Drawing.Point(0, 0);
+ this.groupGeneral.Name = "groupGeneral";
+ this.groupGeneral.Size = new System.Drawing.Size(611, 88);
+ this.groupGeneral.TabIndex = 14;
+ this.groupGeneral.TabStop = false;
+ this.groupGeneral.Text = "General";
+ //
+ // cbCheckForUpdatesOnStartup
+ //
+ this.cbCheckForUpdatesOnStartup.AutoSize = true;
+ this.cbCheckForUpdatesOnStartup.Location = new System.Drawing.Point(6, 51);
+ this.cbCheckForUpdatesOnStartup.Name = "cbCheckForUpdatesOnStartup";
+ this.cbCheckForUpdatesOnStartup.Size = new System.Drawing.Size(218, 22);
+ this.cbCheckForUpdatesOnStartup.TabIndex = 7;
+ this.cbCheckForUpdatesOnStartup.Text = "Check for updates on startup";
+ this.cbCheckForUpdatesOnStartup.UseVisualStyleBackColor = true;
+ //
+ // cbStartMaximized
+ //
+ this.cbStartMaximized.AutoSize = true;
+ this.cbStartMaximized.Location = new System.Drawing.Point(6, 23);
+ this.cbStartMaximized.Name = "cbStartMaximized";
+ this.cbStartMaximized.Size = new System.Drawing.Size(133, 22);
+ this.cbStartMaximized.TabIndex = 6;
+ this.cbStartMaximized.Text = "Start maximized";
+ this.cbStartMaximized.UseVisualStyleBackColor = true;
+ //
+ // groupLayerPreview
+ //
+ this.groupLayerPreview.Controls.Add(this.cbZoomToFitPrintVolumeBounds);
+ this.groupLayerPreview.Controls.Add(this.cbOutlineHollowAreas);
+ this.groupLayerPreview.Controls.Add(this.label18);
+ this.groupLayerPreview.Controls.Add(this.nmOutlineHollowAreasLineThickness);
+ this.groupLayerPreview.Controls.Add(this.label19);
+ this.groupLayerPreview.Controls.Add(this.btnOutlineHollowAreasColor);
+ this.groupLayerPreview.Controls.Add(this.cbOutlineLayerBounds);
+ this.groupLayerPreview.Controls.Add(this.label16);
+ this.groupLayerPreview.Controls.Add(this.nmOutlineLayerBoundsLineThickness);
+ this.groupLayerPreview.Controls.Add(this.label17);
+ this.groupLayerPreview.Controls.Add(this.btnOutlineLayerBoundsColor);
+ this.groupLayerPreview.Controls.Add(this.cbOutlinePrintVolumeBounds);
+ this.groupLayerPreview.Controls.Add(this.label15);
+ this.groupLayerPreview.Controls.Add(this.nmOutlinePrintVolumeBoundsLineThickness);
+ this.groupLayerPreview.Controls.Add(this.label14);
+ this.groupLayerPreview.Controls.Add(this.btnOutlinePrintVolumeBoundsColor);
+ this.groupLayerPreview.Controls.Add(this.cbLayerZoomToFit);
+ this.groupLayerPreview.Controls.Add(this.cbLayerDifferenceDefault);
+ this.groupLayerPreview.Controls.Add(this.cbLayerAutoRotateBestView);
+ this.groupLayerPreview.Controls.Add(this.label1);
+ this.groupLayerPreview.Controls.Add(this.btnPreviousNextLayerColor);
+ this.groupLayerPreview.Controls.Add(this.label2);
+ this.groupLayerPreview.Controls.Add(this.btnPreviousLayerColor);
+ this.groupLayerPreview.Controls.Add(this.btnIslandColor);
+ this.groupLayerPreview.Controls.Add(this.label3);
+ this.groupLayerPreview.Controls.Add(this.btnResinTrapColor);
+ this.groupLayerPreview.Controls.Add(this.btnNextLayerColor);
+ this.groupLayerPreview.Controls.Add(this.label6);
+ this.groupLayerPreview.Controls.Add(this.label4);
+ this.groupLayerPreview.Controls.Add(this.label5);
+ this.groupLayerPreview.Controls.Add(this.btnTouchingBoundsColor);
+ this.groupLayerPreview.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupLayerPreview.Location = new System.Drawing.Point(0, 88);
+ this.groupLayerPreview.Name = "groupLayerPreview";
+ this.groupLayerPreview.Size = new System.Drawing.Size(611, 348);
+ this.groupLayerPreview.TabIndex = 15;
+ this.groupLayerPreview.TabStop = false;
+ this.groupLayerPreview.Text = "Layer Preview";
+ //
+ // cbZoomToFitPrintVolumeBounds
+ //
+ this.cbZoomToFitPrintVolumeBounds.AutoSize = true;
+ this.cbZoomToFitPrintVolumeBounds.Location = new System.Drawing.Point(325, 292);
+ this.cbZoomToFitPrintVolumeBounds.Name = "cbZoomToFitPrintVolumeBounds";
+ this.cbZoomToFitPrintVolumeBounds.Size = new System.Drawing.Size(276, 22);
+ this.cbZoomToFitPrintVolumeBounds.TabIndex = 34;
+ this.cbZoomToFitPrintVolumeBounds.Text = "Zoom to print volume bounds instead ";
+ this.cbZoomToFitPrintVolumeBounds.UseVisualStyleBackColor = true;
+ //
+ // cbOutlineHollowAreas
+ //
+ this.cbOutlineHollowAreas.AutoSize = true;
+ this.cbOutlineHollowAreas.Location = new System.Drawing.Point(470, 228);
+ this.cbOutlineHollowAreas.Name = "cbOutlineHollowAreas";
+ this.cbOutlineHollowAreas.Size = new System.Drawing.Size(131, 22);
+ this.cbOutlineHollowAreas.TabIndex = 33;
+ this.cbOutlineHollowAreas.Text = "Show by default";
+ this.cbOutlineHollowAreas.UseVisualStyleBackColor = true;
+ //
+ // label18
+ //
+ this.label18.AutoSize = true;
+ this.label18.Location = new System.Drawing.Point(319, 230);
+ this.label18.Name = "label18";
+ this.label18.Size = new System.Drawing.Size(150, 18);
+ this.label18.TabIndex = 32;
+ this.label18.Text = "Line thickness (-1-50)";
+ //
+ // nmOutlineHollowAreasLineThickness
+ //
+ this.nmOutlineHollowAreasLineThickness.Location = new System.Drawing.Point(256, 227);
+ this.nmOutlineHollowAreasLineThickness.Maximum = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.nmOutlineHollowAreasLineThickness.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ -2147483648});
+ this.nmOutlineHollowAreasLineThickness.Name = "nmOutlineHollowAreasLineThickness";
+ this.nmOutlineHollowAreasLineThickness.Size = new System.Drawing.Size(57, 24);
+ this.nmOutlineHollowAreasLineThickness.TabIndex = 31;
+ this.nmOutlineHollowAreasLineThickness.Value = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ //
+ // label19
+ //
+ this.label19.AutoSize = true;
+ this.label19.Location = new System.Drawing.Point(7, 230);
+ this.label19.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label19.Name = "label19";
+ this.label19.Size = new System.Drawing.Size(183, 18);
+ this.label19.TabIndex = 29;
+ this.label19.Text = "Outline Hollow areas color";
+ //
+ // btnOutlineHollowAreasColor
+ //
+ this.btnOutlineHollowAreasColor.BackColor = System.Drawing.Color.White;
+ this.btnOutlineHollowAreasColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnOutlineHollowAreasColor.FlatAppearance.BorderSize = 2;
+ this.btnOutlineHollowAreasColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnOutlineHollowAreasColor.Location = new System.Drawing.Point(217, 223);
+ this.btnOutlineHollowAreasColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnOutlineHollowAreasColor.Name = "btnOutlineHollowAreasColor";
+ this.btnOutlineHollowAreasColor.Size = new System.Drawing.Size(32, 32);
+ this.btnOutlineHollowAreasColor.TabIndex = 30;
+ this.btnOutlineHollowAreasColor.UseVisualStyleBackColor = false;
+ this.btnOutlineHollowAreasColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // cbOutlineLayerBounds
+ //
+ this.cbOutlineLayerBounds.AutoSize = true;
+ this.cbOutlineLayerBounds.Location = new System.Drawing.Point(470, 188);
+ this.cbOutlineLayerBounds.Name = "cbOutlineLayerBounds";
+ this.cbOutlineLayerBounds.Size = new System.Drawing.Size(131, 22);
+ this.cbOutlineLayerBounds.TabIndex = 28;
+ this.cbOutlineLayerBounds.Text = "Show by default";
+ this.cbOutlineLayerBounds.UseVisualStyleBackColor = true;
+ //
+ // label16
+ //
+ this.label16.AutoSize = true;
+ this.label16.Location = new System.Drawing.Point(319, 190);
+ this.label16.Name = "label16";
+ this.label16.Size = new System.Drawing.Size(145, 18);
+ this.label16.TabIndex = 27;
+ this.label16.Text = "Line thickness (1-50)";
+ //
+ // nmOutlineLayerBoundsLineThickness
+ //
+ this.nmOutlineLayerBoundsLineThickness.Location = new System.Drawing.Point(256, 187);
+ this.nmOutlineLayerBoundsLineThickness.Maximum = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.nmOutlineLayerBoundsLineThickness.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmOutlineLayerBoundsLineThickness.Name = "nmOutlineLayerBoundsLineThickness";
+ this.nmOutlineLayerBoundsLineThickness.Size = new System.Drawing.Size(57, 24);
+ this.nmOutlineLayerBoundsLineThickness.TabIndex = 26;
+ this.nmOutlineLayerBoundsLineThickness.Value = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ //
+ // label17
+ //
+ this.label17.AutoSize = true;
+ this.label17.Location = new System.Drawing.Point(7, 190);
+ this.label17.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label17.Name = "label17";
+ this.label17.Size = new System.Drawing.Size(185, 18);
+ this.label17.TabIndex = 24;
+ this.label17.Text = "Outline Layer bounds color";
+ //
+ // btnOutlineLayerBoundsColor
+ //
+ this.btnOutlineLayerBoundsColor.BackColor = System.Drawing.Color.White;
+ this.btnOutlineLayerBoundsColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnOutlineLayerBoundsColor.FlatAppearance.BorderSize = 2;
+ this.btnOutlineLayerBoundsColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnOutlineLayerBoundsColor.Location = new System.Drawing.Point(217, 183);
+ this.btnOutlineLayerBoundsColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnOutlineLayerBoundsColor.Name = "btnOutlineLayerBoundsColor";
+ this.btnOutlineLayerBoundsColor.Size = new System.Drawing.Size(32, 32);
+ this.btnOutlineLayerBoundsColor.TabIndex = 25;
+ this.btnOutlineLayerBoundsColor.UseVisualStyleBackColor = false;
+ this.btnOutlineLayerBoundsColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // cbOutlinePrintVolumeBounds
+ //
+ this.cbOutlinePrintVolumeBounds.AutoSize = true;
+ this.cbOutlinePrintVolumeBounds.Location = new System.Drawing.Point(470, 148);
+ this.cbOutlinePrintVolumeBounds.Name = "cbOutlinePrintVolumeBounds";
+ this.cbOutlinePrintVolumeBounds.Size = new System.Drawing.Size(131, 22);
+ this.cbOutlinePrintVolumeBounds.TabIndex = 23;
+ this.cbOutlinePrintVolumeBounds.Text = "Show by default";
+ this.cbOutlinePrintVolumeBounds.UseVisualStyleBackColor = true;
+ //
+ // label15
+ //
+ this.label15.AutoSize = true;
+ this.label15.Location = new System.Drawing.Point(319, 150);
+ this.label15.Name = "label15";
+ this.label15.Size = new System.Drawing.Size(145, 18);
+ this.label15.TabIndex = 22;
+ this.label15.Text = "Line thickness (1-50)";
+ //
+ // nmOutlinePrintVolumeBoundsLineThickness
+ //
+ this.nmOutlinePrintVolumeBoundsLineThickness.Location = new System.Drawing.Point(256, 147);
+ this.nmOutlinePrintVolumeBoundsLineThickness.Maximum = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.nmOutlinePrintVolumeBoundsLineThickness.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmOutlinePrintVolumeBoundsLineThickness.Name = "nmOutlinePrintVolumeBoundsLineThickness";
+ this.nmOutlinePrintVolumeBoundsLineThickness.Size = new System.Drawing.Size(57, 24);
+ this.nmOutlinePrintVolumeBoundsLineThickness.TabIndex = 19;
+ this.nmOutlinePrintVolumeBoundsLineThickness.Value = new decimal(new int[] {
+ 2,
+ 0,
+ 0,
+ 0});
+ //
+ // label14
+ //
+ this.label14.AutoSize = true;
+ this.label14.Location = new System.Drawing.Point(7, 150);
+ this.label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+ this.label14.Name = "label14";
+ this.label14.Size = new System.Drawing.Size(181, 18);
+ this.label14.TabIndex = 16;
+ this.label14.Text = "Print volume bounds color";
+ //
+ // btnOutlinePrintVolumeBoundsColor
+ //
+ this.btnOutlinePrintVolumeBoundsColor.BackColor = System.Drawing.Color.White;
+ this.btnOutlinePrintVolumeBoundsColor.FlatAppearance.BorderColor = System.Drawing.Color.Black;
+ this.btnOutlinePrintVolumeBoundsColor.FlatAppearance.BorderSize = 2;
+ this.btnOutlinePrintVolumeBoundsColor.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+ this.btnOutlinePrintVolumeBoundsColor.Location = new System.Drawing.Point(217, 143);
+ this.btnOutlinePrintVolumeBoundsColor.Margin = new System.Windows.Forms.Padding(4);
+ this.btnOutlinePrintVolumeBoundsColor.Name = "btnOutlinePrintVolumeBoundsColor";
+ this.btnOutlinePrintVolumeBoundsColor.Size = new System.Drawing.Size(32, 32);
+ this.btnOutlinePrintVolumeBoundsColor.TabIndex = 17;
+ this.btnOutlinePrintVolumeBoundsColor.UseVisualStyleBackColor = false;
+ this.btnOutlinePrintVolumeBoundsColor.Click += new System.EventHandler(this.EventClick);
+ //
+ // cbLayerZoomToFit
+ //
+ this.cbLayerZoomToFit.AutoSize = true;
+ this.cbLayerZoomToFit.Location = new System.Drawing.Point(9, 292);
+ this.cbLayerZoomToFit.Name = "cbLayerZoomToFit";
+ this.cbLayerZoomToFit.Size = new System.Drawing.Size(313, 22);
+ this.cbLayerZoomToFit.TabIndex = 15;
+ this.cbLayerZoomToFit.Text = "Zoom to fit layer on load and window resize";
+ this.cbLayerZoomToFit.UseVisualStyleBackColor = true;
+ //
+ // cbLayerDifferenceDefault
+ //
+ this.cbLayerDifferenceDefault.AutoSize = true;
+ this.cbLayerDifferenceDefault.Location = new System.Drawing.Point(9, 320);
+ this.cbLayerDifferenceDefault.Name = "cbLayerDifferenceDefault";
+ this.cbLayerDifferenceDefault.Size = new System.Drawing.Size(234, 22);
+ this.cbLayerDifferenceDefault.TabIndex = 13;
+ this.cbLayerDifferenceDefault.Text = "Show layer difference by default";
+ this.cbLayerDifferenceDefault.UseVisualStyleBackColor = true;
+ //
+ // cbLayerAutoRotateBestView
+ //
+ this.cbLayerAutoRotateBestView.AutoSize = true;
+ this.cbLayerAutoRotateBestView.Location = new System.Drawing.Point(9, 264);
+ this.cbLayerAutoRotateBestView.Name = "cbLayerAutoRotateBestView";
+ this.cbLayerAutoRotateBestView.Size = new System.Drawing.Size(327, 22);
+ this.cbLayerAutoRotateBestView.TabIndex = 12;
+ this.cbLayerAutoRotateBestView.Text = "Auto rotate layer to best fit window on file load";
+ this.cbLayerAutoRotateBestView.UseVisualStyleBackColor = true;
+ //
+ // cbComputeIssuesOnLoad
+ //
+ this.cbComputeIssuesOnLoad.AutoSize = true;
+ this.cbComputeIssuesOnLoad.Location = new System.Drawing.Point(6, 23);
+ this.cbComputeIssuesOnLoad.Name = "cbComputeIssuesOnLoad";
+ this.cbComputeIssuesOnLoad.Size = new System.Drawing.Size(210, 22);
+ this.cbComputeIssuesOnLoad.TabIndex = 14;
+ this.cbComputeIssuesOnLoad.Text = "Compute issues on file load";
+ this.cbComputeIssuesOnLoad.UseVisualStyleBackColor = true;
+ //
+ // btnReset
+ //
+ this.btnReset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
+ this.btnReset.Image = global::UVtools.GUI.Properties.Resources.Rotate_16x16;
+ this.btnReset.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
+ this.btnReset.Location = new System.Drawing.Point(13, 891);
+ this.btnReset.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
+ this.btnReset.Name = "btnReset";
+ this.btnReset.Size = new System.Drawing.Size(158, 48);
+ this.btnReset.TabIndex = 16;
+ this.btnReset.Text = "&Reset to defaults";
+ this.btnReset.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
+ this.btnReset.UseVisualStyleBackColor = true;
+ this.btnReset.Click += new System.EventHandler(this.EventClick);
+ //
+ // cbComputeIslands
+ //
+ this.cbComputeIslands.AutoSize = true;
+ this.cbComputeIslands.Location = new System.Drawing.Point(244, 23);
+ this.cbComputeIslands.Name = "cbComputeIslands";
+ this.cbComputeIslands.Size = new System.Drawing.Size(138, 22);
+ this.cbComputeIslands.TabIndex = 16;
+ this.cbComputeIslands.Text = "Compute Islands";
+ this.cbComputeIslands.UseVisualStyleBackColor = true;
+ //
+ // cbComputeResinTraps
+ //
+ this.cbComputeResinTraps.AutoSize = true;
+ this.cbComputeResinTraps.Location = new System.Drawing.Point(411, 23);
+ this.cbComputeResinTraps.Name = "cbComputeResinTraps";
+ this.cbComputeResinTraps.Size = new System.Drawing.Size(172, 22);
+ this.cbComputeResinTraps.TabIndex = 17;
+ this.cbComputeResinTraps.Text = "Compute Resin Traps";
+ this.cbComputeResinTraps.UseVisualStyleBackColor = true;
+ //
+ // gbIssues
+ //
+ this.gbIssues.Controls.Add(this.groupBox3);
+ this.gbIssues.Controls.Add(this.groupBox2);
+ this.gbIssues.Controls.Add(this.groupBox1);
+ this.gbIssues.Dock = System.Windows.Forms.DockStyle.Top;
+ this.gbIssues.Location = new System.Drawing.Point(0, 436);
+ this.gbIssues.Name = "gbIssues";
+ this.gbIssues.Size = new System.Drawing.Size(611, 442);
+ this.gbIssues.TabIndex = 17;
+ this.gbIssues.TabStop = false;
+ this.gbIssues.Text = "Issues";
+ //
+ // groupBox3
+ //
+ this.groupBox3.Controls.Add(this.nmResinTrapBinaryThreshold);
+ this.groupBox3.Controls.Add(this.label20);
+ this.groupBox3.Controls.Add(this.nmResinTrapMaximumPixelBrightnessToDrain);
+ this.groupBox3.Controls.Add(this.label13);
+ this.groupBox3.Controls.Add(this.nmResinTrapRequiredBlackPixelsToDrain);
+ this.groupBox3.Controls.Add(this.label12);
+ this.groupBox3.Controls.Add(this.nmResinTrapRequiredAreaToProcessCheck);
+ this.groupBox3.Controls.Add(this.label11);
+ this.groupBox3.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox3.Location = new System.Drawing.Point(3, 279);
+ this.groupBox3.Name = "groupBox3";
+ this.groupBox3.Size = new System.Drawing.Size(605, 152);
+ this.groupBox3.TabIndex = 24;
+ this.groupBox3.TabStop = false;
+ this.groupBox3.Text = "Resin Traps";
+ //
+ // nmResinTrapMaximumPixelBrightnessToDrain
+ //
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Location = new System.Drawing.Point(10, 113);
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Maximum = new decimal(new int[] {
+ 150,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Name = "nmResinTrapMaximumPixelBrightnessToDrain";
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Size = new System.Drawing.Size(57, 24);
+ this.nmResinTrapMaximumPixelBrightnessToDrain.TabIndex = 24;
+ this.nmResinTrapMaximumPixelBrightnessToDrain.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label13
+ //
+ this.label13.AutoSize = true;
+ this.label13.Location = new System.Drawing.Point(73, 116);
+ this.label13.Name = "label13";
+ this.label13.Size = new System.Drawing.Size(347, 18);
+ this.label13.TabIndex = 25;
+ this.label13.Text = "Maximum pixel brightness to be a drain pixel (0-150)";
+ //
+ // nmResinTrapRequiredBlackPixelsToDrain
+ //
+ this.nmResinTrapRequiredBlackPixelsToDrain.Location = new System.Drawing.Point(10, 83);
+ this.nmResinTrapRequiredBlackPixelsToDrain.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapRequiredBlackPixelsToDrain.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapRequiredBlackPixelsToDrain.Name = "nmResinTrapRequiredBlackPixelsToDrain";
+ this.nmResinTrapRequiredBlackPixelsToDrain.Size = new System.Drawing.Size(57, 24);
+ this.nmResinTrapRequiredBlackPixelsToDrain.TabIndex = 22;
+ this.nmResinTrapRequiredBlackPixelsToDrain.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label12
+ //
+ this.label12.AutoSize = true;
+ this.label12.Location = new System.Drawing.Point(73, 86);
+ this.label12.Name = "label12";
+ this.label12.Size = new System.Drawing.Size(441, 18);
+ this.label12.TabIndex = 23;
+ this.label12.Text = "Number of drain pixels required to promote area as a drain (1-255)";
+ //
+ // nmResinTrapRequiredAreaToProcessCheck
+ //
+ this.nmResinTrapRequiredAreaToProcessCheck.Location = new System.Drawing.Point(10, 53);
+ this.nmResinTrapRequiredAreaToProcessCheck.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapRequiredAreaToProcessCheck.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapRequiredAreaToProcessCheck.Name = "nmResinTrapRequiredAreaToProcessCheck";
+ this.nmResinTrapRequiredAreaToProcessCheck.Size = new System.Drawing.Size(57, 24);
+ this.nmResinTrapRequiredAreaToProcessCheck.TabIndex = 20;
+ this.nmResinTrapRequiredAreaToProcessCheck.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label11
+ //
+ this.label11.AutoSize = true;
+ this.label11.Location = new System.Drawing.Point(73, 56);
+ this.label11.Name = "label11";
+ this.label11.Size = new System.Drawing.Size(504, 18);
+ this.label11.TabIndex = 21;
+ this.label11.Text = "Required pixel bound area (x*y) to process and consider a resin trap (1-255)";
+ //
+ // groupBox2
+ //
+ this.groupBox2.Controls.Add(this.nmIslandBinaryThreshold);
+ this.groupBox2.Controls.Add(this.label21);
+ this.groupBox2.Controls.Add(this.label10);
+ this.groupBox2.Controls.Add(this.nmIslandRequiredPixelBrightnessToSupport);
+ this.groupBox2.Controls.Add(this.label9);
+ this.groupBox2.Controls.Add(this.nmIslandRequiredPixelsToSupport);
+ this.groupBox2.Controls.Add(this.nmIslandRequiredAreaToProcessCheck);
+ this.groupBox2.Controls.Add(this.label7);
+ this.groupBox2.Controls.Add(this.label8);
+ this.groupBox2.Controls.Add(this.nmIslandRequiredPixelBrightnessToProcessCheck);
+ this.groupBox2.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox2.Location = new System.Drawing.Point(3, 103);
+ this.groupBox2.Name = "groupBox2";
+ this.groupBox2.Size = new System.Drawing.Size(605, 176);
+ this.groupBox2.TabIndex = 23;
+ this.groupBox2.TabStop = false;
+ this.groupBox2.Text = "Islands";
+ //
+ // label10
+ //
+ this.label10.AutoSize = true;
+ this.label10.Location = new System.Drawing.Point(73, 146);
+ this.label10.Name = "label10";
+ this.label10.Size = new System.Drawing.Size(507, 18);
+ this.label10.TabIndex = 25;
+ this.label10.Text = "Minimum pixel brightness bellow island to consider it as a safe pixel (50-255)";
+ //
+ // nmIslandRequiredPixelBrightnessToSupport
+ //
+ this.nmIslandRequiredPixelBrightnessToSupport.Location = new System.Drawing.Point(10, 143);
+ this.nmIslandRequiredPixelBrightnessToSupport.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelBrightnessToSupport.Minimum = new decimal(new int[] {
+ 50,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelBrightnessToSupport.Name = "nmIslandRequiredPixelBrightnessToSupport";
+ this.nmIslandRequiredPixelBrightnessToSupport.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandRequiredPixelBrightnessToSupport.TabIndex = 24;
+ this.nmIslandRequiredPixelBrightnessToSupport.Value = new decimal(new int[] {
+ 150,
+ 0,
+ 0,
+ 0});
+ //
+ // label9
+ //
+ this.label9.AutoSize = true;
+ this.label9.Location = new System.Drawing.Point(73, 116);
+ this.label9.Name = "label9";
+ this.label9.Size = new System.Drawing.Size(385, 18);
+ this.label9.TabIndex = 23;
+ this.label9.Text = "Required safe pixels bellow the island to demote it (1-255)";
+ //
+ // nmIslandRequiredPixelsToSupport
+ //
+ this.nmIslandRequiredPixelsToSupport.Location = new System.Drawing.Point(10, 113);
+ this.nmIslandRequiredPixelsToSupport.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelsToSupport.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelsToSupport.Name = "nmIslandRequiredPixelsToSupport";
+ this.nmIslandRequiredPixelsToSupport.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandRequiredPixelsToSupport.TabIndex = 22;
+ this.nmIslandRequiredPixelsToSupport.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // nmIslandRequiredAreaToProcessCheck
+ //
+ this.nmIslandRequiredAreaToProcessCheck.Location = new System.Drawing.Point(10, 53);
+ this.nmIslandRequiredAreaToProcessCheck.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredAreaToProcessCheck.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredAreaToProcessCheck.Name = "nmIslandRequiredAreaToProcessCheck";
+ this.nmIslandRequiredAreaToProcessCheck.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandRequiredAreaToProcessCheck.TabIndex = 18;
+ this.nmIslandRequiredAreaToProcessCheck.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label7
+ //
+ this.label7.AutoSize = true;
+ this.label7.Location = new System.Drawing.Point(73, 56);
+ this.label7.Name = "label7";
+ this.label7.Size = new System.Drawing.Size(481, 18);
+ this.label7.TabIndex = 19;
+ this.label7.Text = "Required pixel bound area (x*y) to process and consider a island (1-255)";
+ //
+ // label8
+ //
+ this.label8.AutoSize = true;
+ this.label8.Location = new System.Drawing.Point(73, 86);
+ this.label8.Name = "label8";
+ this.label8.Size = new System.Drawing.Size(439, 18);
+ this.label8.TabIndex = 21;
+ this.label8.Text = "Minimum pixel brightness to consider that pixel on a island (1-255)";
+ //
+ // nmIslandRequiredPixelBrightnessToProcessCheck
+ //
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Location = new System.Drawing.Point(10, 83);
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Maximum = new decimal(new int[] {
+ 255,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Minimum = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Name = "nmIslandRequiredPixelBrightnessToProcessCheck";
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.TabIndex = 20;
+ this.nmIslandRequiredPixelBrightnessToProcessCheck.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // groupBox1
+ //
+ this.groupBox1.Controls.Add(this.cbAutoComputeIssuesClickOnTab);
+ this.groupBox1.Controls.Add(this.cbComputeIssuesOnLoad);
+ this.groupBox1.Controls.Add(this.cbComputeIslands);
+ this.groupBox1.Controls.Add(this.cbComputeResinTraps);
+ this.groupBox1.Dock = System.Windows.Forms.DockStyle.Top;
+ this.groupBox1.Location = new System.Drawing.Point(3, 20);
+ this.groupBox1.Name = "groupBox1";
+ this.groupBox1.Size = new System.Drawing.Size(605, 83);
+ this.groupBox1.TabIndex = 22;
+ this.groupBox1.TabStop = false;
+ this.groupBox1.Text = "Commun";
+ //
+ // cbAutoComputeIssuesClickOnTab
+ //
+ this.cbAutoComputeIssuesClickOnTab.AutoSize = true;
+ this.cbAutoComputeIssuesClickOnTab.Location = new System.Drawing.Point(6, 51);
+ this.cbAutoComputeIssuesClickOnTab.Name = "cbAutoComputeIssuesClickOnTab";
+ this.cbAutoComputeIssuesClickOnTab.Size = new System.Drawing.Size(416, 22);
+ this.cbAutoComputeIssuesClickOnTab.TabIndex = 18;
+ this.cbAutoComputeIssuesClickOnTab.Text = "Auto compute issues when click Issues tab for the first time";
+ this.cbAutoComputeIssuesClickOnTab.UseVisualStyleBackColor = true;
+ //
+ // nmResinTrapBinaryThreshold
+ //
+ this.nmResinTrapBinaryThreshold.Location = new System.Drawing.Point(10, 23);
+ this.nmResinTrapBinaryThreshold.Maximum = new decimal(new int[] {
+ 254,
+ 0,
+ 0,
+ 0});
+ this.nmResinTrapBinaryThreshold.Name = "nmResinTrapBinaryThreshold";
+ this.nmResinTrapBinaryThreshold.Size = new System.Drawing.Size(57, 24);
+ this.nmResinTrapBinaryThreshold.TabIndex = 26;
+ this.nmResinTrapBinaryThreshold.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label20
+ //
+ this.label20.AutoSize = true;
+ this.label20.Location = new System.Drawing.Point(73, 26);
+ this.label20.Name = "label20";
+ this.label20.Size = new System.Drawing.Size(512, 18);
+ this.label20.TabIndex = 27;
+ this.label20.Text = "Pixels below this value will turn black, otherwise white. Value=0 to disable this" +
+ "";
+ //
+ // nmIslandBinaryThreshold
+ //
+ this.nmIslandBinaryThreshold.Location = new System.Drawing.Point(10, 23);
+ this.nmIslandBinaryThreshold.Maximum = new decimal(new int[] {
+ 254,
+ 0,
+ 0,
+ 0});
+ this.nmIslandBinaryThreshold.Name = "nmIslandBinaryThreshold";
+ this.nmIslandBinaryThreshold.Size = new System.Drawing.Size(57, 24);
+ this.nmIslandBinaryThreshold.TabIndex = 28;
+ this.nmIslandBinaryThreshold.Value = new decimal(new int[] {
+ 1,
+ 0,
+ 0,
+ 0});
+ //
+ // label21
+ //
+ this.label21.AutoSize = true;
+ this.label21.Location = new System.Drawing.Point(73, 26);
+ this.label21.Name = "label21";
+ this.label21.Size = new System.Drawing.Size(512, 18);
+ this.label21.TabIndex = 29;
+ this.label21.Text = "Pixels below this value will turn black, otherwise white. Value=0 to disable this" +
+ "";
+ //
+ // FrmSettings
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 18F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(611, 953);
+ this.Controls.Add(this.gbIssues);
+ this.Controls.Add(this.btnReset);
+ this.Controls.Add(this.groupLayerPreview);
+ this.Controls.Add(this.groupGeneral);
+ this.Controls.Add(this.btnSave);
+ this.Controls.Add(this.btnCancel);
+ this.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
+ this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
+ this.Margin = new System.Windows.Forms.Padding(4);
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "FrmSettings";
+ this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide;
+ this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
+ this.Text = "Settings";
+ this.groupGeneral.ResumeLayout(false);
+ this.groupGeneral.PerformLayout();
+ this.groupLayerPreview.ResumeLayout(false);
+ this.groupLayerPreview.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlineHollowAreasLineThickness)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlineLayerBoundsLineThickness)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmOutlinePrintVolumeBoundsLineThickness)).EndInit();
+ this.gbIssues.ResumeLayout(false);
+ this.groupBox3.ResumeLayout(false);
+ this.groupBox3.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapMaximumPixelBrightnessToDrain)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredBlackPixelsToDrain)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapRequiredAreaToProcessCheck)).EndInit();
+ this.groupBox2.ResumeLayout(false);
+ this.groupBox2.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToSupport)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelsToSupport)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredAreaToProcessCheck)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandRequiredPixelBrightnessToProcessCheck)).EndInit();
+ this.groupBox1.ResumeLayout(false);
+ this.groupBox1.PerformLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.nmResinTrapBinaryThreshold)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.nmIslandBinaryThreshold)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button btnPreviousNextLayerColor;
+ private System.Windows.Forms.ColorDialog colorDialog;
+ private System.Windows.Forms.Button btnPreviousLayerColor;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Button btnNextLayerColor;
+ private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Button btnTouchingBoundsColor;
+ private System.Windows.Forms.Label label4;
+ private System.Windows.Forms.Label label5;
+ private System.Windows.Forms.Label label6;
+ private System.Windows.Forms.Button btnResinTrapColor;
+ private System.Windows.Forms.Button btnIslandColor;
+ private System.Windows.Forms.Button btnSave;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.GroupBox groupGeneral;
+ private System.Windows.Forms.CheckBox cbStartMaximized;
+ private System.Windows.Forms.CheckBox cbCheckForUpdatesOnStartup;
+ private System.Windows.Forms.GroupBox groupLayerPreview;
+ private System.Windows.Forms.CheckBox cbLayerAutoRotateBestView;
+ private System.Windows.Forms.Button btnReset;
+ private System.Windows.Forms.CheckBox cbLayerDifferenceDefault;
+ private System.Windows.Forms.CheckBox cbComputeIssuesOnLoad;
+ private System.Windows.Forms.CheckBox cbLayerZoomToFit;
+ private System.Windows.Forms.CheckBox cbComputeResinTraps;
+ private System.Windows.Forms.CheckBox cbComputeIslands;
+ private System.Windows.Forms.GroupBox gbIssues;
+ private System.Windows.Forms.NumericUpDown nmIslandRequiredAreaToProcessCheck;
+ private System.Windows.Forms.Label label7;
+ private System.Windows.Forms.Label label8;
+ private System.Windows.Forms.NumericUpDown nmIslandRequiredPixelBrightnessToProcessCheck;
+ private System.Windows.Forms.GroupBox groupBox2;
+ private System.Windows.Forms.GroupBox groupBox1;
+ private System.Windows.Forms.Label label9;
+ private System.Windows.Forms.NumericUpDown nmIslandRequiredPixelsToSupport;
+ private System.Windows.Forms.Label label10;
+ private System.Windows.Forms.NumericUpDown nmIslandRequiredPixelBrightnessToSupport;
+ private System.Windows.Forms.GroupBox groupBox3;
+ private System.Windows.Forms.NumericUpDown nmResinTrapRequiredAreaToProcessCheck;
+ private System.Windows.Forms.Label label11;
+ private System.Windows.Forms.NumericUpDown nmResinTrapRequiredBlackPixelsToDrain;
+ private System.Windows.Forms.Label label12;
+ private System.Windows.Forms.NumericUpDown nmResinTrapMaximumPixelBrightnessToDrain;
+ private System.Windows.Forms.Label label13;
+ private System.Windows.Forms.CheckBox cbAutoComputeIssuesClickOnTab;
+ private System.Windows.Forms.Label label14;
+ private System.Windows.Forms.Button btnOutlinePrintVolumeBoundsColor;
+ private System.Windows.Forms.Label label15;
+ private System.Windows.Forms.NumericUpDown nmOutlinePrintVolumeBoundsLineThickness;
+ private System.Windows.Forms.CheckBox cbOutlinePrintVolumeBounds;
+ private System.Windows.Forms.CheckBox cbOutlineLayerBounds;
+ private System.Windows.Forms.Label label16;
+ private System.Windows.Forms.NumericUpDown nmOutlineLayerBoundsLineThickness;
+ private System.Windows.Forms.Label label17;
+ private System.Windows.Forms.Button btnOutlineLayerBoundsColor;
+ private System.Windows.Forms.CheckBox cbOutlineHollowAreas;
+ private System.Windows.Forms.Label label18;
+ private System.Windows.Forms.NumericUpDown nmOutlineHollowAreasLineThickness;
+ private System.Windows.Forms.Label label19;
+ private System.Windows.Forms.Button btnOutlineHollowAreasColor;
+ private System.Windows.Forms.CheckBox cbZoomToFitPrintVolumeBounds;
+ private System.Windows.Forms.NumericUpDown nmResinTrapBinaryThreshold;
+ private System.Windows.Forms.Label label20;
+ private System.Windows.Forms.NumericUpDown nmIslandBinaryThreshold;
+ private System.Windows.Forms.Label label21;
+ }
+} \ No newline at end of file
diff --git a/UVtools.GUI/Forms/FrmSettings.cs b/UVtools.GUI/Forms/FrmSettings.cs
new file mode 100644
index 0000000..222b564
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmSettings.cs
@@ -0,0 +1,157 @@
+using System;
+using System.Windows.Forms;
+using UVtools.GUI.Properties;
+
+namespace UVtools.GUI.Forms
+{
+ public partial class FrmSettings : Form
+ {
+ public FrmSettings()
+ {
+ InitializeComponent();
+ Init();
+ }
+
+ public void Init()
+ {
+ try
+ {
+ cbCheckForUpdatesOnStartup.Checked = Settings.Default.CheckForUpdatesOnStartup;
+ cbStartMaximized.Checked = Settings.Default.StartMaximized;
+
+ btnPreviousNextLayerColor.BackColor = Settings.Default.PreviousNextLayerColor;
+ btnPreviousLayerColor.BackColor = Settings.Default.PreviousLayerColor;
+ btnNextLayerColor.BackColor = Settings.Default.NextLayerColor;
+ btnIslandColor.BackColor = Settings.Default.IslandColor;
+ btnResinTrapColor.BackColor = Settings.Default.ResinTrapColor;
+ btnTouchingBoundsColor.BackColor = Settings.Default.TouchingBoundsColor;
+
+ btnOutlinePrintVolumeBoundsColor.BackColor = Settings.Default.OutlinePrintVolumeBoundsColor;
+ btnOutlineLayerBoundsColor.BackColor = Settings.Default.OutlineLayerBoundsColor;
+ btnOutlineHollowAreasColor.BackColor = Settings.Default.OutlineHollowAreasColor;
+
+ nmOutlinePrintVolumeBoundsLineThickness.Value = Settings.Default.OutlinePrintVolumeBoundsLineThickness;
+ nmOutlineLayerBoundsLineThickness.Value = Settings.Default.OutlineLayerBoundsLineThickness;
+ nmOutlineHollowAreasLineThickness.Value = Settings.Default.OutlineHollowAreasLineThickness;
+
+ cbOutlinePrintVolumeBounds.Checked = Settings.Default.OutlinePrintVolumeBounds;
+ cbOutlineLayerBounds.Checked = Settings.Default.OutlineLayerBounds;
+ cbOutlineHollowAreas.Checked = Settings.Default.OutlineHollowAreas;
+
+ cbLayerAutoRotateBestView.Checked = Settings.Default.LayerAutoRotateBestView;
+ cbLayerZoomToFit.Checked = Settings.Default.LayerZoomToFit;
+ cbZoomToFitPrintVolumeBounds.Checked = Settings.Default.ZoomToFitPrintVolumeBounds;
+ cbLayerDifferenceDefault.Checked = Settings.Default.LayerDifferenceDefault;
+ cbComputeIssuesOnLoad.Checked = Settings.Default.ComputeIssuesOnLoad;
+ cbComputeIslands.Checked = Settings.Default.ComputeIslands;
+ cbComputeResinTraps.Checked = Settings.Default.ComputeResinTraps;
+ cbAutoComputeIssuesClickOnTab.Checked = Settings.Default.AutoComputeIssuesClickOnTab;
+
+ nmIslandBinaryThreshold.Value = Settings.Default.IslandBinaryThreshold;
+ nmIslandRequiredAreaToProcessCheck.Value = Settings.Default.IslandRequiredAreaToProcessCheck;
+ nmIslandRequiredPixelBrightnessToProcessCheck.Value = Settings.Default.IslandRequiredPixelBrightnessToProcessCheck;
+ nmIslandRequiredPixelsToSupport.Value = Settings.Default.IslandRequiredPixelsToSupport;
+ nmIslandRequiredPixelBrightnessToSupport.Value = Settings.Default.IslandRequiredPixelBrightnessToSupport;
+
+ nmResinTrapBinaryThreshold.Value = Settings.Default.ResinTrapBinaryThreshold;
+ nmResinTrapRequiredAreaToProcessCheck.Value = Settings.Default.ResinTrapRequiredAreaToProcessCheck;
+ nmResinTrapRequiredBlackPixelsToDrain.Value = Settings.Default.ResinTrapRequiredBlackPixelsToDrain;
+ nmResinTrapMaximumPixelBrightnessToDrain.Value = Settings.Default.ResinTrapMaximumPixelBrightnessToDrain;
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show($"Unable to use current settings, a reset will be performed.\n{ex.Message}",
+ "Unable to use current settings", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ Settings.Default.Reset();
+ Settings.Default.Save();
+ Init();
+ }
+ }
+
+ private void EventClick(object sender, EventArgs e)
+ {
+ if (
+ ReferenceEquals(sender, btnPreviousNextLayerColor) ||
+ ReferenceEquals(sender, btnPreviousLayerColor) ||
+ ReferenceEquals(sender, btnNextLayerColor) ||
+ ReferenceEquals(sender, btnIslandColor) ||
+ ReferenceEquals(sender, btnResinTrapColor) ||
+ ReferenceEquals(sender, btnTouchingBoundsColor) ||
+ ReferenceEquals(sender, btnOutlinePrintVolumeBoundsColor) ||
+ ReferenceEquals(sender, btnOutlineLayerBoundsColor) ||
+ ReferenceEquals(sender, btnOutlineHollowAreasColor)
+ )
+ {
+ Button btn = sender as Button;
+ colorDialog.Color = btn.BackColor;
+ if (colorDialog.ShowDialog() != DialogResult.OK) return;
+
+ btn.BackColor = colorDialog.Color;
+
+ return;
+
+ }
+
+ if (ReferenceEquals(sender, btnReset))
+ {
+ if (MessageBox.Show("Are you sure you want to reset the settings to the default values?",
+ "Reset settings?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) !=
+ DialogResult.Yes) return;
+
+ Settings.Default.Reset();
+ Init();
+
+ return;
+ }
+
+ if (ReferenceEquals(sender, btnSave))
+ {
+ Settings.Default.CheckForUpdatesOnStartup = cbCheckForUpdatesOnStartup.Checked;
+ Settings.Default.StartMaximized = cbStartMaximized.Checked;
+
+ Settings.Default.PreviousNextLayerColor = btnPreviousNextLayerColor.BackColor;
+ Settings.Default.PreviousLayerColor = btnPreviousLayerColor.BackColor;
+ Settings.Default.NextLayerColor = btnNextLayerColor.BackColor;
+ Settings.Default.IslandColor = btnIslandColor.BackColor;
+ Settings.Default.ResinTrapColor = btnResinTrapColor.BackColor;
+ Settings.Default.TouchingBoundsColor = btnTouchingBoundsColor.BackColor;
+
+ Settings.Default.OutlinePrintVolumeBoundsColor = btnOutlinePrintVolumeBoundsColor.BackColor;
+ Settings.Default.OutlineLayerBoundsColor = btnOutlineLayerBoundsColor.BackColor;
+ Settings.Default.OutlineHollowAreasColor = btnOutlineHollowAreasColor.BackColor;
+
+ Settings.Default.OutlinePrintVolumeBoundsLineThickness = (byte) nmOutlinePrintVolumeBoundsLineThickness.Value;
+ Settings.Default.OutlineLayerBoundsLineThickness = (byte) nmOutlineLayerBoundsLineThickness.Value;
+ Settings.Default.OutlineHollowAreasLineThickness = (sbyte) nmOutlineHollowAreasLineThickness.Value;
+
+ Settings.Default.OutlinePrintVolumeBounds = cbOutlinePrintVolumeBounds.Checked;
+ Settings.Default.OutlineLayerBounds = cbOutlineLayerBounds.Checked;
+ Settings.Default.OutlineHollowAreas = cbOutlineHollowAreas.Checked;
+
+ Settings.Default.LayerAutoRotateBestView = cbLayerAutoRotateBestView.Checked;
+ Settings.Default.LayerZoomToFit = cbLayerZoomToFit.Checked;
+ Settings.Default.ZoomToFitPrintVolumeBounds = cbZoomToFitPrintVolumeBounds.Checked;
+ Settings.Default.LayerDifferenceDefault = cbLayerDifferenceDefault.Checked;
+ Settings.Default.ComputeIssuesOnLoad = cbComputeIssuesOnLoad.Checked;
+ Settings.Default.ComputeIslands = cbComputeIslands.Checked;
+ Settings.Default.ComputeResinTraps = cbComputeResinTraps.Checked;
+ Settings.Default.AutoComputeIssuesClickOnTab = cbAutoComputeIssuesClickOnTab.Checked;
+
+ Settings.Default.IslandBinaryThreshold = (byte)nmIslandBinaryThreshold.Value;
+ Settings.Default.IslandRequiredAreaToProcessCheck = (byte) nmIslandRequiredAreaToProcessCheck.Value;
+ Settings.Default.IslandRequiredPixelBrightnessToProcessCheck = (byte)nmIslandRequiredPixelBrightnessToProcessCheck.Value;
+ Settings.Default.IslandRequiredPixelsToSupport = (byte)nmIslandRequiredPixelsToSupport.Value;
+ Settings.Default.IslandRequiredPixelBrightnessToSupport = (byte)nmIslandRequiredPixelBrightnessToSupport.Value;
+
+ Settings.Default.ResinTrapBinaryThreshold = (byte) nmResinTrapBinaryThreshold.Value;
+ Settings.Default.ResinTrapRequiredAreaToProcessCheck = (byte)nmResinTrapRequiredAreaToProcessCheck.Value;
+ Settings.Default.ResinTrapRequiredBlackPixelsToDrain = (byte)nmResinTrapRequiredBlackPixelsToDrain.Value;
+ Settings.Default.ResinTrapMaximumPixelBrightnessToDrain = (byte)nmResinTrapMaximumPixelBrightnessToDrain.Value;
+
+ Settings.Default.Save();
+ DialogResult = DialogResult.OK;
+ return;
+ }
+ }
+ }
+}
diff --git a/UVtools.GUI/Forms/FrmSettings.resx b/UVtools.GUI/Forms/FrmSettings.resx
new file mode 100644
index 0000000..ce1a023
--- /dev/null
+++ b/UVtools.GUI/Forms/FrmSettings.resx
@@ -0,0 +1,2204 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <metadata name="colorDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+ <value>17, 17</value>
+ </metadata>
+ <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>
+ 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
+ ////Af///xH///8v////UP///3H///+P////r////8f////c////7P////f////9///////////////9
+ ////9////+z////c////x////6////+P////cf///1D///8v////Ef///wH///8B////Af///wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8B////Af///wr///8o////XP///5T////H////6f////b////+/////v////7/////
+ //////////////////////////////////////////////////////////////////////////7////+
+ /////v////b////p////x////5T///9c////KP///wr///8B////Af///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8C////Ef///0z///+W////0v////T////+
+ //////////7/////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+//////////7////0
+ ////0v///5b///9M////Ef///wL///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8K
+ ////Uf///6X////o/////v////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v////7////o////pf///1H///8K
+ ////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////Af///wP///8x////jf///+f////9/////v//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+/////f///+f///+N////Mf///wP///8B////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wr///9K////uP////T////+
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7////0////uP///0r///8K////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Af///wj///9V////xv////v////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////+////8b///9V
+ ////CP///wH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wP///9L////y/////3/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////3////L////S////wP///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///82
+ ////uP////v/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////7////uP///zb///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wH///8T////jv////H////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////8f///47///8T
+ ////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8C////Sf///9b////+
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///9b///9J////Av///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////EP///5b////5////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////n///+W////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///zT////R/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////7////R////NP///wEAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///wX///9j////7P//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////s////Y////wX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8H////jv////r/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////6
+ ////jv///wf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Ff///7b////+////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////+////tv///xX///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///yD////F/////v//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////xf///yD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8n
+ ////0v////7/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////0v///yf///8A
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Jv///9z////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////7////7/P7/6+/9/9jg+//B0fn/
+ pMT4/5m99/+Yu/f/mr33/6XF9//C0vn/2OD7/+zv/f/7/P///v/////////+////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+////3P///yb///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///yf////c
+ /////v//////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////8/P//
+ 4ej8/6vF9/97pfT/UYbw/yxy7v8dZ+3/HGft/xlq7f8ia+3/JWzt/yZs7f8lbO3/Imvt/xpq7f8cZ+3/
+ Hmft/y9z7v9RhvD/eqb0/67H+P/i6fz//P3/////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////3P///yf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8g////0v////7/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////r7/v/T3/v/i6/1/0iD7/8obe3/I2vt/yJr7f8ka+3/I2vt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/yRr7f8ia+3/I2rt/yhu7f9LhPD/
+ j7D1/9bh+//6+/7/////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////+////0v///yD///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////FP///8X////+
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////v7///H1/v+owvf/T4fw/yRs7f8ha+3/
+ JGvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNs7f8ia+3/J2zt/1OJ8P+rwvf/8/b+//7/////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////xf///xT///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///wf///+2/////v//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////H0/f+SsvX/Onfu/yFq7f8ja+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/JGzt/yFq7f83eO7/l7b2//L1/f//////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////tv///wf///8A
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E////jv////7/////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////X3/v+ivPb/NHTu/yRr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8la+3/
+ NXbu/6C99//4+f7/////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+////jv///wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////Af///2P////6////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////7+///J2Pr/
+ TYXw/yZr7f8ja+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/JWvt/1GH8P/N2/r//f7/////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////6
+ ////Y////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///80////6///////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////3+P7/i6z1/ylt7f8ka+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/JGzt/yxu7f+Or/X/9/n+////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////r////NP///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////EP///9H/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////4Oj8/1OH8P8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRr7f9TiPD/
+ 5ev8////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////R////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wL///+W/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////8HT+f83du7/I2vt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f86d+7/x9f6////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////7///+W////AgAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8B////Sf////r/////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////7+//+yx/j/K2/t/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJq6v8fY9v/GEyp/xZFmv8iaur/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yNr7f8wce7/tcr4//7+////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////r///9J////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///xP////W////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////sML3/ypt7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+z/IWfk/xtUuv8SOHv/Ch9E/wMLGf8DCBL/
+ AgYN/xE2d/8iaur/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f8nbu3/rcT3//7+////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////9b///8T
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8B////jv////7/////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////a4/v/OXju/yRr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFm4/8bVbz/
+ EzyG/wohSP8DCBL/AwkU/wkcP/8RN3n/GlK2/yFn5P8aUbP/AwgS/w8vaf8haOf/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8jbO3/r8X4//7+////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///47///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///zb////x////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////a4/v/OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8gZuL/HFjD/xRAjv8LI0//BA0d/wQLGf8IGjn/EDNx/xlQsP8fY9r/IWnp/yJr7f8ia+3/
+ Imvt/yJr7f8bVLr/BA4e/w4rXv8hZ+T/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8rb+3/
+ vc/5////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////8f///zb///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8D////uP//////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////W4Pv/
+ O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8cWMP/DShZ/wYSJ/8DChX/BxYw/w8wav8YS6f/
+ Hl/T/yFp6f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8cWMP/BhIn/wwkUP8gZuL/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f8zc+7/0d77////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////uP///wP///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///0v////7////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////W4fv/OHfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/xlPsP8DCBL/BhIn/xxYw/8iauv/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8eXc7/BhMq/wofRf8gZN3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yNr7f9Cfe//8fT9////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////7////S////wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8I////yv//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/x1cy/8HFjL/BhQs/xtWv/8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8fYtj/
+ BxYx/wgZOP8fYNX/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRs7f9olvL/+/z/////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////K////CP///wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///1X////9////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////Z4vv/OXju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yBk3v8OK1//AwoX/xVDlf8iauv/Imvt/yJr7f8ia+3/Imvt/yJr7f8iaur/
+ H2HX/xlNq/8QMm//Dy5m/yBl4P8ia+3/Imvt/yJr7f8fYtn/CR1A/wcVL/8eXtD/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yNq7f+mwvf/////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////3///9V////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8K////xv//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////W4Pv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFp6f8VQZD/
+ AwkU/w8vZ/8gZuL/Imrr/yBl4P8aUbT/ETV2/wkdQf8EDBr/AwsX/wsiSv8GEyn/CR5D/yBj3P8ia+3/
+ Imvt/yJr7f8gY9z/CyJL/wURJ/8dXMz/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/zR27v/h6vz/
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////8X///8K
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///0n////7////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////X4fv/
+ OXfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8bVLr/AwoV/wcXMv8KIEb/AwoV/wMIE/8KHkP/
+ Ejl+/xpTt/8hZ+P/Imvt/x9h1/8HGDT/CBk4/x9g1f8ia+3/Imvt/yJr7f8gZuP/DCdW/wUOIP8cV8L/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/2+c8//+/v//////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////+////0n///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8D////uP//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////b4/v/OHju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/IGbi/xtWv/8TPoj/
+ CyFK/wMKF/8DChX/CRw+/xE1dv8aUbX/IGbi/yJq6/8ia+3/Imvt/yJr7f8ia+3/Imvt/yBk3f8JHkL/
+ BhMr/x1czP8ia+3/Imvt/yJr7f8haej/Di1k/wQMG/8aUbT/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ J23t/8nX+v//////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////uP///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///zH////0////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////Y4fv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/xdKo/8FDyH/AwgS/wgYNv8QMm//GU6s/x9h1v8haen/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yBk3v8LI07/BRAk/x1byP8ia+3/Imvt/yFo5v8eX9P/
+ CyRP/wMIE/8ZTq3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/VIzx//39////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////0////Mf///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8B////jf////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////V4Pv/Onju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Hl3P/wgaOf8FDiD/
+ G1W7/yJr7P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yBm4f8NKFj/BQ4g/xAzcf8MJlT/BxUv/wMLGP8CCBH/BREm/xQ9iP8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8eae3/ydj6////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7///+N////AQAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr////m////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////Y4vv/OXju/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/IWfk/w8vZ/8CBw//FD+M/yJq6v8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8iauz/IWnp/yJr7f8ia+3/Imvt/yJq6v8PLmX/AAEC/wofRf8WRJb/
+ G1a//yBj3P8iauz/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRs7f9jk/H//P3/////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////+b///8K////AAAAAAAAAAAA
+ AAAAAAAAAAD///8A////Uf////3/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////b5Pv/
+ OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imrr/xZFmP8ECxn/DChY/yBl3/8ia+3/Imvt/yJr7f8ia+3/Imrr/x5g1P8YTKj/DzBr/wcWMP8GEyn/
+ HFnF/yJr7f8ia+3/Imvt/yJq6v8RNXb/AwoW/xhLpv8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yRs7f/d5vz/////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////f///1H///8AAAAAAAAAAAAAAAAAAAAAAP///wL///+l/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////f39/+bm5v/+/v7////////////X4fv/Onnu/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xxXwf8HFzL/Bxcz/xxXwv8fY9v/
+ GU+v/xAzcv8JGzv/BAsZ/wQNHv8KH0b/FD6K/w0qXP8EDR7/G1W8/yJr7f8ia+3/Imvt/yFp6f8SOX//
+ AggR/xdInv8iauz/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/JGvt/4qt9f//////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////pf///wIAAAAA
+ AAAAAAAAAAD///8A////Ev///+j/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////7+/v+rq6v/Ozs7/8zMzP//////
+ ///////////W4Pv/OXfu/yRr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+z/IWfk/xlOrf8DChb/AgcQ/wMLGP8AAQH/CR1A/xM7hP8NK1//F0ed/yJr7f8cWMP/
+ EDFs/w8vaf8EDBr/GlCy/yJr7f8ia+3/Imvt/yJq6/8UP43/AgYO/xVCkv8ia+z/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/QX/v//f4/v//////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////o////Ev///wAAAAAAAAAAAP///wD///9L/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////t7e3/zMzM/8zMzP/Pj4+/8jIyP/////////////////a4/v/OXju/yNs7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFp6P8bVb3/EzuC/wogRv8DCBP/AwkT/wkdQf8RNXb/
+ GlGz/xdHnf8hZ+X/IGXg/xpTuP8dWsj/IGTe/x9i2P8YS6f/IGbh/xE0dP8DCRP/GEql/yJr7f8ia+3/
+ Imvt/yJr7f8WRpv/AggR/xM7hP8ia+z/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ y9v6////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7///9L
+ ////AAAAAAAAAAAA////Af///5b////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////8/Pz/85OTn/MjIy/zIyMv8zMzP/
+ Pz8//8jIyP/////////////////b4/v/OHfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ FUKT/wEECP8EDR3/Dy9n/wUQJP8dW8r/Imrq/w4uZf8WRpv/Imvt/xlPsP8MJFH/Imvs/yFo5/8HGDX/
+ HVzN/yJr7f8RNXb/FD6J/xM8hf8CCBH/FkWa/yFp6f8gZN7/HVvK/xhMp/8LIkv/AQIF/xM8hf8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f+Or/X/////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///5b///8BAAAAAAAAAAD///8K////0v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////s7Oz/R0dH/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8vLy//+/v7////////////W4Pv/
+ O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8hZuP/ETV1/wMIEv8TPIX/Hl7Q/x9h1v8aU7j/
+ IGPc/yBl4f8ZTav/IWbj/x9i2f8cV8L/Hl3O/x9h1v8fYtr/GlGz/yBk3v8gZeH/GU+u/xM9hv8CBw//
+ CBg1/wUPIf8DChf/BA4f/wkcPv8OLWT/GlK1/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ JGzt/1GI8P/+/v//////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////0v///woAAAAA////AP///yf////0////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////Pz8/21tbf8zMzP/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8zMzP/////////////////W4fv/OHfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+z/F0mh/wMKFf8MJVL/GEqk/xAxbf8iauz/IWfj/wsjTf8gZN3/Imvt/xM7gv8XSJ7/
+ Imvt/xxXv/8OLGH/Imvt/yFo5v8NKVr/HVzN/xZGm/8CBQr/DCRQ/x5dzv8haOX/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/K2/u/+/y/f//////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////0////J////wD///8B////XP////7/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////+qqqr/Li4u/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP//////
+ ///////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/HVzL/wgaOP8FESX/
+ G1W9/xQ+iv8ZULH/Imvt/xxXwf8SOHz/Imvs/yFp6P8PL2f/H2HW/yJr7f8WRJf/GEul/yJr7f8eXtD/
+ EDJu/xhLpf8DChX/EDNy/yFq6v8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8fa+3/ydj6////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7///9c////Af///wH///+U////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////5OTk/z8/P/8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP/////////////////Z4vv/OXju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/IGXg/w8uZv8DChf/DSlc/xxaxv8gZN//Hl/T/xhKpf8hZ+P/
+ IWfl/xZFmP8gZN7/IGXg/xpTt/8cV8H/IGXf/x9j3P8WRpz/IGbi/xlOrP8EDBv/Dy9n/yFn5P8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRr7f+eu/b//v//////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////5T///8B////Af///8f////+
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////7+/v91dXX/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ PT09/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imrr/xVDlP8DChf/DCdX/wcVL/8fYtj/Imvt/xAzcv8VQZD/Imvt/xpStv8LIkv/Imvt/yFn5P8KHkT/
+ HFrI/yJr7f8SOoD/Ejl//xtWv/8EDBv/DSpc/yBm4v8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/3ym9P//////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////xv///wH///8R////6f//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////zs7O/zExMf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/////////////////X4fv/
+ OXfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xxXwP8GEyv/BA0d/xtUuv8bVr//
+ H2Pc/yBm4v8aU7f/IGbi/x9g1f8dW8r/Hl/S/x5f0/8gZuH/GlO3/yBk3v8gZN7/GlO4/xtWvv8FESb/
+ CyJM/yFn5P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/WZHx//7+////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////p////Ef///y/////2
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////7+/v9kZGT/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8fHx//////////////////b4/v/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yBk3f8NKFn/AQIE/wgbO/8iaur/IWjn/wsiTP8eXtD/Imvt/xM8hf8WRJb/
+ Imvt/x1ayP8MJ1X/HV3O/xlQsv8EDRz/CyNM/wcVL/8AAAH/DzBq/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yNr7f9Lge///f7/////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////b///8v////UP////7/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////0dHR/y0tLf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7/
+ ///////////Y4vv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFp6f8UPon/
+ AwoW/wsjTv8ZT6//Imnp/xxZxv8RNnn/GlO5/xVDlf8OLWT/CiBG/wURJf8ECxn/BA0c/wcXMv8MJ1f/
+ EzqC/xhLp/8fYdj/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/zt47v/9/v//
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////v///1D///9x
+ /////v//////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////39/f9ra2v/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8aUbT/BRAk/wYULf8LI0z/BQ8h/wEDBv8DCBP/
+ BhQs/wskUP8SOHz/F0mi/xxYw/8fY9v/Imrr/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/LnPt//z8////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+////cf///4/////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////5OTk/zMzM/8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pj4+/8rKyv/////////////////Y4vv/OHju/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8fYtn/DSpd/xAxbf8XR57/HFnE/yBl4P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8lcO3/
+ +fv+////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7///+P
+ ////r///////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////+UlJT/Li4u/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8fHx//////////////////b5Pv/
+ OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yVv7f/5+v7/////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////6/////H////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////+fn5/1JSUv8zMzP/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7////////////X4fv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ LHLt//v8////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////x////9z/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////X19f/MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/
+ ///////////W4Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yNr7f84d+7//f7/////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////c////7P//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////5+fn/8uLi7/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8nJyf/////////////////a4/v/OXju/yRs7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ I2vt/0h/7//9/v//////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////+z////3////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////+/v7/YWFh/zQ0NP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pz8//8jIyP/////////////////b5Pv/N3fu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ja+3/V43x//7+////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////9/////3/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////b29v87Ozv/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/+/v7////////////W4Pv/
+ O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f90ovP/////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////9////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////3d3d/y0tLf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8zMzP/////////////////W4Pv/OHfu/yNs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/JWvt/5m39v/+////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////+vr6//MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP//////
+ ///////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8fa+3/wdT5////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////3/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////5GRkf8xMTH/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP/////////////////a4/v/OXju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/ydu7f/q7v3/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////9////9///////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////eXl5/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ PT09/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ka+3/RoLv//39////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////f////s////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////7+/v9cXFz/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/////////////////X4fv/
+ OXfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f+BqPT/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////7P///9z/////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////f39/1JSUv8zMzP/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8fHx//////////////////b5Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/IWrt/8PU+f//////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////c////x///////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////9/f3/SUlJ/zMzM/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7/
+ ///////////Y4vv/Onju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f85ee7/8vX+////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////8f///+v
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////39/f9FRUX/
+ MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8zMzP/+/v7////////////W4Pv/Onju/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/JGzt/3ej8///////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////r////4/////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////f39/0VFRf8zMzP/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pj4+/8rKyv/////////////////Y4vv/OHju/yRs7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8gau3/1N77////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7///+P
+ ////cf////7/////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////9/f3/
+ SkpK/zMzM/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8fHx//////////////////b4/v/
+ OXfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/I2vt/1eK8f/6+///////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///3H///9Q/////v//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////39/f9UVFT/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7////////////X4fv/O3ju/yNr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8gau3/tcv4////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////UP///y/////2////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /v7+/15eXv8zMzP/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/NDQ0/zY2Nv83Nzf/ODg4/zc3N/82Njb/
+ NDQ0/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/
+ ///////////W4Pv/OXju/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/I2vt/0OA7//7/P//////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////b///8v////Ef///+n/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////f39//zExMf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9CQkL/
+ c3Nz/6Ojo//MzMz/5+fn//b29v/8/Pz/+Pj4/+vr6//V1dX/s7Oz/4aGhv9VVVX/NTU1/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8nJyf/////////////////Z4vv/OXju/yRs7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ka+3/tsz5////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////6f///xH///8B////x/////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////7+/v+Wlpb/MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zMzM/9YWFj/rKys/+vr6//7+/v/7+/v/9fX1/+7u7v/qqqq/6SkpP+oqKj/
+ tbW1/87Ozv/m5ub/+fn5//f39//T09P/f39//z8/P/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pz8//8fHx//////////////////b5Pv/OHfu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/I2vt/1+P8f/7/P//////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////7////G////Af///wH///+U////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////7a2tv8wMDD/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9JSUn/q6ur//Pz8//y8vL/
+ u7u7/3Z2dv9KSkr/OTk5/zMzM/8yMjL/MjIy/zIyMv8yMjL/NjY2/0FBQf9fX1//mJiY/9zc3P/6+vr/
+ 29vb/3Z2dv81NTX/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/+/v7////////////W4fv/
+ O3nu/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8scO3/1OD7////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////5T///8B////Af///1z////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////4eHh/ywsLP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/Z2dn/+Pj4//6+vr/srKy/1RUVP8zMzP/MjIy/zIyMv8yMjL/MzMz/z8/P/9ERET/
+ QEBA/zQ0NP8yMjL/MjIy/zIyMv8yMjL/Ozs7/3d3d//c3Nz/+vr6/6ysrP87Ozv/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8zMzP/////////////////W4Pv/OHfu/yRs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imrt/4+x9f/+/v//////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////+////XP///wH///8A////J/////T/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////5+fn/QEBA/zMzM/8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/NDQ0/4CAgP/4+Pj/4ODg/2dnZ/8yMjL/
+ MjIy/zIyMv8yMjL/Ozs7/4WFhf/Q0ND/9PT0//39/f/39/f/19fX/5SUlP9BQUH/MjIy/zIyMv8yMjL/
+ MjIy/zs7O/+fn5//+fn5/8vLy/9ERET/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP//////
+ ///////////b4/v/OXju/yRr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yRr7f9SifD/+Pr+////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////T///8n////AAAAAAD///8K////0v//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////9ra2v/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zMzM/+Hh4f/+Pj4/8vLy/9JSUn/MjIy/zIyMv8yMjL/MjIy/1NTU//S0tL/+/v7/9nZ2f+pqan/
+ lJSU/6SkpP/S0tL/+fn5/9/f3/9iYmL/MjIy/zIyMv8yMjL/MjIy/zQ0NP97e3v/9fX1/8nJyf9BQUH/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP/////////////////a4/v/OXfu/yNr7f8ia+3/
+ Imvt/yJr7f8ia+3/M3Tu/+Lp/P//////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////0v///woAAAAAAAAAAP///wH///+W
+ /////v//////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////6ioqP8tLS3/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/cHBw//T09P/Nzc3/QUFB/zIyMv8yMjL/
+ MjIy/zIyMv9MTEz/39/f//Dw8P9+fn7/Ozs7/zIyMv8yMjL/MjIy/zg4OP9ubm7/5ubm/+zs7P9dXV3/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv94eHj/9fX1/66urv80NDT/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ PT09/8vLy//+/v7////////////W4Pv/Onnu/yNr7f8ia+3/Imvt/ytu7f+6zvn/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7///+W////AQAAAAAAAAAA////AP///0v////+////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////3t7e/zExMf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/0dHR//o6Oj/39/f/0dHR/8yMjL/MjIy/zIyMv8yMjL/NDQ0/7y8vP/19fX/Z2dn/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/7Ozs/9TU1P86Ojr/MjIy/zIyMv8yMjL/MjIy/zIyMv+Xl5f/
+ +vr6/3BwcP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8vLy//////////////////X4fv/
+ OXfu/yRs7f8ja+3/orz3////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v///0v///8AAAAAAAAAAAD///8A
+ ////Ev///+j/////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////8/Pz/
+ WVlZ/zMzM/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/rq6u//f39/9nZ2f/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv9dXV3/9/f3/6CgoP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+EhIT/
+ +/v7/3d3d/8yMjL/MjIy/zIyMv8yMjL/MjIy/zw8PP/T09P/1tbW/zg4OP8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/PT09/8jIyP/////////////////b5Pv/OXju/5Oy9f/9/f//////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////o////Ev///wAAAAAAAAAAAAAAAAD///8C////pf////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////+lpaX/LS0t/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/0tLS//19fX/tbW1/zU1Nf8yMjL/MjIy/zIyMv8yMjL/MjIy/5aWlv/19fX/V1dX/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/0VFRf/q6ur/srKy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/3p6ev/9/f3/YmJi/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP//////
+ ///////////n7f3/+/z/////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v///6X///8CAAAAAAAAAAAAAAAA
+ AAAAAP///wD///9R/////f//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////+vr6/85OTn/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/h4eH//39/f9iYmL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/s7Oz/+bm5v8/Pz//MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ NTU1/8zMzP/W1tb/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/Q0ND//Hx8f+bm5v/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////9////Uf///wAAAAAAAAAAAAAAAAAAAAAA////AP///wr////m////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////v7+/3Z2dv80NDT/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv+VlZX/+/v7/09PT/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+3t7f/5OTk/z09Pf8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv80NDT/x8fH/9nZ2f8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv9CQkL/7+/v/6SkpP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pj4+/8rKyv//////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////+b///8K////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////Af///43////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////4eHh/ykpKf8yMjL/MjIy/zIyMv8yMjL/MjIy/2NjY//+/v7/hISE/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/5+fn//x8fH/TU1N/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/z8/P//j4+P/vb29/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/4KCgv/9/f3/ZGRk/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8fHx///////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////jf///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Mf////T/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////cXFx/zExMf8yMjL/
+ MjIy/zIyMv8yMjL/OTk5/9vb2//W1tb/Pj4+/zIyMv8yMjL/MjIy/zIyMv8yMjL/bGxs//r6+v+Li4v/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/b29v//r6+v+Hh4f/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv9ERET/3t7e/9HR0f83Nzf/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pz8//8nJyf/+/v7/////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////T///8x////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8D////uP//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////b29v/MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/fn5+//v7+/+QkJD/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv85OTn/1NTU/+jo6P9LS0v/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/z8/P//X19f/5+fn/0VFRf8yMjL/MjIy/zIyMv8yMjL/NDQ0/6urq//5+fn/aGho/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP/+/v7/
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////uP///wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9J
+ ////+///////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////+Li4v/
+ MTEx/zIyMv8yMjL/MjIy/zIyMv82Njb/xMTE//X19f9sbGz/MjIy/zIyMv8yMjL/MjIy/zIyMv9iYmL/
+ 8vLy/9ra2v9WVlb/MjIy/zIyMv8yMjL/MjIy/zIyMv9JSUn/ysrK//n5+f95eXn/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv+NjY3/+vr6/52dnf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8nJyf//////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////v///9J////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wr////G////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////+/v7/9FRUX/MzMz/zIyMv8yMjL/MjIy/zIyMv9JSUn/
+ 2tra/+/v7/9qamr/MzMz/zIyMv8yMjL/MjIy/zMzM/9xcXH/7e3t//Pz8/+xsbH/d3d3/2NjY/9ycnL/
+ paWl/+3t7f/z8/P/hoaG/zQ0NP8yMjL/MjIy/zIyMv82Njb/jo6O//n5+f+2trb/Ojo6/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ Pz8//8fHx///////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////xv///wr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Af///1X////9////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////8HBwf8vLy//MjIy/zIyMv8yMjL/MjIy/zIyMv9VVVX/3t7e//Pz8/+Hh4f/ODg4/zIyMv8yMjL/
+ MjIy/zIyMv9SUlL/tLS0/+7u7v/7+/v//f39//z8/P/y8vL/wsLC/19fX/8zMzP/MjIy/zIyMv8yMjL/
+ QUFB/6qqqv/5+fn/tra2/z4+Pv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8rKyv/+/v7/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////3///9V////AQAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////CP///8r/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////f39/4KCgv8zMzP/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv9LS0v/z8/P//v7+//AwMD/WVlZ/zMzM/8yMjL/MjIy/zIyMv8zMzP/R0dH/2lpaf91dXX/
+ bW1t/0tLS/80NDT/MjIy/zIyMv8yMjL/NTU1/3Fxcf/a2tr/+vr6/56env84ODj/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8zMzP/Pj4+/8zMzP//////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////yv///wj///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8B////S/////v/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////+Pj4/1ZWVv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv86Ojr/mpqa//Ly8v/6+vr/
+ vr6+/3Nzc/9DQ0P/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv80NDT/R0dH/4CAgP/R0dH/
+ /f39/9ra2v9tbW3/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/PT09/8jIyP//////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////v///9L////AQAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8D////uP//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////4uLi/0ZGRv8zMzP/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/UlJS/6qqqv/r6+v/+/v7/+zs7P/IyMj/paWl/4eHh/93d3f/
+ cnJy/3Z2dv+Hh4f/p6en/8zMzP/w8PD/+fn5/9ra2v+Hh4f/Pj4+/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pz8//8jIyP//////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////uP///wP///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///82////8f//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////y8vL/zs7O/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/0hISP97e3v/tbW1/9/f3//z8/P/+fn5//z8/P/9/f3//Pz8//j4+P/x8fH/1tbW/6enp/9qamr/
+ PDw8/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/
+ PT09/8vLy//+/v7/////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////H///82////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wH///+O
+ /////v//////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ xMTE/zU1Nf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/NjY2/0ZGRv9ZWVn/
+ ZGRk/2hoaP9kZGT/WFhY/0JCQv81NTX/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/Pj4+/8zMzP//////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+////jv///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///xP////W////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////w8PD/zg4OP8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8vLy//nJyc////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////9b///8T////AAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Af///0n////6////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////xsbG/z09Pf8zMzP/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MzMz/6Kiov/8/Pz/////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////6////Sf///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Av///5b////+////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////09PT/01NTf8zMzP/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MzMz/zw8PP+zs7P//v7+////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v///5b///8CAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////EP///9H/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////7+/v/2ZmZv8vLy//MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zMzM/9MTEz/1dXV////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////R////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////NP///+v/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ +/v7/6CgoP87Ozv/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zMzM/8zMzP/
+ fHx8//Ly8v//////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////6////zT///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Y/////r/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////v7+/9nZ2f9gYGD/MzMz/zMzM/8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/TU1N/7y8vP/8/Pz/////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////r///9j////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8E
+ ////jv////7/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////v7+/+ysrL/SEhI/zExMf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/ODg4/5WVlf/x8fH/
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////+////jv///wQAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8H////tv////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////29vb/
+ paWl/0tLS/8tLS3/MzMz/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zMzM/8wMDD/Ozs7/4eHh//s7Oz/////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////v///7b///8H////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8U////xf////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////9/f3/7e3t/9iYmL/MzMz/y8vL/8zMzP/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MzMz/zIyMv8wMDD/T09P/6Ghof/u7u7//v7+////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////7////F////FP///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8g////0v////7/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////v7+//c3Nz/mZmZ/1dXV/8zMzP/MDAw/zExMf8zMzP/MzMz/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zMzM/8yMjL/MDAw/y8vL/9KSkr/
+ iIiI/87Ozv/4+Pj/////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////0v///yD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8n////3P////7/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /f39/+fn5/+0tLT/iIiI/1lZWf87Ozv/Jycn/yUlJf8pKSn/MjIy/zMzM/80NDT/MzMz/zIyMv8uLi7/
+ JSUl/yYmJv81NTX/UVFR/3x8fP+oqKj/3d3d//v7+///////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////v///9z///8n////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8m
+ ////3f////7/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////v7+//z8/P/u7u7/
+ 29vb/8bGxv+vr6//nZ2d/5iYmP+ampr/qKio/8HBwf/W1tb/6enp//n5+f////////////7+/v//////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7////c
+ ////Jv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8n////0v////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+////0v///yf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8g////xf////7/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////v///8X///8g
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8V////tv////7/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////7///+2////Ff///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8H////jv////r/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////6////jv///wf///8A
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8F
+ ////Y////+z/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////7P///2P///8F////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////NP///9H////+////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////v///9H///80////AQAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////EP///5b////5////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////n///+W////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Av///0n////W
+ /////v//////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////7////W////Sf///wL///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///xP///+O////8f////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////7////x
+ ////jv///xP///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///wH///82////uP////v/////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////7////uP///zb///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8D////S////8v////9
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////9////y////0v///8D
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8B////CP///1X////G////+/////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////7////7////xv///1X///8I////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Af///wr///9K////uP////T////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////7////0////uP///0r///8K////Af///wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wH///8D////Mf///43////n
+ /////f////7/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////v////3////n
+ ////jf///zH///8D////Af///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wr///9R////pf///+j////+/////v//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////+/////v///+j///+l////Uf///wr///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///wH///8C////Ef///0z///+W////0v////T////+//////////7/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////+//////////7////0////0v///5b///9M////Ef///wL///8B
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wH///8K
+ ////KP///1z///+U////x////+n////2/////v////7////+////////////////////////////////
+ ///////////////////////////////////////////////+/////v////7////2////6f///8f///+U
+ ////XP///yj///8K////Af///wH///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Af///wH///8B////Ef///y////9Q
+ ////cf///4////+v////x////9z////s////9/////3///////////////3////3////7P///9z////H
+ ////r////4////9x////UP///y////8R////Af///wH///8B////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA
+ AAD///////////////AAAAAAD/////////////+AAAAAAAH////////////+AAAAAAAAf///////////
+ 8AAAAAAAAA///////////8AAAAAAAAAD//////////8AAAAAAAAAAP/////////+AAAAAAAAAAB/////
+ ////+AAAAAAAAAAAH/////////AAAAAAAAAAAA/////////AAAAAAAAAAAAD////////gAAAAAAAAAAA
+ Af///////wAAAAAAAAAAAAD///////wAAAAAAAAAAAAAP//////4AAAAAAAAAAAAAB//////8AAAAAAA
+ AAAAAAAP/////+AAAAAAAAAAAAAAB//////AAAAAAAAAAAAAAAP/////gAAAAAAAAAAAAAAB/////wAA
+ AAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAB////8AAAAAAAAAAAAAAAAP///+AAAAAAAAAAAAAAAAB//
+ //gAAAAAAAAAAAAAAAAf///wAAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAAf//8AAAAAAAAAAAAAA
+ AAAD///AAAAAAAAAAAAAAAAAA///gAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAA
+ AAAAAAAAAP/+AAAAAAAAAAAAAAAAAAB//AAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAD/4AAAA
+ AAAAAAAAAAAAAAAf+AAAAAAAAAAAAAAAAAAAH/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP
+ 8AAAAAAAAAAAAAAAAAAAD+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAHwAAAAAAAAAAAAAAA
+ AAAAA8AAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAA
+ AAAAAAAAAAGAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAAAAAAB
+ gAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAAAAAAA
+ AAAAA+AAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAH8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAA
+ AAAAAAAAAA/wAAAAAAAAAAAAAAAAAAAP+AAAAAAAAAAAAAAAAAAAH/gAAAAAAAAAAAAAAAAAAB/8AAAA
+ AAAAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAP/4AAAAAAAAAAAAAAAAAAH//AAAAAAAAAAAAAAAAAAD/
+ /wAAAAAAAAAAAAAAAAAA//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAA
+ AAAD///gAAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAf///4AAAAAAAA
+ AAAAAAAAH////AAAAAAAAAAAAAAAAD////4AAAAAAAAAAAAAAAB/////AAAAAAAAAAAAAAAA/////4AA
+ AAAAAAAAAAAAAf/////AAAAAAAAAAAAAAAP/////4AAAAAAAAAAAAAAH//////AAAAAAAAAAAAAAD///
+ ///4AAAAAAAAAAAAAB///////AAAAAAAAAAAAAA///////8AAAAAAAAAAAAA////////gAAAAAAAAAAA
+ Af///////8AAAAAAAAAAAAP////////wAAAAAAAAAAAP////////+AAAAAAAAAAAH/////////4AAAAA
+ AAAAAH//////////AAAAAAAAAAD//////////8AAAAAAAAAD///////////wAAAAAAAAD///////////
+ /gAAAAAAAH////////////+AAAAAAAH/////////////8AAAAAAP//////////////8AAAAA////////
+ KAAAAEAAAACAAAAAAQAgAAAAAAAAQAAA6hYAAOoWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////A////yH///9X////iP///6/////P////6P////j////+/////v////j////o
+ ////z////6////+I////V////yH///8D////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///wP///8+////kf///9n////8////////////////////////////////
+ ///////////////////////////////////////////////8////2f///5H///8+////A////wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Ff///3j////c/////v//////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////v///9z///94////Ff///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8U////if////D/////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////D///+J////FP///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wX///9u////7P//////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////+z///9u
+ ////BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///yr////G
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////8b///8q////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Af///2H////z////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////8////2H///8BAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////Bf///5L////+////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////kv///wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///63/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////+t////CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///7f/////////////////////
+ //////////////////////////////////////////////////////f4/v/J2vr/nbz3/3+n9P9om/P/
+ X5Ty/2KW8v90ofP/jbH1/7LK+P/k6/z//v7/////////////////////////////////////////////
+ /////////////////////////////////////////////////////////7f///8KAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Bf///63/////
+ ///////////////////////////////////////////////////////////7/P//vNH5/2mZ8v8tcu7/
+ Imvt/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/JGzt/0iD8P+TtPb/5+79////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////rf///wUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Af///5L///////////////////////////////////////////////////////////39//+yyfj/
+ RYDv/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/ydu7f95o/T/5e39////////////////////////////////////////////////////////////
+ //////////////////////////////+S////AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///2H////+////////////////////////////////////////////////
+ /////9/o/P9ZjfH/I2vt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/y9y7v+hvff//f7/////////////////////////////
+ /////////////////////////////////////////////////////v///2H///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yr////z////////////////////////////////
+ /////////////////////7bM+f8vcu7/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/I2vt/2WW8v/x9f7/
+ ///////////////////////////////////////////////////////////////////////////////z
+ ////KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wX////G////////////////
+ /////////////////////////////////////6K99/8kbO3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yBk3v8YS6b/DzFs/xM7gv8ia+z/
+ Imvt/yJr7f8ia+3/TIXw/+rw/f//////////////////////////////////////////////////////
+ /////////////////////////8b///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9u
+ //////////////////////////////////////////////////////////+7z/n/KG7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yBl4P8ZTq7/ETV1/w0qXv8QMWz/
+ F0qj/yBk3f8WRpv/ETRz/yJq6/8ia+3/Imvt/yJr7f9Ig/D/7vP9////////////////////////////
+ ////////////////////////////////////////////////////bv///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8U////7P//////////////////////////////////////////////////////////
+ /////7nO+f8obu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xE2d/8LIUr/
+ Fked/x9g1f8ia+z/Imvt/yJr7f8ia+3/Imvt/xhMqf8PL2j/IWnp/yJr7f8ia+3/Imvt/1qO8f/8/P//
+ /////////////////////////////////////////////////////////////////////////+z///8U
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////if//////////////////////////////////////////
+ ////////////////////////////////u8/5/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8hZ+T/Dy5n/xZElv8ia+z/Imvt/yJr7f8haOf/G1W9/x1ayP8ia+3/GlG0/w4rX/8haOb/
+ Imvt/yJr7f8ja+3/i6/1////////////////////////////////////////////////////////////
+ ////////////////////if///wAAAAAAAAAAAAAAAAAAAAAA////Ff////D/////////////////////
+ //////////////////////////////////////////////////////////+6zvn/KG7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7P8VQpP/Di1k/xQ+if8OK2D/Di1k/xQ/jP8NKl7/
+ GlK1/yJr7f8bVr7/DSla/yBm4v8ia+3/Imvt/ydu7f/T4fv/////////////////////////////////
+ //////////////////////////////////////////D///8VAAAAAAAAAAAAAAAA////AP///3j/////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////7rP+f8pbu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/xhKpf8OLWT/Ditf/xM8hf8cV8H/
+ Imrq/yJr7f8ia+3/IWnp/w8uZv8YTKn/Imvt/xxXwf8LIkz/IGTd/yJr7f8ia+3/Wo/x//7/////////
+ ////////////////////////////////////////////////////////////////////eP///wAAAAAA
+ AAAAAP///wP////c////////////////////////////////////////////////////////////////
+ ////////////////////////////////us75/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8aUrb/
+ DCZU/x5g1P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7P8iaur/EDNy/woeQ/8PLmf/EjqA/x5g1P8ia+3/
+ Imvt/yFr7f/K2vr/////////////////////////////////////////////////////////////////
+ /////////9z///8DAAAAAAAAAAD///8+/////v//////////////////////////////////////////
+ ////////////////////////////////////////////////+Pj4//////+6z/n/KW/t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/x9h1/8NKFn/GVCw/x9i2f8XSaH/EDFt/w0pW/8NKVr/IGXh/yJr7P8SOH3/
+ FUGR/yJr7f8ia+3/Imvt/yJr7f8ia+3/bJvz////////////////////////////////////////////
+ ///////////////////////////////+////PgAAAAD///8A////kf//////////////////////////
+ ////////////////////////////////////////////////////////////////7e3t/1NTU/+0tLT/
+ /////7rO+f8obu3/Imvt/yJr7f8ia+3/Imvt/yBl4P8YTKj/EDJu/wgZN/8NKVr/F0mi/xdIn/8fYtn/
+ FkSX/wwmVf8fY9v/Imvt/xQ+iP8TPIX/Imvt/yJr7f8ia+3/Imvt/ypw7f/w9P7/////////////////
+ /////////////////////////////////////////////////////////5H///8A////A////9n/////
+ ////////////////////////////////////////////////////////////////////////////////
+ +vr6/2BgYP8yMjL/NjY2/7S0tP//////us75/ylv7f8ia+3/Imvt/yJr7f8SOHz/CiBH/xhLpf8bU7n/
+ HFnF/xlPr/8fYtn/GU6t/xtVvf8YS6f/CyRQ/xM9h/8PMGr/CRs8/xxZxf8ia+3/Imvt/yJr7f8ia+3/
+ t835///////////////////////////////////////////////////////////////////////////Z
+ ////A////yH////8////////////////////////////////////////////////////////////////
+ /////////////////////5CQkP8yMjL/MjIy/zIyMv81NTX/tLS0//////+6zvn/KW7t/yJr7f8ia+3/
+ Imvt/xZGnP8MJlX/GEyo/xpRtP8cV8L/G1W9/xtUuv8aUbT/GlK1/xhNqf8KH0X/HFjE/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/4Cp9P//////////////////////////////////////////////////////
+ /////////////////////P///yH///9X////////////////////////////////////////////////
+ /////////////////////////////////////9XV1f81NTX/MjIy/zIyMv8yMjL/MjIy/zY2Nv+0tLT/
+ /////7rO+f8pbu3/Imvt/yJr7f8ia+3/HVrI/wogR/8UP4v/Hl7P/xpRsv8cWsb/GlG0/xpQsv8dXMv/
+ F0qj/w0nV/8cWMT/Imvt/yJr7f8ia+3/Imvt/yJr7f9YjvH/////////////////////////////////
+ //////////////////////////////////////////////9X////iP//////////////////////////
+ //////////////////////////////////////////////////////////9lZWX/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7S0tP//////us/5/yhu7f8ia+3/Imvt/yJr7f8gZuL/Ditg/xAybv8hZ+T/
+ GU6t/xxZxP8dW8r/GU6t/x5dz/8RNnj/BhIo/x1byv8ia+3/Imvt/yJr7f8ia+3/Onrv//7/////////
+ ////////////////////////////////////////////////////////////////////iP///6//////
+ ///////////////////////////////////////////////////////////////////////////Ozs7/
+ MTEx/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv82Njb/tLS0//////+6zvn/KW7t/yJr7f8ia+3/
+ Imvt/yJr7P8VQZD/DCZT/xM9h/8MJVP/DSpd/w4sYv8RNXX/FkWY/xxXwf8haej/Imvt/yJr7f8ia+3/
+ Imvt/ytw7f/+/v//////////////////////////////////////////////////////////////////
+ /////////6/////P////////////////////////////////////////////////////////////////
+ ////////////////dnZ2/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+zs7P/
+ /////7vP+f8obu3/Imvt/yJr7f8ia+3/Imvt/xxYxP8bVLn/IGXg/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8kbe3//P3/////////////////////////////////////////////
+ ///////////////////////////////P////6P//////////////////////////////////////////
+ ////////////////////////////////9PT0/zo6Ov8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7S0tP//////uc75/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/KnDt//7+////////////////////////
+ ////////////////////////////////////////////////////6P////j/////////////////////
+ /////////////////////////////////////////////////////7+/v/8xMTH/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/s7Oz//////+7z/n/KG7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/zp57v/+/v//
+ //////////////////////////////////////////////////////////////////////////j////+
+ //////////////////////////////////////////////////////////////////////////+Pj4//
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+1tbX/
+ /////7nO+f8obu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f9VjPH/////////////////////////////////////////////////////////////////
+ ///////////////+/////v//////////////////////////////////////////////////////////
+ ////////////////aWlp/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7Ozs///////u8/5/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/fKf0////////////////////////////////////////////
+ /////////////////////////////////////v////j/////////////////////////////////////
+ /////////////////////////////////////09PT/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/tbW1//////+5zvn/KG7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/7HJ+P//////////////////////
+ //////////////////////////////////////////////////////////j////o////////////////
+ //////////////////////////////////////////////////////7+/v9AQED/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+zs7P/
+ /////7vP+f8obu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yhu7f/t8v3/
+ ///////////////////////////////////////////////////////////////////////////////o
+ ////z//////////////////////////////////////////////////////////////////////+/v7/
+ PDw8/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7S0tP//////us75/yhu7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f9klvL/////////////////////////////////////////////////////////////////
+ ////////////////////z////6//////////////////////////////////////////////////////
+ /////////////////v7+/0FBQf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/s7Oz//////+6z/n/KW7t/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/wdT6////////////////////////////////////////////
+ /////////////////////////////////////////6////+I////////////////////////////////
+ //////////////////////////////////////////9QUFD/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/RkZG/3V1df+SkpL/mZmZ/4uLi/9oaGj/Ozs7/zIyMv8yMjL/MjIy/zU1Nf+0tLT/
+ /////7rO+f8pbu3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/UInw//7+////////////////////////
+ //////////////////////////////////////////////////////////////+I////V///////////
+ ////////////////////////////////////////////////////////////////bGxs/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv9WVlb/urq6/8bGxv+SkpL/c3Nz/2xsbP97e3v/oKCg/8/Pz/+lpaX/
+ RERE/zIyMv8yMjL/NjY2/7S0tP//////us75/ylv7f8ia+3/Imvt/yJr7f8ia+3/JWzt/8va+v//////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////V////yH////8////////////////////////////////////////////////////////////////
+ /////5KSkv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+EhIT/ycnJ/1paWv8yMjL/SUlJ/42Njf+enp7/
+ dHR0/zY2Nv80NDT/cHBw/9DQ0P9fX1//MjIy/zIyMv81NTX/tLS0//////+6zvn/KG7t/yJr7f8ia+3/
+ Imvt/3+n9P//////////////////////////////////////////////////////////////////////
+ /////////////////////P///yH///8D////2f//////////////////////////////////////////
+ ///////////////////////////ExMT/MTEx/zIyMv8yMjL/MjIy/zIyMv+Hh4f/tLS0/zg4OP8yMjL/
+ bGxs/8/Pz/98fHz/Z2dn/5ycnP/FxcX/PT09/zIyMv9FRUX/y8vL/1VVVf8yMjL/MjIy/zY2Nv+0tLT/
+ /////7rO+f8pb+3/Imvt/0+H8P/4+f7/////////////////////////////////////////////////
+ /////////////////////////////////////////9n///8D////AP///5H/////////////////////
+ ////////////////////////////////////////////////9vb2/zw8PP8yMjL/MjIy/zIyMv9WVlb/
+ ycnJ/zc3N/8yMjL/PT09/9LS0v8/Pz//MjIy/zIyMv8yMjL/fX19/6CgoP8yMjL/MjIy/05OTv/FxcX/
+ NDQ0/zIyMv8yMjL/NTU1/7S0tP//////us/5/0WA7//n7v3/////////////////////////////////
+ //////////////////////////////////////////////////////////////+R////AAAAAAD///8+
+ /////v////////////////////////////////////////////////////////////////////99fX3/
+ MjIy/zIyMv8yMjL/sbGx/2BgYP8yMjL/MjIy/2tra/+cnJz/MjIy/zIyMv8yMjL/MjIy/zc3N//Pz8//
+ MjIy/zIyMv8yMjL/q6ur/1hYWP8yMjL/MjIy/zIyMv81NTX/tLS0///////4+v7/////////////////
+ ///////////////////////////////////////////////////////////////////////////////+
+ ////PgAAAAAAAAAA////A////9z/////////////////////////////////////////////////////
+ ////////////////1dXV/zAwMP8yMjL/MjIy/7y8vP9OTk7/MjIy/zIyMv9ubm7/mJiY/zIyMv8yMjL/
+ MjIy/zIyMv82Njb/0NDQ/zIyMv8yMjL/MjIy/6ysrP9bW1v/MjIy/zIyMv8yMjL/MjIy/zU1Nf+0tLT/
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////3P///wMAAAAAAAAAAP///wD///94////////////////////////////////
+ //////////////////////////////////////////9sbGz/MjIy/zIyMv9xcXH/qKio/zIyMv8yMjL/
+ QkJC/9DQ0P84ODj/MjIy/zIyMv8yMjL/bm5u/6urq/8yMjL/MjIy/1VVVf/ExMT/MzMz/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7S0tP//////////////////////////////////////////////////////
+ /////////////////////////////////////////3j///8AAAAAAAAAAAAAAAAA////Ff////D/////
+ ////////////////////////////////////////////////////////////////3t7e/zc3N/8yMjL/
+ MzMz/7e3t/9+fn7/MjIy/zIyMv9+fn7/xMTE/2NjY/9OTk7/g4OD/8/Pz/9ERET/MjIy/0pKSv/Ozs7/
+ T09P/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/s7Oz////////////////////////////
+ //////////////////////////////////////////////////////////D///8VAAAAAAAAAAAAAAAA
+ AAAAAP///wD///+J////////////////////////////////////////////////////////////////
+ //////////+cnJz/MjIy/zIyMv87Ozv/u7u7/5+fn/88PDz/MjIy/1tbW/+mpqb/t7e3/42Njf89PT3/
+ MzMz/29vb//Pz8//V1dX/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf+1tbX/
+ //////////////////////////////////////////////////////////////////////////////+J
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAA////FP///+z/////////////////////////////////////
+ /////////////////////////////////f39/2xsbP8yMjL/MjIy/zQ0NP+EhIT/09PT/6enp/91dXX/
+ WFhY/1NTU/9kZGT/jo6O/8nJyf+np6f/QUFB/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/NTU1/7Ozs///////////////////////////////////////////////////////
+ ///////////////s////FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9u////////////////
+ ///////////////////////////////////////////////////////////y8vL/WVlZ/zIyMv8yMjL/
+ MjIy/zg4OP9lZWX/k5OT/62trf+xsbH/oaGh/3l5ef9CQkL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv81NTX/tbW1////////////////////////////
+ ////////////////////////////////////bv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////Bf///8b/////////////////////////////////////////////////////////////////////
+ //////Dw8P9bW1v/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/5qamv//////
+ ////////////////////////////////////////////////////xv///wUAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8q////8///////////////////////////////////////////
+ ////////////////////////////////9PT0/3V1df8xMTH/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ OTk5/7Gxsf//////////////////////////////////////////////////////////8////yoAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///2H////+////////////////
+ ///////////////////////////////////////////////////////////+/v7/rKys/z4+Pv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/XFxc/9ra2v//////////////////////////////////////////////////////
+ /////v///2H///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B
+ ////kv//////////////////////////////////////////////////////////////////////////
+ ///////////r6+v/hYWF/zc3N/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv9KSkr/rq6u//v7+///////////////////////////////////////
+ /////////////////////////5L///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wX///+t////////////////////////////////////////////////
+ ///////////////////////////////////////////r6+v/m5ub/1VVVf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8xMTH/ODg4/25ubv+6urr/+vr6////////////////////////////
+ /////////////////////////////////////////63///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Cv///7f/////////////////////
+ ///////////////////////////////////////////////////////////////////////////+/v7/
+ 5ubm/7e3t/+Tk5P/fHx8/2xsbP9mZmb/cnJy/4ODg/+fn5//yMjI//X19f//////////////////////
+ /////////////////////////////////////////////////////////7f///8KAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K
+ ////rf//////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////63///8K
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wX///+S/////v//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ /////v///5L///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////Af///2H////z////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////8////2H///8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Kv///8b/////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////xv///yr///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8F////bv///+z/////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////s////bv///wUAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8U////if////D/////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////D///+J////FP///wAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8V////eP///9z////+////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////////////+////3P///3j///8V
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8D////Pv///5H////Z/////P//////////
+ /////////////////////////////////////////////////////////////////////P///9n///+R
+ ////Pv///wP///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////A////yH///9X////iP///6/////P////6P////j////+/////v////j////o////z////6////+I
+ ////V////yH///8D////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///wAAD//////4AAAB///
+ //+AAAAB/////gAAAAB////8AAAAAD////AAAAAAD///4AAAAAAH///AAAAAAAP//4AAAAAAAf//AAAA
+ AAAA//4AAAAAAAB//AAAAAAAAD/4AAAAAAAAH/gAAAAAAAAf8AAAAAAAAA/gAAAAAAAAB+AAAAAAAAAH
+ wAAAAAAAAAPAAAAAAAAAA4AAAAAAAAABgAAAAAAAAAGAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAYAAAAAAAAABgAAAAAAAAAHAAAAAAAAAA8AAAAAAAAAD
+ 4AAAAAAAAAfgAAAAAAAAB/AAAAAAAAAP+AAAAAAAAB/4AAAAAAAAH/wAAAAAAAA//gAAAAAAAH//AAAA
+ AAAA//+AAAAAAAH//8AAAAAAA///4AAAAAAH///wAAAAAA////wAAAAAP////gAAAAB/////gAAAAf//
+ ///gAAAH//////wAAD///ygAAAAwAAAAYAAAAAEAIAAAAAAAACQAAOoWAADqFgAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Av///yD///9e////lP///77////e////9P////7////+////9P///97///++////lP///17///8g
+ ////Av///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///xj///90////y/////v/////////////////////////////////////////////////////
+ ///////////////7////y////3T///8Y////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8d////lv////P/////////////////////////////////////////////////////
+ ///////////////////////////////////////////////z////lv///x3///8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8A////Cv///33////0////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////T///99
+ ////Cv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///8u////zv//////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////////////////////zv///y7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///1b////y////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////L///9W////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////b/////v/////////////////////
+ //////////////////////////////////////z9///09/7/8PX+//f5/v/+/v//////////////////
+ ///////////////////////////////////////////////////////////////7////b////wEAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///9v/////P//////////
+ /////////////////////////////////f3//87e+/+LsPX/WI7x/zd47/8pcO7/J2/t/y1y7v9Bf+//
+ aZry/6TA9//o7/3/////////////////////////////////////////////////////////////////
+ /////P///2////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///1b////7
+ //////////////////////////////////////7+//+2zPn/TYbw/yNs7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8qcO3/cp/z/97o/P//////////////////////////////////////
+ //////////////////////////v///9W////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A
+ ////Lv////L/////////////////////////////////////4+v9/16R8f8ja+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/ylv7f+Vtvb/+vz/////////////
+ ///////////////////////////////////////////////y////Lv///wAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAD///8K////zv/////////////////////////////////////K2vr/N3ju/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yFo5v8bVb3/IWfk/yJr7f8ia+3/
+ ZJXy//L2/v//////////////////////////////////////////////////////////zv///woAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///99//////////////////////////////////////////+HrPX/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imrq/xxZxf8VQY//EzqB/xM9iP8YTar/
+ ETR0/yBl4f8ia+3/Imvt/1eN8f/2+P7/////////////////////////////////////////////////
+ /////////33///8AAAAAAAAAAAAAAAAAAAAAAP///x3////0////////////////////////////////
+ ///////////9/f//gKj0/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8haej/CyJM/xZHnf8gZd//
+ Imvt/yJr7f8ia+3/IGXf/xE0dP8fY9r/Imvt/yJr7f9tm/P//f3/////////////////////////////
+ //////////////////////////T///8dAAAAAAAAAAAAAAAA////AP///5b/////////////////////
+ /////////////////////////////////P3//4Co9P8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ H2Pc/xE2eP8cWMT/HFnE/xVCk/8SOH3/GU+u/yFn4/8RNXb/HmDU/yJr7f8ja+3/p8P4////////////
+ //////////////////////////////////////////////+W////AAAAAAAAAAAA////GP////P/////
+ //////////////////////////////////////////////////////39//9/p/T/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8iaer/FUOV/xI5f/8RNHP/GE2q/x9j2/8ia+z/Fkac/xhKpP8haOX/EDRy/x1czf8ia+3/
+ NXfu/+7z/v/////////////////////////////////////////////////////z////GAAAAAD///8A
+ ////dP/////////////////////////////////////////////////////////////////////9/f//
+ gKj0/yNr7f8ia+3/Imvt/yJr7f8iauz/FEGP/xdIn/8ia+z/Imvt/yFp6P8dW8n/IWjm/xhLpv8LI07/
+ FUGQ/x1czP8ia+3/Imvt/5O19v//////////////////////////////////////////////////////
+ ////dP///wD///8C////y///////////////////////////////////////////////////////////
+ //////39/f+0tLT/+Pn7/4Co9P8ia+3/Imvt/yJr7f8ia+3/Imrq/xZElv8OLGL/ETZ4/w8vaP8TPIb/
+ EDRy/yBm4v8ZT6//FUKS/yJr7P8ia+3/Imvt/z187//8/f//////////////////////////////////
+ ////////////////////y////wL///8g////+///////////////////////////////////////////
+ /////////////////////5qamv8yMjL/gICA//n6+/9+p/T/Imvt/yJr7f8haej/CyRP/xI4e/8ZTav/
+ HVrH/x5dzv8bVbz/GlCy/w8wa/8XR53/DShZ/xlPrv8ia+3/Imvt/yJr7f/R3/v/////////////////
+ ////////////////////////////////////+////yD///9e////////////////////////////////
+ ////////////////////////////////y8vL/zU1Nf8yMjL/MjIy/39/f//5+vz/gKj0/yNr7f8ia+3/
+ H2LZ/xAxbP8WRZj/G1W8/xxYw/8aUbP/G1a+/xhNqv8PL2f/H2DV/yJr7f8ia+3/Imvt/yJr7f+au/f/
+ /////////////////////////////////////////////////////////17///+U////////////////
+ ///////////////////////////////////////////5+fn/VVVV/zIyMv8yMjL/MjIy/zIyMv+AgID/
+ +fn7/4Co9P8ia+3/Imvt/yJp6v8UPon/Ejh9/xxXwP8bVLv/HVrI/xtWvv8aUrX/Dy5n/x5e0f8ia+3/
+ Imvt/yJr7f91ovT//////////////////////////////////////////////////////////5T///++
+ //////////////////////////////////////////////////////////+zs7P/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/gICA//r6/P9+p/T/Imvt/yJr7f8ia+3/GU2r/xAzcf8TO4P/ETR0/xE1dP8SOX//
+ FD2I/x1ayP8ia+3/Imvt/yJr7f9ilPL/////////////////////////////////////////////////
+ /////////77////e//////////////////////////////////////////////////////////9cXFz/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/35+fv/6+vz/f6f0/yNr7f8ia+3/Imvt/x9h1v8dXMz/
+ Imnq/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f9ZkPH/////////////////////////////////
+ /////////////////////////97////0////////////////////////////////////////////////
+ /////+Tk5P8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+AgID/+fn7/4Co9P8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f9klvL/////////////////
+ //////////////////////////////////////////T////+////////////////////////////////
+ /////////////////////7CwsP8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ gICA//r7/P9+pvT/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f97pvT/
+ //////////////////////////////////////////////////////////7////+////////////////
+ /////////////////////////////////////4uLi/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/35+fv/6+/z/gKj0/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f+jwff///////////////////////////////////////////////////////////7////0
+ /////////////////////////////////////////////////////3R0dP8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+AgID/+fn7/4Cn9P8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yNr7f/c5vz/////////////////////////////////////////////////
+ //////////T////e/////////////////////////////////////////////////////2xsbP8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/gICA//r6/P9+p/T/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/0qF8P/+/v//////////////////////////////////
+ /////////////////////////97///++////////////////////////////////////////////////
+ /////3Fxcf8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/MjIy/zIyMv8yMjL/
+ MjIy/35+fv/6+vz/gKj0/yNr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/6fD+P//////////////////////
+ /////////////////////////////////////////77///+U////////////////////////////////
+ /////////////////////4WFhf8yMjL/MjIy/zIyMv8yMjL/MjIy/zU1Nf9zc3P/p6en/6urq/+qqqr/
+ qqqq/5mZmf9PT0//MjIy/zIyMv+AgID/+fn7/4Co9P8ia+3/Imvt/yJr7f8ia+3/Q4Dv//f5/v//////
+ /////////////////////////////////////////////////////////5T///9e////////////////
+ /////////////////////////////////////6ioqP8yMjL/MjIy/zIyMv8yMjL/R0dH/7Kysv91dXX/
+ Pj4+/25ubv9/f3//SkpK/0lJSf+cnJz/ioqK/zMzM/8yMjL/gICA//n6/P9+p/T/Imvt/yJr7f8lbe3/
+ wdT6/////////////////////////////////////////////////////////////////////17///8g
+ ////+////////////////////////////////////////////////9ra2v8xMTH/MjIy/zIyMv9BQUH/
+ tLS0/0NDQ/85OTn/sLCw/3R0dP9eXl7/qKio/2dnZ/8yMjL/dXV1/4WFhf8yMjL/MjIy/39/f//5+vv/
+ gKj0/yNr7f+NsfX/////////////////////////////////////////////////////////////////
+ ////+////yD///8C////y/////////////////////////////////////////////////7+/v9PT0//
+ MjIy/zIyMv+cnJz/UVFR/zIyMv97e3v/aWlp/zIyMv8yMjL/NjY2/6+vr/8yMjL/MjIy/6Ojo/8+Pj7/
+ MjIy/zIyMv+AgID/+Pn7/7DJ+P/8/f//////////////////////////////////////////////////
+ ////////////////////y////wL///8A////dP//////////////////////////////////////////
+ //////////+goKD/MjIy/zIyMv+urq7/MzMz/zIyMv+RkZH/TU1N/zIyMv8yMjL/MjIy/6urq/8yMjL/
+ MjIy/4mJif9TU1P/MjIy/zIyMv8yMjL/gICA//z8/P//////////////////////////////////////
+ ////////////////////////////////////dP///wAAAAAA////GP////P/////////////////////
+ ///////////////////////////z8/P/RkZG/zIyMv+Dg4P/bGxs/zIyMv9dXV3/lJSU/zMzM/8yMjL/
+ Tk5O/6SkpP8yMjL/QkJC/62trf8zMzP/MjIy/zIyMv8yMjL/MjIy/39/f//7+/v/////////////////
+ ///////////////////////////////////////////////z////GAAAAAAAAAAA////AP///5b/////
+ ////////////////////////////////////////////////tLS0/zMzM/82Njb/p6en/2hoaP8zMzP/
+ fHx8/6ysrP+kpKT/pqam/0BAQP9LS0v/r6+v/0dHR/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv+AgID/
+ +/v7//////////////////////////////////////////////////////////+W////AAAAAAAAAAAA
+ AAAAAP///x3////0/////////////////////////////////////////////////v7+/3x8fP8yMjL/
+ NjY2/46Ojv+srKz/dXV1/1ZWVv9UVFT/ZmZm/5ycnP+hoaH/QUFB/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/gICA//v7+/////////////////////////////////////////////////T///8d
+ AAAAAAAAAAAAAAAAAAAAAP///wD///99////////////////////////////////////////////////
+ //////j4+P9nZ2f/MjIy/zIyMv87Ozv/a2tr/4uLi/+QkJD/eHh4/0VFRf8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/4WFhf//////////////////////////////////////
+ /////////33///8AAAAAAAAAAAAAAAAAAAAAAAAAAAD///8K////zv//////////////////////////
+ ///////////////////////////19fX/cnJy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/QUFB/8bGxv//////////////////////
+ ////////////////////zv///woAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Lv////L/////
+ ////////////////////////////////////////////////+/v7/6CgoP85OTn/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9iYmL/4ODg////////////
+ ///////////////////////////////y////Lv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///1b////7///////////////////////////////////////////////////////////j4+P/
+ fn5+/zk5Of8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv8zMzP/VVVV/7S0tP/9/f3/
+ //////////////////////////////////////////v///9W////AAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wD///9v/////P//////////////////////////////////////////
+ /////////////////////+vr6/+qqqr/dHR0/01NTf87Ozv/NTU1/zg4OP9CQkL/YGBg/46Ojv/Ozs7/
+ /Pz8/////////////////////////////////////////////////P///2////8AAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8B////b/////v/////////////////////
+ //////////////////////////////////////////////////////7+/v/4+Pj/8fHx//T09P/8/Pz/
+ ///////////////////////////////////////////////////////////////7////b////wEAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///1b////y
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////L///9W
+ ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8u////zv//////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////zv///y7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Cv///33////0////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ //////////T///99////Cv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8d////lv////P/////
+ ////////////////////////////////////////////////////////////////////////////////
+ ///////////////z////lv///x3///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ ////AP///xj///90////y/////v/////////////////////////////////////////////////////
+ ///////////////7////y////3T///8Y////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////Av///yD///9e////lP///77////e////9P////7////+
+ ////9P///97///++////lP///17///8g////Av///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gAAf/8AAP/4AAAf/wAA/+AAAAf/AAD/gAAA
+ Af8AAP8AAAAA/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAPAADgAAAAAAcAAOAAAAAABwAA
+ wAAAAAADAADAAAAAAAMAAIAAAAAAAQAAgAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAA
+ AAEAAIAAAAAAAQAAwAAAAAADAADAAAAAAAMAAOAAAAAABwAA4AAAAAAHAADwAAAAAA8AAPgAAAAAHwAA
+ /AAAAAA/AAD+AAAAAH8AAP8AAAAA/wAA/4AAAAH/AAD/4AAAB/8AAP/4AAAf/wAA//4AAH//AAAoAAAA
+ IAAAAEAAAAABACAAAAAAAAAQAADqFgAA6hYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///xD///9b////nf///83////t/////f////3////t////zf///53///9b
+ ////EP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAA////AP///yf///+f////9v//////////////////////////////////////////
+ ///////////////2////n////yf///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///wv///+O////+v//////////////////////////////////////////
+ ////////////////////////////////////+v///47///8LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8m////1P//////////////////////////////////////////
+ /////////////////////////////////////////////////////////9T///8mAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////M////+v////////////////////////////////v9P7/
+ x9j6/7HL+f+1zfn/z977//j6/v///////////////////////////////////////////////+v///8z
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yb////q//////////////////////7///+80fn/
+ WpDx/yVt7f8ia+3/Imvt/yJr7f8ia+3/LHHu/3Gf8//X4/z/////////////////////////////////
+ /////////+r///8mAAAAAAAAAAAAAAAAAAAAAAAAAAD///8L////1P/////////////////////t8v3/
+ YpXy/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8ia+3/Imvt/yVt7f+Kr/X/+/z/////////////
+ /////////////////////////9T///8LAAAAAAAAAAAAAAAA////AP///47/////////////////////
+ /////2ua8/8ia+3/Imvt/yJr7f8ia+3/Imvt/yJr7f8fYtr/GU2r/xhKpf8WRZr/Hl3O/yJr7f9omfL/
+ +/z//////////////////////////////////////47///8AAAAAAAAAAAD///8n////+v//////////
+ ////////////////7vP9/0uG8P8ia+3/Imvt/yJr7f8ia+3/HV3N/xE2ef8haOf/Imrr/x9h2P8ZTq3/
+ HFrH/yJr7f+BqfT/////////////////////////////////////+v///ycAAAAA////AP///5//////
+ ////////////////////////////////7vP9/0uG8P8ia+3/Imvt/yJr7f8fY9v/FUGQ/xRAjf8YS6f/
+ GVCw/xlOrP8ZULH/G1a+/yNs7f/L2/v/////////////////////////////////////n////wD///8Q
+ ////9v//////////////////////////////////////////7PH8/0uG8P8ia+3/Imvt/yBl3/8WRJb/
+ H2LZ/xtUuv8XSqP/HVvK/xAybv8dXMv/Imvt/16S8v/////////////////////////////////////2
+ ////EP///1v//////////////////////////////////////////9LS0v9cXFz/2+Dr/0uG8P8ia+3/
+ HV3O/xI6gf8TO4T/GlCy/xpSt/8UPor/FkWa/xZHnf8ia+3/JGzt/+nw/f//////////////////////
+ //////////////9b////nf/////////////////////////////////////19fX/SkpK/zIyMv9UVFT/
+ 2+Dr/0uG8P8ia+3/GEyp/xQ/i/8cV8D/G1S6/xpSt/8TOoH/IWbj/yJr7f8ia+3/ts35////////////
+ /////////////////////////53////N/////////////////////////////////////5mZmf8yMjL/
+ MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/HFrH/xRAjf8VQpP/FECO/xVDlf8YS6f/Imvt/yJr7f+Zuvb/
+ ////////////////////////////////////zf///+3////////////////////////////////8/Pz/
+ RUVF/zIyMv8yMjL/MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/IWbj/yBk3f8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/5K29v/////////////////////////////////////t/////f//////////////////////////
+ /////9PT0/8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/Imvt/yJr7f8ia+3/
+ Imvt/yJr7f8ia+3/o8H3//////////////////////////////////////3////9////////////////
+ ////////////////ra2t/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/2+Dr/0uF8P8ia+3/
+ Imvt/yJr7f8ia+3/Imvt/yJr7f/L3Pv//////////////////////////////////////f///+3/////
+ //////////////////////////+enp7/MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/MjIy/zIyMv9UVFT/
+ 2+Dr/0uF8P8ia+3/Imvt/yJr7f8ia+3/NHfu//r8///////////////////////////////////////t
+ ////zf///////////////////////////////6Ojo/8yMjL/MjIy/zIyMv8yMjL/Nzc3/1tbW/9iYmL/
+ QkJC/zIyMv9UVFT/2+Dr/0uG8P8ia+3/Imvt/yJr7f+MsfX/////////////////////////////////
+ /////////83///+d////////////////////////////////v7+//zIyMv8yMjL/MjIy/3V1df+Dg4P/
+ d3d3/35+fv92dnb/ioqK/z09Pf9UVFT/2+Dr/0uG8P8ia+3/Onrv//L2/v//////////////////////
+ ////////////////////nf///1v////////////////////////////////u7u7/NDQ0/zIyMv92dnb/
+ VVVV/2tra/9vb2//Wlpa/4iIiP83Nzf/jY2N/zIyMv9UVFT/2+Dr/1KK8f/L2/v/////////////////
+ //////////////////////////////9b////EP////b///////////////////////////////9tbW3/
+ MjIy/4eHh/8yMjL/g4OD/zIyMv8yMjL/g4OD/zIyMv9vb2//RkZG/zIyMv9UVFT/6uvs////////////
+ ////////////////////////////////////9v///xD///8A////n///////////////////////////
+ /////9LS0v8zMzP/gYGB/0VFRf9xcXH/ZGRk/01NTf+Li4v/ODg4/42Njf8yMjL/MjIy/zIyMv9UVFT/
+ 7Ozs//////////////////////////////////////////+f////AAAAAAD///8n////+v//////////
+ /////////////////////46Ojv80NDT/hISE/3p6ev90dHT/f39//3Jycv+Kior/Ozs7/zIyMv8yMjL/
+ MjIy/zIyMv9UVFT/7Ozs////////////////////////////////+v///ycAAAAAAAAAAP///wD///+O
+ /////////////////////////////////Pz8/3Z2dv8yMjL/QEBA/2lpaf9ubm7/SEhI/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv9ubm7///////////////////////////////+O////AAAAAAAAAAAA
+ AAAAAP///wv////U/////////////////////////////////Pz8/5SUlP81NTX/MjIy/zIyMv8yMjL/
+ MjIy/zIyMv8yMjL/MjIy/zIyMv8yMjL/aGho/+vr6///////////////////////////1P///wsAAAAA
+ AAAAAAAAAAAAAAAAAAAAAP///yb////q/////////////////////////////////////9vb2/98fHz/
+ Ozs7/zIyMv8yMjL/MjIy/zIyMv8zMzP/Y2Nj/7y8vP/+/v7//////////////////////////+r///8m
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///zP////r////////////////////////////////
+ ///////////5+fn/0tLS/7m5uf+2trb/yMjI/+/v7//////////////////////////////////////r
+ ////MwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///yb////U////////////////
+ ////////////////////////////////////////////////////////////////////////////////
+ ////1P///yYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wv///+O
+ ////+v//////////////////////////////////////////////////////////////////////////
+ ////+v///47///8LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAP///wD///8n////n/////b/////////////////////////////////////////////////////
+ ////9v///5////8n////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////EP///1v///+d////zf///+3////9/////f///+3////N
+ ////nf///1v///8Q////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAf/+AAB/
+ /AAAP/gAAB/wAAAP4AAAB8AAAAOAAAABgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAYAAAAHAAAAD4AAAB/AAAA/4AAAf/AAAP/4AAH//gAH/
+ KAAAABAAAAAgAAAAAQAgAAAAAAAABAAA6hYAAOoWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8y
+ ////mP///9r////6////+v///9r///+Y////Mv///wAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wr///+b
+ /////v////////////////////////////////////7///+b////CgAAAAAAAAAAAAAAAP///wr////C
+ ///////////F2Pr/f6n0/2qc8/+FrfX/0eD7/////////////////////8L///8KAAAAAP///wD///+b
+ //////////93o/T/Imvt/yJr7f8haej/HVvL/x9e0P+ErPX//v7/////////////////m////wD///8y
+ /////v//////////ydv7/yxy7v8ia+3/GU6s/xxXwf8aU7j/HVvJ/5u89/////////////////7///8y
+ ////mP////////////////T09P+brc3/LHLu/xlQsf8aULL/GU2r/xZGnP8yde7/+vv/////////////
+ ////mP///9r///////////////+CgoL/Ozs7/5Wmxv8qat3/GEyo/xhKpP8YTKj/Imvt/9Ph+///////
+ /////////9r////6///////////z8/P/Nzc3/zIyMv87Ozv/lafG/yxw6/8haen/Imvt/yJr7f/N3fv/
+ ///////////////6////+v//////////0tLS/zIyMv8yMjL/MjIy/zo6Ov+Vp8b/LHLu/yJr7f8mbu3/
+ 8fX+////////////////+v///9r//////////9jY2P8yMjL/Q0ND/2NjY/9mZmb/U1NT/5Wmxv8scu7/
+ d6P0/////////////////////9r///+Y///////////7+/v/QUFB/2FhYf9kZGT/ZmZm/1lZWf9AQED/
+ m6rH//L2/v////////////////////+Y////Mv////7//////////6SkpP9gYGD/cXFx/3Jycv9jY2P/
+ MjIy/zs7O//Ly8v////////////////+////Mv///wD///+b///////////+/v7/jo6O/0RERP9GRkb/
+ MjIy/zIyMv8yMjL/fX19////////////////m////wAAAAAA////Cv///8L////////////////V1dX/
+ jo6O/3V1df+Hh4f/x8fH////////////////wv///woAAAAAAAAAAAAAAAD///8K////m/////7/////
+ ///////////////////////////////+////m////woAAAAAAAAAAAAAAAAAAAAAAAAAAP///wD///8y
+ ////mP///9r////6////+v///9r///+Y////Mv///wAAAAAAAAAAAAAAAADgBwAAwAMAAIABAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAEAAMADAADgBwAA
+</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/UVtools.GUI/FrmMain.Designer.cs b/UVtools.GUI/FrmMain.Designer.cs
index f9513c9..f344d2d 100644
--- a/UVtools.GUI/FrmMain.Designer.cs
+++ b/UVtools.GUI/FrmMain.Designer.cs
@@ -42,6 +42,8 @@
this.menuFileExtract = new System.Windows.Forms.ToolStripMenuItem();
this.menuFileConvert = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+ this.menuFileSettings = new System.Windows.Forms.ToolStripMenuItem();
+ this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator();
this.menuFileExit = new System.Windows.Forms.ToolStripMenuItem();
this.menuEdit = new System.Windows.Forms.ToolStripMenuItem();
this.menuMutate = new System.Windows.Forms.ToolStripMenuItem();
@@ -54,6 +56,7 @@
this.menuHelpAbout = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
this.menuHelpInstallPrinters = new System.Windows.Forms.ToolStripMenuItem();
+ this.menuNewVersion = new System.Windows.Forms.ToolStripMenuItem();
this.statusBar = new System.Windows.Forms.StatusStrip();
this.mainTable = new System.Windows.Forms.TableLayoutPanel();
this.scCenter = new System.Windows.Forms.SplitContainer();
@@ -71,7 +74,11 @@
this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator();
this.tsLayerImageHighlightIssues = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
- this.tsLayerImageLayerOutline = new System.Windows.Forms.ToolStripButton();
+ this.tsLayerImageLayerOutline = new System.Windows.Forms.ToolStripSplitButton();
+ this.tsLayerImageLayerOutlinePrintVolumeBounds = new System.Windows.Forms.ToolStripMenuItem();
+ this.tsLayerImageLayerOutlineLayerBounds = new System.Windows.Forms.ToolStripMenuItem();
+ this.tsLayerImageLayerOutlineHollowAreas = new System.Windows.Forms.ToolStripMenuItem();
+ this.tsLayerImageLayerOutlineEdgeDetection = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
this.tsLayerImagePixelEdit = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
@@ -116,8 +123,10 @@
this.tsIssueCount = new System.Windows.Forms.ToolStripLabel();
this.tsIssueNext = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator();
- this.tsIsuesRefresh = new System.Windows.Forms.ToolStripButton();
this.tsIssueRemove = new System.Windows.Forms.ToolStripButton();
+ this.tsIsuesRefresh = new System.Windows.Forms.ToolStripSplitButton();
+ this.tsIsuesRefreshIslands = new System.Windows.Forms.ToolStripMenuItem();
+ this.tsIsuesRefreshResinTraps = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();
this.tsIssuesRepair = new System.Windows.Forms.ToolStripButton();
this.imageList16x16 = new System.Windows.Forms.ImageList(this.components);
@@ -169,7 +178,8 @@
this.menuMutate,
this.menuTools,
this.viewToolStripMenuItem,
- this.helpToolStripMenuItem});
+ this.helpToolStripMenuItem,
+ this.menuNewVersion});
this.menu.Location = new System.Drawing.Point(0, 0);
this.menu.Name = "menu";
this.menu.Size = new System.Drawing.Size(1784, 24);
@@ -189,6 +199,8 @@
this.menuFileExtract,
this.menuFileConvert,
this.toolStripSeparator2,
+ this.menuFileSettings,
+ this.toolStripSeparator15,
this.menuFileExit});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
@@ -281,6 +293,20 @@
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(258, 6);
//
+ // menuFileSettings
+ //
+ this.menuFileSettings.Image = global::UVtools.GUI.Properties.Resources.settings_16x16;
+ this.menuFileSettings.Name = "menuFileSettings";
+ this.menuFileSettings.ShortcutKeys = System.Windows.Forms.Keys.F12;
+ this.menuFileSettings.Size = new System.Drawing.Size(261, 22);
+ this.menuFileSettings.Text = "&Settings";
+ this.menuFileSettings.Click += new System.EventHandler(this.EventClick);
+ //
+ // toolStripSeparator15
+ //
+ this.toolStripSeparator15.Name = "toolStripSeparator15";
+ this.toolStripSeparator15.Size = new System.Drawing.Size(258, 6);
+ //
// menuFileExit
//
this.menuFileExit.Image = global::UVtools.GUI.Properties.Resources.Exit_16x16;
@@ -384,6 +410,15 @@
this.menuHelpInstallPrinters.Text = "Install profiles into PrusaSlicer";
this.menuHelpInstallPrinters.Click += new System.EventHandler(this.EventClick);
//
+ // menuNewVersion
+ //
+ this.menuNewVersion.BackColor = System.Drawing.Color.Lime;
+ this.menuNewVersion.Name = "menuNewVersion";
+ this.menuNewVersion.Size = new System.Drawing.Size(147, 20);
+ this.menuNewVersion.Text = "New version is available!";
+ this.menuNewVersion.Visible = false;
+ this.menuNewVersion.Click += new System.EventHandler(this.EventClick);
+ //
// statusBar
//
this.statusBar.Location = new System.Drawing.Point(0, 789);
@@ -433,6 +468,7 @@
//
// pbLayer
//
+ this.pbLayer.AllowDoubleClick = true;
this.pbLayer.Dock = System.Windows.Forms.DockStyle.Fill;
this.pbLayer.GridScale = Cyotek.Windows.Forms.ImageBoxGridScale.Large;
this.pbLayer.Location = new System.Drawing.Point(0, 25);
@@ -442,6 +478,7 @@
this.pbLayer.Size = new System.Drawing.Size(1228, 705);
this.pbLayer.TabIndex = 7;
this.pbLayer.Zoomed += new System.EventHandler<Cyotek.Windows.Forms.ImageBoxZoomEventArgs>(this.pbLayer_Zoomed);
+ this.pbLayer.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.EventMouseDoubleClick);
this.pbLayer.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pbLayer_MouseMove);
this.pbLayer.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pbLayer_MouseUp);
//
@@ -581,14 +618,49 @@
//
// tsLayerImageLayerOutline
//
- this.tsLayerImageLayerOutline.CheckOnClick = true;
+ this.tsLayerImageLayerOutline.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.tsLayerImageLayerOutlinePrintVolumeBounds,
+ this.tsLayerImageLayerOutlineLayerBounds,
+ this.tsLayerImageLayerOutlineHollowAreas,
+ this.tsLayerImageLayerOutlineEdgeDetection});
this.tsLayerImageLayerOutline.Image = global::UVtools.GUI.Properties.Resources.Geometry_16x16;
this.tsLayerImageLayerOutline.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsLayerImageLayerOutline.Name = "tsLayerImageLayerOutline";
- this.tsLayerImageLayerOutline.Size = new System.Drawing.Size(66, 22);
+ this.tsLayerImageLayerOutline.Size = new System.Drawing.Size(78, 22);
this.tsLayerImageLayerOutline.Text = "Outline";
- this.tsLayerImageLayerOutline.ToolTipText = "Show layer outlines only";
- this.tsLayerImageLayerOutline.Click += new System.EventHandler(this.EventClick);
+ this.tsLayerImageLayerOutline.ButtonClick += new System.EventHandler(this.EventClick);
+ //
+ // tsLayerImageLayerOutlinePrintVolumeBounds
+ //
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.CheckOnClick = true;
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.Name = "tsLayerImageLayerOutlinePrintVolumeBounds";
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.Size = new System.Drawing.Size(185, 22);
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.Text = "Print Volume Bounds";
+ this.tsLayerImageLayerOutlinePrintVolumeBounds.Click += new System.EventHandler(this.EventClick);
+ //
+ // tsLayerImageLayerOutlineLayerBounds
+ //
+ this.tsLayerImageLayerOutlineLayerBounds.CheckOnClick = true;
+ this.tsLayerImageLayerOutlineLayerBounds.Name = "tsLayerImageLayerOutlineLayerBounds";
+ this.tsLayerImageLayerOutlineLayerBounds.Size = new System.Drawing.Size(185, 22);
+ this.tsLayerImageLayerOutlineLayerBounds.Text = "Layer Bounds";
+ this.tsLayerImageLayerOutlineLayerBounds.Click += new System.EventHandler(this.EventClick);
+ //
+ // tsLayerImageLayerOutlineHollowAreas
+ //
+ this.tsLayerImageLayerOutlineHollowAreas.CheckOnClick = true;
+ this.tsLayerImageLayerOutlineHollowAreas.Name = "tsLayerImageLayerOutlineHollowAreas";
+ this.tsLayerImageLayerOutlineHollowAreas.Size = new System.Drawing.Size(185, 22);
+ this.tsLayerImageLayerOutlineHollowAreas.Text = "Hollow Areas";
+ this.tsLayerImageLayerOutlineHollowAreas.Click += new System.EventHandler(this.EventClick);
+ //
+ // tsLayerImageLayerOutlineEdgeDetection
+ //
+ this.tsLayerImageLayerOutlineEdgeDetection.CheckOnClick = true;
+ this.tsLayerImageLayerOutlineEdgeDetection.Name = "tsLayerImageLayerOutlineEdgeDetection";
+ this.tsLayerImageLayerOutlineEdgeDetection.Size = new System.Drawing.Size(185, 22);
+ this.tsLayerImageLayerOutlineEdgeDetection.Text = "&Edge Detection";
+ this.tsLayerImageLayerOutlineEdgeDetection.Click += new System.EventHandler(this.EventClick);
//
// toolStripSeparator9
//
@@ -975,8 +1047,8 @@
this.tsIssueCount,
this.tsIssueNext,
this.toolStripSeparator13,
- this.tsIsuesRefresh,
this.tsIssueRemove,
+ this.tsIsuesRefresh,
this.toolStripSeparator12,
this.tsIssuesRepair});
this.tsIssues.Location = new System.Drawing.Point(3, 3);
@@ -1021,18 +1093,6 @@
this.toolStripSeparator13.Name = "toolStripSeparator13";
this.toolStripSeparator13.Size = new System.Drawing.Size(6, 25);
//
- // tsIsuesRefresh
- //
- this.tsIsuesRefresh.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
- this.tsIsuesRefresh.Enabled = false;
- this.tsIsuesRefresh.Image = global::UVtools.GUI.Properties.Resources.refresh_16x16;
- this.tsIsuesRefresh.ImageTransparentColor = System.Drawing.Color.Magenta;
- this.tsIsuesRefresh.Name = "tsIsuesRefresh";
- this.tsIsuesRefresh.Size = new System.Drawing.Size(61, 22);
- this.tsIsuesRefresh.Text = "Detect";
- this.tsIsuesRefresh.ToolTipText = "Compute Issues";
- this.tsIsuesRefresh.Click += new System.EventHandler(this.EventClick);
- //
// tsIssueRemove
//
this.tsIssueRemove.Enabled = false;
@@ -1046,6 +1106,38 @@
"tion, need reslice.";
this.tsIssueRemove.Click += new System.EventHandler(this.EventClick);
//
+ // tsIsuesRefresh
+ //
+ this.tsIsuesRefresh.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
+ this.tsIsuesRefresh.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.tsIsuesRefreshIslands,
+ this.tsIsuesRefreshResinTraps});
+ this.tsIsuesRefresh.Image = global::UVtools.GUI.Properties.Resources.refresh_16x16;
+ this.tsIsuesRefresh.ImageTransparentColor = System.Drawing.Color.Magenta;
+ this.tsIsuesRefresh.Name = "tsIsuesRefresh";
+ this.tsIsuesRefresh.Size = new System.Drawing.Size(73, 22);
+ this.tsIsuesRefresh.Text = "&Detect";
+ this.tsIsuesRefresh.ToolTipText = "Compute Issues";
+ this.tsIsuesRefresh.ButtonClick += new System.EventHandler(this.EventClick);
+ //
+ // tsIsuesRefreshIslands
+ //
+ this.tsIsuesRefreshIslands.Checked = true;
+ this.tsIsuesRefreshIslands.CheckOnClick = true;
+ this.tsIsuesRefreshIslands.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.tsIsuesRefreshIslands.Name = "tsIsuesRefreshIslands";
+ this.tsIsuesRefreshIslands.Size = new System.Drawing.Size(211, 22);
+ this.tsIsuesRefreshIslands.Text = "Islands && Touching Bonds";
+ //
+ // tsIsuesRefreshResinTraps
+ //
+ this.tsIsuesRefreshResinTraps.Checked = true;
+ this.tsIsuesRefreshResinTraps.CheckOnClick = true;
+ this.tsIsuesRefreshResinTraps.CheckState = System.Windows.Forms.CheckState.Checked;
+ this.tsIsuesRefreshResinTraps.Name = "tsIsuesRefreshResinTraps";
+ this.tsIsuesRefreshResinTraps.Size = new System.Drawing.Size(211, 22);
+ this.tsIsuesRefreshResinTraps.Text = "Resin traps";
+ //
// toolStripSeparator12
//
this.toolStripSeparator12.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
@@ -1364,7 +1456,6 @@
private System.Windows.Forms.ToolStripLabel tsLayerImageZoom;
private System.Windows.Forms.ToolStripButton tsLayerImagePixelEdit;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
- private System.Windows.Forms.ToolStripButton tsLayerImageLayerOutline;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator9;
private System.Windows.Forms.ToolStripMenuItem menuMutate;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator10;
@@ -1378,7 +1469,6 @@
private System.Windows.Forms.ColumnHeader lvIssuesCount;
private System.Windows.Forms.ColumnHeader lvIssuesXY;
private System.Windows.Forms.ColumnHeader lvIssuesPixels;
- private System.Windows.Forms.ToolStripButton tsIsuesRefresh;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;
private System.Windows.Forms.ToolStripLabel tsLayerImageMouseLocation;
private System.Windows.Forms.ColumnHeader lvIssuesLayerHeader;
@@ -1408,6 +1498,17 @@
private System.Windows.Forms.ToolStripSplitButton tsLayerImageExport;
private System.Windows.Forms.ToolStripMenuItem tsLayerImageExportFile;
private System.Windows.Forms.ToolStripMenuItem tsLayerImageExportClipboard;
+ private System.Windows.Forms.ToolStripMenuItem menuNewVersion;
+ private System.Windows.Forms.ToolStripMenuItem menuFileSettings;
+ private System.Windows.Forms.ToolStripSeparator toolStripSeparator15;
+ private System.Windows.Forms.ToolStripSplitButton tsIsuesRefresh;
+ private System.Windows.Forms.ToolStripMenuItem tsIsuesRefreshIslands;
+ private System.Windows.Forms.ToolStripMenuItem tsIsuesRefreshResinTraps;
+ private System.Windows.Forms.ToolStripSplitButton tsLayerImageLayerOutline;
+ private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlineEdgeDetection;
+ private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlinePrintVolumeBounds;
+ private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlineLayerBounds;
+ private System.Windows.Forms.ToolStripMenuItem tsLayerImageLayerOutlineHollowAreas;
}
}
diff --git a/UVtools.GUI/FrmMain.cs b/UVtools.GUI/FrmMain.cs
index 6d74a8b..0633508 100644
--- a/UVtools.GUI/FrmMain.cs
+++ b/UVtools.GUI/FrmMain.cs
@@ -11,7 +11,7 @@ using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
-using System.Linq;
+using System.Net;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
@@ -23,6 +23,7 @@ using Emgu.CV.Util;
using UVtools.Core;
using UVtools.Core.Extensions;
using UVtools.GUI.Forms;
+using UVtools.GUI.Properties;
namespace UVtools.GUI
{
@@ -33,37 +34,43 @@ namespace UVtools.GUI
#region Properties
- public static readonly Dictionary<Mutation.Mutates, Mutation> Mutations =
- new Dictionary<Mutation.Mutates, Mutation>
+ public static readonly Dictionary<LayerManager.Mutate, Mutation> Mutations =
+ new Dictionary<LayerManager.Mutate, Mutation>
{
- {Mutation.Mutates.Resize, new Mutation(Mutation.Mutates.Resize,
+ {LayerManager.Mutate.Resize, new Mutation(LayerManager.Mutate.Resize,
"Resizes layer images in a X and/or Y factor, starting from 100% value\n" +
"NOTE 1: Build volume bounds are not validated after operation, please ensure scaling stays inside your limits.\n" +
"NOTE 2: X and Y are applied to original image, not to the rotated preview (If enabled)."
)},
- {Mutation.Mutates.Solidify, new Mutation(Mutation.Mutates.Solidify,
+ {LayerManager.Mutate.Flip, new Mutation(LayerManager.Mutate.Flip,
+ "Flips layer images vertically and/or horizontally"
+ )},
+ {LayerManager.Mutate.Rotate, new Mutation(LayerManager.Mutate.Rotate,
+ "Rotate layer images in a certain degrees"
+ )},
+ {LayerManager.Mutate.Solidify, new Mutation(LayerManager.Mutate.Solidify,
"Solidifies the selected layers, closes all inner holes.\n" +
"Warning: All surrounded holes are filled, no exceptions! Make sure you don't require any of holes in layer path.",
Properties.Resources.mutation_solidify
)},
- {Mutation.Mutates.Erode, new Mutation(Mutation.Mutates.Erode,
+ {LayerManager.Mutate.Erode, new Mutation(LayerManager.Mutate.Erode,
"The basic idea of erosion is just like soil erosion only, it erodes away the boundaries of foreground object (Always try to keep foreground in white). " +
"So what happends is that, all the pixels near boundary will be discarded depending upon the size of kernel. So the thickness or size of the foreground object decreases or simply white region decreases in the image. It is useful for removing small white noises, detach two connected objects, etc.",
Properties.Resources.mutation_erosion
)},
- {Mutation.Mutates.Dilate, new Mutation(Mutation.Mutates.Dilate,
+ {LayerManager.Mutate.Dilate, new Mutation(LayerManager.Mutate.Dilate,
"It is just opposite of erosion. Here, a pixel element is '1' if atleast one pixel under the kernel is '1'. So it increases the white region in the image or size of foreground object increases. Normally, in cases like noise removal, erosion is followed by dilation. Because, erosion removes white noises, but it also shrinks our object. So we dilate it. Since noise is gone, they won't come back, but our object area increases. It is also useful in joining broken parts of an object.",
Properties.Resources.mutation_dilation
)},
- {Mutation.Mutates.Opening, new Mutation(Mutation.Mutates.Opening,
+ {LayerManager.Mutate.Opening, new Mutation(LayerManager.Mutate.Opening,
"Opening is just another name of erosion followed by dilation. It is useful in removing noise.",
Properties.Resources.mutation_opening
)},
- {Mutation.Mutates.Closing, new Mutation(Mutation.Mutates.Closing,
+ {LayerManager.Mutate.Closing, new Mutation(LayerManager.Mutate.Closing,
"Closing is reverse of Opening, Dilation followed by Erosion. It is useful in closing small holes inside the foreground objects, or small black points on the object.",
Properties.Resources.mutation_closing
)},
- {Mutation.Mutates.Gradient, new Mutation(Mutation.Mutates.Gradient,
+ {LayerManager.Mutate.Gradient, new Mutation(LayerManager.Mutate.Gradient,
"It's the difference between dilation and erosion of an image.",
Properties.Resources.mutation_gradient
)},
@@ -79,16 +86,16 @@ namespace UVtools.GUI
"The Hit-or-Miss transformation is useful to find patterns in binary images. In particular, it finds those pixels whose neighbourhood matches the shape of a first structuring element B1 while not matching the shape of a second structuring element B2 at the same time.",
null
)},*/
- {Mutation.Mutates.PyrDownUp, new Mutation(Mutation.Mutates.PyrDownUp,
+ {LayerManager.Mutate.PyrDownUp, new Mutation(LayerManager.Mutate.PyrDownUp,
"Performs downsampling step of Gaussian pyramid decomposition.\n" +
"First it convolves image with the specified filter and then downsamples the image by rejecting even rows and columns.\n" +
"After performs up-sampling step of Gaussian pyramid decomposition\n"
)},
- {Mutation.Mutates.SmoothMedian, new Mutation(Mutation.Mutates.SmoothMedian,
+ {LayerManager.Mutate.SmoothMedian, new Mutation(LayerManager.Mutate.SmoothMedian,
"Each pixel becomes the median of its surrounding pixels. Also a good way to remove noise.\n" +
"Note: Iterations must be a odd number."
)},
- {Mutation.Mutates.SmoothGaussian, new Mutation(Mutation.Mutates.SmoothGaussian,
+ {LayerManager.Mutate.SmoothGaussian, new Mutation(LayerManager.Mutate.SmoothGaussian,
"Each pixel is a sum of fractions of each pixel in its neighborhood\n" +
"Very fast, but does not preserve sharp edges well.\n" +
"Note: Iterations must be a odd number."
@@ -108,7 +115,7 @@ namespace UVtools.GUI
public Mat ActualLayerImage { get; private set; }
- public Mat ActualLayerImageBgr { get; private set; }
+ public Mat ActualLayerImageBgr { get; private set; } = new Mat();
public Dictionary<uint, List<LayerIssue>> Issues { get; set; }
@@ -125,10 +132,24 @@ namespace UVtools.GUI
FrmLoading = new FrmLoading();
Program.SetAllControlsFontSize(Controls, 11);
Program.SetAllControlsFontSize(FrmLoading.Controls, 11);
-
+
+ if (Settings.Default.UpdateSettings)
+ {
+ Settings.Default.Upgrade();
+ Settings.Default.UpdateSettings = false;
+ Settings.Default.Save();
+ }
+
Clear();
- if (Width >= Screen.FromControl(this).WorkingArea.Width ||
+ tsLayerImageLayerDifference.Checked = Settings.Default.LayerDifferenceDefault;
+ tsIsuesRefreshIslands.Checked = Settings.Default.ComputeIslands;
+ tsIsuesRefreshResinTraps.Checked = Settings.Default.ComputeResinTraps;
+ tsLayerImageLayerOutlinePrintVolumeBounds.Checked = Settings.Default.OutlinePrintVolumeBounds;
+ tsLayerImageLayerOutlineLayerBounds.Checked = Settings.Default.OutlineLayerBounds;
+ tsLayerImageLayerOutlineHollowAreas.Checked = Settings.Default.OutlineHollowAreas;
+
+ if (Settings.Default.StartMaximized || Width >= Screen.FromControl(this).WorkingArea.Width ||
Height >= Screen.FromControl(this).WorkingArea.Height)
{
WindowState = FormWindowState.Maximized;
@@ -138,7 +159,7 @@ namespace UVtools.GUI
DragEnter += (s, e) => { if (e.Data.GetDataPresent(DataFormats.FileDrop)) e.Effect = DragDropEffects.Copy; };
DragDrop += (s, e) => { ProcessFile((string[])e.Data.GetData(DataFormats.FileDrop)); };
- foreach (Mutation.Mutates mutate in (Mutation.Mutates[])Enum.GetValues(typeof(Mutation.Mutates)))
+ foreach (LayerManager.Mutate mutate in (LayerManager.Mutate[])Enum.GetValues(typeof(LayerManager.Mutate)))
{
if(!Mutations.ContainsKey(mutate)) continue;
var item = new ToolStripMenuItem(mutate.ToString())
@@ -155,6 +176,41 @@ namespace UVtools.GUI
var group = new ListViewGroup(issueType.ToString(), $"{issueType}s"){HeaderAlignment = HorizontalAlignment.Center};
lvIssues.Groups.Add(group);
}
+
+ if (Settings.Default.CheckForUpdatesOnStartup)
+ {
+ Task.Factory.StartNew(AppLoadTask);
+ }
+ }
+
+ private void AppLoadTask()
+ {
+ try
+ {
+ using (WebClient client = new WebClient())
+ {
+ string htmlCode = client.DownloadString($"{About.Website}/releases");
+ const string searchFor = "/releases/tag/";
+ var startIndex = htmlCode.IndexOf(searchFor, StringComparison.InvariantCultureIgnoreCase) + searchFor.Length;
+ var endIndex = htmlCode.IndexOf("\"", startIndex, StringComparison.InvariantCultureIgnoreCase);
+ var version = htmlCode.Substring(startIndex, endIndex- startIndex);
+ if (string.Compare(version, $"v{FrmAbout.AssemblyVersion}", StringComparison.OrdinalIgnoreCase) > 0)
+ {
+ Invoke((MethodInvoker)delegate
+ {
+ // Running on the UI thread
+ menuNewVersion.Text = $"New version {version} is available!";
+ menuNewVersion.Tag = $"{About.Website}/releases/tag/{version}";
+ menuNewVersion.Visible = true;
+ });
+ }
+ //Debug.WriteLine(version);
+ }
+ }
+ catch (Exception e)
+ {
+ Debug.WriteLine(e.Message);
+ }
}
#endregion
@@ -233,7 +289,7 @@ namespace UVtools.GUI
if (e.KeyCode == Keys.NumPad0 || e.KeyCode == Keys.D0)
{
- pbLayer.ZoomToFit();
+ ZoomToFit();
e.Handled = true;
return;
}
@@ -265,7 +321,11 @@ namespace UVtools.GUI
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
- pbLayer.ZoomToFit();
+ if (Settings.Default.LayerZoomToFit)
+ {
+ ZoomToFit();
+ }
+
lbLayerActual.Location = new Point(lbLayerActual.Location.X,
Math.Max(1,
Math.Min(tbLayer.Height - 40,
@@ -273,6 +333,7 @@ namespace UVtools.GUI
));
}
+
#endregion
#region Events
@@ -345,8 +406,10 @@ namespace UVtools.GUI
SlicerFile.Save();
result = true;
}
- catch (Exception)
+ catch (Exception ex)
{
+ MessageBox.Show(ex.Message, "Error while saving the file", MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
}
finally
{
@@ -389,8 +452,10 @@ namespace UVtools.GUI
SlicerFile.SaveAs(dialog.FileName);
result = true;
}
- catch (Exception)
+ catch (Exception ex)
{
+ MessageBox.Show(ex.Message, "Error while saving the file", MessageBoxButtons.OK,
+ MessageBoxIcon.Error);
}
finally
{
@@ -433,6 +498,15 @@ namespace UVtools.GUI
return;
}
+ if (ReferenceEquals(sender, menuFileSettings))
+ {
+ using (FrmSettings frmSettings = new FrmSettings())
+ {
+ if (frmSettings.ShowDialog() != DialogResult.OK) return;
+ }
+ return;
+ }
+
if (ReferenceEquals(sender, menuFileExit))
{
if (menuFileSave.Enabled)
@@ -483,7 +557,7 @@ namespace UVtools.GUI
"Extraction completed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
- Process.Start(finalPath);
+ using (Process.Start(finalPath)){}
}
}
catch (Exception exception)
@@ -529,9 +603,9 @@ namespace UVtools.GUI
}
- if (item.Tag.GetType() == typeof(Mutation.Mutates))
+ if (item.Tag.GetType() == typeof(LayerManager.Mutate))
{
- Mutation.Mutates mutate = (Mutation.Mutates) item.Tag;
+ LayerManager.Mutate mutate = (LayerManager.Mutate) item.Tag;
MutateLayers(mutate);
return;
}
@@ -562,7 +636,7 @@ namespace UVtools.GUI
if (repairResinTraps && ReferenceEquals(Issues, null))
{
- ComputeIssues();
+ ComputeIssues(new IslandDetectionConfiguration {Enabled = false}); // Ignore islands as we dont require it
}
DisableGUI();
@@ -573,49 +647,7 @@ namespace UVtools.GUI
bool result = false;
try
{
-
- Parallel.For(layerStart, layerEnd + 1, layerIndex =>
- {
- Layer layer = SlicerFile[layerIndex];
- using (var image = layer.LayerMat)
- {
- if (repairResinTraps)
- {
- if (Issues.TryGetValue((uint) layerIndex, out var issues))
- {
- foreach (var issue in issues.Where(issue => issue.Type == LayerIssue.IssueType.ResinTrap))
- {
- CvInvoke.DrawContours(image,
- new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)),
- -1,
- new MCvScalar(255),
- -1);
- /*CvInvoke.DrawContours(image,
- new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)),
- -1,
- new MCvScalar(255),
- 2);*/
- }
- }
- }
-
- if (repairIslands)
- {
- Mat kernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(3, 3), new Point(1, 1));
- if (closingIterations > 0)
- {
- CvInvoke.MorphologyEx(image, image, MorphOp.Close, kernel, new Point(-1, -1), (int) closingIterations, BorderType.Default, new MCvScalar());
- }
-
- if (openingIterations > 0)
- {
- CvInvoke.MorphologyEx(image, image, MorphOp.Open, kernel, new Point(-1, -1), (int)closingIterations, BorderType.Default, new MCvScalar());
- }
- }
-
- layer.LayerMat = image;
- }
- });
+ SlicerFile.LayerManager.RepairLayers(layerStart, layerEnd, closingIterations, openingIterations, repairIslands, repairResinTraps, Issues);
result = true;
}
catch (Exception ex)
@@ -638,7 +670,7 @@ namespace UVtools.GUI
ShowLayer();
- ComputeIssues();
+ ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration());
menuFileSave.Enabled =
menuFileSaveAs.Enabled = true;
@@ -654,7 +686,7 @@ namespace UVtools.GUI
if (ReferenceEquals(sender, menuHelpWebsite))
{
- Process.Start(About.Website);
+ using (Process.Start(About.Website)){}
return;
}
@@ -665,7 +697,7 @@ namespace UVtools.GUI
"If you're happy to contribute for a better program and for my work i will appreciate the tip.\n" +
"A browser window will be open and forward to my paypal address after you click 'OK'.\nHappy Printing!",
"Donation", MessageBoxButtons.OK, MessageBoxIcon.Information);
- Process.Start(About.Donate);
+ using (Process.Start(About.Donate)){}
return;
}
@@ -684,7 +716,9 @@ namespace UVtools.GUI
switch (result)
{
case DialogResult.OK:
- Process.Start("https://www.prusa3d.com/prusaslicer/");
+ using (Process.Start("https://www.prusa3d.com/prusaslicer/"))
+ { }
+
return;
default:
return;
@@ -700,6 +734,12 @@ namespace UVtools.GUI
}
}
+ if (ReferenceEquals(sender, menuNewVersion))
+ {
+ using (Process.Start(menuNewVersion.Tag.ToString())) { }
+ return;
+ }
+
/************************
* Thumbnail Menu *
***********************/
@@ -818,7 +858,7 @@ namespace UVtools.GUI
"Properties save completed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
- Process.Start(dialog.FileName);
+ using (Process.Start(dialog.FileName)){}
}
}
@@ -850,7 +890,7 @@ namespace UVtools.GUI
"GCode save completed", MessageBoxButtons.YesNo, MessageBoxIcon.Question) ==
DialogResult.Yes)
{
- Process.Start(dialog.FileName);
+ using (Process.Start(dialog.FileName)){}
}
}
@@ -938,9 +978,13 @@ namespace UVtools.GUI
}
else if (issue.Type == LayerIssue.IssueType.ResinTrap)
{
- var contours = new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels));
- CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), -1);
- //CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), 2);
+ using (var contours =
+ new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)))
+ {
+ CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), -1);
+ //CvInvoke.DrawContours(image, contours, -1, new MCvScalar(255), 2);
+ }
+
edited = true;
}
@@ -1004,7 +1048,7 @@ namespace UVtools.GUI
if (MessageBox.Show("Are you sure you want to compute issues?", "Issues Compute",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) return;
- ComputeIssues();
+ ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration());
return;
}
@@ -1012,11 +1056,27 @@ namespace UVtools.GUI
/************************
* Layer Menu *
***********************/
- if (ReferenceEquals(sender, tsLayerImageRotate) || ReferenceEquals(sender, tsLayerImageLayerDifference) ||
+ if (ReferenceEquals(sender, tsLayerImageRotate) ||
+ ReferenceEquals(sender, tsLayerImageLayerDifference) ||
ReferenceEquals(sender, tsLayerImageHighlightIssues) ||
- ReferenceEquals(sender, tsLayerImageLayerOutline))
+ ReferenceEquals(sender, tsLayerImageLayerOutlinePrintVolumeBounds) ||
+ ReferenceEquals(sender, tsLayerImageLayerOutlineLayerBounds) ||
+ ReferenceEquals(sender, tsLayerImageLayerOutlineHollowAreas) ||
+ ReferenceEquals(sender, tsLayerImageLayerOutlineEdgeDetection)
+
+ )
{
ShowLayer();
+ if (ReferenceEquals(sender, tsLayerImageRotate))
+ {
+ ZoomToFit();
+ }
+ return;
+ }
+
+ if (ReferenceEquals(sender, tsLayerImageLayerOutline))
+ {
+ tsLayerImageLayerOutline.ShowDropDown();
return;
}
@@ -1231,7 +1291,7 @@ namespace UVtools.GUI
if (issue.Type == LayerIssue.IssueType.TouchingBound)
{
- pbLayer.ZoomToFit();
+ ZoomToFit();
}
else if (issue.X >= 0 && issue.Y >= 0)
{
@@ -1448,7 +1508,10 @@ namespace UVtools.GUI
lbInitialLayer.Text = $"{SlicerFile.LayerHeight}mm\n0";
- tsLayerImageRotate.Checked = ActualLayerImage.Height > ActualLayerImage.Width;
+ if (Settings.Default.LayerAutoRotateBestView)
+ {
+ tsLayerImageRotate.Checked = ActualLayerImage.Height > ActualLayerImage.Width;
+ }
if (!ReferenceEquals(SlicerFile.ConvertToFormats, null))
{
@@ -1464,7 +1527,7 @@ namespace UVtools.GUI
new ToolStripMenuItem(fileFormat.GetType().Name.Replace("File", extensions))
{
Tag = fileFormat,
- Image = Properties.Resources.layers_16x16
+ Image = Resources.layers_16x16
};
menuItem.Click += ConvertToItemOnClick;
menuFileConvert.DropDownItems.Add(menuItem);
@@ -1542,16 +1605,24 @@ namespace UVtools.GUI
RefreshInfo();
- pbLayer.ZoomToFit();
+ if (Settings.Default.LayerZoomToFit)
+ {
+ ZoomToFit();
+ }
UpdateTitle();
+
+ if (Settings.Default.ComputeIssuesOnLoad)
+ {
+ ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration());
+ }
}
void UpdateTitle()
{
- Text = $"{FrmAbout.AssemblyTitle} File: {Path.GetFileName(SlicerFile.FileFullPath)} Version: {FrmAbout.AssemblyVersion}";
+ Text = $"{FrmAbout.AssemblyTitle} File: {Path.GetFileName(SlicerFile.FileFullPath)} ({FrmLoading.StopWatch.ElapsedMilliseconds}ms) Version: {FrmAbout.AssemblyVersion}";
}
-
+
void RefreshInfo()
{
menuEdit.DropDownItems.Clear();
@@ -1686,65 +1757,22 @@ namespace UVtools.GUI
Stopwatch watch = Stopwatch.StartNew();
ActualLayerImage?.Dispose();
- ActualLayerImageBgr?.Dispose();
ActualLayerImage = SlicerFile[layerNum].LayerMat;
- ActualLayerImageBgr = new Mat();
+
CvInvoke.CvtColor(ActualLayerImage, ActualLayerImageBgr, ColorConversion.Gray2Bgr);
var imageSpan = ActualLayerImage.GetPixelSpan<byte>();
var imageBgrSpan = ActualLayerImageBgr.GetPixelSpan<byte>();
- if (tsLayerImageLayerOutline.Checked)
- {
-#if DEBUG
- using (Mat grayscale = new Mat())
- {
- CvInvoke.Threshold(ActualLayerImage, grayscale, 1, 255, ThresholdType.Binary);
- using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
- {
- using (Mat hierarchy = new Mat())
- {
- CvInvoke.FindContours(grayscale, contours, hierarchy, RetrType.Ccomp,
- ChainApproxMethod.ChainApproxSimple);
- /*
- * hierarchy[i][0]: the index of the next contour of the same level
- * hierarchy[i][1]: the index of the previous contour of the same level
- * hierarchy[i][2]: the index of the first child
- * hierarchy[i][3]: the index of the parent
- */
- var arr = hierarchy.GetData();
- for (int i = 0; i < contours.Size; i++)
- {
- //if ((int)arr.GetValue(0, i, 2) == -1 && (int)arr.GetValue(0, i, 3) > -1) continue;
- /*Debug.WriteLine($"[0] {arr.GetValue(0, i, 0)}");
- Debug.WriteLine($"[1] {arr.GetValue(0, i, 1)}");
- Debug.WriteLine($"[2] {arr.GetValue(0, i, 2)}");
- Debug.WriteLine($"[3] {arr.GetValue(0, i, 3)}");*/
- //if ((int)arr.GetValue(0, i, 2) > -1 || (int)arr.GetValue(0, i, 3) > -1) continue;
- //if (((int)arr.GetValue(0, i, 2) > -1 && (int)arr.GetValue(0, i, 3) > -1)) continue;
-
- // if ((int) arr.GetValue(0, i, 3) >= 0) continue;
- if ((int)arr.GetValue(0, i, 2) != -1 || (int)arr.GetValue(0, i, 3) == -1)
- continue;
- var r = CvInvoke.BoundingRectangle(contours[i]);
- CvInvoke.Rectangle(ActualLayerImageBgr, r, new MCvScalar(0, 0, 255), 5);
- CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, new MCvScalar(125, 125, 125), -1);
-
- //if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1)
- // CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, new MCvScalar(0, 0, 0), -1);
- }
- }
- }
- }
-#else
+ if (tsLayerImageLayerOutlineEdgeDetection.Checked)
+ {
using (var grayscale = new Mat())
{
CvInvoke.Canny(ActualLayerImage, grayscale, 80, 40, 3, true);
CvInvoke.CvtColor(grayscale, ActualLayerImageBgr, ColorConversion.Gray2Bgr);
}
-#endif
}
else if (tsLayerImageLayerDifference.Checked)
{
@@ -1759,27 +1787,26 @@ namespace UVtools.GUI
for (int pixel = 0; pixel < imageSpan.Length; pixel++)
{
- if (imageSpan[pixel] == 0)
+ if (imageSpan[pixel] != 0) continue;
+ Color color = Color.Empty;
+ if (previousSpan[pixel] > 0 && nextSpan[pixel] > 0)
{
- if (previousSpan[pixel] > 0 && nextSpan[pixel] > 0)
- {
- imageBgrSpan[pixel * 3] = 0; // B
- imageBgrSpan[pixel * 3 + 1] = 0; // G
- imageBgrSpan[pixel * 3 + 2] = 255; // R
- }
- else if (previousSpan[pixel] > 0)
- {
- imageBgrSpan[pixel * 3] = previousSpan[pixel]; // B
- imageBgrSpan[pixel * 3 + 1] = 0; // G
- imageBgrSpan[pixel * 3 + 2] = previousSpan[pixel]; // R
- }
- else if (nextSpan[pixel] > 0)
- {
- imageBgrSpan[pixel * 3] = nextSpan[pixel]; // B
- imageBgrSpan[pixel * 3 + 1] = nextSpan[pixel]; // G
- imageBgrSpan[pixel * 3 + 2] = 0; // R
- }
+ color = Settings.Default.PreviousNextLayerColor;
+ }
+ else if (previousSpan[pixel] > 0)
+ {
+ color = Settings.Default.PreviousLayerColor;
+ }
+ else if (nextSpan[pixel] > 0)
+ {
+ color = Settings.Default.NextLayerColor;
}
+
+ if (color.IsEmpty) continue;
+ var bgrPixel = pixel * 3;
+ imageBgrSpan[bgrPixel] = color.B; // B
+ imageBgrSpan[++bgrPixel] = color.G; // G
+ imageBgrSpan[++bgrPixel] = color.R; // R
}
}
}
@@ -1790,54 +1817,111 @@ namespace UVtools.GUI
!ReferenceEquals(Issues, null) &&
Issues.TryGetValue(ActualLayer, out var issues))
{
- byte brightness;
-
foreach (var issue in issues)
{
if (ReferenceEquals(issue, null)) continue; // Removed issue
if(!issue.HaveValidPoint) continue;
-
+ Color color = Settings.Default.ResinTrapColor;
+
if (issue.Type == LayerIssue.IssueType.ResinTrap)
{
- CvInvoke.DrawContours(ActualLayerImageBgr, new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), -1, new MCvScalar(0, 180, 255), -1);
- //CvInvoke.DrawContours(ActualLayerImageBgr, new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), -1, new MCvScalar(0, 0, 255), 1);
-
+ using (var vec = new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)))
+ {
+ CvInvoke.DrawContours(ActualLayerImageBgr, vec, -1,
+ new MCvScalar(color.B, color.G, color.R), -1);
+ //CvInvoke.DrawContours(ActualLayerImageBgr, new VectorOfVectorOfPoint(new VectorOfPoint(issue.Pixels)), -1, new MCvScalar(0, 0, 255), 1);
+ }
+
continue;
}
foreach (var pixel in issue)
{
int pixelPos = ActualLayerImage.GetPixelPos(pixel);
+ byte brightness = imageSpan[pixelPos];
+ if (brightness == 0) continue;
+
int pixelBgrPos = pixelPos*ActualLayerImageBgr.NumberOfChannels;
+
+
switch (issue.Type)
{
- /*case LayerIssue.IssueType.ResinTrap:
- break;*/
case LayerIssue.IssueType.Island:
- brightness = imageSpan[pixelPos];
- if (brightness == 0) continue;
- // alpha, Color.Yellow
- brightness = Math.Max((byte)80, brightness);
- imageBgrSpan[pixelBgrPos] = 0; // B
- imageBgrSpan[pixelBgrPos + 1] = brightness; // G
- imageBgrSpan[pixelBgrPos + 2] = brightness; // R
+ color = Settings.Default.IslandColor;
break;
- default:
- brightness = imageSpan[pixelPos];
- if (brightness == 0) continue;
- // alpha, Color.Yellow
- brightness = Math.Max((byte)80, brightness);
- imageBgrSpan[pixelBgrPos] = 0; // B
- imageBgrSpan[pixelBgrPos + 1] = 0; // G
- imageBgrSpan[pixelBgrPos + 2] = brightness; // R
+ case LayerIssue.IssueType.TouchingBound:
+ color = Settings.Default.TouchingBoundsColor;
break;
}
-
+
+
+ var newColor = color.FactorColor(brightness, 80);
+
+ imageBgrSpan[pixelBgrPos] = newColor.B; // B
+ imageBgrSpan[pixelBgrPos + 1] = newColor.G; // G
+ imageBgrSpan[pixelBgrPos + 2] = newColor.R; // R
}
}
}
+ if (tsLayerImageLayerOutlinePrintVolumeBounds.Checked)
+ {
+ CvInvoke.Rectangle(ActualLayerImageBgr, SlicerFile.LayerManager.BoundingRectangle,
+ new MCvScalar(Settings.Default.OutlinePrintVolumeBoundsColor.B, Settings.Default.OutlinePrintVolumeBoundsColor.G, Settings.Default.OutlinePrintVolumeBoundsColor.R), Settings.Default.OutlinePrintVolumeBoundsLineThickness);
+ }
+
+ if (tsLayerImageLayerOutlineLayerBounds.Checked)
+ {
+ CvInvoke.Rectangle(ActualLayerImageBgr, SlicerFile[layerNum].BoundingRectangle,
+ new MCvScalar(Settings.Default.OutlineLayerBoundsColor.B, Settings.Default.OutlineLayerBoundsColor.G, Settings.Default.OutlineLayerBoundsColor.R), Settings.Default.OutlineLayerBoundsLineThickness);
+ }
+
+ if (tsLayerImageLayerOutlineHollowAreas.Checked)
+ {
+ using (Mat grayscale = new Mat())
+ {
+ //CvInvoke.Threshold(ActualLayerImage, grayscale, 1, 255, ThresholdType.Binary);
+ using (VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint())
+ {
+ using (Mat hierarchy = new Mat())
+ {
+ CvInvoke.FindContours(ActualLayerImage, contours, hierarchy, RetrType.Ccomp, ChainApproxMethod.ChainApproxSimple);
+
+ /*
+ * hierarchy[i][0]: the index of the next contour of the same level
+ * hierarchy[i][1]: the index of the previous contour of the same level
+ * hierarchy[i][2]: the index of the first child
+ * hierarchy[i][3]: the index of the parent
+ */
+ var arr = hierarchy.GetData();
+ for (int i = 0; i < contours.Size; i++)
+ {
+ if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1)
+ {
+ //var r = CvInvoke.BoundingRectangle(contours[i]);
+ //CvInvoke.Rectangle(ActualLayerImageBgr, r, new MCvScalar(0, 0, 255), 2);
+ CvInvoke.DrawContours(ActualLayerImageBgr, contours, i,
+ new MCvScalar(Settings.Default.OutlineHollowAreasColor.B,
+ Settings.Default.OutlineHollowAreasColor.G, Settings.Default.OutlineHollowAreasColor.R),
+ Settings.Default.OutlineHollowAreasLineThickness);
+ }
+ /*else
+ {
+ CvInvoke.DrawContours(ActualLayerImageBgr, contours, i,
+ new MCvScalar(Settings.Default.ResinTrapColor.B,
+ Settings.Default.IslandColor.G, Settings.Default.IslandColor.R),
+ 2);
+ }*/
+
+ //if ((int) arr.GetValue(0, i, 2) == -1 && (int) arr.GetValue(0, i, 3) != -1)
+ // CvInvoke.DrawContours(ActualLayerImageBgr, contours, i, new MCvScalar(0, 0, 0), -1);
+ }
+ }
+ }
+ }
+ }
+
if (tsLayerImageRotate.Checked)
{
CvInvoke.Rotate(ActualLayerImageBgr, ActualLayerImageBgr, RotateFlags.Rotate90Clockwise);
@@ -1936,8 +2020,8 @@ namespace UVtools.GUI
{
if(ReferenceEquals(tabControlLeft.SelectedTab, tabPageIssues))
{
- if (!ReferenceEquals(tabPageIssues.Tag, null)) return;
- ComputeIssues();
+ if (!ReferenceEquals(tabPageIssues.Tag, null) || !Settings.Default.AutoComputeIssuesClickOnTab) return;
+ ComputeIssues(GetIslandDetectionConfiguration(), GetResinTrapDetectionConfiguration());
}
return;
}
@@ -2056,7 +2140,48 @@ namespace UVtools.GUI
return;
}
}
-#endregion
+
+ private void EventMouseDown(object sender, MouseEventArgs e)
+ {
+ if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer))
+ {
+ layerScrollTimer.Tag = ReferenceEquals(sender, btnNextLayer);
+ layerScrollTimer.Start();
+ return;
+ }
+ }
+
+ private void EventMouseUp(object sender, MouseEventArgs e)
+ {
+ if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer))
+ {
+ layerScrollTimer.Stop();
+ return;
+ }
+ }
+
+ private void EventTimerTick(object sender, EventArgs e)
+ {
+ if (ReferenceEquals(sender, layerScrollTimer))
+ {
+ ShowLayer((bool)layerScrollTimer.Tag);
+ return;
+ }
+ }
+
+ private void EventMouseDoubleClick(object sender, MouseEventArgs e)
+ {
+ if (ReferenceEquals(sender, pbLayer))
+ {
+ if ((e.Button & MouseButtons.Left) != 0)
+ {
+ ZoomToFit();
+ return;
+ }
+ return;
+ }
+ }
+ #endregion
@@ -2104,7 +2229,7 @@ namespace UVtools.GUI
- public void MutateLayers(Mutation.Mutates type)
+ public void MutateLayers(LayerManager.Mutate mutator)
{
uint layerStart;
uint layerEnd;
@@ -2115,10 +2240,10 @@ namespace UVtools.GUI
double x = 0;
double y = 0;
- switch (type)
+ switch (mutator)
{
- case Mutation.Mutates.Resize:
- using (FrmMutationResize inputBox = new FrmMutationResize(Mutations[type]))
+ case LayerManager.Mutate.Resize:
+ using (FrmMutationResize inputBox = new FrmMutationResize(Mutations[mutator]))
{
if (inputBox.ShowDialog() != DialogResult.OK) return;
layerStart = inputBox.LayerRangeStart;
@@ -2129,8 +2254,27 @@ namespace UVtools.GUI
}
break;
+ case LayerManager.Mutate.Flip:
+ using (FrmMutationOneComboBox inputBox = new FrmMutationOneComboBox(Mutations[mutator]))
+ {
+ if (inputBox.ShowDialog() != DialogResult.OK) return;
+ layerStart = inputBox.LayerRangeStart;
+ layerEnd = inputBox.LayerRangeEnd;
+ iterationsStart = (uint) inputBox.SelectedValue;
+ fade = inputBox.MakeCopy;
+ }
+ break;
+ case LayerManager.Mutate.Rotate:
+ using (FrmMutationOneNumericalInput inputBox = new FrmMutationOneNumericalInput(Mutations[mutator]))
+ {
+ if (inputBox.ShowDialog() != DialogResult.OK) return;
+ layerStart = inputBox.LayerRangeStart;
+ layerEnd = inputBox.LayerRangeEnd;
+ x = (double) inputBox.Value;
+ }
+ break;
default:
- using (FrmMutation inputBox = new FrmMutation(Mutations[type]))
+ using (FrmMutation inputBox = new FrmMutation(Mutations[mutator]))
{
if (inputBox.ShowDialog() != DialogResult.OK) return;
iterationsStart = inputBox.Iterations;
@@ -2146,34 +2290,53 @@ namespace UVtools.GUI
DisableGUI();
- FrmLoading.SetDescription($"Mutating - {type}");
+ FrmLoading.SetDescription($"Mutating - {mutator}");
Task<bool> task = Task<bool>.Factory.StartNew(() =>
{
bool result = false;
try
{
- switch (type)
+ switch (mutator)
{
- case Mutation.Mutates.Resize:
+ case LayerManager.Mutate.Resize:
SlicerFile.LayerManager.MutateResize(layerStart, layerEnd, x / 100.0, y / 100.0, fade);
break;
- case Mutation.Mutates.Solidify:
+ case LayerManager.Mutate.Flip:
+ FlipType flipType = FlipType.Horizontal;
+ switch (iterationsStart)
+ {
+ case 0:
+ flipType = FlipType.Horizontal;
+ break;
+ case 1:
+ flipType = FlipType.Vertical;
+ break;
+ case 2:
+ flipType = FlipType.Horizontal | FlipType.Vertical;
+ break;
+ }
+ SlicerFile.LayerManager.MutateFlip(layerStart, layerEnd, flipType, fade);
+ break;
+ case LayerManager.Mutate.Rotate:
+ SlicerFile.LayerManager.MutateRotate(layerStart, layerEnd, x);
+ break;
+ case LayerManager.Mutate.Solidify:
SlicerFile.LayerManager.MutateSolidify(layerStart, layerEnd);
break;
- case Mutation.Mutates.Erode:
+ case LayerManager.Mutate.Erode:
SlicerFile.LayerManager.MutateErode(layerStart, layerEnd, (int) iterationsStart, (int) iterationsEnd, fade);
break;
- case Mutation.Mutates.Dilate:
+ case LayerManager.Mutate.Dilate:
SlicerFile.LayerManager.MutateDilate(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade);
break;
- case Mutation.Mutates.Opening:
+ case LayerManager.Mutate.Opening:
SlicerFile.LayerManager.MutateOpen(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade);
break;
- case Mutation.Mutates.Closing:
+ case LayerManager.Mutate.Closing:
SlicerFile.LayerManager.MutateClose(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade);
break;
- case Mutation.Mutates.Gradient:
+ case LayerManager.Mutate.Gradient:
SlicerFile.LayerManager.MutateGradient(layerStart, layerEnd, (int)iterationsStart, (int)iterationsEnd, fade);
break;
/*case Mutation.Mutates.TopHat:
@@ -2192,13 +2355,13 @@ namespace UVtools.GUI
CvInvoke.MorphologyEx(image, image, MorphOp.HitMiss, Program.KernelFindIsolated,
new Point(-1, -1), (int) iterations, BorderType.Default, new MCvScalar());
break;*/
- case Mutation.Mutates.PyrDownUp:
+ case LayerManager.Mutate.PyrDownUp:
SlicerFile.LayerManager.MutatePyrDownUp(layerStart, layerEnd);
break;
- case Mutation.Mutates.SmoothMedian:
+ case LayerManager.Mutate.SmoothMedian:
SlicerFile.LayerManager.MutateMedianBlur(layerStart, layerEnd, (int)iterationsStart);
break;
- case Mutation.Mutates.SmoothGaussian:
+ case LayerManager.Mutate.SmoothGaussian:
SlicerFile.LayerManager.MutateGaussianBlur(layerStart, layerEnd, new Size((int) iterationsStart, (int) iterationsStart));
break;
}
@@ -2252,7 +2415,7 @@ namespace UVtools.GUI
}
- private void ComputeIssues()
+ private void ComputeIssues(IslandDetectionConfiguration islandConfig = null, ResinTrapDetectionConfiguration resinTrapConfig = null)
{
tabPageIssues.Tag = true;
TotalIssues = 0;
@@ -2269,7 +2432,7 @@ namespace UVtools.GUI
bool result = false;
try
{
- var issues = SlicerFile.LayerManager.GetAllIssues();
+ var issues = SlicerFile.LayerManager.GetAllIssues(islandConfig, resinTrapConfig);
Issues = new Dictionary<uint, List<LayerIssue>>();
for (uint i = 0; i < SlicerFile.LayerCount; i++)
@@ -2337,32 +2500,53 @@ namespace UVtools.GUI
ShowLayer();
}
- private void EventMouseDown(object sender, MouseEventArgs e)
+ private void ZoomToFit()
{
- if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer))
+ if (ReferenceEquals(SlicerFile, null)) return;
+ if (Settings.Default.ZoomToFitPrintVolumeBounds)
{
- layerScrollTimer.Tag = ReferenceEquals(sender, btnNextLayer);
- layerScrollTimer.Start();
- return;
+ if (!tsLayerImageRotate.Checked)
+ {
+ pbLayer.ZoomToRegion(SlicerFile.LayerManager.BoundingRectangle);
+ }
+ else
+ {
+ pbLayer.ZoomToRegion(ActualLayerImage.Height - 1 - SlicerFile.LayerManager.BoundingRectangle.Bottom,
+ SlicerFile.LayerManager.BoundingRectangle.X,
+ SlicerFile.LayerManager.BoundingRectangle.Height,
+ SlicerFile.LayerManager.BoundingRectangle.Width
+ );
+ }
+ }
+ else
+ {
+ pbLayer.ZoomToFit();
}
}
- private void EventMouseUp(object sender, MouseEventArgs e)
+ public IslandDetectionConfiguration GetIslandDetectionConfiguration()
{
- if (ReferenceEquals(sender, btnNextLayer) || ReferenceEquals(sender, btnPreviousLayer))
- {
- layerScrollTimer.Stop();
- return;
- }
+ return new IslandDetectionConfiguration
+ {
+ Enabled = tsIsuesRefreshIslands.Checked,
+ BinaryThreshold = Settings.Default.IslandBinaryThreshold,
+ RequiredAreaToProcessCheck = Settings.Default.IslandRequiredAreaToProcessCheck,
+ RequiredPixelBrightnessToProcessCheck = Settings.Default.IslandRequiredPixelBrightnessToProcessCheck,
+ RequiredPixelsToSupport = Settings.Default.IslandRequiredPixelsToSupport,
+ RequiredPixelBrightnessToSupport = Settings.Default.IslandRequiredPixelBrightnessToSupport
+ };
}
- private void EventTimerTick(object sender, EventArgs e)
+ public ResinTrapDetectionConfiguration GetResinTrapDetectionConfiguration()
{
- if (ReferenceEquals(sender, layerScrollTimer))
+ return new ResinTrapDetectionConfiguration
{
- ShowLayer((bool)layerScrollTimer.Tag);
- return;
- }
+ Enabled = tsIsuesRefreshResinTraps.Checked,
+ BinaryThreshold = Settings.Default.ResinTrapBinaryThreshold,
+ RequiredAreaToProcessCheck = Settings.Default.ResinTrapRequiredAreaToProcessCheck,
+ RequiredBlackPixelsToDrain = Settings.Default.ResinTrapRequiredBlackPixelsToDrain,
+ MaximumPixelBrightnessToDrain = Settings.Default.ResinTrapMaximumPixelBrightnessToDrain
+ };
}
}
}
diff --git a/UVtools.GUI/FrmMain.resx b/UVtools.GUI/FrmMain.resx
index a2492a8..1eff9b4 100644
--- a/UVtools.GUI/FrmMain.resx
+++ b/UVtools.GUI/FrmMain.resx
@@ -145,68 +145,68 @@
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
- ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAA4
- DgAAAk1TRnQBSQFMAgEBBAEAAUABBAFAAQQBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
+ ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAs
+ DgAAAk1TRnQBSQFMAgEBBAEAAbgBBAG4AQQBEAEAARABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABIAMAAQEBAAEgBgABIP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AZgADUAGjA1IBqQNS
- AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAWwBcwH1
- AUgBgQGHAfcDQwF3A1sByAJCAW8B9QJYAV8B4wNKAYwDCgENBAADVQG0A1kBxwMvAUkDAAEBAxsBJgMc
- AScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDAgEDBAADUgGpMAADUgGpEAADJwE6
- AzABTAMwAUwDMAFMAzABTAMwAUwDMAFMAzABTAMwAUwDJwE6FAADBQEHA0wBkgFWAlgBwQMVAR0DPQFp
- AQUByAHzAf8BEwGQAeYB/wIpAdwB/wIpAd0B/wJeAeMB/wI0Ad4B/wIpAd0B/wJYAVsBywMGAQgDAAH/
- AwAB/wNDAXcDKQE+AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgFR
- BAADUgGpBAADUAGdA1MBqgNTAaoDUwGqA1MBqgNTAaoDUwGqA1ABnQwAA1IBqRAAA04B+wMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A04B+xQAATACMQFNAQYByQHzAf8BBgHJAfQB/wFZAWIBZAHr
- AVsCXgHZAQkBwAHxAf8BKgEyAd8B/wIsAeAB/wIsAeAB/wJlAekB/wI3AeIB/wIsAeAB/wIsAeAB/wNA
- AXEDUQGiA1YBtgMqAUAEAAMQARUDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEAEW
- CAADUgGpBAADUAGdA1MBqgNTAaoDHwEsHAADUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/xQAAwcBCgFWAWkBbwHyAQgBygH0Af8BCAHKAfQB/wEIAcoB9AH/ARQBoQHuAf8CLwHj
- Af8CLwHjAf8CLwHjAf8CqQHvAf8CNgHjAf8CLwHjAf8CLwHjAf8CVgFYAbkDCgEOAxEBFwMAAQE4AANS
- AakwAANSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAADFQEdAz0BaQM6
- AWIBXAJgAdQBCQHLAfUB/wEJAcsB9QH/AQkBywH1Af8BFwGgAfAB/wIyAeYB/wIyAeYB/wIyAeYB/wLC
- AfYB/wJKAegB/wIyAeYB/wIyAeYB/wJXAVkBvwNSAfQDAAH/Az4BbAMOARMDQgF2A0MBdwNDAXcDQwF3
- A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0IBdgMUARsEAANSAakDIgEyA1IBqQNSAakDUgGpA1IBqQNS
- AakDUgGpA1IBqQNSAakDUgGpA1IBqQMiATIDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/wwAAUsCTAGQAQoBywH2Af8BCgHLAfYB/wEKAcsB9gH/AQoBywH2Af8BKQGGAZwB+gND
- AXgDIgEyAksBmAH7AjUB6QH/AjUB6QH/As0B+AH/AlkB7QH/AjUB6QH/AjUB6QH/A1ABngMAAf4DAAH/
- A0MBdwMeASsDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANS
- AakDNAFVAzQBVSAAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
- AwAB/wwAA1EBoAEMAcwB9wH/AQwBzAH3Af8BDAHMAfcB/wEMAcwB9wH/A0MBdwgAA0oBjQI4AewB/wI4
- AewB/wJUAe8B/wI8AewB/wI4AewB/wE0AUUB7QH/AVICUwGoAzMBUwM8AWcDFAEcOAADUgGpAzQBVQM0
- AVUDRgGAA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA0UBfwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAT4BfwGQAfgBDQHNAfcB/wENAc0B9wH/
- AxIBGAgAAwEBAgNGAX4CUgFnAfACOwHuAf8BOwE8Ae4B/wFAAU4BugH9AUUCRgF+AwMBBAMzAVMDPAFn
- AxQBHDgAA1IBqQM0AVUDNAFVAz8BbgMyAVAQAAMnATsDRAF8AzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/
- AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/w8AAQEBPwJAAW8BPgF/AZAB+AEOAc4B+AH/AQ4BzgH4
- Af8DEgEYEAADFwEgARUBvAH3Af8BEgHEAfcB/wE6Aa4BvAH9AUUCRgF+AwMBBAMAAf4DAAH/A0MBdwMf
- ASwDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANSAakDNAFV
- AzQBVQMFAQcDVQG1AxEBFwNSAakDKQE+BAADUAGfAxEBFwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8MAANRAaABEAHOAfgB/wEQAc8B+QH/ARABzwH5Af8BEAHP
- AfkB/wNDAXcQAANEAXoBEAHPAfkB/wEQAc8B+QH/ARABzwH5Af8BEAHOAfgB/wFSAlMBqANSAfQDAAH/
- Az4BbAMOARMDQgF1A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwMUARsEAANS
- AakDNAFVAzQBVQQAAzwBaANWAb4DIwE0A1UBtQMSARkDUQGgBAADNAFVAzQBVQNSAakTAAH/AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfDAABSwJMAZABEQHQAfoB/wERAdAB+gH/AREB0AH6
- Af8BEQHQAfoB/wEpAYYBnAH6A0MBeAMSARkDEwEaA0QBegEoAZEBnQH7AREB0AH6Af8BEQHQAfoB/wER
- AdAB+gH/AREB0AH6Af8DSgGMAwoBDgMRARcDAAEBOAADUgGpAzQBVQM0AVUDAAEBAy0BRgMKAQ4EAAM5
- AV8DXAHOAygBPAQAAzQBVQM0AVUDUgGpEwAB/wOCAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHf
- AxcBIAwAAxUBHQM9AWkDOgFiAVwCYAHUARIB0QH6Af8BEgHRAfoB/wESAdAB+gH/ARIBywHzAf8BEgHL
- AfMB/wESAdAB+gH/ARIB0QH6Af8BEgHRAfoB/wFdAmEB4gM6AWIDPQFpAxQBHANRAaIDVgG2AyoBQAQA
- AxABFQMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMQARYIAANSAakDNAFVAzQBVQMz
- AVMDUgGmA0oBjAcAAQEDRwGDCAADNAFVAzQBVQNSAakTAAH/A5kB/wOFAf8DAAH/AwAB/wMAAf8DAAH/
- A1wB3wMXASAYAAMHAQoBWAFpAW8B8gEUAdIB+wH/ARQB0gH7Af8BFAHSAfsB/wEUAdIB+wH/ARQB0gH7
- Af8BFAHSAfsB/wEUAdIB+wH/ARQB0gH7Af8BKwGSAZ0B+wMRARcLAAH/AwAB/wNDAXcDKQE+AwAB/wMA
- Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DMgFRBAADUgGpAzQBVQM0AVUDEQEX
- A1ABngMkATYUAAM0AVUDNAFVA1IBqRAAA1AB+wMAAf8DAAH/AwAB/wMAAf8DAAH/A1wB3wMXASAcAAEw
- AjEBTQEVAdIB/AH/ARUB0gH8Af8BWQFjAWYB6wFbAl4B2QEVAdIB/AH/ARUB0gH8Af8BWwJhAeEBXQJh
- AeIBFQHSAfwB/wEVAdIB/AH/AzgBXggAA1UBtANZAccDLwFJAwABAQMbASYDHAEnAxwBJwMcAScDHAEn
- AxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAwIBAwQAA1IBqQMiATIDUgGpA1IBqQNSAakDUgGpA1IBqQNS
- AakDUgGpA1IBqQNSAakDUgGpAyIBMgNSAakQAAMgAS4DKQE/AykBPwMpAT8DKQE/AykBPwMRARcgAAMF
- AQcDTAGSAVYCWAHBAxUBHQM9AWkBFgHTAfwB/wEWAdMB/AH/AUUCRgF/AxABFQNWAbMBSwJMAY8DBAEG
- TAADUAGjA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wA
- AxUBHQFCAW8BewH1AVEBhQGKAfcDIAEvGAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEB
- FgAD/4EAAv8BgAEBAv8B/AEBAgABvwH9AeABBwHAAwABoAEdAeABBwHAAQABEAEBAaEB/QHgAQcBwAEA
- AR8B/wG/Af0B4AEHBAABgAEBAeABBwQAAY8B8QHgAQcBAwEAAR8B/wGAAQEB4AEHAQMBAAEfAf8BgwHB
- AeABBwEDAcACAAGAAUEB4AEHAQMBwAIAAYgBEQHgAQcCAAEfAf8BgQERAeABBwIAARABAQGBATEB4AEP
- AcABAwIAAYEB8QHgAR8BwAEDAgABgAEBAeABPwHAAQMC/wGAAQEC/wH8AT8L
+ AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAVkBXgH1
+ AVECbQH3A0MBdwNbAcgCQgFaAfUCWAFfAeMDSgGMAwoBDQQAA1UBtANZAccDLwFJAwABAQMbASYDHAEn
+ AxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEnAwIBAwQAA1IBqTAAA1IBqRAAAycBOgMw
+ AUwDMAFMAzABTAMwAUwDMAFMAzABTAMwAUwDMAFMAycBOhQAAwUBBwNMAZIBVgJYAcEDFQEdAz0BaQEA
+ AcgB8wH/AQQBkAHmAf8CGgHcAf8CGgHdAf8CTwHjAf8CJQHeAf8CGgHdAf8CWAFbAcsDBgEIAwAB/wMA
+ Af8DQwF3AykBPgMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AzIBUQQA
+ A1IBqQQAA1ABnQNTAaoDUwGqA1MBqgNTAaoDUwGqA1MBqgNQAZ0MAANSAakQAANOAfsDAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/AwAB/wNOAfsUAAEwAjEBTQEAAckB8wH/AQAByQH0Af8BWQJgAesBWwJe
+ AdkBAAHAAfEB/wEbASMB3wH/Ah0B4AH/Ah0B4AH/AlYB6QH/AigB4gH/Ah0B4AH/Ah0B4AH/A0ABcQNR
+ AaIDVgG2AyoBQAQAAxABFQMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMQARYIAANS
+ AakEAANQAZ0DUwGqA1MBqgMfASwcAANSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/FAADBwEKAVkCZwHyAQABygH0Af8BAAHKAfQB/wEAAcoB9AH/AQUBoQHuAf8CIAHjAf8CIAHj
+ Af8CIAHjAf8CqQHvAf8CJwHjAf8CIAHjAf8CIAHjAf8CVgFYAbkDCgEOAxEBFwMAAQE4AANSAakwAANS
+ AakTAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/DAADFQEdAz0BaQM6AWIBXAJg
+ AdQBAAHLAfUB/wEAAcsB9QH/AQABywH1Af8BCAGgAfAB/wIjAeYB/wIjAeYB/wIjAeYB/wLCAfYB/wI7
+ AegB/wIjAeYB/wIjAeYB/wJXAVkBvwNSAfQDAAH/Az4BbAMOARMDQgF2A0MBdwNDAXcDQwF3A0MBdwND
+ AXcDQwF3A0MBdwNDAXcDQwF3A0IBdgMUARsEAANSAakDIgEyA1IBqQNSAakDUgGpA1IBqQNSAakDUgGp
+ A1IBqQNSAakDUgGpA1IBqQMiATIDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wwAAUsCTAGQAQABywH2Af8BAAHLAfYB/wEAAcsB9gH/AQABywH2Af8BKQFyAXoB+gNDAXgDIgEy
+ AksBiAH7AiYB6QH/AiYB6QH/As0B+AH/AkoB7QH/AiYB6QH/AiYB6QH/A1ABngMAAf4DAAH/A0MBdwMe
+ ASsDVwHFA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1gBxgMmATkEAANSAakDNAFV
+ AzQBVSAAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wwA
+ A1EBoAEAAcwB9wH/AQABzAH3Af8BAAHMAfcB/wEAAcwB9wH/A0MBdwgAA0oBjQIpAewB/wIpAewB/wJF
+ Ae8B/wItAewB/wIpAewB/wElATYB7QH/AVICUwGoAzMBUwM8AWcDFAEcOAADUgGpAzQBVQM0AVUDRgGA
+ A1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA0UBfwM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAT4BcAF1AfgBAAHNAfcB/wEAAc0B9wH/AxIBGAgA
+ AwEBAgNGAX4CUgFdAfACLAHuAf8BLAEtAe4B/wJAAasB/QFFAkYBfgMDAQQDMwFTAzwBZwMUARw4AANS
+ AakDNAFVAzQBVQM/AW4DMgFQEAADJwE7A0QBfAM0AVUDNAFVA1IBqRMAAf8DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8PAAEBAT8CQAFvAT4BcAF1AfgBAAHOAfgB/wEAAc4B+AH/AxIBGBAA
+ AxcBIAEGAbwB9wH/AQMBxAH3Af8BQAGoAa0B/QFFAkYBfgMDAQQDAAH+AwAB/wNDAXcDHwEsA1cBxQNZ
+ AccDWQHHA1kBxwNZAccDWQHHA1kBxwNZAccDWQHHA1kBxwNYAcYDJgE5BAADUgGpAzQBVQM0AVUDBQEH
+ A1UBtQMRARcDUgGpAykBPgQAA1ABnwMRARcDNAFVAzQBVQNSAakTAAH/AwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/DAADUQGgAQEBzgH4Af8BAQHPAfkB/wEBAc8B+QH/AQEBzwH5Af8DQwF3
+ EAADRAF6AQEBzwH5Af8BAQHPAfkB/wEBAc8B+QH/AQEBzgH4Af8BUgJTAagDUgH0AwAB/wM+AWwDDgET
+ A0IBdQNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDQwF3A0MBdwNDAXcDFAEbBAADUgGpAzQBVQM0
+ AVUEAAM8AWgDVgG+AyMBNANVAbUDEgEZA1EBoAQAAzQBVQM0AVUDUgGpEwAB/wMAAf8DAAH/AwAB/wMA
+ Af8DAAH/AwAB/wMAAf8DAAH/A1wB3wwAAUsCTAGQAQIB0AH6Af8BAgHQAfoB/wECAdAB+gH/AQIB0AH6
+ Af8BKQFyAXoB+gNDAXgDEgEZAxMBGgNEAXoBKAGCAYsB+wECAdAB+gH/AQIB0AH6Af8BAgHQAfoB/wEC
+ AdAB+gH/A0oBjAMKAQ4DEQEXAwABATgAA1IBqQM0AVUDNAFVAwABAQMtAUYDCgEOBAADOQFfA1wBzgMo
+ ATwEAAM0AVUDNAFVA1IBqRMAAf8DggH/AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/A1wB3wMXASAMAAMV
+ AR0DPQFpAzoBYgFcAmAB1AEDAdEB+gH/AQMB0QH6Af8BAwHQAfoB/wEDAcsB8wH/AQMBywHzAf8BAwHQ
+ AfoB/wEDAdEB+gH/AQMB0QH6Af8BXQJhAeIDOgFiAz0BaQMUARwDUQGiA1YBtgMqAUAEAAMQARUDEQEX
+ AxEBFwMRARcDEQEXAxEBFwMRARcDEQEXAxEBFwMRARcDEAEWCAADUgGpAzQBVQM0AVUDMwFTA1IBpgNK
+ AYwHAAEBA0cBgwgAAzQBVQM0AVUDUgGpEwAB/wOZAf8DhQH/AwAB/wMAAf8DAAH/AwAB/wNcAd8DFwEg
+ GAADBwEKAVkCZwHyAQUB0gH7Af8BBQHSAfsB/wEFAdIB+wH/AQUB0gH7Af8BBQHSAfsB/wEFAdIB+wH/
+ AQUB0gH7Af8BBQHSAfsB/wErAYMBiwH7AxEBFwsAAf8DAAH/A0MBdwMpAT4DAAH/AwAB/wMAAf8DAAH/
+ AwAB/wMAAf8DAAH/AwAB/wMAAf8DAAH/AwAB/wMyAVEEAANSAakDNAFVAzQBVQMRARcDUAGeAyQBNhQA
+ AzQBVQM0AVUDUgGpEAADUAH7AwAB/wMAAf8DAAH/AwAB/wMAAf8DXAHfAxcBIBwAATACMQFNAQYB0gH8
+ Af8BBgHSAfwB/wFZAmAB6wFbAl4B2QEGAdIB/AH/AQYB0gH8Af8BWwJhAeEBXQJhAeIBBgHSAfwB/wEG
+ AdIB/AH/AzgBXggAA1UBtANZAccDLwFJAwABAQMbASYDHAEnAxwBJwMcAScDHAEnAxwBJwMcAScDHAEn
+ AxwBJwMcAScDHAEnAwIBAwQAA1IBqQMiATIDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNS
+ AakDUgGpAyIBMgNSAakQAAMgAS4DKQE/AykBPwMpAT8DKQE/AykBPwMRARcgAAMFAQcDTAGSAVYCWAHB
+ AxUBHQM9AWkBBwHTAfwB/wEHAdMB/AH/AUUCRgF/AxABFQNWAbMBSwJMAY8DBAEGTAADUAGjA1IBqQNS
+ AakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1IBqQNSAakDUgGpA1ABo1wAAxUBHQFCAVoBYgH1
+ AVEBbQF0AfcDIAEvGAABQgFNAT4HAAE+AwABKAMAAUADAAEgAwABAQEAAQEGAAEBFgAD/4EAAv8BgAEB
+ Av8B/AEBAgABvwH9AeABBwHAAwABoAEdAeABBwHAAQABEAEBAaEB/QHgAQcBwAEAAR8B/wG/Af0B4AEH
+ BAABgAEBAeABBwQAAY8B8QHgAQcBAwEAAR8B/wGAAQEB4AEHAQMBAAEfAf8BgwHBAeABBwEDAcACAAGA
+ AUEB4AEHAQMBwAIAAYgBEQHgAQcCAAEfAf8BgQERAeABBwIAARABAQGBATEB4AEPAcABAwIAAYEB8QHg
+ AR8BwAEDAgABgAEBAeABPwHAAQMC/wGAAQEC/wH8AT8L
</value>
</data>
<metadata name="toolTipInformation.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
diff --git a/UVtools.GUI/Images/settings-16x16.png b/UVtools.GUI/Images/settings-16x16.png
new file mode 100644
index 0000000..83e560c
--- /dev/null
+++ b/UVtools.GUI/Images/settings-16x16.png
Binary files differ
diff --git a/UVtools.GUI/Mutation.cs b/UVtools.GUI/Mutation.cs
index 0ae56d7..e9ba085 100644
--- a/UVtools.GUI/Mutation.cs
+++ b/UVtools.GUI/Mutation.cs
@@ -6,35 +6,15 @@
* of this license document, but changing it is not allowed.
*/
using System.Drawing;
+using UVtools.Core;
namespace UVtools.GUI
{
public class Mutation
{
- #region Enum
- public enum Mutates : byte
- {
- Resize,
- Solidify,
- //LayerSmash,
- Erode,
- Dilate,
- Opening,
- Closing,
- Gradient,
- TopHat,
- BlackHat,
- HitMiss,
- PyrDownUp,
- SmoothMedian,
- SmoothGaussian,
-
- }
- #endregion
-
#region Properties
- public Mutates Mutate { get; }
+ public LayerManager.Mutate Mutate { get; }
public string Description { get; }
@@ -43,7 +23,7 @@ namespace UVtools.GUI
#region Constructor
- public Mutation(Mutates mutate, string description, Image image = null)
+ public Mutation(LayerManager.Mutate mutate, string description, Image image = null)
{
Mutate = mutate;
Description = description;
diff --git a/UVtools.GUI/Properties/Resources.Designer.cs b/UVtools.GUI/Properties/Resources.Designer.cs
index d20e24b..67e7df1 100644
--- a/UVtools.GUI/Properties/Resources.Designer.cs
+++ b/UVtools.GUI/Properties/Resources.Designer.cs
@@ -563,6 +563,16 @@ namespace UVtools.GUI.Properties {
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
+ internal static System.Drawing.Bitmap settings_16x16 {
+ get {
+ object obj = ResourceManager.GetObject("settings-16x16", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ /// <summary>
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ /// </summary>
internal static System.Drawing.Bitmap UVtools {
get {
object obj = ResourceManager.GetObject("UVtools", resourceCulture);
diff --git a/UVtools.GUI/Properties/Resources.resx b/UVtools.GUI/Properties/Resources.resx
index a53bad9..00ef478 100644
--- a/UVtools.GUI/Properties/Resources.resx
+++ b/UVtools.GUI/Properties/Resources.resx
@@ -121,14 +121,17 @@
<data name="Error-128x128" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Error-128x128.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="UVtools" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\UVtools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="search-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\search-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="arrow-top-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-top-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="mutation_solidify" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_solidify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="eye-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\eye-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -163,9 +166,6 @@
<data name="warning-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\warning-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="checkbox-marked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\checkbox-marked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="Wrench-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Wrench-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -178,8 +178,8 @@
<data name="arrow-up" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-up.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="SaveAs-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="Convert-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\Convert-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Ok-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Ok-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -187,6 +187,9 @@
<data name="Button-Info-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Button-Info-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="Next-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Next-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
@@ -199,11 +202,14 @@
<data name="Open-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Open-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="File-Close-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\File-Close-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="search-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\search-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="SaveAs-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\SaveAs-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="Cancel-32x32" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Cancel-32x32.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -211,20 +217,17 @@
<data name="eye-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\eye-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="mutation_tophat" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_tophat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
<data name="Geometry-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\Geometry-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="mutation_tophat" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_tophat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="plus" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\plus.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="Convert-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\Convert-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="UVtools" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\UVtools.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="layers-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\layers-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -247,23 +250,23 @@
<data name="checkbox-unmarked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\checkbox-unmarked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
+ <data name="CNCMachine-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\CNCMachine-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
<data name="delete-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\delete-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="arrow-down-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\arrow-down-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
- <data name="pointer-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\pointer-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
- </data>
- <data name="mutation_solidify" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\gui\mutation_solidify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="checkbox-marked-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\checkbox-marked-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="mutation_blackhat" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\gui\mutation_blackhat.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="Cancel-24x24" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\Cancel-24x24.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="mutation_closing" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\gui\mutation_closing.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ </data>
+ <data name="clipboard-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\clipboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="arrow-down" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\arrow-down.ico;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
@@ -274,7 +277,7 @@
<data name="island-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Images\island-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
- <data name="clipboard-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
- <value>..\Images\clipboard-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
+ <data name="settings-16x16" type="System.Resources.ResXFileRef, System.Windows.Forms">
+ <value>..\Images\settings-16x16.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root> \ No newline at end of file
diff --git a/UVtools.GUI/Properties/Settings.Designer.cs b/UVtools.GUI/Properties/Settings.Designer.cs
index c398559..6cc1d6a 100644
--- a/UVtools.GUI/Properties/Settings.Designer.cs
+++ b/UVtools.GUI/Properties/Settings.Designer.cs
@@ -22,5 +22,425 @@ namespace UVtools.GUI.Properties {
return defaultInstance;
}
}
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Red")]
+ public global::System.Drawing.Color PreviousNextLayerColor {
+ get {
+ return ((global::System.Drawing.Color)(this["PreviousNextLayerColor"]));
+ }
+ set {
+ this["PreviousNextLayerColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Yellow")]
+ public global::System.Drawing.Color IslandColor {
+ get {
+ return ((global::System.Drawing.Color)(this["IslandColor"]));
+ }
+ set {
+ this["IslandColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Orange")]
+ public global::System.Drawing.Color ResinTrapColor {
+ get {
+ return ((global::System.Drawing.Color)(this["ResinTrapColor"]));
+ }
+ set {
+ this["ResinTrapColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Red")]
+ public global::System.Drawing.Color TouchingBoundsColor {
+ get {
+ return ((global::System.Drawing.Color)(this["TouchingBoundsColor"]));
+ }
+ set {
+ this["TouchingBoundsColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Magenta")]
+ public global::System.Drawing.Color PreviousLayerColor {
+ get {
+ return ((global::System.Drawing.Color)(this["PreviousLayerColor"]));
+ }
+ set {
+ this["PreviousLayerColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Cyan")]
+ public global::System.Drawing.Color NextLayerColor {
+ get {
+ return ((global::System.Drawing.Color)(this["NextLayerColor"]));
+ }
+ set {
+ this["NextLayerColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool UpdateSettings {
+ get {
+ return ((bool)(this["UpdateSettings"]));
+ }
+ set {
+ this["UpdateSettings"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool StartMaximized {
+ get {
+ return ((bool)(this["StartMaximized"]));
+ }
+ set {
+ this["StartMaximized"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool CheckForUpdatesOnStartup {
+ get {
+ return ((bool)(this["CheckForUpdatesOnStartup"]));
+ }
+ set {
+ this["CheckForUpdatesOnStartup"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool LayerAutoRotateBestView {
+ get {
+ return ((bool)(this["LayerAutoRotateBestView"]));
+ }
+ set {
+ this["LayerAutoRotateBestView"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool LayerDifferenceDefault {
+ get {
+ return ((bool)(this["LayerDifferenceDefault"]));
+ }
+ set {
+ this["LayerDifferenceDefault"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool ComputeIssuesOnLoad {
+ get {
+ return ((bool)(this["ComputeIssuesOnLoad"]));
+ }
+ set {
+ this["ComputeIssuesOnLoad"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool LayerZoomToFit {
+ get {
+ return ((bool)(this["LayerZoomToFit"]));
+ }
+ set {
+ this["LayerZoomToFit"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool ComputeIslands {
+ get {
+ return ((bool)(this["ComputeIslands"]));
+ }
+ set {
+ this["ComputeIslands"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool ComputeResinTraps {
+ get {
+ return ((bool)(this["ComputeResinTraps"]));
+ }
+ set {
+ this["ComputeResinTraps"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("1")]
+ public byte IslandRequiredAreaToProcessCheck {
+ get {
+ return ((byte)(this["IslandRequiredAreaToProcessCheck"]));
+ }
+ set {
+ this["IslandRequiredAreaToProcessCheck"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("1")]
+ public byte IslandRequiredPixelBrightnessToProcessCheck {
+ get {
+ return ((byte)(this["IslandRequiredPixelBrightnessToProcessCheck"]));
+ }
+ set {
+ this["IslandRequiredPixelBrightnessToProcessCheck"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("10")]
+ public byte IslandRequiredPixelsToSupport {
+ get {
+ return ((byte)(this["IslandRequiredPixelsToSupport"]));
+ }
+ set {
+ this["IslandRequiredPixelsToSupport"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("150")]
+ public byte IslandRequiredPixelBrightnessToSupport {
+ get {
+ return ((byte)(this["IslandRequiredPixelBrightnessToSupport"]));
+ }
+ set {
+ this["IslandRequiredPixelBrightnessToSupport"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("17")]
+ public byte ResinTrapRequiredAreaToProcessCheck {
+ get {
+ return ((byte)(this["ResinTrapRequiredAreaToProcessCheck"]));
+ }
+ set {
+ this["ResinTrapRequiredAreaToProcessCheck"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("10")]
+ public byte ResinTrapRequiredBlackPixelsToDrain {
+ get {
+ return ((byte)(this["ResinTrapRequiredBlackPixelsToDrain"]));
+ }
+ set {
+ this["ResinTrapRequiredBlackPixelsToDrain"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("30")]
+ public byte ResinTrapMaximumPixelBrightnessToDrain {
+ get {
+ return ((byte)(this["ResinTrapMaximumPixelBrightnessToDrain"]));
+ }
+ set {
+ this["ResinTrapMaximumPixelBrightnessToDrain"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool AutoComputeIssuesClickOnTab {
+ get {
+ return ((bool)(this["AutoComputeIssuesClickOnTab"]));
+ }
+ set {
+ this["AutoComputeIssuesClickOnTab"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Lime")]
+ public global::System.Drawing.Color OutlinePrintVolumeBoundsColor {
+ get {
+ return ((global::System.Drawing.Color)(this["OutlinePrintVolumeBoundsColor"]));
+ }
+ set {
+ this["OutlinePrintVolumeBoundsColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("3")]
+ public byte OutlinePrintVolumeBoundsLineThickness {
+ get {
+ return ((byte)(this["OutlinePrintVolumeBoundsLineThickness"]));
+ }
+ set {
+ this["OutlinePrintVolumeBoundsLineThickness"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Lime")]
+ public global::System.Drawing.Color OutlineLayerBoundsColor {
+ get {
+ return ((global::System.Drawing.Color)(this["OutlineLayerBoundsColor"]));
+ }
+ set {
+ this["OutlineLayerBoundsColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("3")]
+ public byte OutlineLayerBoundsLineThickness {
+ get {
+ return ((byte)(this["OutlineLayerBoundsLineThickness"]));
+ }
+ set {
+ this["OutlineLayerBoundsLineThickness"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("Orange")]
+ public global::System.Drawing.Color OutlineHollowAreasColor {
+ get {
+ return ((global::System.Drawing.Color)(this["OutlineHollowAreasColor"]));
+ }
+ set {
+ this["OutlineHollowAreasColor"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("3")]
+ public sbyte OutlineHollowAreasLineThickness {
+ get {
+ return ((sbyte)(this["OutlineHollowAreasLineThickness"]));
+ }
+ set {
+ this["OutlineHollowAreasLineThickness"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool OutlinePrintVolumeBounds {
+ get {
+ return ((bool)(this["OutlinePrintVolumeBounds"]));
+ }
+ set {
+ this["OutlinePrintVolumeBounds"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool OutlineLayerBounds {
+ get {
+ return ((bool)(this["OutlineLayerBounds"]));
+ }
+ set {
+ this["OutlineLayerBounds"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("False")]
+ public bool OutlineHollowAreas {
+ get {
+ return ((bool)(this["OutlineHollowAreas"]));
+ }
+ set {
+ this["OutlineHollowAreas"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("True")]
+ public bool ZoomToFitPrintVolumeBounds {
+ get {
+ return ((bool)(this["ZoomToFitPrintVolumeBounds"]));
+ }
+ set {
+ this["ZoomToFitPrintVolumeBounds"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("127")]
+ public byte ResinTrapBinaryThreshold {
+ get {
+ return ((byte)(this["ResinTrapBinaryThreshold"]));
+ }
+ set {
+ this["ResinTrapBinaryThreshold"] = value;
+ }
+ }
+
+ [global::System.Configuration.UserScopedSettingAttribute()]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Configuration.DefaultSettingValueAttribute("0")]
+ public byte IslandBinaryThreshold {
+ get {
+ return ((byte)(this["IslandBinaryThreshold"]));
+ }
+ set {
+ this["IslandBinaryThreshold"] = value;
+ }
+ }
}
}
diff --git a/UVtools.GUI/Properties/Settings.settings b/UVtools.GUI/Properties/Settings.settings
index 3964565..1a40bbb 100644
--- a/UVtools.GUI/Properties/Settings.settings
+++ b/UVtools.GUI/Properties/Settings.settings
@@ -1,7 +1,111 @@
<?xml version='1.0' encoding='utf-8'?>
-<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
- <Profiles>
- <Profile Name="(Default)" />
- </Profiles>
- <Settings />
-</SettingsFile>
+<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="UVtools.GUI.Properties" GeneratedClassName="Settings">
+ <Profiles />
+ <Settings>
+ <Setting Name="PreviousNextLayerColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Red</Value>
+ </Setting>
+ <Setting Name="IslandColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Yellow</Value>
+ </Setting>
+ <Setting Name="ResinTrapColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Orange</Value>
+ </Setting>
+ <Setting Name="TouchingBoundsColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Red</Value>
+ </Setting>
+ <Setting Name="PreviousLayerColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Magenta</Value>
+ </Setting>
+ <Setting Name="NextLayerColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Cyan</Value>
+ </Setting>
+ <Setting Name="UpdateSettings" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="StartMaximized" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="CheckForUpdatesOnStartup" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="LayerAutoRotateBestView" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="LayerDifferenceDefault" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="ComputeIssuesOnLoad" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="LayerZoomToFit" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="ComputeIslands" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="ComputeResinTraps" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="IslandRequiredAreaToProcessCheck" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">1</Value>
+ </Setting>
+ <Setting Name="IslandRequiredPixelBrightnessToProcessCheck" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">1</Value>
+ </Setting>
+ <Setting Name="IslandRequiredPixelsToSupport" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">10</Value>
+ </Setting>
+ <Setting Name="IslandRequiredPixelBrightnessToSupport" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">150</Value>
+ </Setting>
+ <Setting Name="ResinTrapRequiredAreaToProcessCheck" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">17</Value>
+ </Setting>
+ <Setting Name="ResinTrapRequiredBlackPixelsToDrain" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">10</Value>
+ </Setting>
+ <Setting Name="ResinTrapMaximumPixelBrightnessToDrain" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">30</Value>
+ </Setting>
+ <Setting Name="AutoComputeIssuesClickOnTab" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="OutlinePrintVolumeBoundsColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Lime</Value>
+ </Setting>
+ <Setting Name="OutlinePrintVolumeBoundsLineThickness" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">3</Value>
+ </Setting>
+ <Setting Name="OutlineLayerBoundsColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Lime</Value>
+ </Setting>
+ <Setting Name="OutlineLayerBoundsLineThickness" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">3</Value>
+ </Setting>
+ <Setting Name="OutlineHollowAreasColor" Type="System.Drawing.Color" Scope="User">
+ <Value Profile="(Default)">Orange</Value>
+ </Setting>
+ <Setting Name="OutlineHollowAreasLineThickness" Type="System.SByte" Scope="User">
+ <Value Profile="(Default)">3</Value>
+ </Setting>
+ <Setting Name="OutlinePrintVolumeBounds" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="OutlineLayerBounds" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="OutlineHollowAreas" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">False</Value>
+ </Setting>
+ <Setting Name="ZoomToFitPrintVolumeBounds" Type="System.Boolean" Scope="User">
+ <Value Profile="(Default)">True</Value>
+ </Setting>
+ <Setting Name="ResinTrapBinaryThreshold" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">127</Value>
+ </Setting>
+ <Setting Name="IslandBinaryThreshold" Type="System.Byte" Scope="User">
+ <Value Profile="(Default)">0</Value>
+ </Setting>
+ </Settings>
+</SettingsFile> \ No newline at end of file
diff --git a/UVtools.GUI/UVtools.GUI.csproj b/UVtools.GUI/UVtools.GUI.csproj
index cb1c952..66274c8 100644
--- a/UVtools.GUI/UVtools.GUI.csproj
+++ b/UVtools.GUI/UVtools.GUI.csproj
@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
- <Import Project="..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props')" />
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -63,9 +62,6 @@
<Reference Include="ApplicationManagement">
<HintPath>Libraries\ApplicationManagement.dll</HintPath>
</Reference>
- <Reference Include="BinarySerializer, Version=8.5.1.0, Culture=neutral, processorArchitecture=MSIL">
- <HintPath>..\packages\BinarySerializer.8.5.1\lib\net46\BinarySerializer.dll</HintPath>
- </Reference>
<Reference Include="Cyotek.Windows.Forms.ImageBox, Version=1.2.0.0, Culture=neutral, PublicKeyToken=58daa28b0b2de221, processorArchitecture=MSIL">
<HintPath>..\packages\CyotekImageBox.1.3.0-Alpha1\lib\net20\Cyotek.Windows.Forms.ImageBox.dll</HintPath>
</Reference>
@@ -75,9 +71,6 @@
<Reference Include="Emgu.CV.Platform.NetStandard, Version=4.3.0.3890, Culture=neutral, PublicKeyToken=7281126722ab4438, processorArchitecture=MSIL">
<HintPath>..\packages\Emgu.CV.4.3.0.3890\lib\net461\Emgu.CV.Platform.NetStandard.dll</HintPath>
</Reference>
- <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
- <HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
- </Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
@@ -94,16 +87,6 @@
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
- <Reference Include="System.Linq, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
- <HintPath>..\packages\System.Linq.4.3.0\lib\net463\System.Linq.dll</HintPath>
- <Private>True</Private>
- <Private>True</Private>
- </Reference>
- <Reference Include="System.Linq.Expressions, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
- <HintPath>..\packages\System.Linq.Expressions.4.3.0\lib\net463\System.Linq.Expressions.dll</HintPath>
- <Private>True</Private>
- <Private>True</Private>
- </Reference>
<Reference Include="System.Management" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
@@ -126,7 +109,7 @@
<Private>True</Private>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
- <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0-preview.5.20278.1\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
+ <HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0-preview.6.20305.6\lib\net45\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Extensions, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.Extensions.4.3.1\lib\net462\System.Runtime.Extensions.dll</HintPath>
@@ -149,6 +132,18 @@
<Compile Include="Forms\FrmInstallPEProfiles.Designer.cs">
<DependentUpon>FrmInstallPEProfiles.cs</DependentUpon>
</Compile>
+ <Compile Include="Forms\FrmMutationOneNumericalInput.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\FrmMutationOneNumericalInput.Designer.cs">
+ <DependentUpon>FrmMutationOneNumericalInput.cs</DependentUpon>
+ </Compile>
+ <Compile Include="Forms\FrmMutationOneComoboBox.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\FrmMutationOneComoboBox.Designer.cs">
+ <DependentUpon>FrmMutationOneComoboBox.cs</DependentUpon>
+ </Compile>
<Compile Include="Forms\FrmMutationResize.cs">
<SubType>Form</SubType>
</Compile>
@@ -185,6 +180,12 @@
<Compile Include="Forms\FrmLoading.Designer.cs">
<DependentUpon>FrmLoading.cs</DependentUpon>
</Compile>
+ <Compile Include="Forms\FrmSettings.cs">
+ <SubType>Form</SubType>
+ </Compile>
+ <Compile Include="Forms\FrmSettings.Designer.cs">
+ <DependentUpon>FrmSettings.cs</DependentUpon>
+ </Compile>
<Compile Include="FrmMain.cs">
<SubType>Form</SubType>
</Compile>
@@ -201,6 +202,12 @@
<EmbeddedResource Include="Forms\FrmInstallPEProfiles.resx">
<DependentUpon>FrmInstallPEProfiles.cs</DependentUpon>
</EmbeddedResource>
+ <EmbeddedResource Include="Forms\FrmMutationOneNumericalInput.resx">
+ <DependentUpon>FrmMutationOneNumericalInput.cs</DependentUpon>
+ </EmbeddedResource>
+ <EmbeddedResource Include="Forms\FrmMutationOneComoboBox.resx">
+ <DependentUpon>FrmMutationOneComoboBox.cs</DependentUpon>
+ </EmbeddedResource>
<EmbeddedResource Include="Forms\FrmMutationResize.resx">
<DependentUpon>FrmMutationResize.cs</DependentUpon>
</EmbeddedResource>
@@ -216,6 +223,9 @@
<EmbeddedResource Include="Forms\FrmLoading.resx">
<DependentUpon>FrmLoading.cs</DependentUpon>
</EmbeddedResource>
+ <EmbeddedResource Include="Forms\FrmSettings.resx">
+ <DependentUpon>FrmSettings.cs</DependentUpon>
+ </EmbeddedResource>
<EmbeddedResource Include="FrmMain.resx">
<DependentUpon>FrmMain.cs</DependentUpon>
</EmbeddedResource>
@@ -263,6 +273,7 @@
<None Include="Images\checkbox-unmarked-16x16.png" />
<None Include="Images\file-image-16x16.png" />
<None Include="Images\clipboard-16x16.png" />
+ <None Include="Images\settings-16x16.png" />
<Content Include="UVtools.ico" />
<None Include="UVtools.png" />
<None Include="Images\Exit-16x16.png" />
@@ -337,14 +348,14 @@
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
- <PostBuildEvent>xcopy /i /y /d /s $(ProjectDir)..\PrusaSlicer $(ProjectDir)$(OutDir)\PrusaSlicer</PostBuildEvent>
+ <PostBuildEvent>xcopy /i /y /d /s $(ProjectDir)..\PrusaSlicer $(ProjectDir)$(OutDir)\PrusaSlicer
+xcopy /d /y $(ProjectDir)..\UVtools.Cmd\$(OutDir)netcoreapp3.1\* $(ProjectDir)$(OutDir)</PostBuildEvent>
</PropertyGroup>
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets'))" />
- <Error Condition="!Exists('..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.Toolset.3.7.0-2.final\build\Microsoft.Net.Compilers.Toolset.props'))" />
</Target>
<Import Project="..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets" Condition="Exists('..\packages\Emgu.CV.runtime.windows.4.3.0.3890\build\Emgu.CV.runtime.windows.targets')" />
</Project> \ No newline at end of file
diff --git a/UVtools.GUI/packages.config b/UVtools.GUI/packages.config
index cb19e0e..1289075 100644
--- a/UVtools.GUI/packages.config
+++ b/UVtools.GUI/packages.config
@@ -1,24 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
- <package id="BinarySerializer" version="8.5.1" targetFramework="net48" />
<package id="CyotekImageBox" version="1.3.0-Alpha1" targetFramework="net48" />
<package id="Emgu.CV" version="4.3.0.3890" targetFramework="net48" />
<package id="Emgu.CV.runtime.windows" version="4.3.0.3890" targetFramework="net48" />
- <package id="Microsoft.Net.Compilers.Toolset" version="3.7.0-2.final" targetFramework="net48" developmentDependency="true" />
- <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net48" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
- <package id="System.Collections" version="4.3.0" targetFramework="net48" />
<package id="System.IO" version="4.3.0" targetFramework="net48" />
- <package id="System.Linq" version="4.3.0" targetFramework="net48" />
- <package id="System.Linq.Expressions" version="4.3.0" targetFramework="net48" />
<package id="System.Memory" version="4.5.4" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.Reflection" version="4.3.0" targetFramework="net48" />
- <package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net48" />
<package id="System.Reflection.TypeExtensions" version="4.7.0" targetFramework="net48" />
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime" version="4.3.1" targetFramework="net48" />
- <package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0-preview.5.20278.1" targetFramework="net48" />
+ <package id="System.Runtime.CompilerServices.Unsafe" version="5.0.0-preview.6.20305.6" targetFramework="net48" />
<package id="System.Runtime.Extensions" version="4.3.1" targetFramework="net48" />
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net48" />
<package id="System.Threading" version="4.3.0" targetFramework="net48" />