diff options
69 files changed, 2886 insertions, 636 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 3989409..16e1e67 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## 08/08/2021 - v2.17.0 + +- **Windows MSI:** + - (Fix) Use the folder programs x64 instead of x86 for new installation path (#254) + - (Improvement) Mark program and all files as x64 + - (Improvement) Add UVtools logo to side panel and top banner + - (Improvement) Add open-source logo to side panel + - (Improvement) License text aligment and bold title +- (Add) File format: OSLA / ODLP / OMSLA - Universal binary file format +- (Add) Calibration - Lift height: Generates test models with various strategies and increments to measure the optimal lift height or peel forces for layers given the printed area +- (Add) Layer Actions - Export layers to images (PNG, JPG/JPEG, JP2, TIF/TIFF, BMP, PBM, PGM, SR/RAS and SVG) +- (Add) About box: License with link +- (Add) Include a copy of the LICENSE on the packages +- (Improvement) File formats: Implement `Wait time before cure` properties on file formats with light-off delay, when used it will calculate the right light-off delay with that extra time and set to `LightOffDelay` property +- (Improvement) Change all date times to Utc instead of local +- (Fix) Tool - Flip: 'Both' were not working correctly +- (Fix) Linux: File 'UVtools.sh' with incorrect line break type, changed to \n (#258) + ## 01/08/2021 - v2.16.0 - **(Add) PrusaSlicer printers:** @@ -26,6 +26,7 @@ # Supporters / Contributors +- https://github.com/sponsors/sn4k3 - Ingo Strohmenger - Sven Vogt - Paul Hammerstrom @@ -57,4 +58,5 @@ - Finn Newick - Thomas Wilbert - Gary Kyle -- Peter Csaki
\ No newline at end of file +- Peter Csaki +- Chris Luginbuhl
\ No newline at end of file diff --git a/Documentation/osla.md b/Documentation/osla.md index 436a396..c4e83f5 100644 --- a/Documentation/osla.md +++ b/Documentation/osla.md @@ -91,8 +91,8 @@ eg: `PreviewDataType=RGB565` and `LayerDataType=PNG` ## Structure 1. [File] (150 bytes) -2. [Header] (197 bytes) -3. [Custom table] (0 or more bytes) +2. [Header] (199 bytes) +3. [Custom table] (4 bytes + 0 or more bytes) 4. [Previews] (0 or more) - Preview 1 (8 bytes + sizeof(preview image data)) - Preview 2 (8 bytes + sizeof(preview image data)) @@ -8,6 +8,7 @@ [![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/sn4k3/UVtools?include_prereleases&style=flat-square)](https://github.com/sn4k3/UVtools/releases) [![Downloads](https://img.shields.io/github/downloads/sn4k3/UVtools/total?style=flat-square)](https://github.com/sn4k3/UVtools/releases) +**Download the latest version at:** https://github.com/sn4k3/UVtools/releases/latest **MSLA/DLP, file analysis, calibration, repair, conversion and manipulation** diff --git a/UVtools.Core/About.cs b/UVtools.Core/About.cs index ba904d5..1bc41d5 100644 --- a/UVtools.Core/About.cs +++ b/UVtools.Core/About.cs @@ -13,15 +13,20 @@ namespace UVtools.Core { public static class About { - public static string Software = "UVtools"; - public static string Author = "Tiago Conceição"; - public static string Company = "PTRTECH"; - public static string Website = "https://github.com/sn4k3/UVtools"; - public static string Donate = "https://paypal.me/SkillTournament"; + public const string Software = "UVtools"; + public static string SoftwareWithVersion => $"{Software} v{VersionStr}"; + public const string Author = "Tiago Conceição"; + public const string Company = "PTRTECH"; + public const string License = "GNU Affero General Public License v3.0 (AGPL)"; + public const string LicenseUrl = "https://github.com/sn4k3/UVtools/blob/master/LICENSE"; + public const string Website = "https://github.com/sn4k3/UVtools"; + public const string Donate = "https://paypal.me/SkillTournament"; + public const string Sponsor = "https://github.com/sponsors/sn4k3"; - public static string DemoFile = "UVtools_demo_file.sl1"; + public const string DemoFile = "UVtools_demo_file.sl1"; public static Version Version => Assembly.GetExecutingAssembly().GetName().Version; public static string VersionStr => Assembly.GetExecutingAssembly().GetName().Version.ToString(3); + public static string Arch => Environment.Is64BitOperatingSystem ? "64-bits" : "32-bits"; } } diff --git a/UVtools.Core/Enumerations.cs b/UVtools.Core/Enumerations.cs index 468b389..98be0a5 100644 --- a/UVtools.Core/Enumerations.cs +++ b/UVtools.Core/Enumerations.cs @@ -5,7 +5,10 @@ * Everyone is permitted to copy and distribute verbatim copies * of this license document, but changing it is not allowed. */ + +using System; using System.ComponentModel; +using Emgu.CV.CvEnum; namespace UVtools.Core { @@ -24,11 +27,27 @@ namespace UVtools.Core public enum FlipDirection : byte { + None, Horizontally, Vertically, Both, } + public enum RotateDirection : sbyte + { + [Description("None")] + None = -1, + /// <summary>Rotate 90 degrees clockwise (0)</summary> + [Description("Rotate 90º CW")] + Rotate90Clockwise = 0, + /// <summary>Rotate 180 degrees clockwise (1)</summary> + [Description("Rotate 180º")] + Rotate180 = 1, + /// <summary>Rotate 270 degrees clockwise (2)</summary> + [Description("Rotate 90º CCW")] + Rotate90CounterClockwise = 2, + } + public enum Anchor : byte { TopLeft, TopCenter, TopRight, @@ -51,5 +70,29 @@ namespace UVtools.Core [Description("Disabled")] NoAction } + + public static FlipType ToOpenCVFlipType(FlipDirection flip) + { + return flip switch + { + FlipDirection.None => throw new NotSupportedException($"Flip type: {flip} is not supported by OpenCV."), + FlipDirection.Horizontally => FlipType.Horizontal, + FlipDirection.Vertically => FlipType.Vertical, + FlipDirection.Both => FlipType.Both, + _ => throw new ArgumentOutOfRangeException(nameof(flip), flip, null) + }; + } + + public static RotateFlags ToOpenCVRotateFlags(RotateDirection rotate) + { + return rotate switch + { + RotateDirection.None => throw new NotSupportedException($"Rotate direction: {rotate} is not supported by OpenCV."), + RotateDirection.Rotate90Clockwise => RotateFlags.Rotate90Clockwise, + RotateDirection.Rotate90CounterClockwise => RotateFlags.Rotate90CounterClockwise, + RotateDirection.Rotate180 => RotateFlags.Rotate180, + _ => throw new ArgumentOutOfRangeException(nameof(rotate), rotate, null) + }; + } } } diff --git a/UVtools.Core/Extensions/EnumExtensions.cs b/UVtools.Core/Extensions/EnumExtensions.cs index 493418c..6847164 100644 --- a/UVtools.Core/Extensions/EnumExtensions.cs +++ b/UVtools.Core/Extensions/EnumExtensions.cs @@ -33,7 +33,7 @@ namespace UVtools.Core.Extensions if (!t.IsEnum) throw new ArgumentException($"{nameof(t)} must be an enum type"); - return Enum.GetValues(t).Cast<Enum>().Select(e => new ValueDescription(e, e.GetDescription())).ToList(); + return Enum.GetValues(t).Cast<Enum>().OrderBy(e => e).Select(e => new ValueDescription(e, e.GetDescription())).ToList(); } } } diff --git a/UVtools.Core/Extensions/FileStreamExtensions.cs b/UVtools.Core/Extensions/FileStreamExtensions.cs index 02fba02..c9b530c 100644 --- a/UVtools.Core/Extensions/FileStreamExtensions.cs +++ b/UVtools.Core/Extensions/FileStreamExtensions.cs @@ -24,6 +24,9 @@ namespace UVtools.Core.Extensions return buffer; } + public static byte[] ReadBytes(this FileStream fs, uint length, int offset = 0) + => fs.ReadBytes((int)length, offset); + public static uint ReadUShortLittleEndian(this FileStream fs, int offset = 0) { return BitExtensions.ToUShortLittleEndian(fs.ReadBytes(2, offset)); @@ -44,6 +47,26 @@ namespace UVtools.Core.Extensions return BitExtensions.ToUIntBigEndian(fs.ReadBytes(4, offset)); } + public static void WriteUShortLittleEndian(this FileStream fs, ushort value, int offset = 0) + { + fs.WriteBytes(BitExtensions.ToBytesLittleEndian(value), offset); + } + + public static void WriteUShortBigEndian(this FileStream fs, ushort value, int offset = 0) + { + fs.WriteBytes(BitExtensions.ToBytesBigEndian(value), offset); + } + + public static void WriteUIntLittleEndian(this FileStream fs, uint value, int offset = 0) + { + fs.WriteBytes(BitExtensions.ToBytesLittleEndian(value), offset); + } + + public static void WriteUIntBigEndian(this FileStream fs, uint value, int offset = 0) + { + fs.WriteBytes(BitExtensions.ToBytesBigEndian(value), offset); + } + public static uint WriteStream(this FileStream fs, MemoryStream stream, int offset = 0) { return fs.WriteBytes(stream.ToArray(), offset); diff --git a/UVtools.Core/FileFormats/CWSFile.cs b/UVtools.Core/FileFormats/CWSFile.cs index ca8388b..40f4ca1 100644 --- a/UVtools.Core/FileFormats/CWSFile.cs +++ b/UVtools.Core/FileFormats/CWSFile.cs @@ -398,7 +398,7 @@ namespace UVtools.Core.FileFormats set => base.MachineZ = OutputSettings.PlatformZSize = (float)Math.Round(value, 2); } - public override bool MirrorDisplay + public override bool DisplayMirror { get => OutputSettings.FlipX; set @@ -546,7 +546,7 @@ namespace UVtools.Core.FileFormats GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Partial, GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.MillimetersPerMinute, GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds, - GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.LayerIndexZero, + GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.LayerIndex0Started, LayerMoveCommand = GCodeBuilder.GCodeMoveCommands.G1, EndGCodeMoveCommand = GCodeBuilder.GCodeMoveCommands.G1 }; @@ -629,7 +629,7 @@ namespace UVtools.Core.FileFormats var entry = outputFile.CreateEntry("slice.conf"); using TextWriter tw = new StreamWriter(entry.Open()); - tw.WriteLine($"# {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.Now}"); + tw.WriteLine($"# {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.UtcNow}"); tw.WriteLine("# conf version 1.0"); tw.WriteLine(""); @@ -875,7 +875,7 @@ namespace UVtools.Core.FileFormats if (!SupportsGCode || SuppressRebuildGCode) return; //string arch = Environment.Is64BitOperatingSystem ? "64-bits" : "32-bits"; //GCode.Clear(); - //GCode.AppendLine($"; {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.Now}"); + //GCode.AppendLine($"; {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.UtcNow}"); StringBuilder sb = new(); sb.AppendLine(";(**** Build and Slicing Parameters ****)"); @@ -1005,7 +1005,7 @@ namespace UVtools.Core.FileFormats using (TextWriter tw = new StreamWriter(stream)) { - tw.WriteLine($"# {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.Now}"); + tw.WriteLine($"# {About.Website} {About.Software} {Assembly.GetExecutingAssembly().GetName().Version} {arch} {DateTime.UtcNow}"); tw.WriteLine("# conf version 1.0"); tw.WriteLine(""); diff --git a/UVtools.Core/FileFormats/CXDLPFile.cs b/UVtools.Core/FileFormats/CXDLPFile.cs index 1e93bda..f6f9d6d 100644 --- a/UVtools.Core/FileFormats/CXDLPFile.cs +++ b/UVtools.Core/FileFormats/CXDLPFile.cs @@ -492,6 +492,26 @@ namespace UVtools.Core.FileFormats set => base.LightOffDelay = SlicerInfoSettings.LightOffDelay = (ushort)value; } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float BottomExposureTime { get => SlicerInfoSettings.BottomExposureTime; diff --git a/UVtools.Core/FileFormats/CXDLPv1File.cs b/UVtools.Core/FileFormats/CXDLPv1File.cs index 0e96f5a..752cebc 100644 --- a/UVtools.Core/FileFormats/CXDLPv1File.cs +++ b/UVtools.Core/FileFormats/CXDLPv1File.cs @@ -441,6 +441,26 @@ namespace UVtools.Core.FileFormats set => base.LightOffDelay = SlicerInfoSettings.LightOffDelay = (ushort)value; } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float BottomExposureTime { get => SlicerInfoSettings.BottomExposureTime; diff --git a/UVtools.Core/FileFormats/ChituboxFile.cs b/UVtools.Core/FileFormats/ChituboxFile.cs index 512ae46..d2fdc78 100644 --- a/UVtools.Core/FileFormats/ChituboxFile.cs +++ b/UVtools.Core/FileFormats/ChituboxFile.cs @@ -27,21 +27,31 @@ namespace UVtools.Core.FileFormats { #region Constants - private const uint MAGIC_CBDDLP = 0x12FD0019; // 318570521 - private const uint MAGIC_CBT = 0x12FD0086; // 318570630 - private const uint MAGIC_CBTv4 = 0x12FD0106; // 318570758 - private const ushort REPEATRGB15MASK = 0x20; + public const uint MAGIC_CBDDLP = 0x12FD0019; // 318570521 + public const uint MAGIC_CBT = 0x12FD0086; // 318570630 + public const uint MAGIC_CBTv4 = 0x12FD0106; // 318570758 + public const uint MAGIC_CBT_ENCRYPTED = 0x12FD0107; // 318570759 + public const ushort REPEATRGB15MASK = 0x20; - private const byte RLE8EncodingLimit = 0x7d; // 125; - private const ushort RLE16EncodingLimit = 0xFFF; + public const byte RLE8EncodingLimit = 0x7d; // 125; + public const ushort RLE16EncodingLimit = 0xFFF; - private const uint ENCRYPTYION_MODE_CBDDLP = 0x8; // 0 or 8 - private const uint ENCRYPTYION_MODE_CTBv2 = 0xF; // 15 for ctb v2 files - private const uint ENCRYPTYION_MODE_CTBv3 = 536870927; // 536870927 for ctb v3 files (This allow per layer settings, while 15 don't) - private const uint ENCRYPTYION_MODE_CTBv4 = 1073741839; // 1073741839 for ctb v3 files (This allow per layer settings, while 15 don't) + public const uint ENCRYPTYION_MODE_CBDDLP = 0x8; // 0 or 8 + public const uint ENCRYPTYION_MODE_CTBv2 = 0xF; // 15 for ctb v2 files + public const uint ENCRYPTYION_MODE_CTBv3 = 536870927; // 536870927 for ctb v3 files (This allow per layer settings, while 15 don't) + public const uint ENCRYPTYION_MODE_CTBv4 = 1073741839; // 1073741839 for ctb v3 files (This allow per layer settings, while 15 don't) private const string CTBv4_DISCLAIMER = "Layout and record format for the ctb and cbddlp file types are the copyrighted programs or codes of CBD Technology (China) Inc..The Customer or User shall not in any manner reproduce, distribute, modify, decompile, disassemble, decrypt, extract, reverse engineer, lease, assign, or sublicense the said programs or codes."; private const ushort CTBv4_DISCLAIMER_SIZE = 320; + + public static readonly byte[] SomethingNew1 = { + 0xD0, 0x5B, 0x8E, 0x33, 0x71, 0xDE, 0x3D, 0x1A, 0xE5, 0x4F, 0x22, 0xDD, 0xDF, 0x5B, 0xFD, 0x94, + 0xAB, 0x5D, 0x64, 0x3A, 0x9D, 0x7E, 0xBF, 0xAF, 0x42, 0x03, 0xF3, 0x10, 0xD8, 0x52, 0x2A, 0xEA + }; + + public static readonly byte[] SomethingNew2 = { + 0x0F, 0x01, 0x0A, 0x05, 0x05, 0x0B, 0x06, 0x07, 0x08, 0x06, 0x0A, 0x0C, 0x0C, 0x0D, 0x09, 0x0F + }; #endregion #region Sub Classes @@ -1060,7 +1070,7 @@ namespace UVtools.Core.FileFormats public LayerData[,] LayerDefinitions { get; private set; } - public Dictionary<string, LayerData> LayersHash { get; } = new Dictionary<string, LayerData>(); + public Dictionary<string, LayerData> LayersHash { get; } = new(); public override FileFormatType FileType => FileFormatType.Binary; @@ -1233,7 +1243,7 @@ namespace UVtools.Core.FileFormats set => base.MachineZ = HeaderSettings.BedSizeZ = (float)Math.Round(value, 2); } - public override bool MirrorDisplay + public override bool DisplayMirror { get => HeaderSettings.ProjectorType > 0; set @@ -1321,7 +1331,21 @@ namespace UVtools.Core.FileFormats } } - public override float BottomWaitTimeBeforeCure => WaitTimeBeforeCure; + public override float BottomWaitTimeBeforeCure + { + get => WaitTimeBeforeCure; + set + { + if (HeaderSettings.Version < 4) + { + if (value > 0) + { + SetBottomLightOffDelay(value); + } + } + } + } + public override float WaitTimeBeforeCure { get => HeaderSettings.Version >= 4 ? PrintParametersV4Settings.RestTimeAfterRetract : 0; @@ -1331,7 +1355,6 @@ namespace UVtools.Core.FileFormats { if (value > 0) { - SetBottomLightOffDelay(value); SetNormalLightOffDelay(value); } @@ -1729,7 +1752,7 @@ namespace UVtools.Core.FileFormats FileFullPath = fileFullPath; - progress.Reset(OperationProgress.StatusDecodeThumbnails, ThumbnailsCount); + progress.Reset(OperationProgress.StatusDecodePreviews, ThumbnailsCount); Debug.Write("Header -> "); Debug.WriteLine(HeaderSettings); diff --git a/UVtools.Core/FileFormats/ChituboxZipFile.cs b/UVtools.Core/FileFormats/ChituboxZipFile.cs index 6a29dff..7d663e8 100644 --- a/UVtools.Core/FileFormats/ChituboxZipFile.cs +++ b/UVtools.Core/FileFormats/ChituboxZipFile.cs @@ -168,7 +168,7 @@ namespace UVtools.Core.FileFormats set => base.MachineZ = HeaderSettings.MachineZ = (float)Math.Round(value, 2); } - public override bool MirrorDisplay + public override bool DisplayMirror { get => HeaderSettings.Mirror > 0; set @@ -360,7 +360,7 @@ namespace UVtools.Core.FileFormats GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Absolute, GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.MillimetersPerMinute, GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds, - GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.FilenameNonZeroPNG, + GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.FilenamePng1Started, LayerMoveCommand = GCodeBuilder.GCodeMoveCommands.G0, EndGCodeMoveCommand = GCodeBuilder.GCodeMoveCommands.G1 }; @@ -468,9 +468,6 @@ namespace UVtools.Core.FileFormats progress.ItemCount = LayerCount; - var gcode = GCodeStr; - float lastPostZ = LayerHeight; - for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++) { if (progress.Token.IsCancellationRequested) break; diff --git a/UVtools.Core/FileFormats/FDGFile.cs b/UVtools.Core/FileFormats/FDGFile.cs index cab1b55..a80e0c1 100644 --- a/UVtools.Core/FileFormats/FDGFile.cs +++ b/UVtools.Core/FileFormats/FDGFile.cs @@ -751,7 +751,7 @@ namespace UVtools.Core.FileFormats set => base.MachineZ = HeaderSettings.BedSizeZ = (float)Math.Round(value, 2); } - public override bool MirrorDisplay + public override bool DisplayMirror { get => HeaderSettings.ProjectorType > 0; set @@ -811,6 +811,26 @@ namespace UVtools.Core.FileFormats set => base.LightOffDelay = HeaderSettings.LightOffDelay = (float)Math.Round(value, 2); } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float BottomExposureTime { get => HeaderSettings.BottomExposureSeconds; @@ -1070,7 +1090,7 @@ namespace UVtools.Core.FileFormats FileFullPath = fileFullPath; - progress.Reset(OperationProgress.StatusDecodeThumbnails, ThumbnailsCount); + progress.Reset(OperationProgress.StatusDecodePreviews, ThumbnailsCount); Debug.Write("Header -> "); Debug.WriteLine(HeaderSettings); diff --git a/UVtools.Core/FileFormats/FileFormat.cs b/UVtools.Core/FileFormats/FileFormat.cs index 5f627c4..465e68a 100644 --- a/UVtools.Core/FileFormats/FileFormat.cs +++ b/UVtools.Core/FileFormats/FileFormat.cs @@ -235,6 +235,7 @@ namespace UVtools.Core.FileFormats new FDGFile(), // fdg new PhotonWorkshopFile(), // PSW new CWSFile(), // CWS + new OSLAFile(), // OSLA new ZCodeFile(), // zcode new ZCodexFile(), // zcodex new MDLPFile(), // MKS v1 @@ -487,6 +488,9 @@ namespace UVtools.Core.FileFormats /// </summary> public string FileFullPath { get; set; } + public string Filename => Path.GetFileName(FileFullPath); + public string FilenameNoExt => GetFileNameStripExtensions(FileFullPath); + /// <summary> /// Gets the thumbnails count present in this file format /// </summary> @@ -640,7 +644,7 @@ namespace UVtools.Core.FileFormats /// <summary> /// Gets or sets if images need to be mirrored on lcd to print on the correct orientation /// </summary> - public virtual bool MirrorDisplay { get; set; } + public virtual bool DisplayMirror { get; set; } /// <summary> /// Gets if the display is in portrait mode @@ -827,22 +831,49 @@ namespace UVtools.Core.FileFormats /// </summary> public uint NormalLayerCount => LayerCount - BottomLayerCount; + /// <summary> + /// Gets or sets the bottom layer off time in seconds + /// </summary> + public virtual float BottomLightOffDelay + { + get => _bottomLightOffDelay; + set + { + RaiseAndSet(ref _bottomLightOffDelay, (float)Math.Round(value, 2)); + RaisePropertyChanged(nameof(LightOffDelayRepresentation)); + } + } + + /// <summary> + /// Gets or sets the layer off time in seconds + /// </summary> + public virtual float LightOffDelay + { + get => _lightOffDelay; + set + { + RaiseAndSet(ref _lightOffDelay, (float)Math.Round(value, 2)); + RaisePropertyChanged(nameof(LightOffDelayRepresentation)); + } + } + public virtual float BottomWaitTimeBeforeCure { get => _bottomWaitTimeBeforeCure; set { - RaiseAndSet(ref _bottomWaitTimeBeforeCure, value); + RaiseAndSet(ref _bottomWaitTimeBeforeCure, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(WaitTimeRepresentation)); } } + public virtual float WaitTimeBeforeCure { get => _waitTimeBeforeCure; set { - RaiseAndSet(ref _waitTimeBeforeCure, value); + RaiseAndSet(ref _waitTimeBeforeCure, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(WaitTimeRepresentation)); } } @@ -855,7 +886,7 @@ namespace UVtools.Core.FileFormats get => _bottomExposureTime; set { - RaiseAndSet(ref _bottomExposureTime, value); + RaiseAndSet(ref _bottomExposureTime, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(ExposureRepresentation)); } } @@ -868,7 +899,7 @@ namespace UVtools.Core.FileFormats get => _exposureTime; set { - RaiseAndSet(ref _exposureTime, value); + RaiseAndSet(ref _exposureTime, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(ExposureRepresentation)); } } @@ -878,7 +909,7 @@ namespace UVtools.Core.FileFormats get => _bottomWaitTimeAfterCure; set { - RaiseAndSet(ref _bottomWaitTimeAfterCure, value); + RaiseAndSet(ref _bottomWaitTimeAfterCure, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(WaitTimeRepresentation)); } } @@ -888,7 +919,7 @@ namespace UVtools.Core.FileFormats get => _waitTimeAfterCure; set { - RaiseAndSet(ref _waitTimeAfterCure, value); + RaiseAndSet(ref _waitTimeAfterCure, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(WaitTimeRepresentation)); } } @@ -901,7 +932,7 @@ namespace UVtools.Core.FileFormats get => _bottomLiftHeight; set { - RaiseAndSet(ref _bottomLiftHeight, value); + RaiseAndSet(ref _bottomLiftHeight, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(LiftRepresentation)); } } @@ -914,7 +945,7 @@ namespace UVtools.Core.FileFormats get => _liftHeight; set { - RaiseAndSet(ref _liftHeight, value); + RaiseAndSet(ref _liftHeight, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(LiftRepresentation)); } } @@ -927,7 +958,7 @@ namespace UVtools.Core.FileFormats get => _bottomLiftSpeed; set { - RaiseAndSet(ref _bottomLiftSpeed, value); + RaiseAndSet(ref _bottomLiftSpeed, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(LiftRepresentation)); } } @@ -940,7 +971,7 @@ namespace UVtools.Core.FileFormats get => _liftSpeed; set { - RaiseAndSet(ref _liftSpeed, value); + RaiseAndSet(ref _liftSpeed, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(LiftRepresentation)); } } @@ -950,7 +981,7 @@ namespace UVtools.Core.FileFormats get => _bottomWaitTimeAfterLift; set { - RaiseAndSet(ref _bottomWaitTimeAfterLift, value); + RaiseAndSet(ref _bottomWaitTimeAfterLift, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(WaitTimeRepresentation)); } } @@ -960,7 +991,7 @@ namespace UVtools.Core.FileFormats get => _waitTimeAfterLift; set { - RaiseAndSet(ref _waitTimeAfterLift, value); + RaiseAndSet(ref _waitTimeAfterLift, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(WaitTimeRepresentation)); } } @@ -973,38 +1004,12 @@ namespace UVtools.Core.FileFormats get => _retractSpeed; set { - RaiseAndSet(ref _retractSpeed, value); + RaiseAndSet(ref _retractSpeed, (float)Math.Round(value, 2)); RaisePropertyChanged(nameof(RetractRepresentation)); } } /// <summary> - /// Gets or sets the bottom layer off time in seconds - /// </summary> - public virtual float BottomLightOffDelay - { - get => _bottomLightOffDelay; - set - { - RaiseAndSet(ref _bottomLightOffDelay, value); - RaisePropertyChanged(nameof(LightOffDelayRepresentation)); - } - } - - /// <summary> - /// Gets or sets the layer off time in seconds - /// </summary> - public virtual float LightOffDelay - { - get => _lightOffDelay; - set - { - RaiseAndSet(ref _lightOffDelay, value); - RaisePropertyChanged(nameof(LightOffDelayRepresentation)); - } - } - - /// <summary> /// Gets or sets the bottom pwm value from 0 to 255 /// </summary> public virtual byte BottomLightPWM @@ -1547,7 +1552,7 @@ namespace UVtools.Core.FileFormats if (Thumbnails is not null) { - for (int i = 0; i < ThumbnailsCount; i++) + for (int i = 0; i < Thumbnails.Length; i++) { Thumbnails[i]?.Dispose(); } @@ -2316,6 +2321,7 @@ namespace UVtools.Core.FileFormats public float CalculateLightOffDelay(bool isBottomLayer, float extraTime = 0) { + extraTime = (float)Math.Round(extraTime, 2); if (SupportsGCode) return extraTime; return isBottomLayer ? OperationCalculator.LightOffDelayC.CalculateSeconds(BottomLiftHeight, BottomLiftSpeed, RetractSpeed, extraTime) @@ -2401,34 +2407,38 @@ namespace UVtools.Core.FileFormats slicerFile.DisplayWidth = DisplayWidth; slicerFile.DisplayHeight = DisplayHeight; slicerFile.MachineZ = MachineZ; - slicerFile.MirrorDisplay = MirrorDisplay; - - slicerFile.BottomLightOffDelay = BottomLightOffDelay; - slicerFile.LightOffDelay = LightOffDelay; - - slicerFile.BottomWaitTimeBeforeCure = BottomWaitTimeBeforeCure; - slicerFile.WaitTimeBeforeCure = WaitTimeBeforeCure; + slicerFile.DisplayMirror = DisplayMirror; + // Exposure slicerFile.BottomExposureTime = BottomExposureTime; slicerFile.ExposureTime = ExposureTime; - slicerFile.BottomWaitTimeAfterCure = BottomWaitTimeAfterCure; - slicerFile.WaitTimeAfterCure = WaitTimeAfterCure; - + // Lift slicerFile.BottomLiftHeight = BottomLiftHeight; slicerFile.LiftHeight = LiftHeight; slicerFile.BottomLiftSpeed = BottomLiftSpeed; slicerFile.LiftSpeed = LiftSpeed; + + slicerFile.RetractSpeed = RetractSpeed; + + // Wait times + slicerFile.BottomLightOffDelay = BottomLightOffDelay; + slicerFile.LightOffDelay = LightOffDelay; + + slicerFile.BottomWaitTimeBeforeCure = BottomWaitTimeBeforeCure; + slicerFile.WaitTimeBeforeCure = WaitTimeBeforeCure; + + slicerFile.BottomWaitTimeAfterCure = BottomWaitTimeAfterCure; + slicerFile.WaitTimeAfterCure = WaitTimeAfterCure; slicerFile.BottomWaitTimeAfterLift = BottomWaitTimeAfterLift; slicerFile.WaitTimeAfterLift = WaitTimeAfterLift; - slicerFile.RetractSpeed = RetractSpeed; - slicerFile.BottomLightPWM = BottomLightPWM; slicerFile.LightPWM = LightPWM; + slicerFile.MachineName = MachineName; slicerFile.MaterialName = MaterialName; slicerFile.MaterialMilliliters = MaterialMilliliters; diff --git a/UVtools.Core/FileFormats/GR1File.cs b/UVtools.Core/FileFormats/GR1File.cs index 34993bf..fdf8ef2 100644 --- a/UVtools.Core/FileFormats/GR1File.cs +++ b/UVtools.Core/FileFormats/GR1File.cs @@ -230,7 +230,7 @@ namespace UVtools.Core.FileFormats } } - public override bool MirrorDisplay { get; set; } + public override bool DisplayMirror { get; set; } public override byte AntiAliasing { @@ -276,6 +276,26 @@ namespace UVtools.Core.FileFormats set => base.LightOffDelay = SlicerInfoSettings.LightOffDelay = (ushort)value; } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float BottomExposureTime { get => SlicerInfoSettings.BottomExposureTime; diff --git a/UVtools.Core/FileFormats/ImageFile.cs b/UVtools.Core/FileFormats/ImageFile.cs index 42c4323..07f5139 100644 --- a/UVtools.Core/FileFormats/ImageFile.cs +++ b/UVtools.Core/FileFormats/ImageFile.cs @@ -59,7 +59,7 @@ namespace UVtools.Core.FileFormats } } - public override bool MirrorDisplay + public override bool DisplayMirror { get => false; set { } diff --git a/UVtools.Core/FileFormats/LGSFile.cs b/UVtools.Core/FileFormats/LGSFile.cs index b5dc348..5ecbe22 100644 --- a/UVtools.Core/FileFormats/LGSFile.cs +++ b/UVtools.Core/FileFormats/LGSFile.cs @@ -326,7 +326,7 @@ namespace UVtools.Core.FileFormats set => base.MachineZ = HeaderSettings.MachineZ = (float)Math.Round(value, 2); } - public override bool MirrorDisplay + public override bool DisplayMirror { get => true; set { } @@ -384,6 +384,26 @@ namespace UVtools.Core.FileFormats } } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float BottomExposureTime { get => TimeExtensions.MillisecondsToSeconds(HeaderSettings.BottomExposureTimeMs); diff --git a/UVtools.Core/FileFormats/MDLPFile.cs b/UVtools.Core/FileFormats/MDLPFile.cs index 2899843..babe25b 100644 --- a/UVtools.Core/FileFormats/MDLPFile.cs +++ b/UVtools.Core/FileFormats/MDLPFile.cs @@ -234,7 +234,7 @@ namespace UVtools.Core.FileFormats } } - public override bool MirrorDisplay { get; set; } + public override bool DisplayMirror { get; set; } public override byte AntiAliasing { @@ -280,6 +280,26 @@ namespace UVtools.Core.FileFormats set => base.LightOffDelay = SlicerInfoSettings.LightOffDelay = (ushort)value; } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float BottomExposureTime { get => SlicerInfoSettings.BottomExposureTime; diff --git a/UVtools.Core/FileFormats/OSLAFile.cs b/UVtools.Core/FileFormats/OSLAFile.cs new file mode 100644 index 0000000..94d956d --- /dev/null +++ b/UVtools.Core/FileFormats/OSLAFile.cs @@ -0,0 +1,800 @@ +/* + * 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. + */ + +// https://github.com/sn4k3/UVtools/blob/master/Documentation/osla.md + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using BinarySerialization; +using Emgu.CV; +using Emgu.CV.CvEnum; +using MoreLinq; +using UVtools.Core.Extensions; +using UVtools.Core.GCode; +using UVtools.Core.Operations; + +namespace UVtools.Core.FileFormats +{ + public class OSLAFile : FileFormat + { + #region Constants + + public const string MARKER = "OSLATiCo"; + #endregion + + #region Sub Classes + #region Header + public class FileDef + { + [FieldOrder(0)] + [FieldLength(8)] + public string Marker { get; set; } = MARKER; + + [FieldOrder(1)] + public ushort Version { get; set; } = 0; + + [FieldOrder(2)] + [FieldLength(20)] + public string CreatedDateTime { get; set; } = DateTime.UtcNow.ToString("u"); + + [FieldOrder(3)] + [FieldLength(50)] + [SerializeAs(SerializedType.TerminatedString)] + public string CreatedBy { get; set; } = About.SoftwareWithVersion; + + [FieldOrder(4)] + [FieldLength(20)] + public string ModifiedDateTime { get; set; } = DateTime.UtcNow.ToString("u"); + + [FieldOrder(5)] + [FieldLength(50)] + [SerializeAs(SerializedType.TerminatedString)] + public string ModifiedBy { get; set; } = About.SoftwareWithVersion; + + public override string ToString() + { + return $"{nameof(Marker)}: {Marker}, {nameof(Version)}: {Version}, {nameof(CreatedDateTime)}: {CreatedDateTime}, {nameof(CreatedBy)}: {CreatedBy}, {nameof(ModifiedDateTime)}: {ModifiedDateTime}, {nameof(ModifiedBy)}: {ModifiedBy}"; + } + + public void Update() + { + ModifiedDateTime= DateTime.UtcNow.ToString("u"); + ModifiedBy = About.SoftwareWithVersion;; + } + + public void Validate() + { + if (Marker != MARKER) + { + throw new FileLoadException($"Invalid marker: {Marker}, not a valid OSLA file."); + } + } + } + + + public class Header + { + [FieldOrder(0)] public uint TableSize { get; set; } + [FieldOrder(1)] public uint ResolutionX { get; set; } + [FieldOrder(2)] public uint ResolutionY { get; set; } + [FieldOrder(3)] public float MachineZ { get; set; } + [FieldOrder(4)] public float DisplayWidth { get; set; } + [FieldOrder(5)] public float DisplayHeight { get; set; } + [FieldOrder(6)] public byte DisplayMirror { get; set; } // 0 = No mirror | 1 = Horizontally | 2 = Vertically | 3 = Horizontally+Vertically | >3 = No mirror + [FieldOrder(7)] [FieldLength(16)] [SerializeAs(SerializedType.TerminatedString)] public string PreviewDataType { get; set; } = "RGB565"; + [FieldOrder(8)] [FieldLength(16)] [SerializeAs(SerializedType.TerminatedString)] public string LayerDataType { get; set; } = "PNG"; + [FieldOrder(9)] public uint PreviewTableSize { get; set; } = 8; + [FieldOrder(10)] public uint PreviewCount { get; set; } + [FieldOrder(11)] public float LayerHeight { get; set; } = 0.05f; + [FieldOrder(12)] public ushort BottomLayersCount { get; set; } = 4; + [FieldOrder(13)] public uint LayerCount { get; set; } + [FieldOrder(14)] public uint LayerTableSize { get; set; } = 4; + [FieldOrder(15)] public uint LayerDefinitionsAddress { get; set; } + [FieldOrder(16)] public uint GCodeAddress { get; set; } + [FieldOrder(17)] public uint PrintTime { get; set; } + [FieldOrder(18)] public float MaterialMilliliters { get; set; } + [FieldOrder(19)] public float MaterialCost { get; set; } + [FieldOrder(20)] [FieldLength(50)] [SerializeAs(SerializedType.TerminatedString)] public string MaterialName { get; set; } + [FieldOrder(21)] [FieldLength(50)] [SerializeAs(SerializedType.TerminatedString)] public string MachineName { get; set; } = "Unknown"; + + public override string ToString() + { + return $"{nameof(TableSize)}: {TableSize}, {nameof(ResolutionX)}: {ResolutionX}, {nameof(ResolutionY)}: {ResolutionY}, {nameof(MachineZ)}: {MachineZ}, {nameof(DisplayWidth)}: {DisplayWidth}, {nameof(DisplayHeight)}: {DisplayHeight}, {nameof(DisplayMirror)}: {DisplayMirror}, {nameof(PreviewDataType)}: {PreviewDataType}, {nameof(LayerDataType)}: {LayerDataType}, {nameof(PreviewTableSize)}: {PreviewTableSize}, {nameof(PreviewCount)}: {PreviewCount}, {nameof(LayerTableSize)}: {LayerTableSize}, {nameof(BottomLayersCount)}: {BottomLayersCount}, {nameof(LayerCount)}: {LayerCount}, {nameof(LayerDefinitionsAddress)}: {LayerDefinitionsAddress}, {nameof(GCodeAddress)}: {GCodeAddress}, {nameof(PrintTime)}: {PrintTime}, {nameof(MaterialMilliliters)}: {MaterialMilliliters}, {nameof(MaterialCost)}: {MaterialCost}, {nameof(MaterialName)}: {MaterialName}, {nameof(MachineName)}: {MachineName}"; + } + } + #endregion + + #region Custom Table + + public class CustomTable + { + [FieldOrder(0)] public uint TableSize { get; set; } + + [FieldOrder(1)] [FieldCount(nameof(TableSize))] public byte[] Bytes { get; set; } = Array.Empty<byte>(); + + public override string ToString() + { + return $"{nameof(TableSize)}: {TableSize}, {nameof(Bytes)}: {Bytes.Length}"; + } + } + + #endregion + + #region Preview + public class Preview + { + /// <summary> + /// Gets the X dimension of the preview image, in pixels. + /// </summary> + [FieldOrder(0)] public ushort ResolutionX { get; set; } + + /// <summary> + /// Gets the Y dimension of the preview image, in pixels. + /// </summary> + [FieldOrder(1)] public ushort ResolutionY { get; set; } + + /// <summary> + /// Gets the image length in bytes. + /// </summary> + [FieldOrder(2)] public uint ImageLength { get; set; } + //[FieldOrder(3)] [FieldCount(nameof(ImageLength))] public byte[] ImageData { get; set; } + + + public override string ToString() + { + return $"{nameof(ResolutionX)}: {ResolutionX}, {nameof(ResolutionY)}: {ResolutionY}, {nameof(ImageLength)}: {ImageLength}"; + } + } + + #endregion + + #region Layer + public class LayerDef + { + [FieldOrder(0)] public uint DataAddress { get; set; } + + [Ignore] public byte[] ImageData { get; set; } + + public LayerDef() + { + } + + public override string ToString() + { + return $"{nameof(DataAddress)}: {DataAddress}, {nameof(ImageData)}: {ImageData.Length}"; + } + } + #endregion + + #region GCode + + public class GCodeDef + { + [FieldOrder(0)] + public uint GCodeSize { get; set; } + + [FieldOrder(1)] [FieldLength(nameof(GCodeSize))] + public string GCodeText { get; set; } + } + #endregion + + #endregion + + #region Properties + + public FileDef FileSettings { get; protected internal set; } = new(); + public Header HeaderSettings { get; protected internal set; } = new(); + public CustomTable CustomTableSettings { get; protected internal set; } = new(); + public Preview[] Previews { get; protected internal set; } + + public override FileFormatType FileType => FileFormatType.Binary; + + public override FileExtension[] FileExtensions { get; } = { + new ("osla", "Open SLA universal binary file"), + //new ("omsla", "Open mSLA universal binary file"), + //new ("odlp", "Open DLP universal binary file"), + }; + + public override PrintParameterModifier[] PrintParameterModifiers { get; } = + { + PrintParameterModifier.BottomLayerCount, + + PrintParameterModifier.BottomWaitTimeBeforeCure, + PrintParameterModifier.WaitTimeBeforeCure, + + PrintParameterModifier.BottomExposureTime, + PrintParameterModifier.ExposureTime, + + PrintParameterModifier.BottomWaitTimeAfterCure, + PrintParameterModifier.WaitTimeAfterCure, + + PrintParameterModifier.BottomLiftHeight, + PrintParameterModifier.BottomLiftSpeed, + PrintParameterModifier.LiftHeight, + PrintParameterModifier.LiftSpeed, + + PrintParameterModifier.BottomWaitTimeAfterLift, + PrintParameterModifier.WaitTimeAfterLift, + + PrintParameterModifier.RetractSpeed, + + + PrintParameterModifier.BottomLightPWM, + PrintParameterModifier.LightPWM, + }; + + public override PrintParameterModifier[] PrintParameterPerLayerModifiers { get; } = { + PrintParameterModifier.WaitTimeBeforeCure, + PrintParameterModifier.ExposureTime, + PrintParameterModifier.WaitTimeAfterCure, + PrintParameterModifier.LiftHeight, + PrintParameterModifier.LiftSpeed, + PrintParameterModifier.WaitTimeAfterLift, + PrintParameterModifier.RetractSpeed, + PrintParameterModifier.LightPWM, + }; + + public override Size[] ThumbnailsOriginalSize { get; } = + { + new(400, 400), + new(200, 200) + }; + + public override uint ResolutionX + { + get => HeaderSettings.ResolutionX; + set + { + HeaderSettings.ResolutionX = value; + RaisePropertyChanged(); + } + } + + public override uint ResolutionY + { + get => HeaderSettings.ResolutionY; + set + { + HeaderSettings.ResolutionY = value; + RaisePropertyChanged(); + } + } + + public override float DisplayWidth + { + get => HeaderSettings.DisplayWidth; + set + { + HeaderSettings.DisplayWidth = (float)Math.Round(value, 2); + RaisePropertyChanged(); + } + } + + + public override float DisplayHeight + { + get => HeaderSettings.DisplayHeight; + set + { + HeaderSettings.DisplayHeight = (float)Math.Round(value, 2); + RaisePropertyChanged(); + } + } + + public override float MachineZ + { + get => HeaderSettings.MachineZ > 0 ? HeaderSettings.MachineZ : base.MachineZ; + set + { + HeaderSettings.MachineZ = (float)Math.Round(value, 2); + RaisePropertyChanged(); + } + } + + public override bool DisplayMirror + { + get => HeaderSettings.DisplayMirror is >= 1 and <= 3; + set + { + HeaderSettings.DisplayMirror = value ? (byte)1 : (byte)0; + RaisePropertyChanged(); + } + } + + public override byte AntiAliasing + { + get => 8; + set => RaisePropertyChanged(); + } + + public override float LayerHeight + { + get => HeaderSettings.LayerHeight; + set + { + HeaderSettings.LayerHeight = Layer.RoundHeight(value); + RaisePropertyChanged(); + } + } + + public override uint LayerCount + { + get => base.LayerCount; + set => HeaderSettings.LayerCount = base.LayerCount; + } + + public override ushort BottomLayerCount + { + get => HeaderSettings.BottomLayersCount; + set => base.BottomLayerCount = HeaderSettings.BottomLayersCount = value; + } + + public override float PrintTime + { + get => base.PrintTime; + set + { + base.PrintTime = value; + HeaderSettings.PrintTime = (uint)base.PrintTime; + } + } + + public override float MaterialMilliliters + { + get => base.MaterialMilliliters; + set + { + base.MaterialMilliliters = value; + HeaderSettings.MaterialMilliliters = base.MaterialMilliliters; + } + } + + public override float MaterialCost + { + get => (float) Math.Round(HeaderSettings.MaterialCost, 3); + set => base.MaterialCost = HeaderSettings.MaterialCost = (float)Math.Round(value, 3); + } + + public override string MaterialName + { + get => HeaderSettings.MaterialName; + set => base.MaterialName = HeaderSettings.MaterialName = value; + } + + public override string MachineName + { + get => HeaderSettings.MachineName; + set => base.MachineName = HeaderSettings.MachineName = value; + } + + public override object[] Configs => new object[] { FileSettings, HeaderSettings }; + + #endregion + + #region Constructors + public OSLAFile() + { + //Previews = new Preview[ThumbnailsCount]; + GCode = new GCodeBuilder + { + UseTailComma = true, + UseComments = true, + GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Absolute, + GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.MillimetersPerMinute, + GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds, + GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.LayerIndex0Started, + LayerMoveCommand = GCodeBuilder.GCodeMoveCommands.G0, + EndGCodeMoveCommand = GCodeBuilder.GCodeMoveCommands.G0, + CommandShowImageM6054 = {Arguments = "{0}"}, + }; + } + #endregion + + #region Methods + public override void Clear() + { + base.Clear(); + + Previews = null; + } + + protected override void EncodeInternally(string fileFullPath, OperationProgress progress) + { + using var outputFile = new FileStream(fileFullPath, FileMode.Create, FileAccess.Write); + FileSettings.Update(); + var fileDefSize = Helpers.SerializeWriteFileStream(outputFile, FileSettings); + HeaderSettings.TableSize = (uint)Helpers.Serializer.SizeOf(HeaderSettings); + + outputFile.Seek((int)HeaderSettings.TableSize, SeekOrigin.Current); + + Helpers.SerializeWriteFileStream(outputFile, CustomTableSettings); // Custom table + + // Previews + progress.Reset(OperationProgress.StatusEncodePreviews, ThumbnailsCount); + HeaderSettings.PreviewCount = 0; + uint sizeofPreview = 0; + for (byte i = 0; i < ThumbnailsCount; i++) + { + var image = Thumbnails[i]; + if(image is null) continue; + + progress.Token.ThrowIfCancellationRequested(); + + var bytes = EncodeImage(image, HeaderSettings.PreviewDataType); + if (bytes.Length == 0) continue; + var preview = new Preview + { + ResolutionX = (ushort) image.Width, + ResolutionY = (ushort) image.Height, + ImageLength = (uint) bytes.Length, + }; + + if (sizeofPreview == 0) + { + sizeofPreview = (uint) Helpers.Serializer.SizeOf(preview); + } + + HeaderSettings.PreviewCount++; + + Helpers.SerializeWriteFileStream(outputFile, preview); + // Need to fill what we don't know + if (HeaderSettings.PreviewTableSize > sizeofPreview) + { + outputFile.Seek(HeaderSettings.LayerTableSize - sizeofPreview, SeekOrigin.Current); + } + outputFile.WriteBytes(bytes); + + progress++; + } + + uint[] layerDataAddresses = new uint[LayerCount]; + progress.Reset(OperationProgress.StatusEncodeLayers, LayerCount); + HeaderSettings.LayerDefinitionsAddress = (uint) outputFile.Position; + + outputFile.Seek(HeaderSettings.LayerTableSize * LayerCount, SeekOrigin.Current); // Start of layer data + + var layerHash = new Dictionary<string, uint>(); + + var range = Enumerable.Range(0, (int)LayerCount); + foreach (var batch in range.Batch(Environment.ProcessorCount * 10)) + { + var layerBytes = new byte[LayerCount][]; + + Parallel.ForEach(batch, layerIndex => + { + if (progress.Token.IsCancellationRequested) return; + using var mat = this[layerIndex].LayerMat; + layerBytes[layerIndex] = EncodeImage(mat, HeaderSettings.LayerDataType); + progress.LockAndIncrement(); + }); + + foreach (var layerIndex in batch) + { + progress.Token.ThrowIfCancellationRequested(); + + // Try to reuse layers + var hash = Helpers.ComputeSHA1Hash(layerBytes[layerIndex]); + if (layerHash.TryGetValue(hash, out var address)) + { + layerDataAddresses[layerIndex] = address; + } + else + { + layerDataAddresses[layerIndex] = (uint)outputFile.Position; + outputFile.WriteUIntLittleEndian((uint)layerBytes[layerIndex].Length); + outputFile.WriteBytes(layerBytes[layerIndex]); + layerHash.Add(hash, layerDataAddresses[layerIndex]); + } + + + + layerBytes[layerIndex] = null; // Clean + } + } + + HeaderSettings.GCodeAddress = (uint)outputFile.Position; + + outputFile.Seek(HeaderSettings.LayerDefinitionsAddress, SeekOrigin.Begin); + for (int i = 0; i < layerDataAddresses.Length; i++) + { + progress.Token.ThrowIfCancellationRequested(); + outputFile.WriteUIntLittleEndian(layerDataAddresses[i]); + // Need to fill what we don't know + if (HeaderSettings.LayerTableSize > 4) + { + outputFile.Seek(HeaderSettings.LayerTableSize - 4, SeekOrigin.Current); + } + } + + progress.Reset(OperationProgress.StatusEncodeGcode); + outputFile.Seek(HeaderSettings.GCodeAddress, SeekOrigin.Begin); + RebuildGCode(); + var gcodeSettings = new GCodeDef { GCodeText = GCodeStr }; + gcodeSettings.GCodeSize = (uint)gcodeSettings.GCodeText.Length; + Helpers.SerializeWriteFileStream(outputFile, gcodeSettings); + + outputFile.Seek(fileDefSize, SeekOrigin.Begin); + Helpers.SerializeWriteFileStream(outputFile, HeaderSettings); + + Debug.WriteLine("Encode Results:"); + Debug.WriteLine(FileSettings); + Debug.WriteLine(HeaderSettings); + Debug.WriteLine("-End-"); + } + + protected override void DecodeInternally(string fileFullPath, OperationProgress progress) + { + using var inputFile = new FileStream(fileFullPath, FileMode.Open, FileAccess.Read); + FileSettings = Helpers.Deserialize<FileDef>(inputFile); + Debug.Write("File -> "); + Debug.WriteLine(FileSettings); + FileSettings.Validate(); + + HeaderSettings = Helpers.Deserialize<Header>(inputFile); + Debug.Write("Header -> "); + Debug.WriteLine(HeaderSettings); + + var headerSize = Helpers.Serializer.SizeOf(HeaderSettings); + if (HeaderSettings.TableSize > headerSize) // By pass what we dont know + { + inputFile.Seek(HeaderSettings.TableSize - headerSize, SeekOrigin.Current); + } + + CustomTableSettings = Helpers.Deserialize<CustomTable>(inputFile); + Debug.Write("Custom table -> "); + Debug.WriteLine(CustomTableSettings); + + progress.Reset(OperationProgress.StatusDecodePreviews, ThumbnailsCount); + + Previews = new Preview[HeaderSettings.PreviewCount]; + for (byte i = 0; i < HeaderSettings.PreviewCount; i++) + { + progress.Token.ThrowIfCancellationRequested(); + Previews[i] = Helpers.Deserialize<Preview>(inputFile); + + Debug.Write($"Preview {i} -> "); + Debug.WriteLine(Previews[i]); + + // Need to fill what we don't know + if (HeaderSettings.PreviewTableSize > 8) + { + inputFile.Seek(HeaderSettings.LayerTableSize - 8, SeekOrigin.Current); + } + + + var bytes = inputFile.ReadBytes((int)Previews[i].ImageLength); + + Thumbnails[i] = DecodeImage(bytes, HeaderSettings.PreviewDataType, Previews[i].ResolutionX, Previews[i].ResolutionY); + progress++; + } + + inputFile.Seek(HeaderSettings.LayerDefinitionsAddress, SeekOrigin.Begin); + + LayerManager.Init(HeaderSettings.LayerCount); + progress.Reset(OperationProgress.StatusGatherLayers, HeaderSettings.LayerCount); + uint[] layerDataAddresses = new uint[LayerCount]; + for (uint layerIndex = 0; layerIndex < HeaderSettings.LayerCount; layerIndex++) + { + progress.Token.ThrowIfCancellationRequested(); + layerDataAddresses[layerIndex] = inputFile.ReadUIntLittleEndian(); + if (HeaderSettings.LayerTableSize > 4) + { + inputFile.Seek(HeaderSettings.LayerTableSize - 4, SeekOrigin.Current); + } + + progress++; + } + + + + progress.Reset(OperationProgress.StatusDecodeLayers, HeaderSettings.LayerCount); + var range = Enumerable.Range(0, (int)LayerCount); + foreach (var batch in MoreEnumerable.Batch(range, Environment.ProcessorCount * 10)) + { + var layerBytes = new byte[LayerCount][]; + + foreach (var layerIndex in batch) + { + progress.Token.ThrowIfCancellationRequested(); + + inputFile.Seek(layerDataAddresses[layerIndex], SeekOrigin.Begin); + layerBytes[layerIndex] = inputFile.ReadBytes(inputFile.ReadUIntLittleEndian()); + } + + Parallel.ForEach(batch, layerIndex => + { + if (progress.Token.IsCancellationRequested) return; + using var mat = DecodeImage(layerBytes[layerIndex], HeaderSettings.LayerDataType, Resolution); + this[layerIndex] = new Layer((uint)layerIndex, mat, this); + layerBytes[layerIndex] = null; // Clean + + progress.LockAndIncrement(); + }); + } + + progress.Reset(OperationProgress.StatusDecodeGcode); + inputFile.Seek(HeaderSettings.GCodeAddress, SeekOrigin.Begin); + var gcodeDef = Helpers.Deserialize<GCodeDef>(inputFile); + GCodeStr = gcodeDef.GCodeText; + GCode.ParseLayersFromGCode(this); + } + + public override void SaveAs(string filePath = null, OperationProgress progress = null) + { + if (RequireFullEncode) + { + if (!string.IsNullOrEmpty(filePath)) + { + FileFullPath = filePath; + } + Encode(FileFullPath, progress); + return; + } + + if (!string.IsNullOrEmpty(filePath)) + { + File.Copy(FileFullPath, filePath, true); + FileFullPath = filePath; + } + + using var outputFile = new FileStream(FileFullPath, FileMode.Open, FileAccess.Write); + outputFile.Seek(0, SeekOrigin.Begin); + FileSettings.Update(); + Helpers.SerializeWriteFileStream(outputFile, FileSettings); + Helpers.SerializeWriteFileStream(outputFile, HeaderSettings); + + outputFile.Seek(HeaderSettings.GCodeAddress, SeekOrigin.Begin); + outputFile.SetLength(HeaderSettings.GCodeAddress); + + RebuildGCode(); + var gcodeSettings = new GCodeDef {GCodeText = GCodeStr}; + gcodeSettings.GCodeSize = (uint) gcodeSettings.GCodeText.Length; + Helpers.SerializeWriteFileStream(outputFile, gcodeSettings); + } + #endregion + + #region Static Methods + + public static byte[] EncodeImage(Mat mat, string encodeTo) + { + encodeTo = encodeTo.ToUpperInvariant(); + if (encodeTo is "PNG" or "JPG" or "JPEG" or "JP2" or "BMP" or "TIF" or "TIFF" or "PPM" or "PMG" or "SR" or "RAS") + { + return CvInvoke.Imencode($".{encodeTo.ToLowerInvariant()}", mat); + } + + if (encodeTo is "RGB555" or "RGB565" or "RGB888" + or "BGR555" or "BGR565" or "BGR888") + { + var bytesPerPixel = encodeTo is "RGB888" or "BGR888" ? 3 : 2; + var bytes = new byte[mat.Width * mat.Height * bytesPerPixel]; + uint index = 0; + var span = mat.GetDataByteSpan(); + for (int i = 0; i < span.Length;) + { + byte b = span[i++]; + byte g; + byte r; + + if (mat.NumberOfChannels == 1) // 8 bit safe-guard + { + r = g = b; + } + else + { + g = span[i++]; + r = span[i++]; + } + + if (mat.NumberOfChannels == 4) i++; // skip alpha + + switch (encodeTo) + { + case "RGB555": + var rgb555 = (ushort) (((r & 0b11111000) << 7) | ((g & 0b11111000) << 2) | (b >> 3)); + BitExtensions.ToBytesLittleEndian(rgb555, bytes, index); + index += 2; + break; + case "RGB565": + var rgb565 = (ushort) (((r & 0b11111000) << 8) | ((g & 0b11111100) << 3) | (b >> 3)); + BitExtensions.ToBytesLittleEndian(rgb565, bytes, index); + index += 2; + break; + case "RGB888": + bytes[index++] = r; + bytes[index++] = g; + bytes[index++] = b; + break; + } + } + + return bytes; + } + + throw new NotSupportedException($"The encode type: {encodeTo} is not supported."); + } + + public static Mat DecodeImage(byte[] bytes, string decodeFrom, Size resolution) + { + if (decodeFrom is "PNG" or "JPG" or "JPEG" or "JP2" or "BMP" or "TIF" or "TIFF" or "PPM" or "PMG" or "SR" or "RAS") + { + var mat = new Mat(); + CvInvoke.Imdecode(bytes, ImreadModes.AnyColor, mat); + return mat; + } + + if (decodeFrom is "RGB555" or "RGB565" or "RGB888" + or "BGR555" or "BGR565" or "BGR888") + { + var mat = new Mat(resolution, DepthType.Cv8U, 3); + var span = mat.GetDataByteSpan(); + var pixel = 0; + for (int i = 0; i < bytes.Length;) + { + switch (decodeFrom) + { + case "RGB555": + ushort rgb555 = BitExtensions.ToUShortLittleEndian(bytes, i); + span[pixel++] = (byte)((rgb555 & 0b00000000_00011111) << 3); // b + span[pixel++] = (byte)((rgb555 & 0b00000011_11100000) >> 2); // g + span[pixel++] = (byte)((rgb555 & 0b01111100_00000000) >> 7); // r + i += 2; + break; + case "RGB565": + ushort rgb565 = BitExtensions.ToUShortLittleEndian(bytes, i); + span[pixel++] = (byte)((rgb565 & 0b00000000_00011111) << 3); // b + span[pixel++] = (byte)((rgb565 & 0b00000111_11100000) >> 3); // g + span[pixel++] = (byte)((rgb565 & 0b11111000_00000000) >> 8); // r + i += 2; + break; + case "RGB888": + span[pixel++] = bytes[i + 2]; // b + span[pixel++] = bytes[i + 1]; // g + span[pixel++] = bytes[i]; // r + i += 3; + break; + case "BGR555": + ushort bgr555 = BitExtensions.ToUShortLittleEndian(bytes, i); + span[pixel++] = (byte)((bgr555 & 0b01111100_00000000) >> 7); // b + span[pixel++] = (byte)((bgr555 & 0b00000011_11100000) >> 2); // g + span[pixel++] = (byte)((bgr555 & 0b00000000_00011111) << 3); // r + i += 2; + break; + case "BGR565": + ushort bgr565 = BitExtensions.ToUShortLittleEndian(bytes, i); + span[pixel++] = (byte)((bgr565 & 0b11111000_00000000) >> 8); // b + span[pixel++] = (byte)((bgr565 & 0b00000111_11100000) >> 3); // g + span[pixel++] = (byte)((bgr565 & 0b00000000_00011111) << 3); // r + i += 2; + break; + case "BGR888": + span[pixel++] = bytes[i]; // b + span[pixel++] = bytes[i+1]; // g + span[pixel++] = bytes[i+2]; // r + i += 3; + break; + } + } + return mat; + } + + throw new NotSupportedException($"The decode type: {decodeFrom} is not supported."); + } + + public static Mat DecodeImage(byte[] bytes, string decodeFrom, uint resolutionX = 0, uint resolutionY = 0) + => DecodeImage(bytes, decodeFrom, new Size((int) resolutionX, (int) resolutionY)); + + + #endregion + } +} diff --git a/UVtools.Core/FileFormats/PHZFile.cs b/UVtools.Core/FileFormats/PHZFile.cs index c9a34ab..65e7819 100644 --- a/UVtools.Core/FileFormats/PHZFile.cs +++ b/UVtools.Core/FileFormats/PHZFile.cs @@ -775,7 +775,7 @@ namespace UVtools.Core.FileFormats } } - public override bool MirrorDisplay + public override bool DisplayMirror { get => HeaderSettings.ProjectorType > 0; set @@ -841,6 +841,26 @@ namespace UVtools.Core.FileFormats set => base.BottomExposureTime = HeaderSettings.BottomExposureSeconds = (float)Math.Round(value, 2); } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float ExposureTime { get => HeaderSettings.LayerExposureSeconds; @@ -1094,7 +1114,7 @@ namespace UVtools.Core.FileFormats HeaderSettings.AntiAliasLevel = 1; - progress.Reset(OperationProgress.StatusDecodeThumbnails, ThumbnailsCount); + progress.Reset(OperationProgress.StatusDecodePreviews, ThumbnailsCount); Debug.Write("Header -> "); Debug.WriteLine(HeaderSettings); diff --git a/UVtools.Core/FileFormats/PhotonSFile.cs b/UVtools.Core/FileFormats/PhotonSFile.cs index 2195e9d..21436be 100644 --- a/UVtools.Core/FileFormats/PhotonSFile.cs +++ b/UVtools.Core/FileFormats/PhotonSFile.cs @@ -273,7 +273,7 @@ namespace UVtools.Core.FileFormats set { } } - public override bool MirrorDisplay + public override bool DisplayMirror { get => true; set { } @@ -321,10 +321,30 @@ namespace UVtools.Core.FileFormats set => base.LightOffDelay = (float)(HeaderSettings.LightOffDelay = Math.Round(value, 2)); } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float BottomExposureTime { get => (float) HeaderSettings.BottomExposureSeconds; - set => base.BottomExposureTime = (float) (HeaderSettings.BottomExposureSeconds = value); + set => base.BottomExposureTime = (float) (HeaderSettings.BottomExposureSeconds = Math.Round(value, 2)); } public override float ExposureTime diff --git a/UVtools.Core/FileFormats/PhotonWorkshopFile.cs b/UVtools.Core/FileFormats/PhotonWorkshopFile.cs index 0c733b9..b442a57 100644 --- a/UVtools.Core/FileFormats/PhotonWorkshopFile.cs +++ b/UVtools.Core/FileFormats/PhotonWorkshopFile.cs @@ -1041,7 +1041,7 @@ namespace UVtools.Core.FileFormats set { } } - public override bool MirrorDisplay + public override bool DisplayMirror { get => true; set {} @@ -1090,6 +1090,26 @@ namespace UVtools.Core.FileFormats set => base.LightOffDelay = HeaderSettings.LightOffDelay = (float)Math.Round(value, 2); } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float BottomExposureTime { get => HeaderSettings.BottomExposureSeconds; diff --git a/UVtools.Core/FileFormats/SL1File.cs b/UVtools.Core/FileFormats/SL1File.cs index c4580cd..763d021 100644 --- a/UVtools.Core/FileFormats/SL1File.cs +++ b/UVtools.Core/FileFormats/SL1File.cs @@ -267,7 +267,7 @@ namespace UVtools.Core.FileFormats get { //2021-01-23 at 04:07:36 UTC - var now = DateTime.Now; + var now = DateTime.UtcNow; return $"{now.Year}-{now.Month:D2}-{now.Day:D2} at {now.Hour:D2}:{now.Minute:D2}:{now.Second:D2} {now.Kind}"; } set{} @@ -375,7 +375,7 @@ namespace UVtools.Core.FileFormats } } - public override bool MirrorDisplay + public override bool DisplayMirror { get => PrinterSettings.DisplayMirrorX || PrinterSettings.DisplayMirrorY; set diff --git a/UVtools.Core/FileFormats/UVJFile.cs b/UVtools.Core/FileFormats/UVJFile.cs index f6e96ab..24e160f 100644 --- a/UVtools.Core/FileFormats/UVJFile.cs +++ b/UVtools.Core/FileFormats/UVJFile.cs @@ -210,7 +210,7 @@ namespace UVtools.Core.FileFormats } } - public override bool MirrorDisplay { get; set; } + public override bool DisplayMirror { get; set; } public override byte AntiAliasing { @@ -251,6 +251,26 @@ namespace UVtools.Core.FileFormats set => base.LightOffDelay = JsonSettings.Properties.Exposure.LightOffTime = (float)Math.Round(value, 2); } + public override float BottomWaitTimeBeforeCure + { + get => base.BottomWaitTimeBeforeCure; + set + { + SetBottomLightOffDelay(value); + base.BottomWaitTimeBeforeCure = value; + } + } + + public override float WaitTimeBeforeCure + { + get => base.WaitTimeBeforeCure; + set + { + SetNormalLightOffDelay(value); + base.WaitTimeBeforeCure = value; + } + } + public override float BottomLiftHeight { get => JsonSettings.Properties.Bottom.LiftHeight; diff --git a/UVtools.Core/FileFormats/VDAFile.cs b/UVtools.Core/FileFormats/VDAFile.cs index 126c325..ab4a0fd 100644 --- a/UVtools.Core/FileFormats/VDAFile.cs +++ b/UVtools.Core/FileFormats/VDAFile.cs @@ -60,11 +60,11 @@ namespace UVtools.Core.FileFormats public VDABy By { get; set; } = new(); - public string When { get; set; } = DateTime.Now.ToString("u"); + public string When { get; set; } = DateTime.UtcNow.ToString("u"); public void Reset() { - When = DateTime.Now.ToString("u"); + When = DateTime.UtcNow.ToString("u"); By.Reset(); } } diff --git a/UVtools.Core/FileFormats/VDTFile.cs b/UVtools.Core/FileFormats/VDTFile.cs index 7657917..9dfc917 100644 --- a/UVtools.Core/FileFormats/VDTFile.cs +++ b/UVtools.Core/FileFormats/VDTFile.cs @@ -44,7 +44,7 @@ namespace UVtools.Core.FileFormats [JsonProperty("application_version")] public string ApplicationVersion { get; set; } = "2.1.15.14"; //2021-04-09 17:48:46 - [JsonProperty("create_datetime")] public string CreateDateTime { get; set; } = DateTime.Now.ToString("u"); + [JsonProperty("create_datetime")] public string CreateDateTime { get; set; } = DateTime.UtcNow.ToString("u"); [JsonProperty("file_version")] public byte FileVersion { get; set; } = 1; @@ -257,7 +257,7 @@ namespace UVtools.Core.FileFormats } } - public override bool MirrorDisplay => ManifestFile.Machine.XMirror || ManifestFile.Machine.YMirror; + public override bool DisplayMirror => ManifestFile.Machine.XMirror || ManifestFile.Machine.YMirror; public override byte AntiAliasing { @@ -442,7 +442,7 @@ namespace UVtools.Core.FileFormats public void RebuildVDTLayers() { - ManifestFile.CreateDateTime = DateTime.Now.ToString("u"); + ManifestFile.CreateDateTime = DateTime.UtcNow.ToString("u"); var layers = new VDTLayer[LayerCount]; for (uint layerIndex = 0; layerIndex < LayerCount; layerIndex++) { diff --git a/UVtools.Core/FileFormats/ZCodeFile.cs b/UVtools.Core/FileFormats/ZCodeFile.cs index 4b62ea3..643f14d 100644 --- a/UVtools.Core/FileFormats/ZCodeFile.cs +++ b/UVtools.Core/FileFormats/ZCodeFile.cs @@ -273,7 +273,7 @@ namespace UVtools.Core.FileFormats } } - public override bool MirrorDisplay => true; + public override bool DisplayMirror => true; public override byte AntiAliasing { @@ -456,7 +456,7 @@ namespace UVtools.Core.FileFormats GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Absolute, GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.CentimetersPerMinute, GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds, - GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.FilenameNonZeroPNG, + GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.FilenamePng1Started, LayerMoveCommand = GCodeBuilder.GCodeMoveCommands.G0, EndGCodeMoveCommand = GCodeBuilder.GCodeMoveCommands.G1, MaxLEDPower = MaxLEDPower, diff --git a/UVtools.Core/FileFormats/ZCodexFile.cs b/UVtools.Core/FileFormats/ZCodexFile.cs index 0239e4d..a268d32 100644 --- a/UVtools.Core/FileFormats/ZCodexFile.cs +++ b/UVtools.Core/FileFormats/ZCodexFile.cs @@ -209,7 +209,7 @@ namespace UVtools.Core.FileFormats set { } } - public override bool MirrorDisplay + public override bool DisplayMirror { get => true; set { } @@ -364,7 +364,7 @@ namespace UVtools.Core.FileFormats GCodePositioningType = GCodeBuilder.GCodePositioningTypes.Partial, GCodeSpeedUnit = GCodeBuilder.GCodeSpeedUnits.MillimetersPerMinute, GCodeTimeUnit = GCodeBuilder.GCodeTimeUnits.Milliseconds, - GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.LayerIndexZero, + GCodeShowImageType = GCodeBuilder.GCodeShowImageTypes.LayerIndex0Started, LayerMoveCommand = GCodeBuilder.GCodeMoveCommands.G1, EndGCodeMoveCommand = GCodeBuilder.GCodeMoveCommands.G1 }; diff --git a/UVtools.Core/GCode/GCodeBuilder.cs b/UVtools.Core/GCode/GCodeBuilder.cs index 282c624..e53faa2 100644 --- a/UVtools.Core/GCode/GCodeBuilder.cs +++ b/UVtools.Core/GCode/GCodeBuilder.cs @@ -15,7 +15,6 @@ using System.Linq; using System.Reflection; using System.Text; using System.Text.RegularExpressions; -using Org.BouncyCastle.Asn1.Cms; using UVtools.Core.Extensions; using UVtools.Core.FileFormats; using UVtools.Core.Objects; @@ -89,10 +88,10 @@ namespace UVtools.Core.GCode public enum GCodeShowImageTypes : byte { - FilenameZeroPNG, - FilenameNonZeroPNG, - LayerIndexZero, - LayerIndexNonZero, + FilenamePng0Started, + FilenamePng1Started, + LayerIndex0Started, + LayerIndex1Started, } #endregion @@ -103,7 +102,7 @@ namespace UVtools.Core.GCode private GCodePositioningTypes _gCodePositioningType = GCodePositioningTypes.Absolute; private GCodeTimeUnits _gCodeTimeUnit = GCodeTimeUnits.Milliseconds; private GCodeSpeedUnits _gCodeSpeedUnit = GCodeSpeedUnits.MillimetersPerMinute; - private GCodeShowImageTypes _gCodeShowImageType = GCodeShowImageTypes.FilenameNonZeroPNG; + private GCodeShowImageTypes _gCodeShowImageType = GCodeShowImageTypes.FilenamePng1Started; private bool _syncMovementsWithDelay; private bool _useTailComma = true; private bool _useComments = true; @@ -308,9 +307,7 @@ namespace UVtools.Core.GCode public void AppendUVtools() { - string arch = Environment.Is64BitOperatingSystem ? "64-bits" : "32-bits"; - var version = Assembly.GetExecutingAssembly().GetName().Version; - AppendComment($"Generated by {About.Software} v{version.ToString(3)} {arch} @ {DateTime.Now}"); + AppendComment($"Generated by {About.Software} v{About.VersionStr} {About.Arch} @ {DateTime.UtcNow}"); } public void AppendStartGCode() @@ -538,19 +535,19 @@ namespace UVtools.Core.GCode public string GetShowImageString(uint layerIndex) => _gCodeShowImageType switch { - GCodeShowImageTypes.FilenameZeroPNG => $"{layerIndex}.png", - GCodeShowImageTypes.FilenameNonZeroPNG => $"{layerIndex + 1}.png", - GCodeShowImageTypes.LayerIndexZero => $"{layerIndex}", - GCodeShowImageTypes.LayerIndexNonZero => $"{layerIndex + 1}", + GCodeShowImageTypes.FilenamePng0Started => $"{layerIndex}.png", + GCodeShowImageTypes.FilenamePng1Started => $"{layerIndex + 1}.png", + GCodeShowImageTypes.LayerIndex0Started => $"{layerIndex}", + GCodeShowImageTypes.LayerIndex1Started => $"{layerIndex + 1}", _ => throw new InvalidExpressionException($"Unhandled image type for {_gCodeShowImageType}") }; public string GetShowImageString(string value) => _gCodeShowImageType switch { - GCodeShowImageTypes.FilenameZeroPNG => $"{value}.png", - GCodeShowImageTypes.FilenameNonZeroPNG => $"{value}.png", - GCodeShowImageTypes.LayerIndexZero => $"{value}", - GCodeShowImageTypes.LayerIndexNonZero => $"{value}", + GCodeShowImageTypes.FilenamePng0Started => $"{value}.png", + GCodeShowImageTypes.FilenamePng1Started => $"{value}.png", + GCodeShowImageTypes.LayerIndex0Started => $"{value}", + GCodeShowImageTypes.LayerIndex1Started => $"{value}", _ => throw new InvalidExpressionException($"Unhandled image type for {_gCodeShowImageType}") }; @@ -752,8 +749,8 @@ namespace UVtools.Core.GCode if (match.Success && match.Groups.Count >= 2) // Begin new layer { var layerIndex = uint.Parse(match.Groups[1].Value); - if (_gCodeShowImageType is GCodeShowImageTypes.FilenameNonZeroPNG or GCodeShowImageTypes - .LayerIndexNonZero) layerIndex--; + if (_gCodeShowImageType is GCodeShowImageTypes.FilenamePng1Started or GCodeShowImageTypes + .LayerIndex1Started) layerIndex--; if (layerIndex > slicerFile.LayerCount) { throw new FileLoadException( diff --git a/UVtools.Core/Layer/Layer.cs b/UVtools.Core/Layer/Layer.cs index c8ed94d..7ae01d0 100644 --- a/UVtools.Core/Layer/Layer.cs +++ b/UVtools.Core/Layer/Layer.cs @@ -561,16 +561,16 @@ namespace UVtools.Core $"{nameof(BoundingRectangle)}: {BoundingRectangle}, " + $"{nameof(IsBottomLayer)}: {IsBottomLayer}, " + $"{nameof(IsNormalLayer)}: {IsNormalLayer}, " + - $"{nameof(LayerHeight)}: {LayerHeight}, " + - $"{nameof(PositionZ)}: {PositionZ}, " + - $"{nameof(LightOffDelay)}: {LightOffDelay}, " + - $"{nameof(WaitTimeBeforeCure)}: {WaitTimeBeforeCure}, " + - $"{nameof(ExposureTime)}: {ExposureTime}, " + - $"{nameof(WaitTimeAfterCure)}: {WaitTimeAfterCure}, " + - $"{nameof(LiftHeight)}: {LiftHeight}, " + - $"{nameof(LiftSpeed)}: {LiftSpeed}, " + - $"{nameof(WaitTimeAfterLift)}: {WaitTimeAfterLift}, " + - $"{nameof(RetractSpeed)}: {RetractSpeed}, " + + $"{nameof(LayerHeight)}: {LayerHeight}mm, " + + $"{nameof(PositionZ)}: {PositionZ}mm, " + + $"{nameof(LightOffDelay)}: {LightOffDelay}s, " + + $"{nameof(WaitTimeBeforeCure)}: {WaitTimeBeforeCure}s, " + + $"{nameof(ExposureTime)}: {ExposureTime}s, " + + $"{nameof(WaitTimeAfterCure)}: {WaitTimeAfterCure}s, " + + $"{nameof(LiftHeight)}: {LiftHeight}mm, " + + $"{nameof(LiftSpeed)}: {LiftSpeed}mm/mim, " + + $"{nameof(WaitTimeAfterLift)}: {WaitTimeAfterLift}s, " + + $"{nameof(RetractSpeed)}: {RetractSpeed}mm/mim, " + $"{nameof(LightPWM)}: {LightPWM}, " + $"{nameof(IsModified)}: {IsModified}, " + $"{nameof(HaveGlobalParameters)}: {HaveGlobalParameters}"; @@ -606,21 +606,21 @@ namespace UVtools.Core WaitTimeAfterLift = 0; } - public string FormatFileName(string prepend, byte padDigits, bool layerIndexZeroStarted = true) + public string FormatFileName(string prepend, byte padDigits, bool layerIndexZeroStarted = true, string appendExt = ".png") { var index = Index; if (!layerIndexZeroStarted) { index++; } - return $"{prepend}{index.ToString().PadLeft(padDigits, '0')}.png"; + return $"{prepend}{index.ToString().PadLeft(padDigits, '0')}{appendExt}"; } - public string FormatFileName(string prepend = "", bool layerIndexZeroStarted = true) - => FormatFileName(prepend, ParentLayerManager.LayerDigits, layerIndexZeroStarted); + public string FormatFileName(string prepend = "", bool layerIndexZeroStarted = true, string appendExt = ".png") + => FormatFileName(prepend, ParentLayerManager.LayerDigits, layerIndexZeroStarted, appendExt); - public string FormatFileName(byte padDigits, bool layerIndexZeroStarted = true) - => FormatFileName(string.Empty, padDigits, layerIndexZeroStarted); + public string FormatFileName(byte padDigits, bool layerIndexZeroStarted = true, string appendExt = ".png") + => FormatFileName(string.Empty, padDigits, layerIndexZeroStarted, appendExt); public Rectangle GetBoundingRectangle(Mat mat = null, bool reCalculate = false) diff --git a/UVtools.Core/Layer/LayerManager.cs b/UVtools.Core/Layer/LayerManager.cs index 307b1df..4d4c2a4 100644 --- a/UVtools.Core/Layer/LayerManager.cs +++ b/UVtools.Core/Layer/LayerManager.cs @@ -595,12 +595,15 @@ namespace UVtools.Core /// <param name="zeroLightOffDelay">If true also set light off to 0, otherwise current value will be kept.</param> /// </summary> public void SetNoLiftForSamePositionedLayers(bool zeroLightOffDelay = false) + => SetLiftForSamePositionedLayers(0, zeroLightOffDelay); + + public void SetLiftForSamePositionedLayers(float liftHeight = 0, bool zeroLightOffDelay = false) { for (int layerIndex = 1; layerIndex < LayerCount; layerIndex++) { var layer = this[layerIndex]; if (this[layerIndex - 1].PositionZ != layer.PositionZ) continue; - layer.LiftHeight = 0; + layer.LiftHeight = liftHeight; layer.WaitTimeAfterLift = 0; if (zeroLightOffDelay) { diff --git a/UVtools.Core/Operations/OperationCalibrateElephantFoot.cs b/UVtools.Core/Operations/OperationCalibrateElephantFoot.cs index 855a2f8..14744f8 100644 --- a/UVtools.Core/Operations/OperationCalibrateElephantFoot.cs +++ b/UVtools.Core/Operations/OperationCalibrateElephantFoot.cs @@ -370,7 +370,7 @@ namespace UVtools.Core.Operations if (_bottomLayers <= 0) _bottomLayers = (ushort) Slicer.Slicer.MillimetersToLayers(1M, _layerHeight); if (_normalLayers <= 0) _normalLayers = (ushort) Slicer.Slicer.MillimetersToLayers(3.5M, _layerHeight); - _mirrorOutput = SlicerFile.MirrorDisplay; + _mirrorOutput = SlicerFile.DisplayMirror; } #endregion diff --git a/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs b/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs index 5ba5bd5..608b8ec 100644 --- a/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs +++ b/UVtools.Core/Operations/OperationCalibrateExposureFinder.cs @@ -1144,7 +1144,7 @@ namespace UVtools.Core.Operations { base.InitWithSlicerFile(); - _mirrorOutput = SlicerFile.MirrorDisplay; + _mirrorOutput = SlicerFile.DisplayMirror; if (SlicerFile.DisplayWidth > 0) DisplayWidth = (decimal)SlicerFile.DisplayWidth; @@ -2224,7 +2224,7 @@ namespace UVtools.Core.Operations if (_mirrorOutput) { - new OperationFlip(SlicerFile) { FlipDirection = Enumerations.FlipDirection.Horizontally }.Execute(progress); + new OperationFlip(SlicerFile) { FlipDirection = FlipType.Horizontal }.Execute(progress); } } diff --git a/UVtools.Core/Operations/OperationCalibrateGrayscale.cs b/UVtools.Core/Operations/OperationCalibrateGrayscale.cs index 9810dee..b92d339 100644 --- a/UVtools.Core/Operations/OperationCalibrateGrayscale.cs +++ b/UVtools.Core/Operations/OperationCalibrateGrayscale.cs @@ -112,7 +112,7 @@ namespace UVtools.Core.Operations if(_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount; if(_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime; if(_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime; - _mirrorOutput = SlicerFile.MirrorDisplay; + _mirrorOutput = SlicerFile.DisplayMirror; } #endregion diff --git a/UVtools.Core/Operations/OperationCalibrateLiftHeight.cs b/UVtools.Core/Operations/OperationCalibrateLiftHeight.cs new file mode 100644 index 0000000..4caf862 --- /dev/null +++ b/UVtools.Core/Operations/OperationCalibrateLiftHeight.cs @@ -0,0 +1,442 @@ +/* + * 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.Drawing; +using System.Text; +using Emgu.CV; +using Emgu.CV.CvEnum; +using Emgu.CV.Structure; +using UVtools.Core.Extensions; +using UVtools.Core.FileFormats; + +namespace UVtools.Core.Operations +{ + [Serializable] + public sealed class OperationCalibrateLiftHeight : Operation + { + #region Members + private decimal _layerHeight; + private ushort _bottomLayers = 3; + private ushort _normalLayers = 2; + private decimal _bottomExposure; + private decimal _normalExposure; + private decimal _bottomLiftHeight; + private decimal _liftHeight; + private decimal _bottomLiftSpeed; + private decimal _liftSpeed; + private decimal _retractSpeed; + private ushort _leftRightMargin = 200; + private ushort _topBottomMargin = 200; + private bool _decreaseImage = true; + private byte _decreaseImageFactor = 10; + private byte _minimumImageFactor = 10; + + #endregion + + #region Overrides + + public override bool CanROI => false; + + public override bool CanCancel => false; + + public override Enumerations.LayerRangeSelection StartLayerRangeSelection => Enumerations.LayerRangeSelection.None; + + public override string Title => "Lift height"; + public override string Description => + "Generates test models with various strategies and increments to measure the optimal lift height or peel forces for layers given the printed area.\n" + + "You must have a tool to measure the lift height / forces as it moves up, record the values to determine the lowest safe value for the lift.\n" + + "After find the height where it peels, you must give from 1mm to 2mm more for safeness.\n" + + "You must repeat this test when change any of the following: printer, LEDs, resin and exposure times.\n" + + "Note: The current opened file will be overwritten with this test, use a dummy or a not needed file."; + + public override string ConfirmationText => + $"generate the lift height test?"; + + public override string ProgressTitle => + $"Generating the lift height test"; + + public override string ProgressAction => "Generated"; + + public override string ValidateInternally() + { + var sb = new StringBuilder(); + + if (SlicerFile.ResolutionX - _leftRightMargin * 2 <= 0) + sb.AppendLine("The top/bottom margin is too big, it overlaps the screen resolution."); + + if (SlicerFile.ResolutionY - _topBottomMargin * 2 <= 0) + sb.AppendLine("The top/bottom margin is too big, it overlaps the screen resolution."); + + if (_decreaseImage) + { + if(_decreaseImageFactor is 0 or >= 100) + sb.AppendLine("The image decrease factor must be between 1 and 99%"); + + if(_minimumImageFactor is 0 or >= 100) + sb.AppendLine("The minimum image decrease factor must be between 1 and 99%"); + } + + return sb.ToString(); + } + + public override string ToString() + { + var result = $"[Layer Height: {_layerHeight}] " + + $"[Layers: {_bottomLayers}/{_normalLayers}] " + + $"[Exposure: {_bottomExposure}/{_normalExposure}s] " + + $"[Lift: {_bottomLiftHeight}/{_liftHeight}mm @ {_bottomLiftSpeed}/{_liftSpeed}mm/min]" + + $"[Retract speed: {_retractSpeed}mm/min]" + + $"[Decrease image: {_decreaseImage} @ {_decreaseImageFactor}-{_minimumImageFactor}%]"; + if (!string.IsNullOrEmpty(ProfileName)) result = $"{ProfileName}: {result}"; + return result; + } + + #endregion + + #region Properties + + public decimal LayerHeight + { + get => _layerHeight; + set + { + if(!RaiseAndSetIfChanged(ref _layerHeight, Layer.RoundHeight(value))) return; + RaisePropertyChanged(nameof(BottomHeight)); + RaisePropertyChanged(nameof(NormalHeight)); + RaisePropertyChanged(nameof(TotalHeight)); + } + } + + public ushort Microns => (ushort) (LayerHeight * 1000); + + public ushort BottomLayers + { + get => _bottomLayers; + set + { + if(!RaiseAndSetIfChanged(ref _bottomLayers, value)) return; + RaisePropertyChanged(nameof(BottomHeight)); + RaisePropertyChanged(nameof(TotalHeight)); + RaisePropertyChanged(nameof(LayerCount)); + } + } + + public ushort NormalLayers + { + get => _normalLayers; + set + { + if (!RaiseAndSetIfChanged(ref _normalLayers, value)) return; + RaisePropertyChanged(nameof(NormalHeight)); + RaisePropertyChanged(nameof(TotalHeight)); + RaisePropertyChanged(nameof(LayerCount)); + } + } + + public uint LayerCount + { + get + { + uint layerCount = (uint)(_bottomLayers + _normalLayers); + if (_decreaseImage) + { + layerCount += (100u - _minimumImageFactor) / _decreaseImageFactor; + //layerCount += (uint)Math.Ceiling((100.0 - _minimumImageFactor - _decreaseImageFactor) / _decreaseImageFactor); + //for (int factor = 100 - _decreaseImageFactor; factor >= _minimumImageFactor; factor -= _decreaseImageFactor) + // layerCount++; + } + return layerCount; + } + } + + public decimal BottomHeight => Layer.RoundHeight(_layerHeight * _bottomLayers); + public decimal NormalHeight => Layer.RoundHeight(_layerHeight * (LayerCount - _bottomLayers)); + + public decimal TotalHeight => BottomHeight + NormalHeight; + + public decimal BottomExposure + { + get => _bottomExposure; + set => RaiseAndSetIfChanged(ref _bottomExposure, Math.Round(value, 2)); + } + + public decimal NormalExposure + { + get => _normalExposure; + set => RaiseAndSetIfChanged(ref _normalExposure, Math.Round(value, 2)); + } + + public decimal BottomLiftHeight + { + get => _bottomLiftHeight; + set => RaiseAndSetIfChanged(ref _bottomLiftHeight, value); + } + + public decimal LiftHeight + { + get => _liftHeight; + set => RaiseAndSetIfChanged(ref _liftHeight, value); + } + + public decimal BottomLiftSpeed + { + get => _bottomLiftSpeed; + set => RaiseAndSetIfChanged(ref _bottomLiftSpeed, value); + } + + public decimal LiftSpeed + { + get => _liftSpeed; + set => RaiseAndSetIfChanged(ref _liftSpeed, value); + } + + public decimal RetractSpeed + { + get => _retractSpeed; + set => RaiseAndSetIfChanged(ref _retractSpeed, value); + } + + public ushort LeftRightMargin + { + get => _leftRightMargin; + set => RaiseAndSetIfChanged(ref _leftRightMargin, value); + } + + public ushort MaxLeftRightMargin => (ushort)((SlicerFile.ResolutionX - 100) / 2); + + public ushort TopBottomMargin + { + get => _topBottomMargin; + set => RaiseAndSetIfChanged(ref _topBottomMargin, value); + } + + public ushort MaxTopBottomMargin => (ushort) ((SlicerFile.ResolutionY - 100) / 2); + + public bool DecreaseImage + { + get => _decreaseImage; + set + { + RaiseAndSetIfChanged(ref _decreaseImage, value); + RaisePropertyChanged(nameof(TotalHeight)); + RaisePropertyChanged(nameof(LayerCount)); + } + } + + public byte DecreaseImageFactor + { + get => _decreaseImageFactor; + set + { + RaiseAndSetIfChanged(ref _decreaseImageFactor, value); + RaisePropertyChanged(nameof(TotalHeight)); + RaisePropertyChanged(nameof(LayerCount)); + } + } + + public byte MinimumImageFactor + { + get => _minimumImageFactor; + set + { + RaiseAndSetIfChanged(ref _minimumImageFactor, value); + RaisePropertyChanged(nameof(TotalHeight)); + RaisePropertyChanged(nameof(LayerCount)); + } + } + + public Rectangle WhiteBlock + { + get + { + int width = (int) (SlicerFile.ResolutionX - _leftRightMargin * 2); + int height = (int) (SlicerFile.ResolutionY - _topBottomMargin * 2); + int x = (int) (SlicerFile.ResolutionX - width) / 2; + int y = (int) (SlicerFile.ResolutionY - height) / 2; + + return new Rectangle(x, y, width, height); + } + } + + #endregion + + #region Constructor + + public OperationCalibrateLiftHeight() { } + + public OperationCalibrateLiftHeight(FileFormat slicerFile) : base(slicerFile) + { } + + public override void InitWithSlicerFile() + { + base.InitWithSlicerFile(); + if(_layerHeight <= 0) _layerHeight = (decimal)SlicerFile.LayerHeight; + if(_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime; + if(_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime; + if (_bottomLiftHeight <= 0) _bottomLiftHeight = (decimal)SlicerFile.BottomLiftHeight; + if (_liftHeight <= 0) _liftHeight = (decimal)SlicerFile.LiftHeight; + if (_bottomLiftSpeed <= 0) _bottomLiftSpeed = (decimal) SlicerFile.BottomLiftSpeed; + if (_liftSpeed <= 0) _liftSpeed = (decimal) SlicerFile.LiftSpeed; + if (_retractSpeed <= 0) _retractSpeed = (decimal) SlicerFile.RetractSpeed; + } + + #endregion + + #region Equality + + private bool Equals(OperationCalibrateLiftHeight other) + { + return _layerHeight == other._layerHeight && _bottomLayers == other._bottomLayers && _normalLayers == other._normalLayers && _bottomExposure == other._bottomExposure && _normalExposure == other._normalExposure && _bottomLiftHeight == other._bottomLiftHeight && _liftHeight == other._liftHeight && _bottomLiftSpeed == other._bottomLiftSpeed && _liftSpeed == other._liftSpeed && _retractSpeed == other._retractSpeed && _leftRightMargin == other._leftRightMargin && _topBottomMargin == other._topBottomMargin && _decreaseImage == other._decreaseImage && _decreaseImageFactor == other._decreaseImageFactor && _minimumImageFactor == other._minimumImageFactor; + } + + public override bool Equals(object obj) + { + return ReferenceEquals(this, obj) || obj is OperationCalibrateLiftHeight other && Equals(other); + } + + public override int GetHashCode() + { + var hashCode = new HashCode(); + hashCode.Add(_layerHeight); + hashCode.Add(_bottomLayers); + hashCode.Add(_normalLayers); + hashCode.Add(_bottomExposure); + hashCode.Add(_normalExposure); + hashCode.Add(_bottomLiftHeight); + hashCode.Add(_liftHeight); + hashCode.Add(_bottomLiftSpeed); + hashCode.Add(_liftSpeed); + hashCode.Add(_retractSpeed); + hashCode.Add(_leftRightMargin); + hashCode.Add(_topBottomMargin); + hashCode.Add(_decreaseImage); + hashCode.Add(_decreaseImageFactor); + hashCode.Add(_minimumImageFactor); + return hashCode.ToHashCode(); + } + + #endregion + + #region Methods + + /// <summary> + /// Gets the bottom and normal layers, 0 = bottom | 1 = normal + /// </summary> + /// <returns></returns> + public Mat[] GetLayers() + { + var layers = new Mat[1]; + + layers[0] = EmguExtensions.InitMat(SlicerFile.Resolution); + CvInvoke.Rectangle(layers[0], WhiteBlock, EmguExtensions.WhiteColor, -1); + + return layers; + } + + public Mat GetThumbnail() + { + Mat thumbnail = EmguExtensions.InitMat(new Size(400, 200), 3); + var fontFace = FontFace.HersheyDuplex; + var fontScale = 1; + var fontThickness = 2; + const byte xSpacing = 45; + const byte ySpacing = 45; + CvInvoke.PutText(thumbnail, "UVtools", new Point(140, 35), fontFace, fontScale, new MCvScalar(255, 27, 245), fontThickness + 1); + CvInvoke.Line(thumbnail, new Point(xSpacing, 0), new Point(xSpacing, ySpacing + 5), new MCvScalar(255, 27, 245), 3); + CvInvoke.Line(thumbnail, new Point(xSpacing, ySpacing + 5), new Point(thumbnail.Width - xSpacing, ySpacing + 5), new MCvScalar(255, 27, 245), 3); + CvInvoke.Line(thumbnail, new Point(thumbnail.Width - xSpacing, 0), new Point(thumbnail.Width - xSpacing, ySpacing + 5), new MCvScalar(255, 27, 245), 3); + CvInvoke.PutText(thumbnail, "Lift Height Cal.", new Point(xSpacing, ySpacing * 2), fontFace, fontScale, new MCvScalar(0, 255, 255), fontThickness); + CvInvoke.PutText(thumbnail, $"{Microns}um @ {BottomExposure}s/{NormalExposure}s", new Point(xSpacing, ySpacing * 3), fontFace, fontScale, EmguExtensions.WhiteColor, fontThickness); + //CvInvoke.PutText(thumbnail, $"{ObjectCount} Objects", new Point(xSpacing, ySpacing * 4), fontFace, fontScale, EmguExtensions.WhiteColor, fontThickness); + + return thumbnail; + } + + protected override bool ExecuteInternally(OperationProgress progress) + { + progress.ItemCount = LayerCount; + + var newLayers = new Layer[LayerCount]; + + var layers = GetLayers(); + progress++; + + var layer = new Layer(0, layers[0], SlicerFile.LayerManager) + { + IsModified = true + }; + + uint layerIndex = 0; + for (; layerIndex < _bottomLayers + _normalLayers; layerIndex++) + { + newLayers[layerIndex] = layer.Clone(); + progress++; + } + + if (_decreaseImage) + { + var rect = WhiteBlock; + for (int factor = 100 - _decreaseImageFactor; factor >= _minimumImageFactor; factor -= _decreaseImageFactor) + { + using var mat = layers[0].NewBlank(); + + // size - 100 + // x - factor + + int width = rect.Width * factor / 100; + int height = rect.Height * factor / 100; + int x = (int)(SlicerFile.ResolutionX - width) / 2; + int y = (int)(SlicerFile.ResolutionY - height) / 2; + + CvInvoke.Rectangle(mat, + new Rectangle(x, y, width, height), + EmguExtensions.WhiteColor, -1); + + newLayers[layerIndex] = new Layer(0, mat, SlicerFile.LayerManager) + { + IsModified = true + }; + + layerIndex++; + progress++; + } + } + + foreach (var mat in layers) + { + mat.Dispose(); + } + + + if (SlicerFile.ThumbnailsCount > 0) + SlicerFile.SetThumbnails(GetThumbnail()); + + progress++; + + SlicerFile.SuppressRebuildPropertiesWork(() => + { + SlicerFile.LayerHeight = (float)_layerHeight; + SlicerFile.BottomExposureTime = (float)_bottomExposure; + SlicerFile.ExposureTime = (float)_normalExposure; + SlicerFile.BottomLiftHeight = (float)_bottomLiftHeight; + SlicerFile.LiftHeight = (float)_liftHeight; + SlicerFile.BottomLiftSpeed = (float)_bottomLiftSpeed; + SlicerFile.LiftSpeed = (float)_liftSpeed; + SlicerFile.RetractSpeed = (float)_retractSpeed; + SlicerFile.BottomLayerCount = _bottomLayers; + + SlicerFile.LayerManager.Layers = newLayers; + }, true); + + return !progress.Token.IsCancellationRequested; + } + + #endregion + } +} diff --git a/UVtools.Core/Operations/OperationCalibrateStressTower.cs b/UVtools.Core/Operations/OperationCalibrateStressTower.cs index a11f630..2ca4b29 100644 --- a/UVtools.Core/Operations/OperationCalibrateStressTower.cs +++ b/UVtools.Core/Operations/OperationCalibrateStressTower.cs @@ -111,7 +111,7 @@ namespace UVtools.Core.Operations if(_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount; if(_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime; if(_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime; - _mirrorOutput = SlicerFile.MirrorDisplay; + _mirrorOutput = SlicerFile.DisplayMirror; if (SlicerFile.DisplayWidth > 0) DisplayWidth = (decimal)SlicerFile.DisplayWidth; diff --git a/UVtools.Core/Operations/OperationCalibrateTolerance.cs b/UVtools.Core/Operations/OperationCalibrateTolerance.cs index 033c487..20036a7 100644 --- a/UVtools.Core/Operations/OperationCalibrateTolerance.cs +++ b/UVtools.Core/Operations/OperationCalibrateTolerance.cs @@ -431,7 +431,7 @@ namespace UVtools.Core.Operations if (_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount; if (_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime; if (_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime; - _mirrorOutput = SlicerFile.MirrorDisplay; + _mirrorOutput = SlicerFile.DisplayMirror; if (SlicerFile.DisplayWidth > 0) DisplayWidth = (decimal)SlicerFile.DisplayWidth; diff --git a/UVtools.Core/Operations/OperationCalibrateXYZAccuracy.cs b/UVtools.Core/Operations/OperationCalibrateXYZAccuracy.cs index 54f195a..392cdf2 100644 --- a/UVtools.Core/Operations/OperationCalibrateXYZAccuracy.cs +++ b/UVtools.Core/Operations/OperationCalibrateXYZAccuracy.cs @@ -463,7 +463,7 @@ namespace UVtools.Core.Operations if (_bottomLayers <= 0) _bottomLayers = SlicerFile.BottomLayerCount; if (_bottomExposure <= 0) _bottomExposure = (decimal)SlicerFile.BottomExposureTime; if (_normalExposure <= 0) _normalExposure = (decimal)SlicerFile.ExposureTime; - _mirrorOutput = SlicerFile.MirrorDisplay; + _mirrorOutput = SlicerFile.DisplayMirror; if (SlicerFile.DisplayWidth > 0) DisplayWidth = (decimal)SlicerFile.DisplayWidth; diff --git a/UVtools.Core/Operations/OperationFlip.cs b/UVtools.Core/Operations/OperationFlip.cs index 047117d..3510d3e 100644 --- a/UVtools.Core/Operations/OperationFlip.cs +++ b/UVtools.Core/Operations/OperationFlip.cs @@ -19,7 +19,7 @@ namespace UVtools.Core.Operations { #region Members private bool _makeCopy; - private Enumerations.FlipDirection _flipDirection = Enumerations.FlipDirection.Horizontally; + private FlipType _flipDirection = FlipType.Horizontal; #endregion #region Overrides @@ -29,14 +29,14 @@ namespace UVtools.Core.Operations "Note: Before perform this operation, un-rotate the layer preview to see the real orientation."; public override string ConfirmationText => - FlipDirection == Enumerations.FlipDirection.Both - ? $"flip {(MakeCopy == true? "and blend ":"")}layers {LayerIndexStart} through {LayerIndexEnd} Horizontally and Vertically?" - : $"flip {(MakeCopy == true ? "and blend " : "")}layers {LayerIndexStart} through {LayerIndexEnd} {FlipDirection}?"; + FlipDirection == FlipType.Both + ? $"flip {(_makeCopy ? "and blend ":"")}layers {LayerIndexStart} through {LayerIndexEnd} Horizontally and Vertically?" + : $"flip {(_makeCopy ? "and blend " : "")}layers {LayerIndexStart} through {LayerIndexEnd} {FlipDirection}?"; public override string ProgressTitle => - FlipDirection == Enumerations.FlipDirection.Both - ? $"Flipping {(MakeCopy == true ? "and blending " : "")}layers {LayerIndexStart} through {LayerIndexEnd} Horizontally and Vertically" - : $"Flipping {(MakeCopy == true ? "and blending " : "")}layers {LayerIndexStart} through {LayerIndexEnd} {FlipDirection}"; + FlipDirection == FlipType.Both + ? $"Flipping {(_makeCopy ? "and blending " : "")}layers {LayerIndexStart} through {LayerIndexEnd} Horizontally and Vertically" + : $"Flipping {(_makeCopy ? "and blending " : "")}layers {LayerIndexStart} through {LayerIndexEnd} {FlipDirection}"; public override string ProgressAction => "Flipped layers"; @@ -50,7 +50,7 @@ namespace UVtools.Core.Operations #region Properties - public Enumerations.FlipDirection FlipDirection + public FlipType FlipDirection { get => _flipDirection; set => RaiseAndSetIfChanged(ref _flipDirection, value); @@ -62,29 +62,6 @@ namespace UVtools.Core.Operations set => RaiseAndSetIfChanged(ref _makeCopy, value); } - public static Array FlipDirections => Enum.GetValues(typeof(Enumerations.FlipDirection)); - - public FlipType FlipTypeOpenCV - { - get - { - var flipType = FlipType.Horizontal; - switch (FlipDirection) - { - case Enumerations.FlipDirection.Horizontally: - flipType = FlipType.Horizontal; - break; - case Enumerations.FlipDirection.Vertically: - flipType = FlipType.Vertical; - break; - case Enumerations.FlipDirection.Both: - flipType = FlipType.Horizontal | FlipType.Vertical; - break; - } - - return flipType; - } - } #endregion #region Constructor @@ -144,12 +121,12 @@ namespace UVtools.Core.Operations if (MakeCopy) { using Mat dst = new(); - CvInvoke.Flip(target, dst, FlipTypeOpenCV); + CvInvoke.Flip(target, dst, _flipDirection); CvInvoke.Add(target, dst, target); } else { - CvInvoke.Flip(target, target, FlipTypeOpenCV); + CvInvoke.Flip(target, target, _flipDirection); } ApplyMask(original, target); diff --git a/UVtools.Core/Operations/OperationLayerExportGif.cs b/UVtools.Core/Operations/OperationLayerExportGif.cs index 0762608..ae93843 100644 --- a/UVtools.Core/Operations/OperationLayerExportGif.cs +++ b/UVtools.Core/Operations/OperationLayerExportGif.cs @@ -24,30 +24,6 @@ namespace UVtools.Core.Operations [Serializable] public sealed class OperationLayerExportGif : Operation { - #region Enums - public enum ExportGifRotateDirection : byte - { - None = 9, - /// <summary>Rotate 90 degrees clockwise</summary> - [Description("Rotate 90º CW")] - Rotate90Clockwise = 0, - /// <summary>Rotate 180 degrees clockwise</summary> - [Description("Rotate 180º")] - Rotate180 = 1, - /// <summary>Rotate 270 degrees clockwise</summary> - [Description("Rotate 90º CCW")] - Rotate90CounterClockwise = 2, - } - - public enum ExportGifFlipDirection : byte - { - None, - Horizontally, - Vertically, - Both, - } - #endregion - #region Members private string _filePath; private bool _clipByVolumeBounds; @@ -56,8 +32,8 @@ namespace UVtools.Core.Operations private ushort _repeats; private ushort _skip; private decimal _scale = 50; - private ExportGifRotateDirection _rotateDirection = ExportGifRotateDirection.None; - private ExportGifFlipDirection _flipDirection = ExportGifFlipDirection.None; + private Enumerations.RotateDirection _rotateDirection = Enumerations.RotateDirection.None; + private Enumerations.FlipDirection _flipDirection = Enumerations.FlipDirection.None; #endregion @@ -188,13 +164,13 @@ namespace UVtools.Core.Operations public float ScaleFactor => (float)_scale / 100f; - public ExportGifRotateDirection RotateDirection + public Enumerations.RotateDirection RotateDirection { get => _rotateDirection; set => RaiseAndSetIfChanged(ref _rotateDirection, value); } - public ExportGifFlipDirection FlipDirection + public Enumerations.FlipDirection FlipDirection { get => _flipDirection; set => RaiseAndSetIfChanged(ref _flipDirection, value); @@ -257,23 +233,14 @@ namespace UVtools.Core.Operations CvInvoke.Resize(matRoi, matRoi, new Size((int) (matRoi.Width * ScaleFactor), (int)(matRoi.Height * ScaleFactor))); } - if (_flipDirection != ExportGifFlipDirection.None) + if (_flipDirection != Enumerations.FlipDirection.None) { - FlipType? flipType = _flipDirection switch - { - ExportGifFlipDirection.Horizontally => FlipType.Horizontal, - ExportGifFlipDirection.Vertically => FlipType.Vertical, - ExportGifFlipDirection.Both => FlipType.Both, - _ => null - }; - - if (flipType is not null) - CvInvoke.Flip(matRoi, matRoi, flipType.Value); + CvInvoke.Flip(matRoi, matRoi, Enumerations.ToOpenCVFlipType(_flipDirection)); } - if (_rotateDirection != ExportGifRotateDirection.None) + if (_rotateDirection != Enumerations.RotateDirection.None) { - CvInvoke.Rotate(matRoi, matRoi, (RotateFlags) _rotateDirection); + CvInvoke.Rotate(matRoi, matRoi, Enumerations.ToOpenCVRotateFlags(_rotateDirection)); } if (_renderLayerCount) diff --git a/UVtools.Core/Operations/OperationLayerExportImage.cs b/UVtools.Core/Operations/OperationLayerExportImage.cs new file mode 100644 index 0000000..7e52359 --- /dev/null +++ b/UVtools.Core/Operations/OperationLayerExportImage.cs @@ -0,0 +1,303 @@ +/* + * 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.ComponentModel; +using System.IO; +using System.Threading.Tasks; +using Emgu.CV; +using Emgu.CV.CvEnum; +using Emgu.CV.Util; +using UVtools.Core.FileFormats; + +namespace UVtools.Core.Operations +{ + [Serializable] + public sealed class OperationLayerExportImage : Operation + { + #region Enums + + public enum LayerExportImageTypes : byte + { + [Description("PNG: Portable Network Graphics")] + PNG, + [Description("JPG: Joint Photographic Experts Group")] + JPG, + [Description("JPEG: Joint Photographic Experts Group")] + JPEG, + [Description("JP2: Joint Photographic Experts Group (JPEG 2000)")] + JP2, + [Description("TIF: Tag Image File Format")] + TIF, + [Description("TIFF: Tag Image File Format")] + TIFF, + [Description("BMP: Bitmap")] + BMP, + [Description("PBM: Portable Bitmap")] + PBM, + [Description("PGM: Portable Greymap")] + PGM, + //[Description("PPM: Portable Pixmap")] + //PPM, + [Description("SR: Sun raster")] + SR, + [Description("RAS: Sun raster")] + RAS, + [Description("SVG: Scalable Vector Graphics")] + SVG + } + #endregion + + #region Members + + private string _outputFolder; + private string _filename = "layer"; + private LayerExportImageTypes _imageType = LayerExportImageTypes.PNG; + private Enumerations.RotateDirection _rotateDirection = Enumerations.RotateDirection.None; + private Enumerations.FlipDirection _flipDirection = Enumerations.FlipDirection.None; + private bool _padLayerIndex = true; + private bool _cropByRoi = true; + + #endregion + + #region Overrides + + public override bool CanHaveProfiles => false; + public override string Title => "Export layers to images"; + + public override string Description => + "Export a layer range to images."; + + public override string ConfirmationText => + $"export {_imageType} images from layers {LayerIndexStart} through {LayerIndexEnd}?"; + + public override string ProgressTitle => + $"Exporting {_imageType} images from layers {LayerIndexStart} through {LayerIndexEnd}"; + + public override string ProgressAction => $"Exported {_imageType} images"; + + /*public override string ValidateInternally() + { + var sb = new StringBuilder(); + + if (LayerRangeCount < 2) + { + sb.AppendLine("To generate a heat map at least two layers are required."); + } + + return sb.ToString(); + }*/ + + public override string ToString() + { + var result = $"[Crop by ROI: {_cropByRoi}] [Pad index: {_padLayerIndex}]" + + LayerRangeString; + if (!string.IsNullOrEmpty(ProfileName)) result = $"{ProfileName}: {result}"; + return result; + } + + #endregion + + #region Properties + + public string OutputFolder + { + get => _outputFolder; + set => RaiseAndSetIfChanged(ref _outputFolder, value); + } + + public string Filename + { + get => _filename; + set => RaiseAndSetIfChanged(ref _filename, value); + } + + public LayerExportImageTypes ImageType + { + get => _imageType; + set => RaiseAndSetIfChanged(ref _imageType, value); + } + + public Enumerations.RotateDirection RotateDirection + { + get => _rotateDirection; + set => RaiseAndSetIfChanged(ref _rotateDirection, value); + } + + public Enumerations.FlipDirection FlipDirection + { + get => _flipDirection; + set => RaiseAndSetIfChanged(ref _flipDirection, value); + } + + public bool PadLayerIndex + { + get => _padLayerIndex; + set => RaiseAndSetIfChanged(ref _padLayerIndex, value); + } + + public bool CropByROI + { + get => _cropByRoi; + set => RaiseAndSetIfChanged(ref _cropByRoi, value); + } + + #endregion + + #region Constructor + + public OperationLayerExportImage() + { } + + public OperationLayerExportImage(FileFormat slicerFile) : base(slicerFile) + { + _outputFolder = Path.Combine(Path.GetDirectoryName(SlicerFile.FileFullPath) ?? string.Empty, FileFormat.GetFileNameStripExtensions(SlicerFile.FileFullPath)); + } + + #endregion + + #region Methods + + protected override bool ExecuteInternally(OperationProgress progress) + { + if (!Directory.Exists(_outputFolder)) + { + Directory.CreateDirectory(_outputFolder); + } + + var slicedFileNameNoExt = SlicerFile.FilenameNoExt; + + Parallel.For(LayerIndexStart, LayerIndexEnd+1, layerIndex => + { + if (progress.Token.IsCancellationRequested) return; + + using var mat = SlicerFile[layerIndex].LayerMat; + var matRoi = mat; + if (_cropByRoi && HaveROI) + { + matRoi = GetRoiOrDefault(mat); + } + + if (_flipDirection != Enumerations.FlipDirection.None) + { + CvInvoke.Flip(matRoi, matRoi, Enumerations.ToOpenCVFlipType(_flipDirection)); + } + + if (_rotateDirection != Enumerations.RotateDirection.None) + { + CvInvoke.Rotate(matRoi, matRoi, Enumerations.ToOpenCVRotateFlags(_rotateDirection)); + } + + var filename = SlicerFile[layerIndex].FormatFileName(_filename, _padLayerIndex ? SlicerFile.LayerManager.LayerDigits : byte.MinValue, true, string.Empty); + var fileFullPath = Path.Combine(_outputFolder, $"{filename}.{_imageType.ToString().ToLower()}"); + + if (_imageType != LayerExportImageTypes.SVG) + { + matRoi.Save(fileFullPath); + } + else + { + // SVG + + CvInvoke.Threshold(matRoi, matRoi, 127, byte.MaxValue, ThresholdType.Binary); // Remove AA + + using var contours = new VectorOfVectorOfPoint(); + using var hierarchy = new Mat(); + CvInvoke.FindContours(matRoi, contours, hierarchy, RetrType.Tree, ChainApproxMethod.ChainApproxSimple); + var hierarchyJagged = hierarchy.GetData(); + + using TextWriter tw = new StreamWriter(fileFullPath); + tw.WriteLine("<!--"); + tw.WriteLine($"# Generated by {About.Software} v{About.VersionStr} {About.Arch} @ {DateTime.UtcNow} #"); + tw.WriteLine($"File: {SlicerFile.Filename}"); + tw.WriteLine($"{SlicerFile[layerIndex].ToString().Replace(", ", "\n")}"); + tw.WriteLine("-->"); + tw.WriteLine("<svg " + + "xmlns=\"http://www.w3.org/2000/svg\" " + + //"xmlns:xlink=\"http://www.w3.org/1999/xlink\" " + + //"version=\"1.1\" " + + $"id=\"{slicedFileNameNoExt}_{filename}\" " + + $"data-name=\"{slicedFileNameNoExt}_{filename}\" " + + //"x=\"0\" " + + //"y=\"0\" " + + $"width=\"{matRoi.Width}\" " + + $"height=\"{matRoi.Height}\" " + + $"viewBox=\"0 0 {matRoi.Width} {matRoi.Height}\">"); + tw.WriteLine("\t<defs>"); + tw.WriteLine("\t\t<style>"); + //tw.WriteLine("\t\tsvg { background-color: #000000; }"); + tw.WriteLine("\t\t.background { fill: #000000; fill-rule: evenodd; }"); + tw.WriteLine("\t\t.black { fill: #000000; fill-rule: evenodd; }"); + tw.WriteLine("\t\t.white { fill: #FFFFFF; fill-rule: evenodd; }"); + tw.WriteLine("\t\t</style>"); + tw.WriteLine("\t</defs>"); + tw.WriteLine($"\t<title>{slicedFileNameNoExt} #{layerIndex}</title>"); + tw.WriteLine($"\t<rect class=\"background\" width=\"{mat.Width}\" height=\"{mat.Height}\"/>"); + + // + //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 + // + + for (int i = 0; i < contours.Size; i++) + { + if (contours[i].Size == 0) continue; + + var style = "white"; + + int parentIndex = i; + int count = 0; + while ((parentIndex = (int)hierarchyJagged.GetValue(0, parentIndex, 3)) != -1) + { + count++; + } + + if (count % 2 != 0) + style = "black"; + + tw.Write($"\t<path class=\"{style}\" d=\"M{contours[i][0].X} {contours[i][0].Y}"); + for (int x = 1; x < contours[i].Size; x++) + { + tw.Write($",L{contours[i][x].X} {contours[i][x].Y}"); + } + tw.WriteLine("Z\"/>"); + } + + tw.WriteLine("</svg>"); + } + + progress.LockAndIncrement(); + }); + + return !progress.Token.IsCancellationRequested; + } + + #endregion + + #region Equality + + private bool Equals(OperationLayerExportImage other) + { + return _outputFolder == other._outputFolder && _filename == other._filename && _imageType == other._imageType && _rotateDirection == other._rotateDirection && _flipDirection == other._flipDirection && _padLayerIndex == other._padLayerIndex && _cropByRoi == other._cropByRoi; + } + + public override bool Equals(object obj) + { + return ReferenceEquals(this, obj) || obj is OperationLayerExportImage other && Equals(other); + } + + public override int GetHashCode() + { + return HashCode.Combine(_outputFolder, _filename, (int) _imageType, (int) _rotateDirection, (int) _flipDirection, _padLayerIndex, _cropByRoi); + } + + #endregion + } +} diff --git a/UVtools.Core/Operations/OperationProgress.cs b/UVtools.Core/Operations/OperationProgress.cs index 732434a..a567638 100644 --- a/UVtools.Core/Operations/OperationProgress.cs +++ b/UVtools.Core/Operations/OperationProgress.cs @@ -15,11 +15,13 @@ namespace UVtools.Core.Operations { public sealed class OperationProgress : BindableBase { - public const string StatusDecodeThumbnails = "Decoded Thumbnails"; + public const string StatusDecodePreviews = "Decoded Previews"; public const string StatusGatherLayers = "Gathered Layers"; public const string StatusDecodeLayers = "Decoded Layers"; + public const string StatusEncodePreviews = "Encoded Previews"; public const string StatusEncodeLayers = "Encoded Layers"; public const string StatusWritingFile = "Writing File"; + public const string StatusDecodeGcode = "Decoding GCode"; public const string StatusEncodeGcode = "Encoding GCode"; public const string StatusOptimizingBounds = "Gathering Bounds"; diff --git a/UVtools.Core/UVtools.Core.csproj b/UVtools.Core/UVtools.Core.csproj index 51050a2..b2d41a2 100644 --- a/UVtools.Core/UVtools.Core.csproj +++ b/UVtools.Core/UVtools.Core.csproj @@ -10,7 +10,7 @@ <RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl> <PackageProjectUrl>https://github.com/sn4k3/UVtools</PackageProjectUrl> <Description>MSLA/DLP, file analysis, calibration, repair, conversion and manipulation</Description> - <Version>2.16.0</Version> + <Version>2.17.0</Version> <Copyright>Copyright © 2020 PTRTECH</Copyright> <PackageIcon>UVtools.png</PackageIcon> <Platforms>AnyCPU;x64</Platforms> diff --git a/UVtools.Installer/Code/Features.wxs b/UVtools.Installer/Code/Features.wxs index 820a881..987a66d 100644 --- a/UVtools.Installer/Code/Features.wxs +++ b/UVtools.Installer/Code/Features.wxs @@ -3,7 +3,7 @@ <Fragment> <Directory Id="TARGETDIR" Name="SourceDir"> - <Directory Id="ProgramFilesFolder"> + <Directory Id="ProgramFiles64Folder"> <Directory Id="INSTALLLOCATION" Name="UVtools"> <Merge Id="UVtools" SourceFile="$(var.UVtools.InstallerMM.TargetPath)" DiskId="1" Language="1033" /> </Directory> diff --git a/UVtools.Installer/Code/Product.wxs b/UVtools.Installer/Code/Product.wxs index 9a0b9fb..4e4ae42 100644 --- a/UVtools.Installer/Code/Product.wxs +++ b/UVtools.Installer/Code/Product.wxs @@ -10,7 +10,7 @@ Version="$(var.MSIProductVersion)" --> <Product Id="*" Name="UVtools" Language="1033" Version="$(var.MSIProductVersion)" Manufacturer="PTRTECH" UpgradeCode="1ea6d212-15c0-425e-b2ec-4b6c60817552"> - <Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine" /> + <Package InstallerVersion="301" Compressed="yes" InstallScope="perMachine" Platform="x64" /> <MediaTemplate EmbedCab="yes" /> <!-- Major Upgrade Rule to disallow downgrades --> <!-- AllowSameVersionUpgrades="yes" --> diff --git a/UVtools.Installer/Resources/Banner.fw.png b/UVtools.Installer/Resources/Banner.fw.png Binary files differnew file mode 100644 index 0000000..ac99ff2 --- /dev/null +++ b/UVtools.Installer/Resources/Banner.fw.png diff --git a/UVtools.Installer/Resources/Banner.jpg b/UVtools.Installer/Resources/Banner.jpg Binary files differindex 743dbff..468aea6 100644 --- a/UVtools.Installer/Resources/Banner.jpg +++ b/UVtools.Installer/Resources/Banner.jpg diff --git a/UVtools.Installer/Resources/Dialog.fw.png b/UVtools.Installer/Resources/Dialog.fw.png Binary files differnew file mode 100644 index 0000000..823885a --- /dev/null +++ b/UVtools.Installer/Resources/Dialog.fw.png diff --git a/UVtools.Installer/Resources/Dialog.jpg b/UVtools.Installer/Resources/Dialog.jpg Binary files differindex 0b8f2d0..7b2b33c 100644 --- a/UVtools.Installer/Resources/Dialog.jpg +++ b/UVtools.Installer/Resources/Dialog.jpg diff --git a/UVtools.Installer/Resources/EULA.rtf b/UVtools.Installer/Resources/EULA.rtf index 7f62333..ea12ce0 100644 --- a/UVtools.Installer/Resources/EULA.rtf +++ b/UVtools.Installer/Resources/EULA.rtf @@ -1,4 +1,4 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang2070\deflangfe2070\themelang2070\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang2070\deflangfe2070\themelang2070\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} {\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} {\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;} {\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} @@ -7,56 +7,62 @@ {\f46\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f47\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f48\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f49\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} {\f50\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f51\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f53\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f54\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} {\f56\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f57\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f58\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f59\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} -{\f60\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f61\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f413\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f414\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} -{\f416\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f417\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f418\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f419\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);} -{\f420\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f421\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;}{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;} -{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31533\fbidi \fswiss\fcharset177\fprq2 Calibri Light (Hebrew);}{\fhimajor\f31534\fbidi \fswiss\fcharset178\fprq2 Calibri Light (Arabic);} -{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} -{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\f60\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f61\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f383\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f384\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} +{\f386\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f387\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f390\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f391\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} +{\f413\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f414\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f416\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f417\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\f418\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\f419\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\f420\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f421\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);} +{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;} +{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31533\fbidi \fswiss\fcharset177\fprq2 Calibri Light (Hebrew);} +{\fhimajor\f31534\fbidi \fswiss\fcharset178\fprq2 Calibri Light (Arabic);}{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);} +{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} {\fhiminor\f31573\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\fhiminor\f31574\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} {\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} {\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} {\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} {\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; -\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green0\blue0;\red0\green0\blue0;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap -\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang2070\langfe2070\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp2070\langfenp2070 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green0\blue0;\red0\green0\blue0;\chyperlink\ctint255\cshade255\red5\green99\blue193;\red96\green94\blue92;\red225\green223\blue221; +\cfollowedhyperlink\ctint255\cshade255\red149\green79\blue114;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 } +\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang2070\langfe2070\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp2070\langfenp2070 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* \ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa160\sl259\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang2070\langfe2070\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp2070\langfenp2070 \snext11 \ssemihidden \sunhideused -Normal Table;}}{\*\rsidtbl \rsid11478430\rsid12386343}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator Tiago Concei\'e7\'e3o} -{\creatim\yr2020\mo6\dy20\hr22\min43}{\revtim\yr2020\mo6\dy20\hr22\min44}{\version2}{\edmins1}{\nofpages21}{\nofwords5394}{\nofchars29129}{\nofcharsws34455}{\vern1}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang2070\langfe2070\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp2070\langfenp2070 \snext11 \ssemihidden \sunhideused +Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf19 \sbasedon10 \sunhideused \styrsid11416405 Hyperlink;}{\*\cs16 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \cf20\chshdng0\chcfpat0\chcbpat21 +\sbasedon10 \ssemihidden \sunhideused \styrsid11416405 Unresolved Mention;}{\*\cs17 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf22 \sbasedon10 \ssemihidden \sunhideused \styrsid11416405 FollowedHyperlink;}}{\*\rsidtbl \rsid1337904\rsid3091265\rsid5775268 +\rsid6292107\rsid11086039\rsid11416405\rsid11478430\rsid12386343}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator Tiago Concei\'e7\'e3o} +{\creatim\yr2020\mo6\dy20\hr22\min43}{\revtim\yr2021\mo8\dy4\hr20}{\version8}{\edmins6}{\nofpages21}{\nofwords5393}{\nofchars29126}{\nofcharsws34451}{\vern29}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} \paperw12240\paperh15840\margl1701\margr1701\margt1417\margb1417\gutter0\ltrsect \widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120 -\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale300\rsidroot12386343 \nouicompat \fet0{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1 +\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale260\rsidroot12386343 \nouicompat \fet0{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1 \pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5 \pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12386343 \rtlch\fcs1 -\af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang2070\langfe2070\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp2070\langfenp2070 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2070\langnp1033\insrsid12386343\charrsid12386343 -\hich\af1\dbch\af31505\loch\f1 GNU AFFERO GENERAL PUBLIC LICENSE -\par \hich\af1\dbch\af31505\loch\f1 Version 3, 19 November 2007 -\par +\af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang2070\langfe2070\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp2070\langfenp2070 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2070\langnp1033\insrsid12386343\charrsid12386343 +\hich\af1\dbch\af31505\loch\f1 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2070\langnp1033\insrsid1337904 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 +\b\f1\fs20\lang1033\langfe2070\langnp1033\insrsid12386343\charrsid1337904 \hich\af1\dbch\af31505\loch\f1 GNU AFFERO GENERAL PUBLIC LICENSE +\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2070\langnp1033\insrsid12386343\charrsid12386343 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 +\b\f1\fs20\lang1033\langfe2070\langnp1033\insrsid12386343\charrsid1337904 \hich\af1\dbch\af31505\loch\f1 Version 3, 19 November 2007 +\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2070\langnp1033\insrsid12386343\charrsid12386343 \par \hich\af1\dbch\af31505\loch\f1 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> \par \hich\af1\dbch\af31505\loch\f1 Everyone is permitted to copy and distribute verbatim copies \par \hich\af1\dbch\af31505\loch\f1 of this license document, but changing it is not allowed. \par \par \hich\af1\dbch\af31505\loch\f1 Preamble \par -\par \hich\af1\dbch\af31505\loch\f1 The GNU Affero General Public License is a free, copyleft license for -\par \hich\af1\dbch\af31505\loch\f1 software and other kinds\hich\af1\dbch\af31505\loch\f1 of works, specifically designed to ensure +\par \hich\af1\dbch\af31505\loch\f1 The GNU Affero General P\hich\af1\dbch\af31505\loch\f1 ublic License is a free, copyleft license for +\par \hich\af1\dbch\af31505\loch\f1 software and other kinds of works, specifically designed to ensure \par \hich\af1\dbch\af31505\loch\f1 cooperation with the community in the case of network server software. \par \par \hich\af1\dbch\af31505\loch\f1 The licenses for most software and other practical works are designed @@ -65,46 +71,46 @@ Normal Table;}}{\*\rsidtbl \rsid11478430\rsid12386343}{\mmathPr\mmathFont34\mbrk \par \hich\af1\dbch\af31505\loch\f1 share and change all versions of a program--to make sure it remains free \par \hich\af1\dbch\af31505\loch\f1 software for all its users. \par -\par \hich\af1\dbch\af31505\loch\f1 When we speak of free software, we are referring to freedom, not -\par \hich\af1\dbch\af31505\loch\f1 price. Our Gen\hich\af1\dbch\af31505\loch\f1 eral Public Licenses are designed to make sure that you +\par \hich\af1\dbch\af31505\loch\f1 When we sp\hich\af1\dbch\af31505\loch\f1 eak of free software, we are referring to freedom, not +\par \hich\af1\dbch\af31505\loch\f1 price. Our General Public Licenses are designed to make sure that you \par \hich\af1\dbch\af31505\loch\f1 have the freedom to distribute copies of free software (and charge for -\par \hich\af1\dbch\af31505\loch\f1 them if you wish), that you receive source code or can get it if you -\par \hich\af1\dbch\af31505\loch\f1 want it, that you can change the software or use pieces of i\hich\af1\dbch\af31505\loch\f1 t in new +\par \hich\af1\dbch\af31505\loch\f1 them if you wish), that you receive source code or can get \hich\af1\dbch\af31505\loch\f1 it if you +\par \hich\af1\dbch\af31505\loch\f1 want it, that you can change the software or use pieces of it in new \par \hich\af1\dbch\af31505\loch\f1 free programs, and that you know you can do these things. \par \par \hich\af1\dbch\af31505\loch\f1 Developers that use our General Public Licenses protect your rights -\par \hich\af1\dbch\af31505\loch\f1 with two steps: (1) assert copyright on the software, and (2) offer -\par \hich\af1\dbch\af31505\loch\f1 you this License which gives you legal permission \hich\af1\dbch\af31505\loch\f1 to copy, distribute +\par \hich\af1\dbch\af31505\loch\f1 with two steps: (1) assert copyright on the soft\hich\af1\dbch\af31505\loch\f1 ware, and (2) offer +\par \hich\af1\dbch\af31505\loch\f1 you this License which gives you legal permission to copy, distribute \par \hich\af1\dbch\af31505\loch\f1 and/or modify the software. \par \par \hich\af1\dbch\af31505\loch\f1 A secondary benefit of defending all users' freedom is that \par \hich\af1\dbch\af31505\loch\f1 improvements made in alternate versions of the program, if they \par \hich\af1\dbch\af31505\loch\f1 receive widespread use, become available for other developers to \par \hich\af1\dbch\af31505\loch\f1 incorporate. Many developers of free software are heartened and -\par \hich\af1\dbch\af31505\loch\f1 encouraged by the resulting cooperation. However, in the case of -\par \hich\af1\dbch\af31505\loch\f1 software used on network servers, this result may fail to co\hich\af1\dbch\af31505\loch\f1 me about. +\par \hich\af1\dbch\af31505\loch\f1 encouraged by the resulting cooperation. However, in the case\hich\af1\dbch\af31505\loch\f1 of +\par \hich\af1\dbch\af31505\loch\f1 software used on network servers, this result may fail to come about. \par \hich\af1\dbch\af31505\loch\f1 The GNU General Public License permits making a modified version and \par \hich\af1\dbch\af31505\loch\f1 letting the public access it on a server without ever releasing its \par \hich\af1\dbch\af31505\loch\f1 source code to the public. \par -\par \hich\af1\dbch\af31505\loch\f1 The GNU Affero General Public License is designed specifically to -\par \hich\af1\dbch\af31505\loch\f1 ensure that, \hich\af1\dbch\af31505\loch\f1 in such cases, the modified source code becomes available +\par \hich\af1\dbch\af31505\loch\f1 The GNU Affero \hich\af1\dbch\af31505\loch\f1 General Public License is designed specifically to +\par \hich\af1\dbch\af31505\loch\f1 ensure that, in such cases, the modified source code becomes available \par \hich\af1\dbch\af31505\loch\f1 to the community. It requires the operator of a network server to -\par \hich\af1\dbch\af31505\loch\f1 provide the source code of the modified version running there to the -\par \hich\af1\dbch\af31505\loch\f1 users of that server. Therefore, public use of a modified ver\hich\af1\dbch\af31505\loch\f1 sion, on +\par \hich\af1\dbch\af31505\loch\f1 provide the source code of the modified version running there to th\hich\af1\dbch\af31505\loch\f1 e +\par \hich\af1\dbch\af31505\loch\f1 users of that server. Therefore, public use of a modified version, on \par \hich\af1\dbch\af31505\loch\f1 a publicly accessible server, gives the public access to the source \par \hich\af1\dbch\af31505\loch\f1 code of the modified version. \par \par \hich\af1\dbch\af31505\loch\f1 An older license, called the Affero General Public License and -\par \hich\af1\dbch\af31505\loch\f1 published by Affero, was designed to accomplish similar goals. This is -\par \hich\af1\dbch\af31505\loch\f1 a different\hich\af1\dbch\af31505\loch\f1 license, not a version of the Affero GPL, but Affero has +\par \hich\af1\dbch\af31505\loch\f1 published by Affero\hich\af1\dbch\af31505\loch\f1 , was designed to accomplish similar goals. This is +\par \hich\af1\dbch\af31505\loch\f1 a different license, not a version of the Affero GPL, but Affero has \par \hich\af1\dbch\af31505\loch\f1 released a new version of the Affero GPL which permits relicensing under \par \hich\af1\dbch\af31505\loch\f1 this license. \par -\par \hich\af1\dbch\af31505\loch\f1 The precise terms and conditions for copying, distribution and +\par \hich\af1\dbch\af31505\loch\f1 The precise terms and conditions for copying\hich\af1\dbch\af31505\loch\f1 , distribution and \par \hich\af1\dbch\af31505\loch\f1 modification follow. \par -\par \hich\af1\dbch\af31505\loch\f1 \hich\af1\dbch\af31505\loch\f1 TERMS AND CONDITIONS +\par \hich\af1\dbch\af31505\loch\f1 TERMS AND CONDITIONS \par \par \hich\af1\dbch\af31505\loch\f1 0. Definitions. \par @@ -113,24 +119,24 @@ Normal Table;}}{\*\rsidtbl \rsid11478430\rsid12386343}{\mmathPr\mmathFont34\mbrk \par \hich\af1\dbch\af31505\loch\f1 "Copyright" also means copyright-like laws that apply to other kinds of \par \hich\af1\dbch\af31505\loch\f1 works, such as semiconductor masks. \par -\par \hich\af1\dbch\af31505\loch\f1 "The Program" refers to any copyrightable work licensed under this +\par \hich\af1\dbch\af31505\loch\f1 "The Program" refers to any copyrightable work licensed under t\hich\af1\dbch\af31505\loch\f1 his \par \hich\af1\dbch\af31505\loch\f1 License. Each licensee is addressed as "you". "Licensees" and -\par \hich\af1\dbch\af31505\loch\f1 "recipients"\hich\af1\dbch\af31505\loch\f1 may be individuals or organizations. +\par \hich\af1\dbch\af31505\loch\f1 "recipients" may be individuals or organizations. \par \par \hich\af1\dbch\af31505\loch\f1 To "modify" a work means to copy from or adapt all or part of the work -\par \hich\af1\dbch\af31505\loch\f1 in a fashion requiring copyright permission, other than the making of an +\par \hich\af1\dbch\af31505\loch\f1 in a fashion requiring copyright permission, other than the maki\hich\af1\dbch\af31505\loch\f1 ng of an \par \hich\af1\dbch\af31505\loch\f1 exact copy. The resulting work is called a "modified version" of the -\par \hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 arlier work or a work "based on" the earlier work. +\par \hich\af1\dbch\af31505\loch\f1 earlier work or a work "based on" the earlier work. \par \par \hich\af1\dbch\af31505\loch\f1 A "covered work" means either the unmodified Program or a work based \par \hich\af1\dbch\af31505\loch\f1 on the Program. \par -\par \hich\af1\dbch\af31505\loch\f1 To "propagate" a work means to do anything with it that, without -\par \hich\af1\dbch\af31505\loch\f1 permission, would make you directly or secondaril\hich\af1\dbch\af31505\loch\f1 y liable for +\par \hich\af1\dbch\af31505\loch\f1 To "propagate" a work means to do \hich\af1\dbch\af31505\loch\f1 anything with it that, without +\par \hich\af1\dbch\af31505\loch\f1 permission, would make you directly or secondarily liable for \par \hich\af1\dbch\af31505\loch\f1 infringement under applicable copyright law, except executing it on a \par \hich\af1\dbch\af31505\loch\f1 computer or modifying a private copy. Propagation includes copying, -\par \hich\af1\dbch\af31505\loch\f1 distribution (with or without modification), making available to the -\par \hich\af1\dbch\af31505\loch\f1 public, and in some countries other\hich\af1\dbch\af31505\loch\f1 activities as well. +\par \hich\af1\dbch\af31505\loch\f1 distribution (with or wi\hich\af1\dbch\af31505\loch\f1 thout modification), making available to the +\par \hich\af1\dbch\af31505\loch\f1 public, and in some countries other activities as well. \par \par \hich\af1\dbch\af31505\loch\f1 To "convey" a work means any kind of propagation that enables other \par \hich\af1\dbch\af31505\loch\f1 parties to make or receive copies. Mere interaction with a user through @@ -476,7 +482,7 @@ Normal Table;}}{\*\rsidtbl \rsid11478430\rsid12386343}{\mmathPr\mmathFont34\mbrk \par \hich\af1\dbch\af31505\loch\f1 to receive a copy likewise does not require acceptance. However, \par \hich\af1\dbch\af31505\loch\f1 nothing other than this Licens\hich\af1\dbch\af31505\loch\f1 e grants you permission to propagate or \par \hich\af1\dbch\af31505\loch\f1 modify any covered work. These actions infringe copyright if you do -\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid12386343\charrsid12386343 \hich\af1\dbch\af31505\loch\f1 not accept this License. Therefore, by modifying or propagating a +\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2070\langnp1033\insrsid12386343\charrsid11416405 \hich\af1\dbch\af31505\loch\f1 not accept this License. Therefore, by modifying or propagating a \par \hich\af1\dbch\af31505\loch\f1 covered work, you indicate your acceptance of this License to do so. \par \par \hich\af1\dbch\af31505\loch\f1 10. Auto\hich\af1\dbch\af31505\loch\f1 matic Licensing of Downstream Recipients. @@ -540,32 +546,32 @@ Normal Table;}}{\*\rsidtbl \rsid11478430\rsid12386343}{\mmathPr\mmathFont34\mbrk \par \hich\af1\dbch\af31505\loch\f1 available, or (2) arrange to deprive yourself of the benefit of the \par \hich\af1\dbch\af31505\loch\f1 patent license for this particular work, or (3) arrange, in a manner \par \hich\af1\dbch\af31505\loch\f1 consistent with the requirements of this License, to extend the patent -\par \hich\af1\dbch\af31505\loch\f1 license to downstream recipients. "Knowingly relying" means you have +\par \hich\af1\dbch\af31505\loch\f1 license to downstream \hich\af1\dbch\af31505\loch\f1 recipients. "Knowingly relying" means you have \par \hich\af1\dbch\af31505\loch\f1 actual knowledge that, but for the patent license, your conveying the \par \hich\af1\dbch\af31505\loch\f1 covered work in a country, or your recipient's use of the covered work -\par \hich\af1\dbch\af31505\loch\f1 in a country, would infringe one or more iden\hich\af1\dbch\af31505\loch\f1 tifiable patents in that +\par \hich\af1\dbch\af31505\loch\f1 in a country, would infringe one or more identifiable patents in th\hich\af1\dbch\af31505\loch\f1 at \par \hich\af1\dbch\af31505\loch\f1 country that you have reason to believe are valid. \par \par \hich\af1\dbch\af31505\loch\f1 If, pursuant to or in connection with a single transaction or \par \hich\af1\dbch\af31505\loch\f1 arrangement, you convey, or propagate by procuring conveyance of, a -\par \hich\af1\dbch\af31505\loch\f1 covered work, and grant a patent license to som\hich\af1\dbch\af31505\loch\f1 e of the parties -\par \hich\af1\dbch\af31505\loch\f1 receiving the covered work authorizing them to use, propagate, modify +\par \hich\af1\dbch\af31505\loch\f1 covered work, and grant a patent license to some of the parties +\par \hich\af1\dbch\af31505\loch\f1 recei\hich\af1\dbch\af31505\loch\f1 ving the covered work authorizing them to use, propagate, modify \par \hich\af1\dbch\af31505\loch\f1 or convey a specific copy of the covered work, then the patent license \par \hich\af1\dbch\af31505\loch\f1 you grant is automatically extended to all recipients of the covered \par \hich\af1\dbch\af31505\loch\f1 work and works based on it. \par -\par \hich\af1\dbch\af31505\loch\f1 A patent license is "discriminatory" if it does not include within +\par \hich\af1\dbch\af31505\loch\f1 A patent license is \hich\af1\dbch\af31505\loch\f1 "discriminatory" if it does not include within \par \hich\af1\dbch\af31505\loch\f1 the scope of its coverage, prohibits the exercise of, or is \par \hich\af1\dbch\af31505\loch\f1 conditioned on the non-exercise of one or more of the rights that are -\par \hich\af1\dbch\af31505\loch\f1 specifically granted under this License. You may not con\hich\af1\dbch\af31505\loch\f1 vey a covered -\par \hich\af1\dbch\af31505\loch\f1 work if you are a party to an arrangement with a third party that is +\par \hich\af1\dbch\af31505\loch\f1 specifically granted under this License. You may not convey a covered +\par \hich\af1\dbch\af31505\loch\f1 work if \hich\af1\dbch\af31505\loch\f1 you are a party to an arrangement with a third party that is \par \hich\af1\dbch\af31505\loch\f1 in the business of distributing software, under which you make payment \par \hich\af1\dbch\af31505\loch\f1 to the third party based on the extent of your activity of conveying -\par \hich\af1\dbch\af31505\loch\f1 the work, and under which the thi\hich\af1\dbch\af31505\loch\f1 rd party grants, to any of the +\par \hich\af1\dbch\af31505\loch\f1 the work, and under which the third party grants, to an\hich\af1\dbch\af31505\loch\f1 y of the \par \hich\af1\dbch\af31505\loch\f1 parties who would receive the covered work from you, a discriminatory \par \hich\af1\dbch\af31505\loch\f1 patent license (a) in connection with copies of the covered work \par \hich\af1\dbch\af31505\loch\f1 conveyed by you (or copies made from those copies), or (b) primarily -\par \hich\af1\dbch\af31505\loch\f1 for and in connection\hich\af1\dbch\af31505\loch\f1 with specific products or compilations that +\par \hich\af1\dbch\af31505\loch\f1 for and in connection with specific product\hich\af1\dbch\af31505\loch\f1 s or compilations that \par \hich\af1\dbch\af31505\loch\f1 contain the covered work, unless you entered into that arrangement, \par \hich\af1\dbch\af31505\loch\f1 or that patent license was granted, prior to 28 March 2007. \par @@ -706,7 +712,9 @@ Normal Table;}}{\*\rsidtbl \rsid11478430\rsid12386343}{\mmathPr\mmathFont34\mbrk \par \hich\af1\dbch\af31505\loch\f1 You should also get your employer (if you work as a programmer) or school, \par \hich\af1\dbch\af31505\loch\f1 if any, to sign a "copyright disclaimer" for the program, if necessary. \par \hich\af1\dbch\af31505\loch\f1 For m\hich\af1\dbch\af31505\loch\f1 ore information on this, and how to apply and follow the GNU AGPL, see -\par \hich\af1\dbch\af31505\loch\f1 <https://www.gnu.org/licenses/>.}{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid11478430\charrsid12386343 +\par \hich\af1\dbch\af31505\loch\f1 <}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2070\langnp1033\insrsid12386343\charrsid6292107 \hich\af1\dbch\af31505\loch\f1 https://www.g\hich\af1\dbch\af31505\loch\f1 nu.org/licenses}{\rtlch\fcs1 +\af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2070\langnp1033\insrsid11416405\charrsid6292107 \hich\af1\dbch\af31505\loch\f1 /}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe2070\langnp1033\insrsid12386343\charrsid11416405 +\hich\af1\dbch\af31505\loch\f1 >.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe2070\langnp1033\insrsid11478430\charrsid11416405 \par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a 9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad 5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 @@ -791,35 +799,25 @@ d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995 \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym; \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition; \lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Table;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 1; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Simple 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Classic 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Colorful 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 3; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Columns 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 6; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Grid 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 6; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table List 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table 3D effects 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Contemporary;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Elegant;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Professional; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Subtle 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 1;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 2; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Web 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Table Theme;\lsdsemihidden1 \lsdlocked0 Placeholder Text; -\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; -\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; -\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; -\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision; -\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; -\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; -\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; -\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; -\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; -\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; -\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; -\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; -\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; -\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; -\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; -\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid; +\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid; +\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1; +\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2; +\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3; +\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; \lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; @@ -861,8 +859,8 @@ fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e50000000000000000000000004016 -b0f74b47d601feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000c0f7 +b1ee6289d701feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000105000000000000}}
\ No newline at end of file diff --git a/UVtools.Installer/UVtools.Installer.wixproj b/UVtools.Installer/UVtools.Installer.wixproj index f342739..ccf01d4 100644 --- a/UVtools.Installer/UVtools.Installer.wixproj +++ b/UVtools.Installer/UVtools.Installer.wixproj @@ -1,7 +1,7 @@ <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">x86</Platform> + <Platform Condition=" '$(Platform)' == '' ">x64</Platform> <ProductVersion>3.7</ProductVersion> <ProjectGuid>{41224896-08e9-4f22-9e56-5f9d46dec7d2}</ProjectGuid> <SchemaVersion>2.0</SchemaVersion> diff --git a/UVtools.InstallerMM/UVtools.InstallerMM.wixproj b/UVtools.InstallerMM/UVtools.InstallerMM.wixproj index d308515..8223831 100644 --- a/UVtools.InstallerMM/UVtools.InstallerMM.wixproj +++ b/UVtools.InstallerMM/UVtools.InstallerMM.wixproj @@ -1,7 +1,7 @@ <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> - <Platform Condition=" '$(Platform)' == '' ">x86</Platform> + <Platform Condition=" '$(Platform)' == '' ">x64</Platform> <ProductVersion>3.7</ProductVersion> <ProjectGuid>{e53baa5d-29a8-4287-b3aa-1aff5a4bdc6c}</ProjectGuid> <SchemaVersion>2.0</SchemaVersion> diff --git a/UVtools.InstallerMM/UVtools.InstallerMM.wxs b/UVtools.InstallerMM/UVtools.InstallerMM.wxs index 7cd6c1e..e762ac3 100644 --- a/UVtools.InstallerMM/UVtools.InstallerMM.wxs +++ b/UVtools.InstallerMM/UVtools.InstallerMM.wxs @@ -4,851 +4,854 @@ <!-- SourceDir instructs IsWiX the location of the directory that contains files for this merge module --> <?define SourceDir="..\publish\win-x64"?> <Module Id="UVtools" Language="1033" Version="1.0.0.0"> - <Package Id="12aaa1cf-ff06-4a02-abd5-2ac01ac4f83b" Manufacturer="PTRTECH" InstallerVersion="200" Keywords="MSLA, DLP" Description="MSLA/DLP, file analysis, repair, conversion and manipulation" InstallScope="perMachine" /> + <Package Id="12aaa1cf-ff06-4a02-abd5-2ac01ac4f83b" Manufacturer="PTRTECH" InstallerVersion="200" Keywords="MSLA, DLP" Description="MSLA/DLP, file analysis, repair, conversion and manipulation" InstallScope="perMachine" Platform="x64" /> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="DesktopFolder" /> <Directory Id="MergeRedirectFolder"> - <Component Id="owc8E67DDA19FDE9EB745B0ADE651E8DC86" Guid="3744e071-b6de-ada6-7887-761d99e8f73b"> + <Component Id="owc8E67DDA19FDE9EB745B0ADE651E8DC86" Guid="3744e071-b6de-ada6-7887-761d99e8f73b" Win64="yes"> <File Id="owf8E67DDA19FDE9EB745B0ADE651E8DC86" Source="$(var.SourceDir)\AnimatedGif.dll" KeyPath="yes" /> </Component> - <Component Id="owcF3EB3D7C133F5B48E5859309ABDC2EE0" Guid="5a6040ae-b91e-47b6-8438-d9cd47fb947a"> + <Component Id="owcF3EB3D7C133F5B48E5859309ABDC2EE0" Guid="5a6040ae-b91e-47b6-8438-d9cd47fb947a" Win64="yes"> <File Id="owfF3EB3D7C133F5B48E5859309ABDC2EE0" Source="$(var.SourceDir)\api-ms-win-core-console-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcFA31C1307B4F2830BF0AB23B88C6F1C0" Guid="29cf69a8-5aa7-fc7d-dc59-c2406bdbf06e"> + <Component Id="owcFA31C1307B4F2830BF0AB23B88C6F1C0" Guid="29cf69a8-5aa7-fc7d-dc59-c2406bdbf06e" Win64="yes"> <File Id="owfFA31C1307B4F2830BF0AB23B88C6F1C0" Source="$(var.SourceDir)\api-ms-win-core-console-l1-2-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcB0E3C7251F136710A0F11E0C18525364" Guid="f80e6202-0436-d488-52cf-827e37483096"> + <Component Id="owcB0E3C7251F136710A0F11E0C18525364" Guid="f80e6202-0436-d488-52cf-827e37483096" Win64="yes"> <File Id="owfB0E3C7251F136710A0F11E0C18525364" Source="$(var.SourceDir)\api-ms-win-core-datetime-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc4B0AD9DF281D253C1207D4E82DEB0DD2" Guid="4ac4edbd-2c6a-8aed-125e-11237a36e4f8"> + <Component Id="owc4B0AD9DF281D253C1207D4E82DEB0DD2" Guid="4ac4edbd-2c6a-8aed-125e-11237a36e4f8" Win64="yes"> <File Id="owf4B0AD9DF281D253C1207D4E82DEB0DD2" Source="$(var.SourceDir)\api-ms-win-core-debug-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc0BC091DFDF8929131FA52A129DCEBED7" Guid="dc61ed86-1fb2-43f1-ba79-d39df61efff6"> + <Component Id="owc0BC091DFDF8929131FA52A129DCEBED7" Guid="dc61ed86-1fb2-43f1-ba79-d39df61efff6" Win64="yes"> <File Id="owf0BC091DFDF8929131FA52A129DCEBED7" Source="$(var.SourceDir)\api-ms-win-core-errorhandling-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcB8506905830F0088BB646B3A8730400E" Guid="c32be070-5e67-9acf-2253-bce1d67d0139"> + <Component Id="owcB8506905830F0088BB646B3A8730400E" Guid="c32be070-5e67-9acf-2253-bce1d67d0139" Win64="yes"> <File Id="owfB8506905830F0088BB646B3A8730400E" Source="$(var.SourceDir)\api-ms-win-core-file-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcE8347DEA0E729A0801F9EC688606ED5A" Guid="47cea295-3138-da6c-5ab5-1e3c6f6ae58a"> + <Component Id="owcE8347DEA0E729A0801F9EC688606ED5A" Guid="47cea295-3138-da6c-5ab5-1e3c6f6ae58a" Win64="yes"> <File Id="owfE8347DEA0E729A0801F9EC688606ED5A" Source="$(var.SourceDir)\api-ms-win-core-file-l1-2-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcBC4BB905E2625FF8812B77442EC3F27B" Guid="f02a6238-6002-1e28-2813-76c8afaa1d3c"> + <Component Id="owcBC4BB905E2625FF8812B77442EC3F27B" Guid="f02a6238-6002-1e28-2813-76c8afaa1d3c" Win64="yes"> <File Id="owfBC4BB905E2625FF8812B77442EC3F27B" Source="$(var.SourceDir)\api-ms-win-core-file-l2-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc740A048F42D8DF1A9A77580493C4C987" Guid="f9ef4f41-636f-0a9a-335e-6ec96c45d13c"> + <Component Id="owc740A048F42D8DF1A9A77580493C4C987" Guid="f9ef4f41-636f-0a9a-335e-6ec96c45d13c" Win64="yes"> <File Id="owf740A048F42D8DF1A9A77580493C4C987" Source="$(var.SourceDir)\api-ms-win-core-handle-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc139D09B67243A68F34B95704CCB38020" Guid="ff774f94-e3c3-eac4-982e-e892f317a235"> + <Component Id="owc139D09B67243A68F34B95704CCB38020" Guid="ff774f94-e3c3-eac4-982e-e892f317a235" Win64="yes"> <File Id="owf139D09B67243A68F34B95704CCB38020" Source="$(var.SourceDir)\api-ms-win-core-heap-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc65372F05C29E55457B1C95D7E75F56EA" Guid="55dacd03-85c4-b361-95e9-8f97e8ad7a31"> + <Component Id="owc65372F05C29E55457B1C95D7E75F56EA" Guid="55dacd03-85c4-b361-95e9-8f97e8ad7a31" Win64="yes"> <File Id="owf65372F05C29E55457B1C95D7E75F56EA" Source="$(var.SourceDir)\api-ms-win-core-interlocked-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc83FA9B95DF474359D7DABD4543DD33E6" Guid="4d368a8e-f1d7-a0d9-d5e5-a79bf86b3579"> + <Component Id="owc83FA9B95DF474359D7DABD4543DD33E6" Guid="4d368a8e-f1d7-a0d9-d5e5-a79bf86b3579" Win64="yes"> <File Id="owf83FA9B95DF474359D7DABD4543DD33E6" Source="$(var.SourceDir)\api-ms-win-core-libraryloader-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc6DCAA1302E4C4C84B800FB1E70119DF0" Guid="d915a3e0-a53b-6f2b-2899-1554d5781918"> + <Component Id="owc6DCAA1302E4C4C84B800FB1E70119DF0" Guid="d915a3e0-a53b-6f2b-2899-1554d5781918" Win64="yes"> <File Id="owf6DCAA1302E4C4C84B800FB1E70119DF0" Source="$(var.SourceDir)\api-ms-win-core-localization-l1-2-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc404603E02B0B789BCB7F840BB530BA6A" Guid="9f431d8e-8e7b-8abf-d199-71b22010a26f"> + <Component Id="owc404603E02B0B789BCB7F840BB530BA6A" Guid="9f431d8e-8e7b-8abf-d199-71b22010a26f" Win64="yes"> <File Id="owf404603E02B0B789BCB7F840BB530BA6A" Source="$(var.SourceDir)\api-ms-win-core-memory-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc64E8470B0E608FAC29A885FE1E254BB5" Guid="4b64e16c-f93c-adf9-aaf5-be236c900a97"> + <Component Id="owc64E8470B0E608FAC29A885FE1E254BB5" Guid="4b64e16c-f93c-adf9-aaf5-be236c900a97" Win64="yes"> <File Id="owf64E8470B0E608FAC29A885FE1E254BB5" Source="$(var.SourceDir)\api-ms-win-core-namedpipe-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcC43BF7A4E7A31856547F0A915D3E720D" Guid="1fd136d4-542d-1e9a-3adc-f8b2821d94ac"> + <Component Id="owcC43BF7A4E7A31856547F0A915D3E720D" Guid="1fd136d4-542d-1e9a-3adc-f8b2821d94ac" Win64="yes"> <File Id="owfC43BF7A4E7A31856547F0A915D3E720D" Source="$(var.SourceDir)\api-ms-win-core-processenvironment-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcC944A567AF4971E0F6690D1F6B0E2188" Guid="bee79815-ccc0-8f0b-5ba5-27021637a3fc"> + <Component Id="owcC944A567AF4971E0F6690D1F6B0E2188" Guid="bee79815-ccc0-8f0b-5ba5-27021637a3fc" Win64="yes"> <File Id="owfC944A567AF4971E0F6690D1F6B0E2188" Source="$(var.SourceDir)\api-ms-win-core-processthreads-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc063581CA4F10046EFAB402C73DBB2AE2" Guid="a36b82c7-e6a3-321f-9948-e94e30513204"> + <Component Id="owc063581CA4F10046EFAB402C73DBB2AE2" Guid="a36b82c7-e6a3-321f-9948-e94e30513204" Win64="yes"> <File Id="owf063581CA4F10046EFAB402C73DBB2AE2" Source="$(var.SourceDir)\api-ms-win-core-processthreads-l1-1-1.dll" KeyPath="yes" /> </Component> - <Component Id="owc70447A29E3762E57B9C5AA1F0F0B0DE6" Guid="372cf964-065e-c240-0074-3198fed89881"> + <Component Id="owc70447A29E3762E57B9C5AA1F0F0B0DE6" Guid="372cf964-065e-c240-0074-3198fed89881" Win64="yes"> <File Id="owf70447A29E3762E57B9C5AA1F0F0B0DE6" Source="$(var.SourceDir)\api-ms-win-core-profile-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcF57953A9122696C0FA8DD3345F2649C3" Guid="3f3b3dc3-ce42-f3cf-4406-4bfa18a7b58d"> + <Component Id="owcF57953A9122696C0FA8DD3345F2649C3" Guid="3f3b3dc3-ce42-f3cf-4406-4bfa18a7b58d" Win64="yes"> <File Id="owfF57953A9122696C0FA8DD3345F2649C3" Source="$(var.SourceDir)\api-ms-win-core-rtlsupport-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc7ADECD5D4A25825BBF26821AD5DDCD50" Guid="2c6007ac-65cd-67ac-43d5-07b874640ecb"> + <Component Id="owc7ADECD5D4A25825BBF26821AD5DDCD50" Guid="2c6007ac-65cd-67ac-43d5-07b874640ecb" Win64="yes"> <File Id="owf7ADECD5D4A25825BBF26821AD5DDCD50" Source="$(var.SourceDir)\api-ms-win-core-string-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcB678D5C59AC99A47A3BD4E490206F834" Guid="21cc017a-2cb8-74ab-cf18-a404ba2b8b44"> + <Component Id="owcB678D5C59AC99A47A3BD4E490206F834" Guid="21cc017a-2cb8-74ab-cf18-a404ba2b8b44" Win64="yes"> <File Id="owfB678D5C59AC99A47A3BD4E490206F834" Source="$(var.SourceDir)\api-ms-win-core-synch-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc31615FBE506FE8C6C3164744E49BD75A" Guid="35ddd353-900a-cd82-d8bb-fab3c63e5af3"> + <Component Id="owc31615FBE506FE8C6C3164744E49BD75A" Guid="35ddd353-900a-cd82-d8bb-fab3c63e5af3" Win64="yes"> <File Id="owf31615FBE506FE8C6C3164744E49BD75A" Source="$(var.SourceDir)\api-ms-win-core-synch-l1-2-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc8BF6D3E06929C968426F71A39AB67A6A" Guid="4d2cfb22-00c1-4f5c-8993-94c6117f2586"> + <Component Id="owc8BF6D3E06929C968426F71A39AB67A6A" Guid="4d2cfb22-00c1-4f5c-8993-94c6117f2586" Win64="yes"> <File Id="owf8BF6D3E06929C968426F71A39AB67A6A" Source="$(var.SourceDir)\api-ms-win-core-sysinfo-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc2B55561383738D0EC2FC457DCEE62880" Guid="db80f8f9-0d57-d2d3-8ec0-ede1cc33faca"> + <Component Id="owc2B55561383738D0EC2FC457DCEE62880" Guid="db80f8f9-0d57-d2d3-8ec0-ede1cc33faca" Win64="yes"> <File Id="owf2B55561383738D0EC2FC457DCEE62880" Source="$(var.SourceDir)\api-ms-win-core-timezone-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc68FE9A51BE117EA988B03782E905E80C" Guid="41ab7ba6-2a93-8f92-ccce-010861eedcdb"> + <Component Id="owc68FE9A51BE117EA988B03782E905E80C" Guid="41ab7ba6-2a93-8f92-ccce-010861eedcdb" Win64="yes"> <File Id="owf68FE9A51BE117EA988B03782E905E80C" Source="$(var.SourceDir)\api-ms-win-core-util-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcD1693AA47CB9D1478746AA0EA51393DE" Guid="21deac68-aabd-ca78-9850-5d3946257dd2"> + <Component Id="owcD1693AA47CB9D1478746AA0EA51393DE" Guid="21deac68-aabd-ca78-9850-5d3946257dd2" Win64="yes"> <File Id="owfD1693AA47CB9D1478746AA0EA51393DE" Source="$(var.SourceDir)\api-ms-win-crt-conio-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcC0FF1ED3E758B2E709F858D62299B564" Guid="b625b88e-4abf-6166-ead9-51d7f022a245"> + <Component Id="owcC0FF1ED3E758B2E709F858D62299B564" Guid="b625b88e-4abf-6166-ead9-51d7f022a245" Win64="yes"> <File Id="owfC0FF1ED3E758B2E709F858D62299B564" Source="$(var.SourceDir)\api-ms-win-crt-convert-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcFF109116ADE424E019A74ECEDCEEDC96" Guid="df956e13-b57b-21f3-03e3-03045db37ad0"> + <Component Id="owcFF109116ADE424E019A74ECEDCEEDC96" Guid="df956e13-b57b-21f3-03e3-03045db37ad0" Win64="yes"> <File Id="owfFF109116ADE424E019A74ECEDCEEDC96" Source="$(var.SourceDir)\api-ms-win-crt-environment-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc58EEEBEEDA434B7510814325C1AB10BD" Guid="78a9cebd-4ff7-7156-01c1-701cc378ec48"> + <Component Id="owc58EEEBEEDA434B7510814325C1AB10BD" Guid="78a9cebd-4ff7-7156-01c1-701cc378ec48" Win64="yes"> <File Id="owf58EEEBEEDA434B7510814325C1AB10BD" Source="$(var.SourceDir)\api-ms-win-crt-filesystem-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcF9145DB2949158EE66CAF13467D7CDEA" Guid="0db242df-3c38-59d9-ba82-678292e415e9"> + <Component Id="owcF9145DB2949158EE66CAF13467D7CDEA" Guid="0db242df-3c38-59d9-ba82-678292e415e9" Win64="yes"> <File Id="owfF9145DB2949158EE66CAF13467D7CDEA" Source="$(var.SourceDir)\api-ms-win-crt-heap-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc04E2797822CA701738BA8CF773ACA17D" Guid="e1ceddda-a7e2-c588-eff5-1c64a6829942"> + <Component Id="owc04E2797822CA701738BA8CF773ACA17D" Guid="e1ceddda-a7e2-c588-eff5-1c64a6829942" Win64="yes"> <File Id="owf04E2797822CA701738BA8CF773ACA17D" Source="$(var.SourceDir)\api-ms-win-crt-locale-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc79E5C41B2E769D88A7E451C9B85B7D3E" Guid="5af7dee7-e556-d050-2bee-905bab048731"> + <Component Id="owc79E5C41B2E769D88A7E451C9B85B7D3E" Guid="5af7dee7-e556-d050-2bee-905bab048731" Win64="yes"> <File Id="owf79E5C41B2E769D88A7E451C9B85B7D3E" Source="$(var.SourceDir)\api-ms-win-crt-math-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcC0DD0DCFA4C8391F0584DDBFD3D01D8A" Guid="69d99aa1-532a-a42b-da66-239b695caa29"> + <Component Id="owcC0DD0DCFA4C8391F0584DDBFD3D01D8A" Guid="69d99aa1-532a-a42b-da66-239b695caa29" Win64="yes"> <File Id="owfC0DD0DCFA4C8391F0584DDBFD3D01D8A" Source="$(var.SourceDir)\api-ms-win-crt-multibyte-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc00DF349696D15E13CDDB73EFE89973BF" Guid="86dbb085-cf17-3a18-0b04-48ca1dcdf789"> + <Component Id="owc00DF349696D15E13CDDB73EFE89973BF" Guid="86dbb085-cf17-3a18-0b04-48ca1dcdf789" Win64="yes"> <File Id="owf00DF349696D15E13CDDB73EFE89973BF" Source="$(var.SourceDir)\api-ms-win-crt-private-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc1C6DFB0EB64E5491806509E3A185DA92" Guid="69d98238-e53d-68df-a2d1-a40f0f074603"> + <Component Id="owc1C6DFB0EB64E5491806509E3A185DA92" Guid="69d98238-e53d-68df-a2d1-a40f0f074603" Win64="yes"> <File Id="owf1C6DFB0EB64E5491806509E3A185DA92" Source="$(var.SourceDir)\api-ms-win-crt-process-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc6D67191F10304B6EEB061FF6C8BA189E" Guid="c3e4e843-7d00-d6eb-57e1-dffe08b74b39"> + <Component Id="owc6D67191F10304B6EEB061FF6C8BA189E" Guid="c3e4e843-7d00-d6eb-57e1-dffe08b74b39" Win64="yes"> <File Id="owf6D67191F10304B6EEB061FF6C8BA189E" Source="$(var.SourceDir)\api-ms-win-crt-runtime-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcD4C69D7E7D5B0EB2FCF1A1D64DB4E549" Guid="04a20710-8488-76dd-a682-05f5beda4865"> + <Component Id="owcD4C69D7E7D5B0EB2FCF1A1D64DB4E549" Guid="04a20710-8488-76dd-a682-05f5beda4865" Win64="yes"> <File Id="owfD4C69D7E7D5B0EB2FCF1A1D64DB4E549" Source="$(var.SourceDir)\api-ms-win-crt-stdio-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc6BD6F8DDDEE0D45B22F4D0C1651442CB" Guid="2bda440c-7480-06ee-f3b8-bd2d961eaa70"> + <Component Id="owc6BD6F8DDDEE0D45B22F4D0C1651442CB" Guid="2bda440c-7480-06ee-f3b8-bd2d961eaa70" Win64="yes"> <File Id="owf6BD6F8DDDEE0D45B22F4D0C1651442CB" Source="$(var.SourceDir)\api-ms-win-crt-string-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcD70B7FCB3BE2EABECC4DA8763976173F" Guid="f903429f-585a-59b2-7b0e-d4eb32984751"> + <Component Id="owcD70B7FCB3BE2EABECC4DA8763976173F" Guid="f903429f-585a-59b2-7b0e-d4eb32984751" Win64="yes"> <File Id="owfD70B7FCB3BE2EABECC4DA8763976173F" Source="$(var.SourceDir)\api-ms-win-crt-time-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owc2B8CEEBABEB111119D338BBEA7DDEE56" Guid="360a1a54-67cf-c5bc-ba1f-45460ea2297c"> + <Component Id="owc2B8CEEBABEB111119D338BBEA7DDEE56" Guid="360a1a54-67cf-c5bc-ba1f-45460ea2297c" Win64="yes"> <File Id="owf2B8CEEBABEB111119D338BBEA7DDEE56" Source="$(var.SourceDir)\api-ms-win-crt-utility-l1-1-0.dll" KeyPath="yes" /> </Component> - <Component Id="owcD7380A80B6429BB4DD3659354FF3599A" Guid="20b81152-3892-057d-a7ba-4ecf09ee3857"> + <Component Id="owcD7380A80B6429BB4DD3659354FF3599A" Guid="20b81152-3892-057d-a7ba-4ecf09ee3857" Win64="yes"> <File Id="owfD7380A80B6429BB4DD3659354FF3599A" Source="$(var.SourceDir)\Avalonia.Animation.dll" KeyPath="yes" /> </Component> - <Component Id="owcCBA06267CD7D69F59C478AB8551B1F8B" Guid="0540f694-8b6f-e03c-6003-48c1fa3e72e8"> + <Component Id="owcCBA06267CD7D69F59C478AB8551B1F8B" Guid="0540f694-8b6f-e03c-6003-48c1fa3e72e8" Win64="yes"> <File Id="owfCBA06267CD7D69F59C478AB8551B1F8B" Source="$(var.SourceDir)\Avalonia.Base.dll" KeyPath="yes" /> </Component> - <Component Id="owcC02D5A123FCE6AFFB4061750C62E6AA6" Guid="4640e05c-e685-ab89-a262-216faf27d765"> + <Component Id="owcC02D5A123FCE6AFFB4061750C62E6AA6" Guid="4640e05c-e685-ab89-a262-216faf27d765" Win64="yes"> <File Id="owfC02D5A123FCE6AFFB4061750C62E6AA6" Source="$(var.SourceDir)\Avalonia.Controls.DataGrid.dll" KeyPath="yes" /> </Component> - <Component Id="owc43312941CA94028E1397B9994C2D7ED9" Guid="81d7abba-5527-f12c-e97c-c1be0d913f98"> + <Component Id="owc43312941CA94028E1397B9994C2D7ED9" Guid="81d7abba-5527-f12c-e97c-c1be0d913f98" Win64="yes"> <File Id="owf43312941CA94028E1397B9994C2D7ED9" Source="$(var.SourceDir)\Avalonia.Controls.dll" KeyPath="yes" /> </Component> - <Component Id="owc9BCEC280F9C4B1B69CD49CBD48B8C865" Guid="c66f1b6d-cfe8-9edb-dcc2-4a4dae306a98"> + <Component Id="owc9BCEC280F9C4B1B69CD49CBD48B8C865" Guid="c66f1b6d-cfe8-9edb-dcc2-4a4dae306a98" Win64="yes"> <File Id="owf9BCEC280F9C4B1B69CD49CBD48B8C865" Source="$(var.SourceDir)\Avalonia.DesignerSupport.dll" KeyPath="yes" /> </Component> - <Component Id="owc5B4A40E91AC07B12DFE396FA497C9227" Guid="0741d6ce-ea95-9492-6e0e-a1dfc41f3ef9"> + <Component Id="owc5B4A40E91AC07B12DFE396FA497C9227" Guid="0741d6ce-ea95-9492-6e0e-a1dfc41f3ef9" Win64="yes"> <File Id="owf5B4A40E91AC07B12DFE396FA497C9227" Source="$(var.SourceDir)\Avalonia.Desktop.dll" KeyPath="yes" /> </Component> - <Component Id="owc27A5D1506739847D9D7688256879A937" Guid="30f2e89f-1e95-77b9-1c3b-90bd4d875160"> + <Component Id="owc27A5D1506739847D9D7688256879A937" Guid="30f2e89f-1e95-77b9-1c3b-90bd4d875160" Win64="yes"> <File Id="owf27A5D1506739847D9D7688256879A937" Source="$(var.SourceDir)\Avalonia.DesktopRuntime.dll" KeyPath="yes" /> </Component> - <Component Id="owcAA73F8E2C0EE78F802BAA8B361043211" Guid="536d2de0-51e7-19c8-3a8e-466146777c64"> + <Component Id="owcAA73F8E2C0EE78F802BAA8B361043211" Guid="536d2de0-51e7-19c8-3a8e-466146777c64" Win64="yes"> <File Id="owfAA73F8E2C0EE78F802BAA8B361043211" Source="$(var.SourceDir)\Avalonia.Diagnostics.dll" KeyPath="yes" /> </Component> - <Component Id="owc6C15ADD7A5EE7A0CBEFD35B0027BBEB7" Guid="9c4a8ab3-598c-8e7c-0295-5c068334ab67"> + <Component Id="owc6C15ADD7A5EE7A0CBEFD35B0027BBEB7" Guid="9c4a8ab3-598c-8e7c-0295-5c068334ab67" Win64="yes"> <File Id="owf6C15ADD7A5EE7A0CBEFD35B0027BBEB7" Source="$(var.SourceDir)\Avalonia.Dialogs.dll" KeyPath="yes" /> </Component> - <Component Id="owc437B704291AF430E7FAF436BD9105196" Guid="bd31c36f-0a7a-7980-fd46-9cbfa0be3c05"> + <Component Id="owc437B704291AF430E7FAF436BD9105196" Guid="bd31c36f-0a7a-7980-fd46-9cbfa0be3c05" Win64="yes"> <File Id="owf437B704291AF430E7FAF436BD9105196" Source="$(var.SourceDir)\Avalonia.dll" KeyPath="yes" /> </Component> - <Component Id="owc8B7F38628C7EDDC3DFDEFB877EF5DC10" Guid="b04773d8-71fe-651f-6f2d-98411ae7bce9"> + <Component Id="owc8B7F38628C7EDDC3DFDEFB877EF5DC10" Guid="b04773d8-71fe-651f-6f2d-98411ae7bce9" Win64="yes"> <File Id="owf8B7F38628C7EDDC3DFDEFB877EF5DC10" Source="$(var.SourceDir)\Avalonia.FreeDesktop.dll" KeyPath="yes" /> </Component> - <Component Id="owc5AD74C3398CCA7C990D4B281B84DCEBB" Guid="21e9caf1-f88c-633b-dbf8-b8f4f94c8032"> + <Component Id="owc5AD74C3398CCA7C990D4B281B84DCEBB" Guid="21e9caf1-f88c-633b-dbf8-b8f4f94c8032" Win64="yes"> <File Id="owf5AD74C3398CCA7C990D4B281B84DCEBB" Source="$(var.SourceDir)\Avalonia.Input.dll" KeyPath="yes" /> </Component> - <Component Id="owcEACB5F0F57103C4EE185E047FF1826F1" Guid="df1d0500-505f-9591-d7db-9dcd37ba2a35"> + <Component Id="owcEACB5F0F57103C4EE185E047FF1826F1" Guid="df1d0500-505f-9591-d7db-9dcd37ba2a35" Win64="yes"> <File Id="owfEACB5F0F57103C4EE185E047FF1826F1" Source="$(var.SourceDir)\Avalonia.Interactivity.dll" KeyPath="yes" /> </Component> - <Component Id="owcA3CC643938FE3DDCDA48D353D25E3C16" Guid="cabcc50e-a385-3ecf-5c74-026f44d595a8"> + <Component Id="owcA3CC643938FE3DDCDA48D353D25E3C16" Guid="cabcc50e-a385-3ecf-5c74-026f44d595a8" Win64="yes"> <File Id="owfA3CC643938FE3DDCDA48D353D25E3C16" Source="$(var.SourceDir)\Avalonia.Layout.dll" KeyPath="yes" /> </Component> - <Component Id="owcC0B00F3CD5A0DCEFD01DC823C07E6F72" Guid="7030563e-1fd3-b3e9-0540-5f20b4d225de"> + <Component Id="owcC0B00F3CD5A0DCEFD01DC823C07E6F72" Guid="7030563e-1fd3-b3e9-0540-5f20b4d225de" Win64="yes"> <File Id="owfC0B00F3CD5A0DCEFD01DC823C07E6F72" Source="$(var.SourceDir)\Avalonia.Markup.dll" KeyPath="yes" /> </Component> - <Component Id="owcF8D46916EBAD015C45AD96CFA020065B" Guid="e65fa3f1-f330-eee1-9307-9a4d0835d4c2"> + <Component Id="owcF8D46916EBAD015C45AD96CFA020065B" Guid="e65fa3f1-f330-eee1-9307-9a4d0835d4c2" Win64="yes"> <File Id="owfF8D46916EBAD015C45AD96CFA020065B" Source="$(var.SourceDir)\Avalonia.Markup.Xaml.dll" KeyPath="yes" /> </Component> - <Component Id="owc6834F87221790516C5BC358659FB168A" Guid="a648aa0a-edab-e191-afb0-5744596ea468"> + <Component Id="owc6834F87221790516C5BC358659FB168A" Guid="a648aa0a-edab-e191-afb0-5744596ea468" Win64="yes"> <File Id="owf6834F87221790516C5BC358659FB168A" Source="$(var.SourceDir)\Avalonia.MicroCom.dll" KeyPath="yes" /> </Component> - <Component Id="owc429F500BA073A0E6269B9341D14183BD" Guid="dcb4ad79-d927-c83e-1938-b2872b68db22"> + <Component Id="owc429F500BA073A0E6269B9341D14183BD" Guid="dcb4ad79-d927-c83e-1938-b2872b68db22" Win64="yes"> <File Id="owf429F500BA073A0E6269B9341D14183BD" Source="$(var.SourceDir)\Avalonia.Native.dll" KeyPath="yes" /> </Component> - <Component Id="owc4E185369FC40F6DAFEBB23AA25A98904" Guid="b6be3442-f344-161b-bce4-a08b16f6f69d"> + <Component Id="owc4E185369FC40F6DAFEBB23AA25A98904" Guid="b6be3442-f344-161b-bce4-a08b16f6f69d" Win64="yes"> <File Id="owf4E185369FC40F6DAFEBB23AA25A98904" Source="$(var.SourceDir)\Avalonia.OpenGL.dll" KeyPath="yes" /> </Component> - <Component Id="owcD69CFCE9EE400CCC3A2DC69ECB3AFB9C" Guid="a4b34c19-87d5-7b3f-61a5-4a897c32202f"> + <Component Id="owcD69CFCE9EE400CCC3A2DC69ECB3AFB9C" Guid="a4b34c19-87d5-7b3f-61a5-4a897c32202f" Win64="yes"> <File Id="owfD69CFCE9EE400CCC3A2DC69ECB3AFB9C" Source="$(var.SourceDir)\Avalonia.Remote.Protocol.dll" KeyPath="yes" /> </Component> - <Component Id="owcFAF24430FC9CE0D7B5510DC5C18085B1" Guid="b0bc07e7-111c-67a3-a90f-8bc47f0dcbb2"> + <Component Id="owcFAF24430FC9CE0D7B5510DC5C18085B1" Guid="b0bc07e7-111c-67a3-a90f-8bc47f0dcbb2" Win64="yes"> <File Id="owfFAF24430FC9CE0D7B5510DC5C18085B1" Source="$(var.SourceDir)\Avalonia.Skia.dll" KeyPath="yes" /> </Component> - <Component Id="owcA08BB73AE310A316EDFF2172A1050F82" Guid="07375671-126d-c2a6-be8f-5b5f6d2891a1"> + <Component Id="owcA08BB73AE310A316EDFF2172A1050F82" Guid="07375671-126d-c2a6-be8f-5b5f6d2891a1" Win64="yes"> <File Id="owfA08BB73AE310A316EDFF2172A1050F82" Source="$(var.SourceDir)\Avalonia.Styling.dll" KeyPath="yes" /> </Component> - <Component Id="owc0A621F7F94C102165C804D54ABDE7987" Guid="67ee26ea-3112-bccb-cb21-5160ed8c5ada"> + <Component Id="owc0A621F7F94C102165C804D54ABDE7987" Guid="67ee26ea-3112-bccb-cb21-5160ed8c5ada" Win64="yes"> <File Id="owf0A621F7F94C102165C804D54ABDE7987" Source="$(var.SourceDir)\Avalonia.Themes.Default.dll" KeyPath="yes" /> </Component> - <Component Id="owcD4D4EB0A8A39F9F6F27EBDA5D1FB4D0E" Guid="2ecd96fd-496d-b0bb-e1ec-a66a3c36b7d9"> + <Component Id="owcD4D4EB0A8A39F9F6F27EBDA5D1FB4D0E" Guid="2ecd96fd-496d-b0bb-e1ec-a66a3c36b7d9" Win64="yes"> <File Id="owfD4D4EB0A8A39F9F6F27EBDA5D1FB4D0E" Source="$(var.SourceDir)\Avalonia.Themes.Fluent.dll" KeyPath="yes" /> </Component> - <Component Id="owc77EB2CE808BEF35774814EF5F8D10B9E" Guid="2d6fcbc6-4a40-bed7-bc41-53b8225f6f26"> + <Component Id="owc77EB2CE808BEF35774814EF5F8D10B9E" Guid="2d6fcbc6-4a40-bed7-bc41-53b8225f6f26" Win64="yes"> <File Id="owf77EB2CE808BEF35774814EF5F8D10B9E" Source="$(var.SourceDir)\Avalonia.Visuals.dll" KeyPath="yes" /> </Component> - <Component Id="owc07DA187FA8A4CCDC82718DE31A9734BD" Guid="ecdaa657-70ce-e068-4118-cc4e2fe28e05"> + <Component Id="owc07DA187FA8A4CCDC82718DE31A9734BD" Guid="ecdaa657-70ce-e068-4118-cc4e2fe28e05" Win64="yes"> <File Id="owf07DA187FA8A4CCDC82718DE31A9734BD" Source="$(var.SourceDir)\Avalonia.Win32.dll" KeyPath="yes" /> </Component> - <Component Id="owc6DF1BE170002EC6C0C7009FA4A0218DE" Guid="aef7ebfb-7776-5184-87d4-13d7d0adb51b"> + <Component Id="owc6DF1BE170002EC6C0C7009FA4A0218DE" Guid="aef7ebfb-7776-5184-87d4-13d7d0adb51b" Win64="yes"> <File Id="owf6DF1BE170002EC6C0C7009FA4A0218DE" Source="$(var.SourceDir)\Avalonia.X11.dll" KeyPath="yes" /> </Component> - <Component Id="owc0F7CC7ACEA840EC81FADDEE08D4B54C3" Guid="8de4454d-fc84-51cf-d44c-612dcea01607"> + <Component Id="owc0F7CC7ACEA840EC81FADDEE08D4B54C3" Guid="8de4454d-fc84-51cf-d44c-612dcea01607" Win64="yes"> <File Id="owf0F7CC7ACEA840EC81FADDEE08D4B54C3" Source="$(var.SourceDir)\BinarySerializer.dll" KeyPath="yes" /> </Component> - <Component Id="owc0D5E901B0EDC9AC66EDED7744C9C0EC4" Guid="bf900338-6ac3-e652-0358-b6c5a433ead1"> + <Component Id="owc0D5E901B0EDC9AC66EDED7744C9C0EC4" Guid="bf900338-6ac3-e652-0358-b6c5a433ead1" Win64="yes"> <File Id="owf0D5E901B0EDC9AC66EDED7744C9C0EC4" Source="$(var.SourceDir)\BouncyCastle.Crypto.dll" KeyPath="yes" /> </Component> - <Component Id="owc3D4C6D44ECDB03E5FE1F04B44BCF854F" Guid="7357d916-7bf8-aecc-ec52-30bed411500d"> + <Component Id="owc3D4C6D44ECDB03E5FE1F04B44BCF854F" Guid="7357d916-7bf8-aecc-ec52-30bed411500d" Win64="yes"> <File Id="owf3D4C6D44ECDB03E5FE1F04B44BCF854F" Source="$(var.SourceDir)\clrcompression.dll" KeyPath="yes" /> </Component> - <Component Id="owc1EB8A6523152350CEBC63B9D1BC2930F" Guid="a49af45a-fa09-479b-2625-4fdd580aa598"> + <Component Id="owc1EB8A6523152350CEBC63B9D1BC2930F" Guid="a49af45a-fa09-479b-2625-4fdd580aa598" Win64="yes"> <File Id="owf1EB8A6523152350CEBC63B9D1BC2930F" Source="$(var.SourceDir)\clretwrc.dll" KeyPath="yes" /> </Component> - <Component Id="owc80EC8AEA1BFB8077812CDD06F9128A53" Guid="afbd2d79-629c-90a1-57a9-d68edc2d1437"> + <Component Id="owc80EC8AEA1BFB8077812CDD06F9128A53" Guid="afbd2d79-629c-90a1-57a9-d68edc2d1437" Win64="yes"> <File Id="owf80EC8AEA1BFB8077812CDD06F9128A53" Source="$(var.SourceDir)\clrjit.dll" KeyPath="yes" /> </Component> - <Component Id="owcD89DA7DE2D69AFC05DD5D46B6072C05C" Guid="ff72b568-c40c-3d50-c5af-049f64b476ea"> + <Component Id="owcD89DA7DE2D69AFC05DD5D46B6072C05C" Guid="ff72b568-c40c-3d50-c5af-049f64b476ea" Win64="yes"> <File Id="owfD89DA7DE2D69AFC05DD5D46B6072C05C" Source="$(var.SourceDir)\concrt140.dll" KeyPath="yes" /> </Component> - <Component Id="owc6135A13B8E29883ED57BF3FE20578EED" Guid="cd1aae2e-a4de-1bd1-9680-014bccf80e32"> + <Component Id="owc6135A13B8E29883ED57BF3FE20578EED" Guid="cd1aae2e-a4de-1bd1-9680-014bccf80e32" Win64="yes"> <File Id="owf6135A13B8E29883ED57BF3FE20578EED" Source="$(var.SourceDir)\coreclr.dll" KeyPath="yes" /> </Component> - <Component Id="owc5E8FBF42F9BCF40914849582C19906B8" Guid="f7a08052-6afc-fe5e-291c-07137533ab79"> + <Component Id="owc5E8FBF42F9BCF40914849582C19906B8" Guid="f7a08052-6afc-fe5e-291c-07137533ab79" Win64="yes"> <File Id="owf5E8FBF42F9BCF40914849582C19906B8" Source="$(var.SourceDir)\createdump.exe" KeyPath="yes" /> </Component> - <Component Id="owcF9E82F0BAE95DEABBEA8012A0994676C" Guid="edd1fddd-c05b-dc01-33b2-52e715b79615"> + <Component Id="owcF9E82F0BAE95DEABBEA8012A0994676C" Guid="edd1fddd-c05b-dc01-33b2-52e715b79615" Win64="yes"> <File Id="owfF9E82F0BAE95DEABBEA8012A0994676C" Source="$(var.SourceDir)\cvextern.dll" KeyPath="yes" /> </Component> - <Component Id="owc3883419A2BFFE7013C2194A99728AB11" Guid="dd137337-4b74-c76b-c87e-6b5f42697dd4"> + <Component Id="owc3883419A2BFFE7013C2194A99728AB11" Guid="dd137337-4b74-c76b-c87e-6b5f42697dd4" Win64="yes"> <File Id="owf3883419A2BFFE7013C2194A99728AB11" Source="$(var.SourceDir)\dbgshim.dll" KeyPath="yes" /> </Component> - <Component Id="owc63D81B12D4DED477220E84E2AEBD7DBE" Guid="b08152e4-c420-0b27-69c4-3f58ac0a5fc7"> + <Component Id="owc63D81B12D4DED477220E84E2AEBD7DBE" Guid="b08152e4-c420-0b27-69c4-3f58ac0a5fc7" Win64="yes"> <File Id="owf63D81B12D4DED477220E84E2AEBD7DBE" Source="$(var.SourceDir)\Emgu.CV.Platform.NetStandard.dll" KeyPath="yes" /> </Component> - <Component Id="owc596D9175D838C2B55E7BD869B446D92E" Guid="5a816164-9ca0-8b4c-5481-76eff54d3b1c"> + <Component Id="owc596D9175D838C2B55E7BD869B446D92E" Guid="5a816164-9ca0-8b4c-5481-76eff54d3b1c" Win64="yes"> <File Id="owf596D9175D838C2B55E7BD869B446D92E" Source="$(var.SourceDir)\HarfBuzzSharp.dll" KeyPath="yes" /> </Component> - <Component Id="owc8138E00413CF804D31C92E6536ADBDD7" Guid="644a568d-6191-f90d-d183-aa343c0fbaff"> + <Component Id="owc8138E00413CF804D31C92E6536ADBDD7" Guid="644a568d-6191-f90d-d183-aa343c0fbaff" Win64="yes"> <File Id="owf8138E00413CF804D31C92E6536ADBDD7" Source="$(var.SourceDir)\hostfxr.dll" KeyPath="yes" /> </Component> - <Component Id="owcD0A4163F1CFBFB72485E8EF0D23425C0" Guid="24cee699-91b4-3e01-c2c3-1623a1af17b5"> + <Component Id="owcD0A4163F1CFBFB72485E8EF0D23425C0" Guid="24cee699-91b4-3e01-c2c3-1623a1af17b5" Win64="yes"> <File Id="owfD0A4163F1CFBFB72485E8EF0D23425C0" Source="$(var.SourceDir)\hostpolicy.dll" KeyPath="yes" /> </Component> - <Component Id="owcB4617140E4B8CB31110519BDA453AF9F" Guid="91471bb5-2f18-7710-ec5c-84629d1a627c"> + <Component Id="owcB4617140E4B8CB31110519BDA453AF9F" Guid="91471bb5-2f18-7710-ec5c-84629d1a627c" Win64="yes"> <File Id="owfB4617140E4B8CB31110519BDA453AF9F" Source="$(var.SourceDir)\JetBrains.Annotations.dll" KeyPath="yes" /> </Component> - <Component Id="owc41446B36203B82310F233D8008B969AA" Guid="ea7a7559-9953-2c8d-a8e4-e4518a2b49d5"> + <Component Id="owc41446B36203B82310F233D8008B969AA" Guid="ea7a7559-9953-2c8d-a8e4-e4518a2b49d5" Win64="yes"> <File Id="owf41446B36203B82310F233D8008B969AA" Source="$(var.SourceDir)\libHarfBuzzSharp.dll" KeyPath="yes" /> </Component> - <Component Id="owcABA441AFF3054689389C9F05A60C2B49" Guid="bc14fe23-5c0e-c4f0-7268-d633972c8d6b"> + <Component Id="owcABA441AFF3054689389C9F05A60C2B49" Guid="bc14fe23-5c0e-c4f0-7268-d633972c8d6b" Win64="yes"> <File Id="owfABA441AFF3054689389C9F05A60C2B49" Source="$(var.SourceDir)\libSkiaSharp.dll" KeyPath="yes" /> </Component> - <Component Id="owc6262D65DF7B3DF80C034B72467CAE882" Guid="4941cd5b-5666-87fe-5a6a-5ebdd5ee2524"> + <Component Id="owc08C959AF4C2883BEBDD9830863C05E9E" Guid="0a3d45eb-02e4-a772-acdb-d6fefb9f9907" Win64="yes"> + <File Id="owf08C959AF4C2883BEBDD9830863C05E9E" Source="$(var.SourceDir)\LICENSE" KeyPath="yes" /> + </Component> + <Component Id="owc6262D65DF7B3DF80C034B72467CAE882" Guid="4941cd5b-5666-87fe-5a6a-5ebdd5ee2524" Win64="yes"> <File Id="owf6262D65DF7B3DF80C034B72467CAE882" Source="$(var.SourceDir)\MessageBox.Avalonia.dll" KeyPath="yes" /> </Component> - <Component Id="owcBED5500FCECB7551175681E93EC9B191" Guid="e84e4591-8227-e9c2-b052-dc4583553c9a"> + <Component Id="owcBED5500FCECB7551175681E93EC9B191" Guid="e84e4591-8227-e9c2-b052-dc4583553c9a" Win64="yes"> <File Id="owfBED5500FCECB7551175681E93EC9B191" Source="$(var.SourceDir)\Microsoft.CodeAnalysis.CSharp.dll" KeyPath="yes" /> </Component> - <Component Id="owcD48DD5DDA2BA4C83F4A98D4BE87BA462" Guid="effc6a72-2186-a73f-ee7f-c05c95de6c6e"> + <Component Id="owcD48DD5DDA2BA4C83F4A98D4BE87BA462" Guid="effc6a72-2186-a73f-ee7f-c05c95de6c6e" Win64="yes"> <File Id="owfD48DD5DDA2BA4C83F4A98D4BE87BA462" Source="$(var.SourceDir)\Microsoft.CodeAnalysis.CSharp.Scripting.dll" KeyPath="yes" /> </Component> - <Component Id="owcDC0782CCA5E596145FD1FDFB67EDC2AF" Guid="8bfcc8b6-6693-60fe-2af9-d0e34ab6f421"> + <Component Id="owcDC0782CCA5E596145FD1FDFB67EDC2AF" Guid="8bfcc8b6-6693-60fe-2af9-d0e34ab6f421" Win64="yes"> <File Id="owfDC0782CCA5E596145FD1FDFB67EDC2AF" Source="$(var.SourceDir)\Microsoft.CodeAnalysis.dll" KeyPath="yes" /> </Component> - <Component Id="owcB9CA98C685BDD7D3E9DD3EBD5C5A3B84" Guid="434ec6c6-a47b-5321-63d1-6d30a2f8a9bf"> + <Component Id="owcB9CA98C685BDD7D3E9DD3EBD5C5A3B84" Guid="434ec6c6-a47b-5321-63d1-6d30a2f8a9bf" Win64="yes"> <File Id="owfB9CA98C685BDD7D3E9DD3EBD5C5A3B84" Source="$(var.SourceDir)\Microsoft.CodeAnalysis.Scripting.dll" KeyPath="yes" /> </Component> - <Component Id="owc27AE8A53D94DD8A3E4AEAF6F7C27FB60" Guid="80e5ef0e-84a5-2bce-9923-0fd54d243e45"> + <Component Id="owc27AE8A53D94DD8A3E4AEAF6F7C27FB60" Guid="80e5ef0e-84a5-2bce-9923-0fd54d243e45" Win64="yes"> <File Id="owf27AE8A53D94DD8A3E4AEAF6F7C27FB60" Source="$(var.SourceDir)\Microsoft.CSharp.dll" KeyPath="yes" /> </Component> - <Component Id="owc8E8A4B43081A3E23A39A84E6034A1F78" Guid="bfdc1e75-05b8-7f04-2965-29a50f29fe42"> + <Component Id="owc8E8A4B43081A3E23A39A84E6034A1F78" Guid="bfdc1e75-05b8-7f04-2965-29a50f29fe42" Win64="yes"> <File Id="owf8E8A4B43081A3E23A39A84E6034A1F78" Source="$(var.SourceDir)\Microsoft.DiaSymReader.Native.amd64.dll" KeyPath="yes" /> </Component> - <Component Id="owc4A360832ECFF1ECB9A008F2BA790EC1F" Guid="48a7d858-89a0-d86f-9222-354f090dbbae"> + <Component Id="owc4A360832ECFF1ECB9A008F2BA790EC1F" Guid="48a7d858-89a0-d86f-9222-354f090dbbae" Win64="yes"> <File Id="owf4A360832ECFF1ECB9A008F2BA790EC1F" Source="$(var.SourceDir)\Microsoft.VisualBasic.Core.dll" KeyPath="yes" /> </Component> - <Component Id="owc926E7DC3DE74EB3E2181C7465A15BAF4" Guid="397a9bc4-4f37-c528-2e2b-4058762b3129"> + <Component Id="owc926E7DC3DE74EB3E2181C7465A15BAF4" Guid="397a9bc4-4f37-c528-2e2b-4058762b3129" Win64="yes"> <File Id="owf926E7DC3DE74EB3E2181C7465A15BAF4" Source="$(var.SourceDir)\Microsoft.VisualBasic.dll" KeyPath="yes" /> </Component> - <Component Id="owcADE9A457248959D397C6B092C7CCF78B" Guid="4aac0c53-b1ed-bef0-2706-7a1a9ee332ae"> + <Component Id="owcADE9A457248959D397C6B092C7CCF78B" Guid="4aac0c53-b1ed-bef0-2706-7a1a9ee332ae" Win64="yes"> <File Id="owfADE9A457248959D397C6B092C7CCF78B" Source="$(var.SourceDir)\Microsoft.Win32.Primitives.dll" KeyPath="yes" /> </Component> - <Component Id="owc32505701ADEEE7A81C57A93DDFC583B2" Guid="e0bde769-f4c5-1e7c-49ff-50b79f2fddf1"> + <Component Id="owc32505701ADEEE7A81C57A93DDFC583B2" Guid="e0bde769-f4c5-1e7c-49ff-50b79f2fddf1" Win64="yes"> <File Id="owf32505701ADEEE7A81C57A93DDFC583B2" Source="$(var.SourceDir)\Microsoft.Win32.Registry.dll" KeyPath="yes" /> </Component> - <Component Id="owc7609DFEE03B95E830FD72B0699C9CF8C" Guid="c7b987b7-1a3c-0d2c-7831-ad6f4c3871e7"> + <Component Id="owc7609DFEE03B95E830FD72B0699C9CF8C" Guid="c7b987b7-1a3c-0d2c-7831-ad6f4c3871e7" Win64="yes"> <File Id="owf7609DFEE03B95E830FD72B0699C9CF8C" Source="$(var.SourceDir)\Microsoft.Win32.SystemEvents.dll" KeyPath="yes" /> </Component> - <Component Id="owc14CB9EF1BBF3C31A43771E2849BBB039" Guid="785bdc3f-43ca-90d5-d8be-40de895dae62"> + <Component Id="owc14CB9EF1BBF3C31A43771E2849BBB039" Guid="785bdc3f-43ca-90d5-d8be-40de895dae62" Win64="yes"> <File Id="owf14CB9EF1BBF3C31A43771E2849BBB039" Source="$(var.SourceDir)\MoreLinq.dll" KeyPath="yes" /> </Component> - <Component Id="owc6F31DEF09608AA645959666A4CB7FBBC" Guid="c94570a5-5bb4-a53f-e12f-9581bddf7d08"> + <Component Id="owc6F31DEF09608AA645959666A4CB7FBBC" Guid="c94570a5-5bb4-a53f-e12f-9581bddf7d08" Win64="yes"> <File Id="owf6F31DEF09608AA645959666A4CB7FBBC" Source="$(var.SourceDir)\mscordaccore.dll" KeyPath="yes" /> </Component> - <Component Id="owc0365879AFD7A138F231419745CD7CD56" Guid="419f9e5f-a09c-aa5d-379f-f6b5994c509d"> + <Component Id="owc0365879AFD7A138F231419745CD7CD56" Guid="419f9e5f-a09c-aa5d-379f-f6b5994c509d" Win64="yes"> <File Id="owf0365879AFD7A138F231419745CD7CD56" Source="$(var.SourceDir)\mscordaccore_amd64_amd64_5.0.821.31504.dll" KeyPath="yes" /> </Component> - <Component Id="owc5FC34571A1AE47A011FC6C2A95B00DA6" Guid="2591451e-0fe5-ccad-abf6-1d1097251253"> + <Component Id="owc5FC34571A1AE47A011FC6C2A95B00DA6" Guid="2591451e-0fe5-ccad-abf6-1d1097251253" Win64="yes"> <File Id="owf5FC34571A1AE47A011FC6C2A95B00DA6" Source="$(var.SourceDir)\mscordbi.dll" KeyPath="yes" /> </Component> - <Component Id="owc703B511CED6E576F1821E72BCD315C77" Guid="905632ee-e7c7-e961-f7b6-cefe84558e3f"> + <Component Id="owc703B511CED6E576F1821E72BCD315C77" Guid="905632ee-e7c7-e961-f7b6-cefe84558e3f" Win64="yes"> <File Id="owf703B511CED6E576F1821E72BCD315C77" Source="$(var.SourceDir)\mscorlib.dll" KeyPath="yes" /> </Component> - <Component Id="owcE382B0CF482F0E7C3AF33E6EEEBD26B0" Guid="7433845c-c763-9b7e-e2c9-7b06986570bf"> + <Component Id="owcE382B0CF482F0E7C3AF33E6EEEBD26B0" Guid="7433845c-c763-9b7e-e2c9-7b06986570bf" Win64="yes"> <File Id="owfE382B0CF482F0E7C3AF33E6EEEBD26B0" Source="$(var.SourceDir)\mscorrc.dll" KeyPath="yes" /> </Component> - <Component Id="owc4EDD870826B23A7EFC3FACD1E199E883" Guid="587324f3-ed59-f000-c241-8dc6a66501de"> + <Component Id="owc4EDD870826B23A7EFC3FACD1E199E883" Guid="587324f3-ed59-f000-c241-8dc6a66501de" Win64="yes"> <File Id="owf4EDD870826B23A7EFC3FACD1E199E883" Source="$(var.SourceDir)\msvcp140.dll" KeyPath="yes" /> </Component> - <Component Id="owc57B8051D45DF8A094B6F6F64CD58D9E6" Guid="b19c1e08-c2ee-ae27-0014-d5180ae56935"> + <Component Id="owc57B8051D45DF8A094B6F6F64CD58D9E6" Guid="b19c1e08-c2ee-ae27-0014-d5180ae56935" Win64="yes"> <File Id="owf57B8051D45DF8A094B6F6F64CD58D9E6" Source="$(var.SourceDir)\msvcp140_1.dll" KeyPath="yes" /> </Component> - <Component Id="owcE2F8C74ADC2AF2357936D93D9E417BB4" Guid="01e22654-976b-0b52-7f65-17a93b4d19ab"> + <Component Id="owcE2F8C74ADC2AF2357936D93D9E417BB4" Guid="01e22654-976b-0b52-7f65-17a93b4d19ab" Win64="yes"> <File Id="owfE2F8C74ADC2AF2357936D93D9E417BB4" Source="$(var.SourceDir)\msvcp140_2.dll" KeyPath="yes" /> </Component> - <Component Id="owcD748ECCC1ECBC6ACAF796527AC8E18D3" Guid="53347251-3752-30e8-051d-71050378624d"> + <Component Id="owcD748ECCC1ECBC6ACAF796527AC8E18D3" Guid="53347251-3752-30e8-051d-71050378624d" Win64="yes"> <File Id="owfD748ECCC1ECBC6ACAF796527AC8E18D3" Source="$(var.SourceDir)\msvcp140_atomic_wait.dll" KeyPath="yes" /> </Component> - <Component Id="owc3FDD5303B44770B8890DCDE0685AF1EB" Guid="50c83bf3-3054-7dd7-6eda-a39108edb2c2"> + <Component Id="owc3FDD5303B44770B8890DCDE0685AF1EB" Guid="50c83bf3-3054-7dd7-6eda-a39108edb2c2" Win64="yes"> <File Id="owf3FDD5303B44770B8890DCDE0685AF1EB" Source="$(var.SourceDir)\msvcp140_codecvt_ids.dll" KeyPath="yes" /> </Component> - <Component Id="owc79156F385239CEA4DEA3C87C1DA3E1D8" Guid="68380c80-6708-5eb6-415d-10e278417679"> + <Component Id="owc79156F385239CEA4DEA3C87C1DA3E1D8" Guid="68380c80-6708-5eb6-415d-10e278417679" Win64="yes"> <File Id="owf79156F385239CEA4DEA3C87C1DA3E1D8" Source="$(var.SourceDir)\netstandard.dll" KeyPath="yes" /> </Component> - <Component Id="owc3FC8434C1A84605AEEBC6A100CA2F3E1" Guid="47d7e276-db6d-424e-d797-1a69e1e24b3b"> + <Component Id="owc3FC8434C1A84605AEEBC6A100CA2F3E1" Guid="47d7e276-db6d-424e-d797-1a69e1e24b3b" Win64="yes"> <File Id="owf3FC8434C1A84605AEEBC6A100CA2F3E1" Source="$(var.SourceDir)\Newtonsoft.Json.dll" KeyPath="yes" /> </Component> - <Component Id="owcCB6DF5BB7A5BDAA67D11BB13C52A4927" Guid="dc9a18cc-9c4c-5a90-c668-983489a0805d"> + <Component Id="owcCB6DF5BB7A5BDAA67D11BB13C52A4927" Guid="dc9a18cc-9c4c-5a90-c668-983489a0805d" Win64="yes"> <File Id="owfCB6DF5BB7A5BDAA67D11BB13C52A4927" Source="$(var.SourceDir)\opencv_videoio_ffmpeg453_64.dll" KeyPath="yes" /> </Component> - <Component Id="owc363CAFE6342F1E71AB07D13BAEEE5FF0" Guid="8e946fdc-ea52-7c4b-a8b3-69e1ecf51086"> + <Component Id="owc363CAFE6342F1E71AB07D13BAEEE5FF0" Guid="8e946fdc-ea52-7c4b-a8b3-69e1ecf51086" Win64="yes"> <File Id="owf363CAFE6342F1E71AB07D13BAEEE5FF0" Source="$(var.SourceDir)\SkiaSharp.dll" KeyPath="yes" /> </Component> - <Component Id="owc57FFE4BD9EBED4E6F6741F389009CBAA" Guid="63b5b00e-b356-ad17-9580-4a6ac8da581a"> + <Component Id="owc57FFE4BD9EBED4E6F6741F389009CBAA" Guid="63b5b00e-b356-ad17-9580-4a6ac8da581a" Win64="yes"> <File Id="owf57FFE4BD9EBED4E6F6741F389009CBAA" Source="$(var.SourceDir)\STL-netcore.dll" KeyPath="yes" /> </Component> - <Component Id="owc25FBE4153F32A5634B0ADA8A6954CC89" Guid="6c98bea6-1304-2fb8-4ce3-709ad7fb9601"> + <Component Id="owc25FBE4153F32A5634B0ADA8A6954CC89" Guid="6c98bea6-1304-2fb8-4ce3-709ad7fb9601" Win64="yes"> <File Id="owf25FBE4153F32A5634B0ADA8A6954CC89" Source="$(var.SourceDir)\System.AppContext.dll" KeyPath="yes" /> </Component> - <Component Id="owc266C4DEC591C8A54CCC1D3C61FC512AA" Guid="2224179c-4d85-88a2-23e2-bc0c27cadd0e"> + <Component Id="owc266C4DEC591C8A54CCC1D3C61FC512AA" Guid="2224179c-4d85-88a2-23e2-bc0c27cadd0e" Win64="yes"> <File Id="owf266C4DEC591C8A54CCC1D3C61FC512AA" Source="$(var.SourceDir)\System.Buffers.dll" KeyPath="yes" /> </Component> - <Component Id="owcB0938B04162738D88A9505D891432182" Guid="d7cbe080-11e4-4dc2-1193-c6f503619626"> + <Component Id="owcB0938B04162738D88A9505D891432182" Guid="d7cbe080-11e4-4dc2-1193-c6f503619626" Win64="yes"> <File Id="owfB0938B04162738D88A9505D891432182" Source="$(var.SourceDir)\System.Collections.Concurrent.dll" KeyPath="yes" /> </Component> - <Component Id="owcC2F9734A56DFCFEB68C9F8C7AC021C68" Guid="82632b16-161d-4a6e-e391-607b20e12b4a"> + <Component Id="owcC2F9734A56DFCFEB68C9F8C7AC021C68" Guid="82632b16-161d-4a6e-e391-607b20e12b4a" Win64="yes"> <File Id="owfC2F9734A56DFCFEB68C9F8C7AC021C68" Source="$(var.SourceDir)\System.Collections.dll" KeyPath="yes" /> </Component> - <Component Id="owc2F5D24BF1EA2D036DA793146E86BDF87" Guid="4d4dbb14-d5d0-ce16-910a-fdb6e5ba134f"> + <Component Id="owc2F5D24BF1EA2D036DA793146E86BDF87" Guid="4d4dbb14-d5d0-ce16-910a-fdb6e5ba134f" Win64="yes"> <File Id="owf2F5D24BF1EA2D036DA793146E86BDF87" Source="$(var.SourceDir)\System.Collections.Immutable.dll" KeyPath="yes" /> </Component> - <Component Id="owc3C7F9AF847AED9488EC18EEE32E4304B" Guid="809763ea-b3f3-18ce-3e41-26bbda842703"> + <Component Id="owc3C7F9AF847AED9488EC18EEE32E4304B" Guid="809763ea-b3f3-18ce-3e41-26bbda842703" Win64="yes"> <File Id="owf3C7F9AF847AED9488EC18EEE32E4304B" Source="$(var.SourceDir)\System.Collections.NonGeneric.dll" KeyPath="yes" /> </Component> - <Component Id="owc4AB84BBF58909FD5D097268ED05BD3B8" Guid="89c3ecb5-0659-212f-cb59-05d31675daa7"> + <Component Id="owc4AB84BBF58909FD5D097268ED05BD3B8" Guid="89c3ecb5-0659-212f-cb59-05d31675daa7" Win64="yes"> <File Id="owf4AB84BBF58909FD5D097268ED05BD3B8" Source="$(var.SourceDir)\System.Collections.Specialized.dll" KeyPath="yes" /> </Component> - <Component Id="owc7948664103751DE00E3ABF3175F1B8F5" Guid="a366d8d2-4235-2c9e-7252-ca4929048578"> + <Component Id="owc7948664103751DE00E3ABF3175F1B8F5" Guid="a366d8d2-4235-2c9e-7252-ca4929048578" Win64="yes"> <File Id="owf7948664103751DE00E3ABF3175F1B8F5" Source="$(var.SourceDir)\System.ComponentModel.Annotations.dll" KeyPath="yes" /> </Component> - <Component Id="owc458070063867F096B12D3D0EA7702B44" Guid="686d8347-a4df-2d8a-7194-657c3fbf995d"> + <Component Id="owc458070063867F096B12D3D0EA7702B44" Guid="686d8347-a4df-2d8a-7194-657c3fbf995d" Win64="yes"> <File Id="owf458070063867F096B12D3D0EA7702B44" Source="$(var.SourceDir)\System.ComponentModel.DataAnnotations.dll" KeyPath="yes" /> </Component> - <Component Id="owc0792F81748B398DB4EE3E1DDF209590D" Guid="412b0f26-4503-9999-14e9-e2202c8021e8"> + <Component Id="owc0792F81748B398DB4EE3E1DDF209590D" Guid="412b0f26-4503-9999-14e9-e2202c8021e8" Win64="yes"> <File Id="owf0792F81748B398DB4EE3E1DDF209590D" Source="$(var.SourceDir)\System.ComponentModel.dll" KeyPath="yes" /> </Component> - <Component Id="owc3D2E0FD83A8DB7B30128FE2CC76A6D37" Guid="5dda7ef9-ae81-1fe4-8988-f67e2ce81309"> + <Component Id="owc3D2E0FD83A8DB7B30128FE2CC76A6D37" Guid="5dda7ef9-ae81-1fe4-8988-f67e2ce81309" Win64="yes"> <File Id="owf3D2E0FD83A8DB7B30128FE2CC76A6D37" Source="$(var.SourceDir)\System.ComponentModel.EventBasedAsync.dll" KeyPath="yes" /> </Component> - <Component Id="owcB98A1045EF964B67FA038C39D0455A74" Guid="d0e70631-1f29-359a-7ccb-265ced4e5d8e"> + <Component Id="owcB98A1045EF964B67FA038C39D0455A74" Guid="d0e70631-1f29-359a-7ccb-265ced4e5d8e" Win64="yes"> <File Id="owfB98A1045EF964B67FA038C39D0455A74" Source="$(var.SourceDir)\System.ComponentModel.Primitives.dll" KeyPath="yes" /> </Component> - <Component Id="owc8CC124ECA60830593E855269F2C68614" Guid="0cbd8724-812b-82e5-1498-9c99299e2890"> + <Component Id="owc8CC124ECA60830593E855269F2C68614" Guid="0cbd8724-812b-82e5-1498-9c99299e2890" Win64="yes"> <File Id="owf8CC124ECA60830593E855269F2C68614" Source="$(var.SourceDir)\System.ComponentModel.TypeConverter.dll" KeyPath="yes" /> </Component> - <Component Id="owc4D1AA5E76AA7D0794358BCC376413DFB" Guid="1221d4ea-dc0b-5283-b6b7-bc16eeb85b02"> + <Component Id="owc4D1AA5E76AA7D0794358BCC376413DFB" Guid="1221d4ea-dc0b-5283-b6b7-bc16eeb85b02" Win64="yes"> <File Id="owf4D1AA5E76AA7D0794358BCC376413DFB" Source="$(var.SourceDir)\System.Configuration.dll" KeyPath="yes" /> </Component> - <Component Id="owcA90D9D10E6DAB6E67011458672887086" Guid="054993ce-0abb-9441-3124-21f972454715"> + <Component Id="owcA90D9D10E6DAB6E67011458672887086" Guid="054993ce-0abb-9441-3124-21f972454715" Win64="yes"> <File Id="owfA90D9D10E6DAB6E67011458672887086" Source="$(var.SourceDir)\System.Console.dll" KeyPath="yes" /> </Component> - <Component Id="owc2EA670ABDBE3E6FE0C73F0120DC793D1" Guid="eb1f610c-76e9-af90-7f4d-6d6fb47758d3"> + <Component Id="owc2EA670ABDBE3E6FE0C73F0120DC793D1" Guid="eb1f610c-76e9-af90-7f4d-6d6fb47758d3" Win64="yes"> <File Id="owf2EA670ABDBE3E6FE0C73F0120DC793D1" Source="$(var.SourceDir)\System.Core.dll" KeyPath="yes" /> </Component> - <Component Id="owc197F2534968D57C97974CF0FED71433C" Guid="3647ba1e-f9a9-2b45-b700-10df69827a5c"> + <Component Id="owc197F2534968D57C97974CF0FED71433C" Guid="3647ba1e-f9a9-2b45-b700-10df69827a5c" Win64="yes"> <File Id="owf197F2534968D57C97974CF0FED71433C" Source="$(var.SourceDir)\System.Data.Common.dll" KeyPath="yes" /> </Component> - <Component Id="owcAA8A37AF9206BCE732E042CF295162C2" Guid="b23269cc-c591-f9b5-0037-c08f266c345f"> + <Component Id="owcAA8A37AF9206BCE732E042CF295162C2" Guid="b23269cc-c591-f9b5-0037-c08f266c345f" Win64="yes"> <File Id="owfAA8A37AF9206BCE732E042CF295162C2" Source="$(var.SourceDir)\System.Data.DataSetExtensions.dll" KeyPath="yes" /> </Component> - <Component Id="owc6A5367E03C802967F875027B23010458" Guid="690870a4-9f7d-aed4-cf6c-48c9414103d6"> + <Component Id="owc6A5367E03C802967F875027B23010458" Guid="690870a4-9f7d-aed4-cf6c-48c9414103d6" Win64="yes"> <File Id="owf6A5367E03C802967F875027B23010458" Source="$(var.SourceDir)\System.Data.dll" KeyPath="yes" /> </Component> - <Component Id="owc3C29D500369F47A07E343EDD2651DB32" Guid="29dea56c-eaa9-483f-a716-b67d01b8b990"> + <Component Id="owc3C29D500369F47A07E343EDD2651DB32" Guid="29dea56c-eaa9-483f-a716-b67d01b8b990" Win64="yes"> <File Id="owf3C29D500369F47A07E343EDD2651DB32" Source="$(var.SourceDir)\System.Diagnostics.Contracts.dll" KeyPath="yes" /> </Component> - <Component Id="owc6CACFB486BAFCC91094BBE11FA1D6D77" Guid="793133b4-fb80-7975-7a8e-07766464274c"> + <Component Id="owc6CACFB486BAFCC91094BBE11FA1D6D77" Guid="793133b4-fb80-7975-7a8e-07766464274c" Win64="yes"> <File Id="owf6CACFB486BAFCC91094BBE11FA1D6D77" Source="$(var.SourceDir)\System.Diagnostics.Debug.dll" KeyPath="yes" /> </Component> - <Component Id="owcBC11F886BA2AB9469783C04435BCA0B9" Guid="2c483d72-1aea-aa8b-f71a-6566569838c7"> + <Component Id="owcBC11F886BA2AB9469783C04435BCA0B9" Guid="2c483d72-1aea-aa8b-f71a-6566569838c7" Win64="yes"> <File Id="owfBC11F886BA2AB9469783C04435BCA0B9" Source="$(var.SourceDir)\System.Diagnostics.DiagnosticSource.dll" KeyPath="yes" /> </Component> - <Component Id="owc95502C822C8ECC756B2E2C4F9C64FF16" Guid="dd7706d9-f8b2-2713-b7f0-834cb639d431"> + <Component Id="owc95502C822C8ECC756B2E2C4F9C64FF16" Guid="dd7706d9-f8b2-2713-b7f0-834cb639d431" Win64="yes"> <File Id="owf95502C822C8ECC756B2E2C4F9C64FF16" Source="$(var.SourceDir)\System.Diagnostics.FileVersionInfo.dll" KeyPath="yes" /> </Component> - <Component Id="owc07926E71F17C43267B44ABF5C937ED8C" Guid="c2f4dc50-e48b-8b70-da9d-05d3d0b96d8c"> + <Component Id="owc07926E71F17C43267B44ABF5C937ED8C" Guid="c2f4dc50-e48b-8b70-da9d-05d3d0b96d8c" Win64="yes"> <File Id="owf07926E71F17C43267B44ABF5C937ED8C" Source="$(var.SourceDir)\System.Diagnostics.Process.dll" KeyPath="yes" /> </Component> - <Component Id="owcFD55AECF118116371C5449C61249EBA9" Guid="3e573539-03f1-e10d-bdf2-156834c932bb"> + <Component Id="owcFD55AECF118116371C5449C61249EBA9" Guid="3e573539-03f1-e10d-bdf2-156834c932bb" Win64="yes"> <File Id="owfFD55AECF118116371C5449C61249EBA9" Source="$(var.SourceDir)\System.Diagnostics.StackTrace.dll" KeyPath="yes" /> </Component> - <Component Id="owc8C141B7761F05071AEBFD95ADA41AAC2" Guid="f47f0838-abc0-f976-4844-86785cf80c59"> + <Component Id="owc8C141B7761F05071AEBFD95ADA41AAC2" Guid="f47f0838-abc0-f976-4844-86785cf80c59" Win64="yes"> <File Id="owf8C141B7761F05071AEBFD95ADA41AAC2" Source="$(var.SourceDir)\System.Diagnostics.TextWriterTraceListener.dll" KeyPath="yes" /> </Component> - <Component Id="owc574EE3E1A7A24522AA9A38228494DECE" Guid="5a009284-cc72-3c8c-153f-7efd850794bd"> + <Component Id="owc574EE3E1A7A24522AA9A38228494DECE" Guid="5a009284-cc72-3c8c-153f-7efd850794bd" Win64="yes"> <File Id="owf574EE3E1A7A24522AA9A38228494DECE" Source="$(var.SourceDir)\System.Diagnostics.Tools.dll" KeyPath="yes" /> </Component> - <Component Id="owcA29B00369195EF6CDC8068D7A2A4DA83" Guid="743ce7b4-53e5-922c-e986-bf8473a7cf98"> + <Component Id="owcA29B00369195EF6CDC8068D7A2A4DA83" Guid="743ce7b4-53e5-922c-e986-bf8473a7cf98" Win64="yes"> <File Id="owfA29B00369195EF6CDC8068D7A2A4DA83" Source="$(var.SourceDir)\System.Diagnostics.TraceSource.dll" KeyPath="yes" /> </Component> - <Component Id="owc38B2B9FCCE93A2C7D2E931C05D695098" Guid="9459de6c-25a4-7990-155f-a45d2c7be1c9"> + <Component Id="owc38B2B9FCCE93A2C7D2E931C05D695098" Guid="9459de6c-25a4-7990-155f-a45d2c7be1c9" Win64="yes"> <File Id="owf38B2B9FCCE93A2C7D2E931C05D695098" Source="$(var.SourceDir)\System.Diagnostics.Tracing.dll" KeyPath="yes" /> </Component> - <Component Id="owc792855966F47F4EE89053BF1151A9542" Guid="9331c7c2-b0f6-e3b1-0868-9382d658ad1f"> + <Component Id="owc792855966F47F4EE89053BF1151A9542" Guid="9331c7c2-b0f6-e3b1-0868-9382d658ad1f" Win64="yes"> <File Id="owf792855966F47F4EE89053BF1151A9542" Source="$(var.SourceDir)\System.dll" KeyPath="yes" /> </Component> - <Component Id="owcC44FBFE064FE5B25B9677334BAFFBB9F" Guid="7eaa9e75-cff6-90ab-c842-673d3b7d6d9b"> + <Component Id="owcC44FBFE064FE5B25B9677334BAFFBB9F" Guid="7eaa9e75-cff6-90ab-c842-673d3b7d6d9b" Win64="yes"> <File Id="owfC44FBFE064FE5B25B9677334BAFFBB9F" Source="$(var.SourceDir)\System.Drawing.Common.dll" KeyPath="yes" /> </Component> - <Component Id="owcA073632493751937102DDDDCECF0885D" Guid="c3a44acf-4091-f095-8147-5d7a100fdd22"> + <Component Id="owcA073632493751937102DDDDCECF0885D" Guid="c3a44acf-4091-f095-8147-5d7a100fdd22" Win64="yes"> <File Id="owfA073632493751937102DDDDCECF0885D" Source="$(var.SourceDir)\System.Drawing.dll" KeyPath="yes" /> </Component> - <Component Id="owcAE197E3701A3A42602A5A8DFCD4C1352" Guid="aaecbf8b-bd8b-869d-39d1-a4ad8096c8fc"> + <Component Id="owcAE197E3701A3A42602A5A8DFCD4C1352" Guid="aaecbf8b-bd8b-869d-39d1-a4ad8096c8fc" Win64="yes"> <File Id="owfAE197E3701A3A42602A5A8DFCD4C1352" Source="$(var.SourceDir)\System.Drawing.Primitives.dll" KeyPath="yes" /> </Component> - <Component Id="owc9A4DD4F6185D06C5A78E8AEDADB2494F" Guid="3249aa9c-9bf9-808a-ad80-94b09eb9ee37"> + <Component Id="owc9A4DD4F6185D06C5A78E8AEDADB2494F" Guid="3249aa9c-9bf9-808a-ad80-94b09eb9ee37" Win64="yes"> <File Id="owf9A4DD4F6185D06C5A78E8AEDADB2494F" Source="$(var.SourceDir)\System.Dynamic.Runtime.dll" KeyPath="yes" /> </Component> - <Component Id="owc2698635F680AF602A4B363817C363BDB" Guid="343217c8-8437-12c1-741e-84eacfdb2ba3"> + <Component Id="owc2698635F680AF602A4B363817C363BDB" Guid="343217c8-8437-12c1-741e-84eacfdb2ba3" Win64="yes"> <File Id="owf2698635F680AF602A4B363817C363BDB" Source="$(var.SourceDir)\System.Formats.Asn1.dll" KeyPath="yes" /> </Component> - <Component Id="owcB1B1D5CD5E0525947D05C2530DDA9E96" Guid="43664615-fe63-0e97-cbd8-b599204e0079"> + <Component Id="owcB1B1D5CD5E0525947D05C2530DDA9E96" Guid="43664615-fe63-0e97-cbd8-b599204e0079" Win64="yes"> <File Id="owfB1B1D5CD5E0525947D05C2530DDA9E96" Source="$(var.SourceDir)\System.Globalization.Calendars.dll" KeyPath="yes" /> </Component> - <Component Id="owc25E08EF59014137F40FBDB350A040254" Guid="72175d94-4661-bd4d-8f7c-806a2c4e10df"> + <Component Id="owc25E08EF59014137F40FBDB350A040254" Guid="72175d94-4661-bd4d-8f7c-806a2c4e10df" Win64="yes"> <File Id="owf25E08EF59014137F40FBDB350A040254" Source="$(var.SourceDir)\System.Globalization.dll" KeyPath="yes" /> </Component> - <Component Id="owcC5DFECD777F28F599EFA8F4187DD40EF" Guid="99f2e8a7-8767-ed7e-3b5d-db91e3aac12e"> + <Component Id="owcC5DFECD777F28F599EFA8F4187DD40EF" Guid="99f2e8a7-8767-ed7e-3b5d-db91e3aac12e" Win64="yes"> <File Id="owfC5DFECD777F28F599EFA8F4187DD40EF" Source="$(var.SourceDir)\System.Globalization.Extensions.dll" KeyPath="yes" /> </Component> - <Component Id="owc0B27BF2D8C5E9D1FA71670F897004F44" Guid="0f7714e7-c24e-22c7-ad62-6f5cdb4a87bf"> + <Component Id="owc0B27BF2D8C5E9D1FA71670F897004F44" Guid="0f7714e7-c24e-22c7-ad62-6f5cdb4a87bf" Win64="yes"> <File Id="owf0B27BF2D8C5E9D1FA71670F897004F44" Source="$(var.SourceDir)\System.IO.Compression.Brotli.dll" KeyPath="yes" /> </Component> - <Component Id="owc5AC6699E38D4EE124CC260C1E19F025A" Guid="c61fccad-8828-7db7-7b4c-a6e5c488d921"> + <Component Id="owc5AC6699E38D4EE124CC260C1E19F025A" Guid="c61fccad-8828-7db7-7b4c-a6e5c488d921" Win64="yes"> <File Id="owf5AC6699E38D4EE124CC260C1E19F025A" Source="$(var.SourceDir)\System.IO.Compression.dll" KeyPath="yes" /> </Component> - <Component Id="owc7076993716C6C3AE1E237165C150BC5D" Guid="6ba9db0d-a783-1f25-3bce-dec520a31d10"> + <Component Id="owc7076993716C6C3AE1E237165C150BC5D" Guid="6ba9db0d-a783-1f25-3bce-dec520a31d10" Win64="yes"> <File Id="owf7076993716C6C3AE1E237165C150BC5D" Source="$(var.SourceDir)\System.IO.Compression.FileSystem.dll" KeyPath="yes" /> </Component> - <Component Id="owc87D8454A10E8D4063130BA0D60AAE450" Guid="a585b63b-3239-b7eb-2469-3c56a3d09878"> + <Component Id="owc87D8454A10E8D4063130BA0D60AAE450" Guid="a585b63b-3239-b7eb-2469-3c56a3d09878" Win64="yes"> <File Id="owf87D8454A10E8D4063130BA0D60AAE450" Source="$(var.SourceDir)\System.IO.Compression.ZipFile.dll" KeyPath="yes" /> </Component> - <Component Id="owc7600C49A56A3819C607969AD7D76A1D1" Guid="9542af82-033f-50c7-0b25-101b9d94aee5"> + <Component Id="owc7600C49A56A3819C607969AD7D76A1D1" Guid="9542af82-033f-50c7-0b25-101b9d94aee5" Win64="yes"> <File Id="owf7600C49A56A3819C607969AD7D76A1D1" Source="$(var.SourceDir)\System.IO.dll" KeyPath="yes" /> </Component> - <Component Id="owc6372F0503E54EFFBD93822665A490240" Guid="bf636343-7d51-0f71-d231-b3d5da7213d5"> + <Component Id="owc6372F0503E54EFFBD93822665A490240" Guid="bf636343-7d51-0f71-d231-b3d5da7213d5" Win64="yes"> <File Id="owf6372F0503E54EFFBD93822665A490240" Source="$(var.SourceDir)\System.IO.FileSystem.AccessControl.dll" KeyPath="yes" /> </Component> - <Component Id="owc6A348A5B38822B45BE742FD5B11ACF09" Guid="adbadd4a-8778-9648-1adb-3049bb09a6fe"> + <Component Id="owc6A348A5B38822B45BE742FD5B11ACF09" Guid="adbadd4a-8778-9648-1adb-3049bb09a6fe" Win64="yes"> <File Id="owf6A348A5B38822B45BE742FD5B11ACF09" Source="$(var.SourceDir)\System.IO.FileSystem.dll" KeyPath="yes" /> </Component> - <Component Id="owc200ACB21A48F8F1D56C9616D95EC5CA6" Guid="86572d0d-c334-066c-8492-f5a95c55ae7e"> + <Component Id="owc200ACB21A48F8F1D56C9616D95EC5CA6" Guid="86572d0d-c334-066c-8492-f5a95c55ae7e" Win64="yes"> <File Id="owf200ACB21A48F8F1D56C9616D95EC5CA6" Source="$(var.SourceDir)\System.IO.FileSystem.DriveInfo.dll" KeyPath="yes" /> </Component> - <Component Id="owc6AF351692769A11F3108B81F1F6AC695" Guid="2ac1ada3-a20f-6c5e-5cdf-7bf5714f1c04"> + <Component Id="owc6AF351692769A11F3108B81F1F6AC695" Guid="2ac1ada3-a20f-6c5e-5cdf-7bf5714f1c04" Win64="yes"> <File Id="owf6AF351692769A11F3108B81F1F6AC695" Source="$(var.SourceDir)\System.IO.FileSystem.Primitives.dll" KeyPath="yes" /> </Component> - <Component Id="owc7B9EE702BD2FAC26E42EFF8600C64938" Guid="84c93447-8f38-23ab-af54-34e69eb7ced5"> + <Component Id="owc7B9EE702BD2FAC26E42EFF8600C64938" Guid="84c93447-8f38-23ab-af54-34e69eb7ced5" Win64="yes"> <File Id="owf7B9EE702BD2FAC26E42EFF8600C64938" Source="$(var.SourceDir)\System.IO.FileSystem.Watcher.dll" KeyPath="yes" /> </Component> - <Component Id="owc0E49FFF68A74A08E1D96D167E231151C" Guid="e75a5738-a216-d575-b966-18057daede4a"> + <Component Id="owc0E49FFF68A74A08E1D96D167E231151C" Guid="e75a5738-a216-d575-b966-18057daede4a" Win64="yes"> <File Id="owf0E49FFF68A74A08E1D96D167E231151C" Source="$(var.SourceDir)\System.IO.IsolatedStorage.dll" KeyPath="yes" /> </Component> - <Component Id="owcE365A318301D62F1E6FA10DAB8EDC93F" Guid="2326c008-47f6-4283-e890-762ab2f98d30"> + <Component Id="owcE365A318301D62F1E6FA10DAB8EDC93F" Guid="2326c008-47f6-4283-e890-762ab2f98d30" Win64="yes"> <File Id="owfE365A318301D62F1E6FA10DAB8EDC93F" Source="$(var.SourceDir)\System.IO.MemoryMappedFiles.dll" KeyPath="yes" /> </Component> - <Component Id="owcA10791B34B9C78C70CAA64E8338D9614" Guid="d1c6232d-5704-91b7-0c7a-777a386f1051"> + <Component Id="owcA10791B34B9C78C70CAA64E8338D9614" Guid="d1c6232d-5704-91b7-0c7a-777a386f1051" Win64="yes"> <File Id="owfA10791B34B9C78C70CAA64E8338D9614" Source="$(var.SourceDir)\System.IO.Pipes.AccessControl.dll" KeyPath="yes" /> </Component> - <Component Id="owcDCCA68A85DF38860CCC28523FB623211" Guid="add6cc29-8bf1-6e97-79ee-b261352607e4"> + <Component Id="owcDCCA68A85DF38860CCC28523FB623211" Guid="add6cc29-8bf1-6e97-79ee-b261352607e4" Win64="yes"> <File Id="owfDCCA68A85DF38860CCC28523FB623211" Source="$(var.SourceDir)\System.IO.Pipes.dll" KeyPath="yes" /> </Component> - <Component Id="owc78BC0855489045221F1F6CEA03DF8766" Guid="d2b4c167-5a87-ed23-1ce5-794611185bd9"> + <Component Id="owc78BC0855489045221F1F6CEA03DF8766" Guid="d2b4c167-5a87-ed23-1ce5-794611185bd9" Win64="yes"> <File Id="owf78BC0855489045221F1F6CEA03DF8766" Source="$(var.SourceDir)\System.IO.UnmanagedMemoryStream.dll" KeyPath="yes" /> </Component> - <Component Id="owc14A5BB088914D21BDD2FBEE1395FD78B" Guid="11154b61-2f87-760b-ca0a-36b886648d7f"> + <Component Id="owc14A5BB088914D21BDD2FBEE1395FD78B" Guid="11154b61-2f87-760b-ca0a-36b886648d7f" Win64="yes"> <File Id="owf14A5BB088914D21BDD2FBEE1395FD78B" Source="$(var.SourceDir)\System.Linq.dll" KeyPath="yes" /> </Component> - <Component Id="owc06E33481927840239152432A87297CC9" Guid="2f479661-9a83-d333-258a-3151e9ece602"> + <Component Id="owc06E33481927840239152432A87297CC9" Guid="2f479661-9a83-d333-258a-3151e9ece602" Win64="yes"> <File Id="owf06E33481927840239152432A87297CC9" Source="$(var.SourceDir)\System.Linq.Expressions.dll" KeyPath="yes" /> </Component> - <Component Id="owc33213504D30FB74AAAB9D42C2A139443" Guid="dd6f9275-f413-79ca-4c16-3b49f3eed555"> + <Component Id="owc33213504D30FB74AAAB9D42C2A139443" Guid="dd6f9275-f413-79ca-4c16-3b49f3eed555" Win64="yes"> <File Id="owf33213504D30FB74AAAB9D42C2A139443" Source="$(var.SourceDir)\System.Linq.Parallel.dll" KeyPath="yes" /> </Component> - <Component Id="owcB31C9F44CA4C0DEA88E930491533E593" Guid="87247598-1247-8568-6682-990663cb8642"> + <Component Id="owcB31C9F44CA4C0DEA88E930491533E593" Guid="87247598-1247-8568-6682-990663cb8642" Win64="yes"> <File Id="owfB31C9F44CA4C0DEA88E930491533E593" Source="$(var.SourceDir)\System.Linq.Queryable.dll" KeyPath="yes" /> </Component> - <Component Id="owcF2B199C7800AE0BBCC0001E0A61F6988" Guid="405dfe99-fffe-4059-26e0-c7d1bd0a0bed"> + <Component Id="owcF2B199C7800AE0BBCC0001E0A61F6988" Guid="405dfe99-fffe-4059-26e0-c7d1bd0a0bed" Win64="yes"> <File Id="owfF2B199C7800AE0BBCC0001E0A61F6988" Source="$(var.SourceDir)\System.Memory.dll" KeyPath="yes" /> </Component> - <Component Id="owc4A43C16F2C3C6CBABFA3485A6C60298F" Guid="21af8d40-14dc-d59b-6214-1311fa50c80b"> + <Component Id="owc4A43C16F2C3C6CBABFA3485A6C60298F" Guid="21af8d40-14dc-d59b-6214-1311fa50c80b" Win64="yes"> <File Id="owf4A43C16F2C3C6CBABFA3485A6C60298F" Source="$(var.SourceDir)\System.Net.dll" KeyPath="yes" /> </Component> - <Component Id="owcB279CD308898A9D5EFCE20D942FB230A" Guid="d983e56b-4031-2045-c1d1-5c2c9be7f564"> + <Component Id="owcB279CD308898A9D5EFCE20D942FB230A" Guid="d983e56b-4031-2045-c1d1-5c2c9be7f564" Win64="yes"> <File Id="owfB279CD308898A9D5EFCE20D942FB230A" Source="$(var.SourceDir)\System.Net.Http.dll" KeyPath="yes" /> </Component> - <Component Id="owc04A3301773938E6C6F757EFA100024F5" Guid="81d28415-e7aa-2966-544f-d5c2c25450d2"> + <Component Id="owc04A3301773938E6C6F757EFA100024F5" Guid="81d28415-e7aa-2966-544f-d5c2c25450d2" Win64="yes"> <File Id="owf04A3301773938E6C6F757EFA100024F5" Source="$(var.SourceDir)\System.Net.Http.Json.dll" KeyPath="yes" /> </Component> - <Component Id="owc1FF5D15A5BDB1E29D2F481CDF957855A" Guid="c020ff07-701e-3695-86ec-a8484a08f16e"> + <Component Id="owc1FF5D15A5BDB1E29D2F481CDF957855A" Guid="c020ff07-701e-3695-86ec-a8484a08f16e" Win64="yes"> <File Id="owf1FF5D15A5BDB1E29D2F481CDF957855A" Source="$(var.SourceDir)\System.Net.HttpListener.dll" KeyPath="yes" /> </Component> - <Component Id="owcBA297676BD4016E21925CEC4E12AAF2B" Guid="6f2bfcd5-8345-6ac6-d857-cc814c58999f"> + <Component Id="owcBA297676BD4016E21925CEC4E12AAF2B" Guid="6f2bfcd5-8345-6ac6-d857-cc814c58999f" Win64="yes"> <File Id="owfBA297676BD4016E21925CEC4E12AAF2B" Source="$(var.SourceDir)\System.Net.Mail.dll" KeyPath="yes" /> </Component> - <Component Id="owc81FA8D77EACF48506EFC7693E951C70F" Guid="e7ed96ee-ac84-1462-3bc5-0acf623d1e15"> + <Component Id="owc81FA8D77EACF48506EFC7693E951C70F" Guid="e7ed96ee-ac84-1462-3bc5-0acf623d1e15" Win64="yes"> <File Id="owf81FA8D77EACF48506EFC7693E951C70F" Source="$(var.SourceDir)\System.Net.NameResolution.dll" KeyPath="yes" /> </Component> - <Component Id="owc934C98C53C7E0808A3EE15A4AC868052" Guid="9117b5fe-bb92-90f0-6841-8fd5f4866905"> + <Component Id="owc934C98C53C7E0808A3EE15A4AC868052" Guid="9117b5fe-bb92-90f0-6841-8fd5f4866905" Win64="yes"> <File Id="owf934C98C53C7E0808A3EE15A4AC868052" Source="$(var.SourceDir)\System.Net.NetworkInformation.dll" KeyPath="yes" /> </Component> - <Component Id="owc1537EF89B96DC1C1E331FD2FE9BC31B8" Guid="561d623d-0e08-7280-427b-d69affcec093"> + <Component Id="owc1537EF89B96DC1C1E331FD2FE9BC31B8" Guid="561d623d-0e08-7280-427b-d69affcec093" Win64="yes"> <File Id="owf1537EF89B96DC1C1E331FD2FE9BC31B8" Source="$(var.SourceDir)\System.Net.Ping.dll" KeyPath="yes" /> </Component> - <Component Id="owcA5E0D3BB9BB264A42DB0EF961B40BAC9" Guid="9ef2c73b-6f1f-0357-6cf8-bc070f12760c"> + <Component Id="owcA5E0D3BB9BB264A42DB0EF961B40BAC9" Guid="9ef2c73b-6f1f-0357-6cf8-bc070f12760c" Win64="yes"> <File Id="owfA5E0D3BB9BB264A42DB0EF961B40BAC9" Source="$(var.SourceDir)\System.Net.Primitives.dll" KeyPath="yes" /> </Component> - <Component Id="owc427724892EF22A8FDF13221FADDF47CC" Guid="c1af59c0-6298-681e-d89d-ea0b63bd940a"> + <Component Id="owc427724892EF22A8FDF13221FADDF47CC" Guid="c1af59c0-6298-681e-d89d-ea0b63bd940a" Win64="yes"> <File Id="owf427724892EF22A8FDF13221FADDF47CC" Source="$(var.SourceDir)\System.Net.Requests.dll" KeyPath="yes" /> </Component> - <Component Id="owc5A51A1889EEF7C8C80A51530FF7D999C" Guid="3dcfe4c5-b7ac-e109-3c50-0e5ea818dded"> + <Component Id="owc5A51A1889EEF7C8C80A51530FF7D999C" Guid="3dcfe4c5-b7ac-e109-3c50-0e5ea818dded" Win64="yes"> <File Id="owf5A51A1889EEF7C8C80A51530FF7D999C" Source="$(var.SourceDir)\System.Net.Security.dll" KeyPath="yes" /> </Component> - <Component Id="owc9A130B1AD6CE0DBF4EF30D1FA0E17558" Guid="f1a46601-8f73-d33b-87df-57da3b57cc3e"> + <Component Id="owc9A130B1AD6CE0DBF4EF30D1FA0E17558" Guid="f1a46601-8f73-d33b-87df-57da3b57cc3e" Win64="yes"> <File Id="owf9A130B1AD6CE0DBF4EF30D1FA0E17558" Source="$(var.SourceDir)\System.Net.ServicePoint.dll" KeyPath="yes" /> </Component> - <Component Id="owcC356900D1A9E2893A31E87C428F0E41B" Guid="61cebe7a-3808-0785-6015-240947c99e73"> + <Component Id="owcC356900D1A9E2893A31E87C428F0E41B" Guid="61cebe7a-3808-0785-6015-240947c99e73" Win64="yes"> <File Id="owfC356900D1A9E2893A31E87C428F0E41B" Source="$(var.SourceDir)\System.Net.Sockets.dll" KeyPath="yes" /> </Component> - <Component Id="owcFBF4445BFCD03E40CAA85580941050EC" Guid="4e9712fa-3326-c7a6-01e9-adde23c326da"> + <Component Id="owcFBF4445BFCD03E40CAA85580941050EC" Guid="4e9712fa-3326-c7a6-01e9-adde23c326da" Win64="yes"> <File Id="owfFBF4445BFCD03E40CAA85580941050EC" Source="$(var.SourceDir)\System.Net.WebClient.dll" KeyPath="yes" /> </Component> - <Component Id="owc15ED2C21746479C61C5A49665D7267AB" Guid="aa1db7fa-0a1d-1a1e-6719-05f44a9ed8d5"> + <Component Id="owc15ED2C21746479C61C5A49665D7267AB" Guid="aa1db7fa-0a1d-1a1e-6719-05f44a9ed8d5" Win64="yes"> <File Id="owf15ED2C21746479C61C5A49665D7267AB" Source="$(var.SourceDir)\System.Net.WebHeaderCollection.dll" KeyPath="yes" /> </Component> - <Component Id="owc1FEECFECFF17CF9EE1457E09FDD8F063" Guid="d25b3ad2-7120-0447-b74e-b7716800f56d"> + <Component Id="owc1FEECFECFF17CF9EE1457E09FDD8F063" Guid="d25b3ad2-7120-0447-b74e-b7716800f56d" Win64="yes"> <File Id="owf1FEECFECFF17CF9EE1457E09FDD8F063" Source="$(var.SourceDir)\System.Net.WebProxy.dll" KeyPath="yes" /> </Component> - <Component Id="owc4B4A4DF753894976B75856AABBD83E94" Guid="218b92df-fbee-5e9e-effc-d4ba986254c9"> + <Component Id="owc4B4A4DF753894976B75856AABBD83E94" Guid="218b92df-fbee-5e9e-effc-d4ba986254c9" Win64="yes"> <File Id="owf4B4A4DF753894976B75856AABBD83E94" Source="$(var.SourceDir)\System.Net.WebSockets.Client.dll" KeyPath="yes" /> </Component> - <Component Id="owc307840A4F26A9DC062C0BF59A99A6C7F" Guid="a1d35c2f-09e0-879e-7ed4-332bc5171e54"> + <Component Id="owc307840A4F26A9DC062C0BF59A99A6C7F" Guid="a1d35c2f-09e0-879e-7ed4-332bc5171e54" Win64="yes"> <File Id="owf307840A4F26A9DC062C0BF59A99A6C7F" Source="$(var.SourceDir)\System.Net.WebSockets.dll" KeyPath="yes" /> </Component> - <Component Id="owc8D7782E7A3BC230C7410DA352FB0C8FC" Guid="55be9b9f-5cd4-c78e-1459-8f6765527eda"> + <Component Id="owc8D7782E7A3BC230C7410DA352FB0C8FC" Guid="55be9b9f-5cd4-c78e-1459-8f6765527eda" Win64="yes"> <File Id="owf8D7782E7A3BC230C7410DA352FB0C8FC" Source="$(var.SourceDir)\System.Numerics.dll" KeyPath="yes" /> </Component> - <Component Id="owcACF44A9199404726B3D0BCAC3DDC9884" Guid="6f6141de-d259-6b2b-c804-923361cfa667"> + <Component Id="owcACF44A9199404726B3D0BCAC3DDC9884" Guid="6f6141de-d259-6b2b-c804-923361cfa667" Win64="yes"> <File Id="owfACF44A9199404726B3D0BCAC3DDC9884" Source="$(var.SourceDir)\System.Numerics.Vectors.dll" KeyPath="yes" /> </Component> - <Component Id="owc47F52E1092EC255FB03FA729B1FB25DD" Guid="510ba151-2fd1-9a2b-c8b3-8ac725dc97ff"> + <Component Id="owc47F52E1092EC255FB03FA729B1FB25DD" Guid="510ba151-2fd1-9a2b-c8b3-8ac725dc97ff" Win64="yes"> <File Id="owf47F52E1092EC255FB03FA729B1FB25DD" Source="$(var.SourceDir)\System.ObjectModel.dll" KeyPath="yes" /> </Component> - <Component Id="owcC7CAE2D30C1FF0EEA89AC22371A96B2E" Guid="84f5b75a-cd78-cefa-5b2e-77a8f68c3790"> + <Component Id="owcC7CAE2D30C1FF0EEA89AC22371A96B2E" Guid="84f5b75a-cd78-cefa-5b2e-77a8f68c3790" Win64="yes"> <File Id="owfC7CAE2D30C1FF0EEA89AC22371A96B2E" Source="$(var.SourceDir)\System.Private.CoreLib.dll" KeyPath="yes" /> </Component> - <Component Id="owcC04757078499DE51102D8CDAB1D1EE59" Guid="19d3b934-95c5-8f10-338a-5ed4fbf4c6df"> + <Component Id="owcC04757078499DE51102D8CDAB1D1EE59" Guid="19d3b934-95c5-8f10-338a-5ed4fbf4c6df" Win64="yes"> <File Id="owfC04757078499DE51102D8CDAB1D1EE59" Source="$(var.SourceDir)\System.Private.DataContractSerialization.dll" KeyPath="yes" /> </Component> - <Component Id="owc9CD12B7F32947BB77F0EAB6A5BF49268" Guid="fdaf043f-420a-39b3-3cf7-a3bf2047b76b"> + <Component Id="owc9CD12B7F32947BB77F0EAB6A5BF49268" Guid="fdaf043f-420a-39b3-3cf7-a3bf2047b76b" Win64="yes"> <File Id="owf9CD12B7F32947BB77F0EAB6A5BF49268" Source="$(var.SourceDir)\System.Private.Uri.dll" KeyPath="yes" /> </Component> - <Component Id="owc6BD0CD2B2788A0401676CF3B25EF8A0F" Guid="10e3c7ea-439a-4cfd-277b-7de66a382d60"> + <Component Id="owc6BD0CD2B2788A0401676CF3B25EF8A0F" Guid="10e3c7ea-439a-4cfd-277b-7de66a382d60" Win64="yes"> <File Id="owf6BD0CD2B2788A0401676CF3B25EF8A0F" Source="$(var.SourceDir)\System.Private.Xml.dll" KeyPath="yes" /> </Component> - <Component Id="owc148489B5CDA7EB2C29FE77B292334A78" Guid="9cb9b3e6-4894-c00e-81e8-b063f5c6da3b"> + <Component Id="owc148489B5CDA7EB2C29FE77B292334A78" Guid="9cb9b3e6-4894-c00e-81e8-b063f5c6da3b" Win64="yes"> <File Id="owf148489B5CDA7EB2C29FE77B292334A78" Source="$(var.SourceDir)\System.Private.Xml.Linq.dll" KeyPath="yes" /> </Component> - <Component Id="owc784C102062996900FDDFF7A76CCC6BEA" Guid="c0228705-c52a-22a0-45e2-aeea6d7780a0"> + <Component Id="owc784C102062996900FDDFF7A76CCC6BEA" Guid="c0228705-c52a-22a0-45e2-aeea6d7780a0" Win64="yes"> <File Id="owf784C102062996900FDDFF7A76CCC6BEA" Source="$(var.SourceDir)\System.Reactive.dll" KeyPath="yes" /> </Component> - <Component Id="owc3113B8ED121A12C42915591BDB9D1908" Guid="13c39e0e-6a8a-6a6c-e70c-464a51dafcee"> + <Component Id="owc3113B8ED121A12C42915591BDB9D1908" Guid="13c39e0e-6a8a-6a6c-e70c-464a51dafcee" Win64="yes"> <File Id="owf3113B8ED121A12C42915591BDB9D1908" Source="$(var.SourceDir)\System.Reflection.DispatchProxy.dll" KeyPath="yes" /> </Component> - <Component Id="owc7A6EE41CC1504CC124313BD05EDA4F44" Guid="c7dccf48-7641-5657-0f4a-790939e60107"> + <Component Id="owc7A6EE41CC1504CC124313BD05EDA4F44" Guid="c7dccf48-7641-5657-0f4a-790939e60107" Win64="yes"> <File Id="owf7A6EE41CC1504CC124313BD05EDA4F44" Source="$(var.SourceDir)\System.Reflection.dll" KeyPath="yes" /> </Component> - <Component Id="owcB8E57E36F239BA1AF1F29557E2BC8504" Guid="fa8a4480-b62d-31da-0031-ffa3ae954680"> + <Component Id="owcB8E57E36F239BA1AF1F29557E2BC8504" Guid="fa8a4480-b62d-31da-0031-ffa3ae954680" Win64="yes"> <File Id="owfB8E57E36F239BA1AF1F29557E2BC8504" Source="$(var.SourceDir)\System.Reflection.Emit.dll" KeyPath="yes" /> </Component> - <Component Id="owc3DF46F848282D290A9F851917AA8772A" Guid="288973f5-f332-a49f-9d93-840452901e6c"> + <Component Id="owc3DF46F848282D290A9F851917AA8772A" Guid="288973f5-f332-a49f-9d93-840452901e6c" Win64="yes"> <File Id="owf3DF46F848282D290A9F851917AA8772A" Source="$(var.SourceDir)\System.Reflection.Emit.ILGeneration.dll" KeyPath="yes" /> </Component> - <Component Id="owcF862FB0271E431AEED11008D1B08CDD8" Guid="c3cb3976-106a-8638-a9fe-d92c87eef3db"> + <Component Id="owcF862FB0271E431AEED11008D1B08CDD8" Guid="c3cb3976-106a-8638-a9fe-d92c87eef3db" Win64="yes"> <File Id="owfF862FB0271E431AEED11008D1B08CDD8" Source="$(var.SourceDir)\System.Reflection.Emit.Lightweight.dll" KeyPath="yes" /> </Component> - <Component Id="owcD9272FCEF8BD1CC7FEAD7AD1A6E49EF3" Guid="4ba74d67-6502-0abd-79a8-26cce9bc86d4"> + <Component Id="owcD9272FCEF8BD1CC7FEAD7AD1A6E49EF3" Guid="4ba74d67-6502-0abd-79a8-26cce9bc86d4" Win64="yes"> <File Id="owfD9272FCEF8BD1CC7FEAD7AD1A6E49EF3" Source="$(var.SourceDir)\System.Reflection.Extensions.dll" KeyPath="yes" /> </Component> - <Component Id="owcA16A544127C8C5C1A438AA3570FBD816" Guid="4e943266-3693-05ea-92ef-4af7612de750"> + <Component Id="owcA16A544127C8C5C1A438AA3570FBD816" Guid="4e943266-3693-05ea-92ef-4af7612de750" Win64="yes"> <File Id="owfA16A544127C8C5C1A438AA3570FBD816" Source="$(var.SourceDir)\System.Reflection.Metadata.dll" KeyPath="yes" /> </Component> - <Component Id="owc083C1FE687BC99A09242C06653A8673C" Guid="f268003d-bd54-6061-568d-b909f33eaf33"> + <Component Id="owc083C1FE687BC99A09242C06653A8673C" Guid="f268003d-bd54-6061-568d-b909f33eaf33" Win64="yes"> <File Id="owf083C1FE687BC99A09242C06653A8673C" Source="$(var.SourceDir)\System.Reflection.Primitives.dll" KeyPath="yes" /> </Component> - <Component Id="owc342C8E4E3FD4C3812596B5DEA9DFA6DF" Guid="0dbd5985-58a6-164d-ee5c-e36378843e69"> + <Component Id="owc342C8E4E3FD4C3812596B5DEA9DFA6DF" Guid="0dbd5985-58a6-164d-ee5c-e36378843e69" Win64="yes"> <File Id="owf342C8E4E3FD4C3812596B5DEA9DFA6DF" Source="$(var.SourceDir)\System.Reflection.TypeExtensions.dll" KeyPath="yes" /> </Component> - <Component Id="owcEFF9EFA899E048C6DD53C124C8DAE919" Guid="a497a5bc-c0f3-1762-69bf-4dc4b0a88f6e"> + <Component Id="owcEFF9EFA899E048C6DD53C124C8DAE919" Guid="a497a5bc-c0f3-1762-69bf-4dc4b0a88f6e" Win64="yes"> <File Id="owfEFF9EFA899E048C6DD53C124C8DAE919" Source="$(var.SourceDir)\System.Resources.Reader.dll" KeyPath="yes" /> </Component> - <Component Id="owc750D708E37736D206D716B57DF575AB0" Guid="0bde5d63-8ea7-f22c-1ebb-030e8d39dfad"> + <Component Id="owc750D708E37736D206D716B57DF575AB0" Guid="0bde5d63-8ea7-f22c-1ebb-030e8d39dfad" Win64="yes"> <File Id="owf750D708E37736D206D716B57DF575AB0" Source="$(var.SourceDir)\System.Resources.ResourceManager.dll" KeyPath="yes" /> </Component> - <Component Id="owc849861456AA2178B87DEAD1CF0DA8761" Guid="8b407362-c4b6-528d-6f4c-5486f3281fbf"> + <Component Id="owc849861456AA2178B87DEAD1CF0DA8761" Guid="8b407362-c4b6-528d-6f4c-5486f3281fbf" Win64="yes"> <File Id="owf849861456AA2178B87DEAD1CF0DA8761" Source="$(var.SourceDir)\System.Resources.Writer.dll" KeyPath="yes" /> </Component> - <Component Id="owc496161876FAED4A7A0471BC80B909F19" Guid="7fe0a99f-4733-5247-2280-d9c79313b3a1"> + <Component Id="owc496161876FAED4A7A0471BC80B909F19" Guid="7fe0a99f-4733-5247-2280-d9c79313b3a1" Win64="yes"> <File Id="owf496161876FAED4A7A0471BC80B909F19" Source="$(var.SourceDir)\System.Runtime.CompilerServices.Unsafe.dll" KeyPath="yes" /> </Component> - <Component Id="owc184E3D12DDC835719CBE7B32D018A9B9" Guid="5b7727d9-d809-6709-fa1d-cb6731f22dcf"> + <Component Id="owc184E3D12DDC835719CBE7B32D018A9B9" Guid="5b7727d9-d809-6709-fa1d-cb6731f22dcf" Win64="yes"> <File Id="owf184E3D12DDC835719CBE7B32D018A9B9" Source="$(var.SourceDir)\System.Runtime.CompilerServices.VisualC.dll" KeyPath="yes" /> </Component> - <Component Id="owcCD2580ECA1FA1A3513916545D2F2BFA5" Guid="6340e508-d6f8-8810-a6a8-ac0e78dde158"> + <Component Id="owcCD2580ECA1FA1A3513916545D2F2BFA5" Guid="6340e508-d6f8-8810-a6a8-ac0e78dde158" Win64="yes"> <File Id="owfCD2580ECA1FA1A3513916545D2F2BFA5" Source="$(var.SourceDir)\System.Runtime.dll" KeyPath="yes" /> </Component> - <Component Id="owcB0183318DD63CCAB717750C767DC21D7" Guid="483f57ba-9660-18d1-2e88-4a867168e9e0"> + <Component Id="owcB0183318DD63CCAB717750C767DC21D7" Guid="483f57ba-9660-18d1-2e88-4a867168e9e0" Win64="yes"> <File Id="owfB0183318DD63CCAB717750C767DC21D7" Source="$(var.SourceDir)\System.Runtime.Extensions.dll" KeyPath="yes" /> </Component> - <Component Id="owc136B2242A532BBBC64642250BAE3BC3F" Guid="3ab37d46-5fd1-fbc4-6157-d3551784c9a2"> + <Component Id="owc136B2242A532BBBC64642250BAE3BC3F" Guid="3ab37d46-5fd1-fbc4-6157-d3551784c9a2" Win64="yes"> <File Id="owf136B2242A532BBBC64642250BAE3BC3F" Source="$(var.SourceDir)\System.Runtime.Handles.dll" KeyPath="yes" /> </Component> - <Component Id="owc456C772F6BA4F8274FFF4540362C5A62" Guid="72ae39cf-24e7-236b-11f9-67b7675f0c4a"> + <Component Id="owc456C772F6BA4F8274FFF4540362C5A62" Guid="72ae39cf-24e7-236b-11f9-67b7675f0c4a" Win64="yes"> <File Id="owf456C772F6BA4F8274FFF4540362C5A62" Source="$(var.SourceDir)\System.Runtime.InteropServices.dll" KeyPath="yes" /> </Component> - <Component Id="owc142B759C8549F55E22EAD18CF214B77E" Guid="4e3b53dc-2b0a-9a0f-3956-f346f8b8ebd1"> + <Component Id="owc142B759C8549F55E22EAD18CF214B77E" Guid="4e3b53dc-2b0a-9a0f-3956-f346f8b8ebd1" Win64="yes"> <File Id="owf142B759C8549F55E22EAD18CF214B77E" Source="$(var.SourceDir)\System.Runtime.InteropServices.RuntimeInformation.dll" KeyPath="yes" /> </Component> - <Component Id="owc9A9C9FBB06116601690A51EB023CA483" Guid="97913f47-cd75-9dbc-af5e-b2268ffe41f5"> + <Component Id="owc9A9C9FBB06116601690A51EB023CA483" Guid="97913f47-cd75-9dbc-af5e-b2268ffe41f5" Win64="yes"> <File Id="owf9A9C9FBB06116601690A51EB023CA483" Source="$(var.SourceDir)\System.Runtime.Intrinsics.dll" KeyPath="yes" /> </Component> - <Component Id="owc89E8C9EAF9E8E5FDD9C8AF216759A449" Guid="a73ea78a-649c-bf2a-0e24-3d676cec2674"> + <Component Id="owc89E8C9EAF9E8E5FDD9C8AF216759A449" Guid="a73ea78a-649c-bf2a-0e24-3d676cec2674" Win64="yes"> <File Id="owf89E8C9EAF9E8E5FDD9C8AF216759A449" Source="$(var.SourceDir)\System.Runtime.Loader.dll" KeyPath="yes" /> </Component> - <Component Id="owc4D6AAABFFAA874E29883633840AD5B1F" Guid="9cf171cf-1bd8-7320-ccb2-cb1adcf87ec0"> + <Component Id="owc4D6AAABFFAA874E29883633840AD5B1F" Guid="9cf171cf-1bd8-7320-ccb2-cb1adcf87ec0" Win64="yes"> <File Id="owf4D6AAABFFAA874E29883633840AD5B1F" Source="$(var.SourceDir)\System.Runtime.Numerics.dll" KeyPath="yes" /> </Component> - <Component Id="owc0D05731F796C61AEBDC3FF2F0377452C" Guid="1a55f7a8-17bb-2708-41ec-4ccea1f69c17"> + <Component Id="owc0D05731F796C61AEBDC3FF2F0377452C" Guid="1a55f7a8-17bb-2708-41ec-4ccea1f69c17" Win64="yes"> <File Id="owf0D05731F796C61AEBDC3FF2F0377452C" Source="$(var.SourceDir)\System.Runtime.Serialization.dll" KeyPath="yes" /> </Component> - <Component Id="owcE993E9C3A7C67ECA577A3A9E42989BFE" Guid="42f40541-4eac-dd0c-419f-07752bb5366a"> + <Component Id="owcE993E9C3A7C67ECA577A3A9E42989BFE" Guid="42f40541-4eac-dd0c-419f-07752bb5366a" Win64="yes"> <File Id="owfE993E9C3A7C67ECA577A3A9E42989BFE" Source="$(var.SourceDir)\System.Runtime.Serialization.Formatters.dll" KeyPath="yes" /> </Component> - <Component Id="owc878F2DAAF11EC15BCCF25D4B2664C036" Guid="fc052749-2574-2d83-91cd-317890816d6e"> + <Component Id="owc878F2DAAF11EC15BCCF25D4B2664C036" Guid="fc052749-2574-2d83-91cd-317890816d6e" Win64="yes"> <File Id="owf878F2DAAF11EC15BCCF25D4B2664C036" Source="$(var.SourceDir)\System.Runtime.Serialization.Json.dll" KeyPath="yes" /> </Component> - <Component Id="owc8CCA0B6EDAAD44516BEED2BD0448127B" Guid="3a279abe-73c3-37ef-d282-05432cc4de99"> + <Component Id="owc8CCA0B6EDAAD44516BEED2BD0448127B" Guid="3a279abe-73c3-37ef-d282-05432cc4de99" Win64="yes"> <File Id="owf8CCA0B6EDAAD44516BEED2BD0448127B" Source="$(var.SourceDir)\System.Runtime.Serialization.Primitives.dll" KeyPath="yes" /> </Component> - <Component Id="owcAFF0D75B678B8C04204C4F4BE10DC63D" Guid="962d7785-2bdd-31be-55cc-1ef55fb340f1"> + <Component Id="owcAFF0D75B678B8C04204C4F4BE10DC63D" Guid="962d7785-2bdd-31be-55cc-1ef55fb340f1" Win64="yes"> <File Id="owfAFF0D75B678B8C04204C4F4BE10DC63D" Source="$(var.SourceDir)\System.Runtime.Serialization.Xml.dll" KeyPath="yes" /> </Component> - <Component Id="owcE16E2DDD34171BE60D55C8D38E64DFED" Guid="5c9c49b2-ab60-2ada-7c5b-ccaf917fec9e"> + <Component Id="owcE16E2DDD34171BE60D55C8D38E64DFED" Guid="5c9c49b2-ab60-2ada-7c5b-ccaf917fec9e" Win64="yes"> <File Id="owfE16E2DDD34171BE60D55C8D38E64DFED" Source="$(var.SourceDir)\System.Security.AccessControl.dll" KeyPath="yes" /> </Component> - <Component Id="owc75D606E732168EB3AF6DA3C08CCDE454" Guid="26c8e108-08a8-4f5f-4bbd-f4a1239aa723"> + <Component Id="owc75D606E732168EB3AF6DA3C08CCDE454" Guid="26c8e108-08a8-4f5f-4bbd-f4a1239aa723" Win64="yes"> <File Id="owf75D606E732168EB3AF6DA3C08CCDE454" Source="$(var.SourceDir)\System.Security.Claims.dll" KeyPath="yes" /> </Component> - <Component Id="owcD6CB46E32249D9DFE253203C9E68622F" Guid="0aa2f4b7-b10b-cfe5-23bf-064b16b835a1"> + <Component Id="owcD6CB46E32249D9DFE253203C9E68622F" Guid="0aa2f4b7-b10b-cfe5-23bf-064b16b835a1" Win64="yes"> <File Id="owfD6CB46E32249D9DFE253203C9E68622F" Source="$(var.SourceDir)\System.Security.Cryptography.Algorithms.dll" KeyPath="yes" /> </Component> - <Component Id="owcBDEF67F7824536A847E85C78FE427CC5" Guid="d8d2da9f-852a-d6e1-e3c6-f1f79ae03812"> + <Component Id="owcBDEF67F7824536A847E85C78FE427CC5" Guid="d8d2da9f-852a-d6e1-e3c6-f1f79ae03812" Win64="yes"> <File Id="owfBDEF67F7824536A847E85C78FE427CC5" Source="$(var.SourceDir)\System.Security.Cryptography.Cng.dll" KeyPath="yes" /> </Component> - <Component Id="owcE1097D781C913E7C0DFC7E360BA5341C" Guid="ed9b5dc0-4679-3d18-d31c-80e19c54a569"> + <Component Id="owcE1097D781C913E7C0DFC7E360BA5341C" Guid="ed9b5dc0-4679-3d18-d31c-80e19c54a569" Win64="yes"> <File Id="owfE1097D781C913E7C0DFC7E360BA5341C" Source="$(var.SourceDir)\System.Security.Cryptography.Csp.dll" KeyPath="yes" /> </Component> - <Component Id="owcF620F5D5E0DED6F51741DE9E09BAA10C" Guid="2bc2c15c-d955-2493-537a-644fab7006f5"> + <Component Id="owcF620F5D5E0DED6F51741DE9E09BAA10C" Guid="2bc2c15c-d955-2493-537a-644fab7006f5" Win64="yes"> <File Id="owfF620F5D5E0DED6F51741DE9E09BAA10C" Source="$(var.SourceDir)\System.Security.Cryptography.Encoding.dll" KeyPath="yes" /> </Component> - <Component Id="owc52714E3E268ECC037C258F1650B55C09" Guid="74e08645-84bc-db40-130e-d8bb2370b886"> + <Component Id="owc52714E3E268ECC037C258F1650B55C09" Guid="74e08645-84bc-db40-130e-d8bb2370b886" Win64="yes"> <File Id="owf52714E3E268ECC037C258F1650B55C09" Source="$(var.SourceDir)\System.Security.Cryptography.OpenSsl.dll" KeyPath="yes" /> </Component> - <Component Id="owc0F0B6DF93E003C893A5E5E253BAF6C85" Guid="8156cb10-1a47-9979-3566-e6bac4f9dfeb"> + <Component Id="owc0F0B6DF93E003C893A5E5E253BAF6C85" Guid="8156cb10-1a47-9979-3566-e6bac4f9dfeb" Win64="yes"> <File Id="owf0F0B6DF93E003C893A5E5E253BAF6C85" Source="$(var.SourceDir)\System.Security.Cryptography.Primitives.dll" KeyPath="yes" /> </Component> - <Component Id="owc328828932DA40CAED6EC4EA121F7534D" Guid="7057b2c9-50fd-de60-a125-3b4584bd89c0"> + <Component Id="owc328828932DA40CAED6EC4EA121F7534D" Guid="7057b2c9-50fd-de60-a125-3b4584bd89c0" Win64="yes"> <File Id="owf328828932DA40CAED6EC4EA121F7534D" Source="$(var.SourceDir)\System.Security.Cryptography.X509Certificates.dll" KeyPath="yes" /> </Component> - <Component Id="owcC0DB18BCBC84132D6B61635BE6EAF1EA" Guid="9d7c6c38-bc43-d772-8953-7b3295914289"> + <Component Id="owcC0DB18BCBC84132D6B61635BE6EAF1EA" Guid="9d7c6c38-bc43-d772-8953-7b3295914289" Win64="yes"> <File Id="owfC0DB18BCBC84132D6B61635BE6EAF1EA" Source="$(var.SourceDir)\System.Security.dll" KeyPath="yes" /> </Component> - <Component Id="owcBEFCDE5B2833DF316BCC51AFD6BF3AA4" Guid="05208332-4a46-eea8-7608-a22531987d4d"> + <Component Id="owcBEFCDE5B2833DF316BCC51AFD6BF3AA4" Guid="05208332-4a46-eea8-7608-a22531987d4d" Win64="yes"> <File Id="owfBEFCDE5B2833DF316BCC51AFD6BF3AA4" Source="$(var.SourceDir)\System.Security.Principal.dll" KeyPath="yes" /> </Component> - <Component Id="owc016214434E9B6E25C4C645A5894A9696" Guid="dd4f1d1e-1fd6-9722-938e-2571dc3780b4"> + <Component Id="owc016214434E9B6E25C4C645A5894A9696" Guid="dd4f1d1e-1fd6-9722-938e-2571dc3780b4" Win64="yes"> <File Id="owf016214434E9B6E25C4C645A5894A9696" Source="$(var.SourceDir)\System.Security.Principal.Windows.dll" KeyPath="yes" /> </Component> - <Component Id="owcCD07048BAA4A186C4C46EDDAE7408BE9" Guid="fec26fc5-0f79-ae52-46a4-1ed20b673c35"> + <Component Id="owcCD07048BAA4A186C4C46EDDAE7408BE9" Guid="fec26fc5-0f79-ae52-46a4-1ed20b673c35" Win64="yes"> <File Id="owfCD07048BAA4A186C4C46EDDAE7408BE9" Source="$(var.SourceDir)\System.Security.SecureString.dll" KeyPath="yes" /> </Component> - <Component Id="owc555E20B29231033BCEEEEFECE7D284AE" Guid="f247b3b5-b43e-0e04-e481-19a119288ff4"> + <Component Id="owc555E20B29231033BCEEEEFECE7D284AE" Guid="f247b3b5-b43e-0e04-e481-19a119288ff4" Win64="yes"> <File Id="owf555E20B29231033BCEEEEFECE7D284AE" Source="$(var.SourceDir)\System.ServiceModel.Web.dll" KeyPath="yes" /> </Component> - <Component Id="owcA3FF4D2B280956BC17D8887A11C5600B" Guid="a0e5728b-8bec-fbac-6c29-c4d1cf611bbe"> + <Component Id="owcA3FF4D2B280956BC17D8887A11C5600B" Guid="a0e5728b-8bec-fbac-6c29-c4d1cf611bbe" Win64="yes"> <File Id="owfA3FF4D2B280956BC17D8887A11C5600B" Source="$(var.SourceDir)\System.ServiceProcess.dll" KeyPath="yes" /> </Component> - <Component Id="owc135E43289668F503124D1EBE6BAEB320" Guid="8e315afb-fefc-02e9-52e9-be1cbfb8cd33"> + <Component Id="owc135E43289668F503124D1EBE6BAEB320" Guid="8e315afb-fefc-02e9-52e9-be1cbfb8cd33" Win64="yes"> <File Id="owf135E43289668F503124D1EBE6BAEB320" Source="$(var.SourceDir)\System.Text.Encoding.CodePages.dll" KeyPath="yes" /> </Component> - <Component Id="owc9DE717553DF308353E4F1AD8553191F3" Guid="113c0221-beb8-56b6-2c47-3cf70203c0a4"> + <Component Id="owc9DE717553DF308353E4F1AD8553191F3" Guid="113c0221-beb8-56b6-2c47-3cf70203c0a4" Win64="yes"> <File Id="owf9DE717553DF308353E4F1AD8553191F3" Source="$(var.SourceDir)\System.Text.Encoding.dll" KeyPath="yes" /> </Component> - <Component Id="owc34C27BB25C81891A7475EFD8FFAA9931" Guid="6ea9738b-8925-479b-9ca3-111dec6a2131"> + <Component Id="owc34C27BB25C81891A7475EFD8FFAA9931" Guid="6ea9738b-8925-479b-9ca3-111dec6a2131" Win64="yes"> <File Id="owf34C27BB25C81891A7475EFD8FFAA9931" Source="$(var.SourceDir)\System.Text.Encoding.Extensions.dll" KeyPath="yes" /> </Component> - <Component Id="owc80A9D1B08FB1D8164D5533012857F968" Guid="a72dee7f-1a2e-26f1-2f41-e1d50be4ff61"> + <Component Id="owc80A9D1B08FB1D8164D5533012857F968" Guid="a72dee7f-1a2e-26f1-2f41-e1d50be4ff61" Win64="yes"> <File Id="owf80A9D1B08FB1D8164D5533012857F968" Source="$(var.SourceDir)\System.Text.Encodings.Web.dll" KeyPath="yes" /> </Component> - <Component Id="owc19E6D5424ACBD32622F1E5B314864D09" Guid="e03f2e4d-0424-cc35-53eb-48558a3090d1"> + <Component Id="owc19E6D5424ACBD32622F1E5B314864D09" Guid="e03f2e4d-0424-cc35-53eb-48558a3090d1" Win64="yes"> <File Id="owf19E6D5424ACBD32622F1E5B314864D09" Source="$(var.SourceDir)\System.Text.Json.dll" KeyPath="yes" /> </Component> - <Component Id="owc50D709F95681A7937E1395ED21E4DE32" Guid="7b081cab-1412-4a3c-0d6d-3a888e5d04fe"> + <Component Id="owc50D709F95681A7937E1395ED21E4DE32" Guid="7b081cab-1412-4a3c-0d6d-3a888e5d04fe" Win64="yes"> <File Id="owf50D709F95681A7937E1395ED21E4DE32" Source="$(var.SourceDir)\System.Text.RegularExpressions.dll" KeyPath="yes" /> </Component> - <Component Id="owc4E643F069E48F2CB72C64B10067DEDBA" Guid="795c4f4b-3f12-c8a9-52c9-e4fdae740061"> + <Component Id="owc4E643F069E48F2CB72C64B10067DEDBA" Guid="795c4f4b-3f12-c8a9-52c9-e4fdae740061" Win64="yes"> <File Id="owf4E643F069E48F2CB72C64B10067DEDBA" Source="$(var.SourceDir)\System.Threading.Channels.dll" KeyPath="yes" /> </Component> - <Component Id="owc93B418EA3A4105CA687B1FD6F9F8E483" Guid="4765e3c2-e8fe-81ea-e8d2-2cbc01e9ab23"> + <Component Id="owc93B418EA3A4105CA687B1FD6F9F8E483" Guid="4765e3c2-e8fe-81ea-e8d2-2cbc01e9ab23" Win64="yes"> <File Id="owf93B418EA3A4105CA687B1FD6F9F8E483" Source="$(var.SourceDir)\System.Threading.dll" KeyPath="yes" /> </Component> - <Component Id="owc26DBBA37A502B1E377A9CF34F7C9D924" Guid="7dbebf27-47a9-2d91-9dea-ca8847ff38e9"> + <Component Id="owc26DBBA37A502B1E377A9CF34F7C9D924" Guid="7dbebf27-47a9-2d91-9dea-ca8847ff38e9" Win64="yes"> <File Id="owf26DBBA37A502B1E377A9CF34F7C9D924" Source="$(var.SourceDir)\System.Threading.Overlapped.dll" KeyPath="yes" /> </Component> - <Component Id="owcCE4898A459220AFB82CE5C29F65FEB28" Guid="d6cfc0fe-0141-1a96-5403-d9390c17e896"> + <Component Id="owcCE4898A459220AFB82CE5C29F65FEB28" Guid="d6cfc0fe-0141-1a96-5403-d9390c17e896" Win64="yes"> <File Id="owfCE4898A459220AFB82CE5C29F65FEB28" Source="$(var.SourceDir)\System.Threading.Tasks.Dataflow.dll" KeyPath="yes" /> </Component> - <Component Id="owc46051FF3577F3044A630547B602D36DC" Guid="5b7067b2-7764-c6d6-1cd8-0c0ec94ac9de"> + <Component Id="owc46051FF3577F3044A630547B602D36DC" Guid="5b7067b2-7764-c6d6-1cd8-0c0ec94ac9de" Win64="yes"> <File Id="owf46051FF3577F3044A630547B602D36DC" Source="$(var.SourceDir)\System.Threading.Tasks.dll" KeyPath="yes" /> </Component> - <Component Id="owc3CF0579307E4A1BD0241C5C6F3C8B3D4" Guid="80fa7fae-900d-88df-1639-3dd6c24b807b"> + <Component Id="owc3CF0579307E4A1BD0241C5C6F3C8B3D4" Guid="80fa7fae-900d-88df-1639-3dd6c24b807b" Win64="yes"> <File Id="owf3CF0579307E4A1BD0241C5C6F3C8B3D4" Source="$(var.SourceDir)\System.Threading.Tasks.Extensions.dll" KeyPath="yes" /> </Component> - <Component Id="owc4DE82B405CA7ADEA8047D5BC722BBBEF" Guid="bb415d19-c137-2787-38dc-5bb66284bcf3"> + <Component Id="owc4DE82B405CA7ADEA8047D5BC722BBBEF" Guid="bb415d19-c137-2787-38dc-5bb66284bcf3" Win64="yes"> <File Id="owf4DE82B405CA7ADEA8047D5BC722BBBEF" Source="$(var.SourceDir)\System.Threading.Tasks.Parallel.dll" KeyPath="yes" /> </Component> - <Component Id="owc1268977FB6886DC35AB6DD4910EC47A5" Guid="553ce841-c554-609c-10f6-d76e19ccc3d8"> + <Component Id="owc1268977FB6886DC35AB6DD4910EC47A5" Guid="553ce841-c554-609c-10f6-d76e19ccc3d8" Win64="yes"> <File Id="owf1268977FB6886DC35AB6DD4910EC47A5" Source="$(var.SourceDir)\System.Threading.Thread.dll" KeyPath="yes" /> </Component> - <Component Id="owcDC6299D4B1597EE397010E85295D610C" Guid="90599afd-2eda-0dad-706c-ffc98b418414"> + <Component Id="owcDC6299D4B1597EE397010E85295D610C" Guid="90599afd-2eda-0dad-706c-ffc98b418414" Win64="yes"> <File Id="owfDC6299D4B1597EE397010E85295D610C" Source="$(var.SourceDir)\System.Threading.ThreadPool.dll" KeyPath="yes" /> </Component> - <Component Id="owcB50ADFFB11B16B7B3CB8B8CF322E6E82" Guid="a2ac071f-7b0b-5b3e-23a1-7d5bc783531c"> + <Component Id="owcB50ADFFB11B16B7B3CB8B8CF322E6E82" Guid="a2ac071f-7b0b-5b3e-23a1-7d5bc783531c" Win64="yes"> <File Id="owfB50ADFFB11B16B7B3CB8B8CF322E6E82" Source="$(var.SourceDir)\System.Threading.Timer.dll" KeyPath="yes" /> </Component> - <Component Id="owcC611AD2074B39B99F982585B6E9B8763" Guid="e34f2079-78d6-5ad7-6a38-5b97128f08c8"> + <Component Id="owcC611AD2074B39B99F982585B6E9B8763" Guid="e34f2079-78d6-5ad7-6a38-5b97128f08c8" Win64="yes"> <File Id="owfC611AD2074B39B99F982585B6E9B8763" Source="$(var.SourceDir)\System.Transactions.dll" KeyPath="yes" /> </Component> - <Component Id="owcC0550E86DAE6C9BD032DEF07B5424FC7" Guid="6fd27f3f-f7c4-71ac-f0fc-f9430ef16810"> + <Component Id="owcC0550E86DAE6C9BD032DEF07B5424FC7" Guid="6fd27f3f-f7c4-71ac-f0fc-f9430ef16810" Win64="yes"> <File Id="owfC0550E86DAE6C9BD032DEF07B5424FC7" Source="$(var.SourceDir)\System.Transactions.Local.dll" KeyPath="yes" /> </Component> - <Component Id="owcE4E6B570ADBEC007C10E9A65C0D3809D" Guid="505ee0c9-d5a3-8e70-221f-48e70d9ec096"> + <Component Id="owcE4E6B570ADBEC007C10E9A65C0D3809D" Guid="505ee0c9-d5a3-8e70-221f-48e70d9ec096" Win64="yes"> <File Id="owfE4E6B570ADBEC007C10E9A65C0D3809D" Source="$(var.SourceDir)\System.ValueTuple.dll" KeyPath="yes" /> </Component> - <Component Id="owc2456C0BAF8F82081E54CBD3EDA22600A" Guid="86de67e7-dfce-cfe5-2d5d-0a5efdece2b0"> + <Component Id="owc2456C0BAF8F82081E54CBD3EDA22600A" Guid="86de67e7-dfce-cfe5-2d5d-0a5efdece2b0" Win64="yes"> <File Id="owf2456C0BAF8F82081E54CBD3EDA22600A" Source="$(var.SourceDir)\System.Web.dll" KeyPath="yes" /> </Component> - <Component Id="owc0F421467BB606E2D060164F924A83B03" Guid="a3071672-4fc9-91ff-20cf-c2dfb3d021ac"> + <Component Id="owc0F421467BB606E2D060164F924A83B03" Guid="a3071672-4fc9-91ff-20cf-c2dfb3d021ac" Win64="yes"> <File Id="owf0F421467BB606E2D060164F924A83B03" Source="$(var.SourceDir)\System.Web.HttpUtility.dll" KeyPath="yes" /> </Component> - <Component Id="owc722113449C03EF4E424692018BED36E6" Guid="2cf858a6-415c-49ab-88cb-2170ef8e4489"> + <Component Id="owc722113449C03EF4E424692018BED36E6" Guid="2cf858a6-415c-49ab-88cb-2170ef8e4489" Win64="yes"> <File Id="owf722113449C03EF4E424692018BED36E6" Source="$(var.SourceDir)\System.Windows.dll" KeyPath="yes" /> </Component> - <Component Id="owcC9F972FFBCC718F1F0F868B9459608C3" Guid="bfefaeda-644a-e405-2122-9f2f77eafecd"> + <Component Id="owcC9F972FFBCC718F1F0F868B9459608C3" Guid="bfefaeda-644a-e405-2122-9f2f77eafecd" Win64="yes"> <File Id="owfC9F972FFBCC718F1F0F868B9459608C3" Source="$(var.SourceDir)\System.Xml.dll" KeyPath="yes" /> </Component> - <Component Id="owcA04967F05900924C76DC93C6AD6E7DD2" Guid="fe2578b9-c72e-c2f1-f97e-a2df67fb0fbb"> + <Component Id="owcA04967F05900924C76DC93C6AD6E7DD2" Guid="fe2578b9-c72e-c2f1-f97e-a2df67fb0fbb" Win64="yes"> <File Id="owfA04967F05900924C76DC93C6AD6E7DD2" Source="$(var.SourceDir)\System.Xml.Linq.dll" KeyPath="yes" /> </Component> - <Component Id="owc1EC9EF9564C76F0DA10AA382F306146E" Guid="43678e96-830a-a38c-d698-b43a3a7a50a8"> + <Component Id="owc1EC9EF9564C76F0DA10AA382F306146E" Guid="43678e96-830a-a38c-d698-b43a3a7a50a8" Win64="yes"> <File Id="owf1EC9EF9564C76F0DA10AA382F306146E" Source="$(var.SourceDir)\System.Xml.ReaderWriter.dll" KeyPath="yes" /> </Component> - <Component Id="owcB5AB17B98C69CADEF8BE513BA59A8970" Guid="eae62965-bc17-96ea-b75b-0c1e3762d812"> + <Component Id="owcB5AB17B98C69CADEF8BE513BA59A8970" Guid="eae62965-bc17-96ea-b75b-0c1e3762d812" Win64="yes"> <File Id="owfB5AB17B98C69CADEF8BE513BA59A8970" Source="$(var.SourceDir)\System.Xml.Serialization.dll" KeyPath="yes" /> </Component> - <Component Id="owcF216D8D0B753CC36356881E2E693CE3F" Guid="04ea6b06-18d4-d739-f496-c64af28a71f9"> + <Component Id="owcF216D8D0B753CC36356881E2E693CE3F" Guid="04ea6b06-18d4-d739-f496-c64af28a71f9" Win64="yes"> <File Id="owfF216D8D0B753CC36356881E2E693CE3F" Source="$(var.SourceDir)\System.Xml.XDocument.dll" KeyPath="yes" /> </Component> - <Component Id="owcCAE4D437B41AEF31A4F9A1A57B15D3A9" Guid="d41c876d-c6e6-612f-c7ca-b8802416556f"> + <Component Id="owcCAE4D437B41AEF31A4F9A1A57B15D3A9" Guid="d41c876d-c6e6-612f-c7ca-b8802416556f" Win64="yes"> <File Id="owfCAE4D437B41AEF31A4F9A1A57B15D3A9" Source="$(var.SourceDir)\System.Xml.XmlDocument.dll" KeyPath="yes" /> </Component> - <Component Id="owc5D35CD8D594CC804EE94DB60FD950A78" Guid="35495e0e-68b9-a7c8-ebe3-f1b54d2efb92"> + <Component Id="owc5D35CD8D594CC804EE94DB60FD950A78" Guid="35495e0e-68b9-a7c8-ebe3-f1b54d2efb92" Win64="yes"> <File Id="owf5D35CD8D594CC804EE94DB60FD950A78" Source="$(var.SourceDir)\System.Xml.XmlSerializer.dll" KeyPath="yes" /> </Component> - <Component Id="owc09E711B62DEFC2C1EE748EF308694428" Guid="91c9eb37-ac71-a646-2e0a-071efc351607"> + <Component Id="owc09E711B62DEFC2C1EE748EF308694428" Guid="91c9eb37-ac71-a646-2e0a-071efc351607" Win64="yes"> <File Id="owf09E711B62DEFC2C1EE748EF308694428" Source="$(var.SourceDir)\System.Xml.XPath.dll" KeyPath="yes" /> </Component> - <Component Id="owcE0C17BD02D38DB980B86FDA2BE82379B" Guid="7da0a47b-fe8b-8b11-a230-87f3c827c2f2"> + <Component Id="owcE0C17BD02D38DB980B86FDA2BE82379B" Guid="7da0a47b-fe8b-8b11-a230-87f3c827c2f2" Win64="yes"> <File Id="owfE0C17BD02D38DB980B86FDA2BE82379B" Source="$(var.SourceDir)\System.Xml.XPath.XDocument.dll" KeyPath="yes" /> </Component> - <Component Id="owc9AB8ED587037D049D47A65028C17AE93" Guid="b99f6da4-b6ca-790b-a463-f4e997e409d6"> + <Component Id="owc9AB8ED587037D049D47A65028C17AE93" Guid="b99f6da4-b6ca-790b-a463-f4e997e409d6" Win64="yes"> <File Id="owf9AB8ED587037D049D47A65028C17AE93" Source="$(var.SourceDir)\ThemeEditor.Controls.ColorPicker.dll" KeyPath="yes" /> </Component> - <Component Id="owc708079DD5FA0D491EA8FDC1BFDF3B8AF" Guid="b7d422cf-5f2c-ca34-3fd3-d4b2b2af2ab2"> + <Component Id="owc708079DD5FA0D491EA8FDC1BFDF3B8AF" Guid="b7d422cf-5f2c-ca34-3fd3-d4b2b2af2ab2" Win64="yes"> <File Id="owf708079DD5FA0D491EA8FDC1BFDF3B8AF" Source="$(var.SourceDir)\Tmds.DBus.dll" KeyPath="yes" /> </Component> - <Component Id="owc7382C9C8FF3A521BF6356335630BD375" Guid="aa17a4dd-086a-d8ca-2a94-5bed85c6d151"> + <Component Id="owc7382C9C8FF3A521BF6356335630BD375" Guid="aa17a4dd-086a-d8ca-2a94-5bed85c6d151" Win64="yes"> <File Id="owf7382C9C8FF3A521BF6356335630BD375" Source="$(var.SourceDir)\ucrtbase.dll" KeyPath="yes" /> </Component> - <Component Id="owc569F1566ECE625286E8493EC67315736" Guid="c148e3e9-5880-6add-e3f9-b0bbc36f5071"> + <Component Id="owc569F1566ECE625286E8493EC67315736" Guid="c148e3e9-5880-6add-e3f9-b0bbc36f5071" Win64="yes"> <File Id="owf569F1566ECE625286E8493EC67315736" Source="$(var.SourceDir)\UVtools.AvaloniaControls.dll" KeyPath="yes" /> </Component> - <Component Id="owc9783B2A71C9B9BA65282E5F7847AF853" Guid="5d8bba8d-dd57-3bf5-32a2-79feff36a7e0"> + <Component Id="owc9783B2A71C9B9BA65282E5F7847AF853" Guid="5d8bba8d-dd57-3bf5-32a2-79feff36a7e0" Win64="yes"> <File Id="owf9783B2A71C9B9BA65282E5F7847AF853" Source="$(var.SourceDir)\UVtools.AvaloniaControls.pdb" KeyPath="yes" /> </Component> - <Component Id="owc540CF8CDBE6617C60879532E387E1716" Guid="bd0331df-7b7e-28be-f87a-809cdbfa07f0"> + <Component Id="owc540CF8CDBE6617C60879532E387E1716" Guid="bd0331df-7b7e-28be-f87a-809cdbfa07f0" Win64="yes"> <File Id="owf540CF8CDBE6617C60879532E387E1716" Source="$(var.SourceDir)\UVtools.Core.dll" KeyPath="yes" /> </Component> - <Component Id="owcBD6C2CB73106BCF8D5385465839D3344" Guid="efab6672-7297-cbab-c613-743b21593319"> + <Component Id="owcBD6C2CB73106BCF8D5385465839D3344" Guid="efab6672-7297-cbab-c613-743b21593319" Win64="yes"> <File Id="owfBD6C2CB73106BCF8D5385465839D3344" Source="$(var.SourceDir)\UVtools.Core.pdb" KeyPath="yes" /> </Component> - <Component Id="owc9AB1BE4516D59D2F9C38FFC7B627F14B" Guid="fb636012-fe7e-5836-ba11-f212e40901bd"> + <Component Id="owc9AB1BE4516D59D2F9C38FFC7B627F14B" Guid="fb636012-fe7e-5836-ba11-f212e40901bd" Win64="yes"> <File Id="owf9AB1BE4516D59D2F9C38FFC7B627F14B" Source="$(var.SourceDir)\UVtools.deps.json" KeyPath="yes" /> </Component> - <Component Id="owcF7BAF7350DBF794C7897F55847D0B0A6" Guid="fe62833b-b06a-875e-fdec-53e669cdde54"> + <Component Id="owcF7BAF7350DBF794C7897F55847D0B0A6" Guid="fe62833b-b06a-875e-fdec-53e669cdde54" Win64="yes"> <File Id="owfF7BAF7350DBF794C7897F55847D0B0A6" Source="$(var.SourceDir)\UVtools.dll" KeyPath="yes" /> </Component> <Component Id="owc21B8C8C0F69E3CD1398B9A0674DF07BD" Guid="1e472543-e636-904d-da5b-cddaac2d36b1"> @@ -858,22 +861,22 @@ <Shortcut Id="sc6327849DA5C02D2396E91B8B1892E03C" Name="UVtools" Directory="DesktopFolder" WorkingDirectory="MergeRedirectFolder" Description="MSLA/DLP, file analysis, calibration, repair, conversion and manipulation" /> </File> </Component> - <Component Id="owc0C1077539E2B54F2460D2C0993613EFB" Guid="fc6ae2db-2865-9eb4-5753-4f2f941fdf16"> + <Component Id="owc0C1077539E2B54F2460D2C0993613EFB" Guid="fc6ae2db-2865-9eb4-5753-4f2f941fdf16" Win64="yes"> <File Id="owf0C1077539E2B54F2460D2C0993613EFB" Source="$(var.SourceDir)\UVtools.pdb" KeyPath="yes" /> </Component> - <Component Id="owc8B5F65BBC0ED56607BB35C1BA7A63823" Guid="a5f52e20-3806-8061-10a3-5daa4730459f"> + <Component Id="owc8B5F65BBC0ED56607BB35C1BA7A63823" Guid="a5f52e20-3806-8061-10a3-5daa4730459f" Win64="yes"> <File Id="owf8B5F65BBC0ED56607BB35C1BA7A63823" Source="$(var.SourceDir)\UVtools.runtimeconfig.json" KeyPath="yes" /> </Component> - <Component Id="owc1FE1E0B70F7D880A2FB9AFA8E0E36EF5" Guid="545300b7-5398-2ce2-788f-02287a83e8a7"> + <Component Id="owc1FE1E0B70F7D880A2FB9AFA8E0E36EF5" Guid="545300b7-5398-2ce2-788f-02287a83e8a7" Win64="yes"> <File Id="owf1FE1E0B70F7D880A2FB9AFA8E0E36EF5" Source="$(var.SourceDir)\UVtools_demo_file.sl1" KeyPath="yes" /> </Component> - <Component Id="owcEB2D9343E9BF3366381E9864468EFB9A" Guid="c4f85169-dfa6-1369-3b95-34e28199fa0f"> + <Component Id="owcEB2D9343E9BF3366381E9864468EFB9A" Guid="c4f85169-dfa6-1369-3b95-34e28199fa0f" Win64="yes"> <File Id="owfEB2D9343E9BF3366381E9864468EFB9A" Source="$(var.SourceDir)\vcruntime140.dll" KeyPath="yes" /> </Component> - <Component Id="owc41A749EF7C055C135F6C13882684CE39" Guid="d0346e8a-b7e9-6a98-fefd-48957d30e340"> + <Component Id="owc41A749EF7C055C135F6C13882684CE39" Guid="d0346e8a-b7e9-6a98-fefd-48957d30e340" Win64="yes"> <File Id="owf41A749EF7C055C135F6C13882684CE39" Source="$(var.SourceDir)\vcruntime140_1.dll" KeyPath="yes" /> </Component> - <Component Id="owc9AF7D2C52438BF24F3FA3132D7C0E6A9" Guid="892f88e7-cf94-fad1-08d3-b26c1b5913d3"> + <Component Id="owc9AF7D2C52438BF24F3FA3132D7C0E6A9" Guid="892f88e7-cf94-fad1-08d3-b26c1b5913d3" Win64="yes"> <File Id="owf9AF7D2C52438BF24F3FA3132D7C0E6A9" Source="$(var.SourceDir)\WindowsBase.dll" KeyPath="yes" /> </Component> <Directory Id="owd9F9F77C9E3C3E4DA718760164D5303B8" Name="Assets"> diff --git a/UVtools.ScriptSample/ScriptTestPerLayerSettingsSample.cs b/UVtools.ScriptSample/ScriptTestPerLayerSettingsSample.cs index 1280131..1511af6 100644 --- a/UVtools.ScriptSample/ScriptTestPerLayerSettingsSample.cs +++ b/UVtools.ScriptSample/ScriptTestPerLayerSettingsSample.cs @@ -128,7 +128,7 @@ namespace UVtools.ScriptSample if (InputDoNotUseLift.Value) { - SlicerFile.LayerManager.SetNoLiftForSamePositionedLayers(); + SlicerFile.LayerManager.SetLiftForSamePositionedLayers(SlicerFile.SupportsGCode ? 0 : 0.1f); } Progress++; diff --git a/UVtools.WPF/Assets/Icons/balance-scale-16x16.png b/UVtools.WPF/Assets/Icons/balance-scale-16x16.png Binary files differnew file mode 100644 index 0000000..f740ea0 --- /dev/null +++ b/UVtools.WPF/Assets/Icons/balance-scale-16x16.png diff --git a/UVtools.WPF/Assets/Icons/long-arrow-alt-up-16x16.png b/UVtools.WPF/Assets/Icons/long-arrow-alt-up-16x16.png Binary files differnew file mode 100644 index 0000000..7b9454c --- /dev/null +++ b/UVtools.WPF/Assets/Icons/long-arrow-alt-up-16x16.png diff --git a/UVtools.WPF/Controls/Calibrators/CalibrateElephantFootControl.axaml.cs b/UVtools.WPF/Controls/Calibrators/CalibrateElephantFootControl.axaml.cs index f8cb3cd..b19b633 100644 --- a/UVtools.WPF/Controls/Calibrators/CalibrateElephantFootControl.axaml.cs +++ b/UVtools.WPF/Controls/Calibrators/CalibrateElephantFootControl.axaml.cs @@ -1,5 +1,4 @@ using System.Timers; -using Avalonia; using Avalonia.Controls; using Avalonia.Markup.Xaml; using Avalonia.Media.Imaging; diff --git a/UVtools.WPF/Controls/Calibrators/CalibrateLiftHeightControl.axaml b/UVtools.WPF/Controls/Calibrators/CalibrateLiftHeightControl.axaml new file mode 100644 index 0000000..f734917 --- /dev/null +++ b/UVtools.WPF/Controls/Calibrators/CalibrateLiftHeightControl.axaml @@ -0,0 +1,234 @@ +<UserControl xmlns="https://github.com/avaloniaui" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" + x:Class="UVtools.WPF.Controls.Calibrators.CalibrateLiftHeightControl"> + <Grid ColumnDefinitions="Auto,10,350"> + <StackPanel Spacing="10"> + <Grid + RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto" + ColumnDefinitions="Auto,10,150,5,Auto,20,Auto,10,150,5,Auto" + > + + <TextBlock Grid.Row="0" Grid.Column="0" + VerticalAlignment="Center" + Text="Layer height:"/> + <NumericUpDown Grid.Row="0" Grid.Column="2" + Increment="0.01" + Minimum="0.01" + Maximum="0.30" + FormatString="F3" + Value="{Binding Operation.LayerHeight}"/> + <TextBlock Grid.Row="0" Grid.Column="4" + VerticalAlignment="Center" + Text="mm"/> + + + <TextBlock Grid.Row="0" Grid.Column="6" + FontWeight="Bold" + VerticalAlignment="Center" + Text="Total layers:"/> + + + <TextBlock Grid.Row="0" Grid.Column="8" Grid.ColumnSpan="3" FontWeight="Bold" VerticalAlignment="Center"> + <TextBlock.Text> + <MultiBinding StringFormat="{}{0} / {1:F3}mm"> + <Binding Path="Operation.LayerCount"/> + <Binding Path="Operation.TotalHeight"/> + </MultiBinding> + </TextBlock.Text> + </TextBlock> + + + <TextBlock Grid.Row="2" Grid.Column="0" + VerticalAlignment="Center" + Text="Bottom layers:"/> + <NumericUpDown Grid.Row="2" Grid.Column="2" + + Increment="1" + Minimum="1" + Maximum="1000" + Value="{Binding Operation.BottomLayers}"/> + <TextBlock Grid.Row="2" Grid.Column="4" + VerticalAlignment="Center" + Text="{Binding Operation.BottomHeight, StringFormat=\{0:F3\}mm}"/> + + + + <TextBlock Grid.Row="2" Grid.Column="6" + VerticalAlignment="Center" + Text="Normal layers:"/> + <NumericUpDown Grid.Row="2" Grid.Column="8" + Increment="1" + Minimum="1" + Maximum="1000" + Value="{Binding Operation.NormalLayers}"/> + <TextBlock Grid.Row="2" Grid.Column="10" + VerticalAlignment="Center" + Text="{Binding Operation.NormalHeight, StringFormat=\{0:F3\}mm}"/> + + <TextBlock Grid.Row="4" Grid.Column="0" + VerticalAlignment="Center" + Text="Bottom exposure:"/> + <NumericUpDown Grid.Row="4" Grid.Column="2" + + Increment="0.5" + Minimum="0.1" + Maximum="200" + Value="{Binding Operation.BottomExposure}"/> + <TextBlock Grid.Row="4" Grid.Column="4" + VerticalAlignment="Center" + Text="s"/> + + <TextBlock Grid.Row="4" Grid.Column="6" + VerticalAlignment="Center" + Text="Normal exposure:"/> + <NumericUpDown Grid.Row="4" Grid.Column="8" + + Increment="0.5" + Minimum="0.1" + Maximum="200" + Value="{Binding Operation.NormalExposure}"/> + <TextBlock Grid.Row="4" Grid.Column="10" + VerticalAlignment="Center" + Text="s"/> + + + <TextBlock Grid.Row="6" Grid.Column="0" + VerticalAlignment="Center" + Text="Bottom lift height:"/> + <NumericUpDown Grid.Row="6" Grid.Column="2" + Increment="0.5" + Minimum="0.5" + Maximum="50" + FormatString="F2" + Value="{Binding Operation.BottomLiftHeight}"/> + <TextBlock Grid.Row="6" Grid.Column="4" + VerticalAlignment="Center" + Text="mm"/> + + <TextBlock Grid.Row="6" Grid.Column="6" + VerticalAlignment="Center" + Text="Normal lift height:"/> + <NumericUpDown Grid.Row="6" Grid.Column="8" + Increment="0.5" + Minimum="0.5" + Maximum="50" + FormatString="F2" + Value="{Binding Operation.LiftHeight}"/> + <TextBlock Grid.Row="6" Grid.Column="10" + VerticalAlignment="Center" + Text="mm"/> + + + <TextBlock Grid.Row="8" Grid.Column="0" + VerticalAlignment="Center" + Text="Bottom lift speed:"/> + <NumericUpDown Grid.Row="8" Grid.Column="2" + Increment="0.5" + Minimum="0.5" + Maximum="1000" + FormatString="F2" + Value="{Binding Operation.BottomLiftSpeed}"/> + <TextBlock Grid.Row="8" Grid.Column="4" + VerticalAlignment="Center" + Text="mm/min"/> + + <TextBlock Grid.Row="8" Grid.Column="6" + VerticalAlignment="Center" + Text="Normal lift speed:"/> + <NumericUpDown Grid.Row="8" Grid.Column="8" + Increment="0.5" + Minimum="0.5" + Maximum="1000" + FormatString="F2" + Value="{Binding Operation.LiftSpeed}"/> + <TextBlock Grid.Row="8" Grid.Column="10" + VerticalAlignment="Center" + Text="mm/min"/> + + + <TextBlock Grid.Row="10" Grid.Column="0" + VerticalAlignment="Center" + Text="Retract speed:"/> + <NumericUpDown Grid.Row="10" Grid.Column="2" + Increment="0.5" + Minimum="0.5" + Maximum="1000" + FormatString="F2" + Value="{Binding Operation.RetractSpeed}"/> + <TextBlock Grid.Row="10" Grid.Column="4" + VerticalAlignment="Center" + Text="mm/min"/> + + <TextBlock Grid.Row="12" Grid.Column="0" + VerticalAlignment="Center" + Text="Left/right margin:"/> + <NumericUpDown Grid.Row="12" Grid.Column="2" + Increment="5" + Minimum="0" + Maximum="{Binding Operation.MaxLeftRightMargin}" + Value="{Binding Operation.LeftRightMargin}"/> + <TextBlock Grid.Row="12" Grid.Column="4" + VerticalAlignment="Center" + Text="px"/> + + <TextBlock Grid.Row="12" Grid.Column="6" + VerticalAlignment="Center" + Text="Top/right margin:"/> + <NumericUpDown Grid.Row="12" Grid.Column="8" + Increment="5" + Minimum="0" + Maximum="{Binding Operation.MaxTopBottomMargin}" + Value="{Binding Operation.TopBottomMargin}"/> + <TextBlock Grid.Row="12" Grid.Column="10" + VerticalAlignment="Center" + Text="px"/> + + <CheckBox Grid.Row="14" Grid.Column="2" + Grid.ColumnSpan="9" + IsChecked="{Binding Operation.DecreaseImage}" + Content="Decrease layers by a factor down to a minimum size" /> + + <TextBlock Grid.Row="16" Grid.Column="0" + IsEnabled="{Binding Operation.DecreaseImage}" + VerticalAlignment="Center" + Text="Decreasing factor:"/> + <NumericUpDown Grid.Row="16" Grid.Column="2" + IsEnabled="{Binding Operation.DecreaseImage}" + Increment="1" + Minimum="1" + Maximum="99" + Value="{Binding Operation.DecreaseImageFactor}"/> + <TextBlock Grid.Row="16" Grid.Column="4" + IsEnabled="{Binding Operation.DecreaseImage}" + VerticalAlignment="Center" + Text="%"/> + + <TextBlock Grid.Row="16" Grid.Column="6" + IsEnabled="{Binding Operation.DecreaseImage}" + VerticalAlignment="Center" + HorizontalAlignment="Right" + Text="Decrease down to:"/> + <NumericUpDown Grid.Row="16" Grid.Column="8" + IsEnabled="{Binding Operation.DecreaseImage}" + Increment="1" + Minimum="1" + Maximum="99" + Value="{Binding Operation.MinimumImageFactor}"/> + <TextBlock Grid.Row="16" Grid.Column="10" + IsEnabled="{Binding Operation.DecreaseImage}" + VerticalAlignment="Center" + Text="%"/> + + </Grid> + + + </StackPanel> + + <Image Grid.Column="2" + Stretch="Uniform" + Source="{Binding PreviewImage}"/> + </Grid> +</UserControl> diff --git a/UVtools.WPF/Controls/Calibrators/CalibrateLiftHeightControl.axaml.cs b/UVtools.WPF/Controls/Calibrators/CalibrateLiftHeightControl.axaml.cs new file mode 100644 index 0000000..2e0a78d --- /dev/null +++ b/UVtools.WPF/Controls/Calibrators/CalibrateLiftHeightControl.axaml.cs @@ -0,0 +1,75 @@ +using System.Timers; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using Avalonia.Media.Imaging; +using Avalonia.Threading; +using UVtools.Core.Operations; +using UVtools.WPF.Controls.Tools; +using UVtools.WPF.Extensions; +using UVtools.WPF.Windows; + +namespace UVtools.WPF.Controls.Calibrators +{ + public class CalibrateLiftHeightControl : ToolControl + { + public OperationCalibrateLiftHeight Operation => BaseOperation as OperationCalibrateLiftHeight; + + private readonly Timer _timer; + + private Bitmap _previewImage; + public Bitmap PreviewImage + { + get => _previewImage; + set => RaiseAndSetIfChanged(ref _previewImage, value); + } + + public CalibrateLiftHeightControl() + { + BaseOperation = new OperationCalibrateLiftHeight(SlicerFile); + if (!ValidateSpawn()) return; + + InitializeComponent(); + + + _timer = new Timer(20) + { + AutoReset = false + }; + _timer.Elapsed += (sender, e) => Dispatcher.UIThread.InvokeAsync(UpdatePreview); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + + public override void Callback(ToolWindow.Callbacks callback) + { + if (App.SlicerFile is null) return; + switch (callback) + { + case ToolWindow.Callbacks.Init: + case ToolWindow.Callbacks.Loaded: + Operation.PropertyChanged += (sender, e) => + { + _timer.Stop(); + _timer.Start(); + }; + _timer.Stop(); + _timer.Start(); + break; + } + } + + public void UpdatePreview() + { + var layers = Operation.GetLayers(); + _previewImage?.Dispose(); + PreviewImage = layers[0].ToBitmap(); + foreach (var layer in layers) + { + layer.Dispose(); + } + } + } +} diff --git a/UVtools.WPF/Controls/Tools/ToolFlipControl.axaml b/UVtools.WPF/Controls/Tools/ToolFlipControl.axaml index dc56f52..906159a 100644 --- a/UVtools.WPF/Controls/Tools/ToolFlipControl.axaml +++ b/UVtools.WPF/Controls/Tools/ToolFlipControl.axaml @@ -6,10 +6,10 @@ x:Class="UVtools.WPF.Controls.Tools.ToolFlipControl"> <StackPanel Orientation="Horizontal" Spacing="10"> <TextBlock VerticalAlignment="Center" Text="Flip direction:"/> - <ComboBox - MinWidth="150" - Items="{Binding Operation.FlipDirections}" - SelectedItem="{Binding Operation.FlipDirection}"/> + <ComboBox + MinWidth="150" + Items="{Binding Operation.FlipDirection, Converter={StaticResource EnumToCollectionConverter}, Mode=OneTime}" + SelectedItem="{Binding Operation.FlipDirection, Converter={StaticResource FromValueDescriptionToEnumConverter}}"/> <CheckBox ToolTip.Tip="If checked, rather than simply flipping the layer, a copy of each layer will be flipped and blended with the layer." IsChecked="{Binding Operation.MakeCopy}" diff --git a/UVtools.WPF/Controls/Tools/ToolLayerExportImageControl.axaml b/UVtools.WPF/Controls/Tools/ToolLayerExportImageControl.axaml new file mode 100644 index 0000000..9eb3d9d --- /dev/null +++ b/UVtools.WPF/Controls/Tools/ToolLayerExportImageControl.axaml @@ -0,0 +1,67 @@ +<UserControl xmlns="https://github.com/avaloniaui" + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" + mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450" + x:Class="UVtools.WPF.Controls.Tools.ToolLayerExportImageControl"> + <StackPanel Orientation="Vertical" Spacing="10"> + <Grid RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,Auto" + ColumnDefinitions="Auto,10,500,5,Auto"> + <TextBlock Grid.Row="0" Grid.Column="0" + VerticalAlignment="Center" + Text="Output folder:"/> + <TextBox Grid.Row="0" Grid.Column="2" + VerticalAlignment="Center" + IsReadOnly="True" + Text="{Binding Operation.OutputFolder}"/> + <Button Grid.Row="0" Grid.Column="4" + VerticalAlignment="Stretch" + Command="{Binding ChooseFolder}"> + <Image Source="/Assets/Icons/open-16x16.png"/> + </Button> + + <TextBlock Grid.Row="2" Grid.Column="0" + VerticalAlignment="Center" + Text="Prepend filename:"/> + <TextBox Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="3" + VerticalAlignment="Center" + Text="{Binding Operation.Filename}"/> + + <TextBlock Grid.Row="4" Grid.Column="0" + VerticalAlignment="Center" + Text="Image type:"/> + <ComboBox Grid.Row="4" Grid.Column="2" Grid.ColumnSpan="3" + HorizontalAlignment="Stretch" + Items="{Binding Operation.ImageType, Converter={StaticResource EnumToCollectionConverter}, Mode=OneTime}" + SelectedItem="{Binding Operation.ImageType, Converter={StaticResource FromValueDescriptionToEnumConverter}}"/> + + <TextBlock Grid.Row="6" Grid.Column="0" + VerticalAlignment="Center" + Text="Rotate direction:"/> + <ComboBox Grid.Row="6" Grid.Column="2" Grid.ColumnSpan="3" + HorizontalAlignment="Stretch" + Items="{Binding Operation.RotateDirection, Converter={StaticResource EnumToCollectionConverter}, Mode=OneTime}" + SelectedItem="{Binding Operation.RotateDirection, Converter={StaticResource FromValueDescriptionToEnumConverter}}"/> + + <TextBlock Grid.Row="8" Grid.Column="0" + VerticalAlignment="Center" + Text="Flip direction:"/> + <ComboBox Grid.Row="8" Grid.Column="2" Grid.ColumnSpan="3" + HorizontalAlignment="Stretch" + Items="{Binding Operation.FlipDirection, Converter={StaticResource EnumToCollectionConverter}, Mode=OneTime}" + SelectedItem="{Binding Operation.FlipDirection, Converter={StaticResource FromValueDescriptionToEnumConverter}}"/> + + <CheckBox Grid.Row="10" Grid.Column="2" + ToolTip.Tip="Example:
 +Enabled: layer0010
 +Disabled: layer10" + Content="Pad layer index filename with left zeros" + IsChecked="{Binding Operation.PadLayerIndex}"/> + + <CheckBox Grid.Row="12" Grid.Column="2" + Content="Crop image by selected ROI" + IsVisible="{Binding ParentWindow.IsROIVisible}" + IsChecked="{Binding Operation.CropByROI}"/> + </Grid> + </StackPanel> +</UserControl> diff --git a/UVtools.WPF/Controls/Tools/ToolLayerExportImageControl.axaml.cs b/UVtools.WPF/Controls/Tools/ToolLayerExportImageControl.axaml.cs new file mode 100644 index 0000000..08f5df5 --- /dev/null +++ b/UVtools.WPF/Controls/Tools/ToolLayerExportImageControl.axaml.cs @@ -0,0 +1,34 @@ +using System.IO; +using Avalonia.Controls; +using Avalonia.Markup.Xaml; +using UVtools.Core.Operations; + +namespace UVtools.WPF.Controls.Tools +{ + public partial class ToolLayerExportImageControl : ToolControl + { + public OperationLayerExportImage Operation => BaseOperation as OperationLayerExportImage; + public ToolLayerExportImageControl() + { + BaseOperation = new OperationLayerExportImage(SlicerFile); + if (!ValidateSpawn()) return; + InitializeComponent(); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + + public async void ChooseFolder() + { + var dialog = new OpenFolderDialog + { + Directory = Path.GetDirectoryName(SlicerFile.FileFullPath), + }; + var folder = await dialog.ShowAsync(ParentWindow); + if (string.IsNullOrWhiteSpace(folder)) return; + Operation.OutputFolder = folder; + } + } +} diff --git a/UVtools.WPF/MainWindow.axaml.cs b/UVtools.WPF/MainWindow.axaml.cs index 22a966e..cdbc8de 100644 --- a/UVtools.WPF/MainWindow.axaml.cs +++ b/UVtools.WPF/MainWindow.axaml.cs @@ -21,7 +21,6 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; -using Avalonia.Controls.Primitives; using UVtools.AvaloniaControls; using UVtools.Core; using UVtools.Core.Extensions; @@ -293,6 +292,14 @@ namespace UVtools.WPF }, new() { + Tag = new OperationCalibrateLiftHeight(), + Icon = new Avalonia.Controls.Image + { + Source = new Bitmap(App.GetAsset("/Assets/Icons/long-arrow-alt-up-16x16.png")) + } + }, + new() + { Tag = new OperationCalibrateTolerance(), Icon = new Avalonia.Controls.Image { @@ -353,6 +360,14 @@ namespace UVtools.WPF }, new() { + Tag = new OperationLayerExportImage(), + Icon = new Avalonia.Controls.Image + { + Source = new Bitmap(App.GetAsset("/Assets/Icons/file-image-16x16.png")) + } + }, + new() + { Tag = new OperationLayerExportGif(), Icon = new Avalonia.Controls.Image { @@ -1245,7 +1260,7 @@ namespace UVtools.WPF _showLayerImageRotated = mat.Height > mat.Width; } - if (SlicerFile.MirrorDisplay) + if (SlicerFile.DisplayMirror) { _showLayerImageFlipped = true; } diff --git a/UVtools.WPF/Structures/OperationProfiles.cs b/UVtools.WPF/Structures/OperationProfiles.cs index 5372361..479e196 100644 --- a/UVtools.WPF/Structures/OperationProfiles.cs +++ b/UVtools.WPF/Structures/OperationProfiles.cs @@ -47,6 +47,7 @@ namespace UVtools.WPF.Structures [XmlElement(typeof(OperationCalibrateExposureFinder))] [XmlElement(typeof(OperationCalibrateElephantFoot))] [XmlElement(typeof(OperationCalibrateXYZAccuracy))] + [XmlElement(typeof(OperationCalibrateLiftHeight))] [XmlElement(typeof(OperationCalibrateTolerance))] [XmlElement(typeof(OperationCalibrateGrayscale))] [XmlElement(typeof(OperationCalibrateStressTower))] diff --git a/UVtools.WPF/UVtools.WPF.csproj b/UVtools.WPF/UVtools.WPF.csproj index 88b3e89..35bb601 100644 --- a/UVtools.WPF/UVtools.WPF.csproj +++ b/UVtools.WPF/UVtools.WPF.csproj @@ -12,7 +12,7 @@ <PackageLicenseFile>LICENSE</PackageLicenseFile> <RepositoryUrl>https://github.com/sn4k3/UVtools</RepositoryUrl> <RepositoryType>Git</RepositoryType> - <Version>2.16.0</Version> + <Version>2.17.0</Version> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> @@ -59,6 +59,7 @@ <None Include="..\LICENSE"> <Pack>True</Pack> <PackagePath></PackagePath> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> <None Include="..\README.md" Link="README.md" /> <None Include="..\UVtools.CAD\UVtools_demo_file.sl1" Link="UVtools_demo_file.sl1"> diff --git a/UVtools.WPF/Windows/AboutWindow.axaml b/UVtools.WPF/Windows/AboutWindow.axaml index 9d71d9c..654dae7 100644 --- a/UVtools.WPF/Windows/AboutWindow.axaml +++ b/UVtools.WPF/Windows/AboutWindow.axaml @@ -75,7 +75,7 @@ </StackPanel> </Border> <Grid - RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,*" + RowDefinitions="Auto,10,Auto,10,Auto,10,Auto,10,Auto,10,*" Margin="20" > @@ -83,7 +83,15 @@ <TextBlock Grid.Row="2" Text="{Binding Version}"/> <TextBlock Grid.Row="4" Text="{Binding Copyright}"/> <TextBlock Grid.Row="6" Text="{Binding Company}"/> - <TextBox Grid.Row="8" + <Button Grid.Row="8" VerticalAlignment="Center" + Command="{Binding OpenLicense}"> + <StackPanel Orientation="Horizontal" Spacing="10"> + <Image Source="/Assets/Icons/balance-scale-16x16.png"></Image> + <TextBlock VerticalAlignment="Center" Text="{Binding License}"/> + </StackPanel> + </Button> + + <TextBox Grid.Row="10" IsReadOnly="True" MaxHeight="550" Text="{Binding Description}"/> diff --git a/UVtools.WPF/Windows/AboutWindow.axaml.cs b/UVtools.WPF/Windows/AboutWindow.axaml.cs index b8c5f8a..51cbcf1 100644 --- a/UVtools.WPF/Windows/AboutWindow.axaml.cs +++ b/UVtools.WPF/Windows/AboutWindow.axaml.cs @@ -5,7 +5,6 @@ using System.Text.RegularExpressions; using Avalonia; using Avalonia.Markup.Xaml; using Emgu.CV; -using Emgu.CV.Stitching; using UVtools.Core; using UVtools.WPF.Controls; @@ -17,6 +16,7 @@ namespace UVtools.WPF.Windows public string Version => $"Version: {App.VersionStr} {RuntimeInformation.ProcessArchitecture}"; public string Copyright => App.AssemblyCopyright; public string Company => App.AssemblyCompany; + public string License => About.License; public string Description => App.AssemblyDescription; public string OSDescription => $"{RuntimeInformation.OSDescription} {RuntimeInformation.OSArchitecture}"; @@ -74,6 +74,8 @@ namespace UVtools.WPF.Windows public void SetOpenCVInformationToClipboard() { Application.Current.Clipboard.SetTextAsync(CvInvoke.BuildInformation); - } + } + + public void OpenLicense() => App.OpenBrowser(About.LicenseUrl); } } diff --git a/build/CreateRelease.WPF.ps1 b/build/CreateRelease.WPF.ps1 index bcce755..4985e72 100644 --- a/build/CreateRelease.WPF.ps1 +++ b/build/CreateRelease.WPF.ps1 @@ -69,7 +69,7 @@ if([string]::IsNullOrWhiteSpace($version)){ # MSI Variables $installers = @("UVtools.InstallerMM", "UVtools.Installer") -$msiSourceFile = "UVtools.Installer\bin\Release\UVtools.msi" +$msiSourceFile = "UVtools.Installer\bin\x64\Release\UVtools.msi" $msbuild = "`"${env:ProgramFiles(x86)}\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe`" /t:Build /p:Configuration=$buildWith /p:MSIProductVersion=$version" Write-Output " |