diff --git a/xivModdingFramework.sln b/xivModdingFramework.sln
index 32330d49..913310ab 100644
--- a/xivModdingFramework.sln
+++ b/xivModdingFramework.sln
@@ -5,10 +5,6 @@ VisualStudioVersion = 15.0.27428.2015
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "xivModdingFramework", "xivModdingFramework\xivModdingFramework.csproj", "{83A720A7-A039-4FE3-BE65-95146CF5C6F3}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xivModdingFramework.xUnit", "xivModdingFramework.xUnit\xivModdingFramework.xUnit.csproj", "{4214BC4D-2FAD-4C9A-9F60-06A3EB22820D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "exChecker", "exChecker\exChecker.csproj", "{D174095D-1B25-471A-B443-83D69E0A3173}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
diff --git a/xivModdingFramework/Exd/Enums/XivEx.cs b/xivModdingFramework/Exd/Enums/XivEx.cs
index 82d25a12..57595911 100644
--- a/xivModdingFramework/Exd/Enums/XivEx.cs
+++ b/xivModdingFramework/Exd/Enums/XivEx.cs
@@ -544,6 +544,7 @@ public enum XivEx
recipe,
recipeelement,
recipeleveltable,
+ recipelookup,
recipenotebooklist,
recommendcontents,
relic,
diff --git a/xivModdingFramework/Materials/DataContainers/XivMtrl.cs b/xivModdingFramework/Materials/DataContainers/XivMtrl.cs
index 82f761ec..b42b32de 100644
--- a/xivModdingFramework/Materials/DataContainers/XivMtrl.cs
+++ b/xivModdingFramework/Materials/DataContainers/XivMtrl.cs
@@ -137,7 +137,7 @@ public EShaderPack ShaderPack
///
/// The list of half floats containing the ColorSet data
///
- public List ColorSetData { get; set; } = new List(new Half[1024]);
+ public List ColorSetData { get; set; } = new List(new SharpDX.Half[1024]);
///
/// The byte array containing the extra ColorSet data
///
diff --git a/xivModdingFramework/Materials/FileTypes/Mtrl.cs b/xivModdingFramework/Materials/FileTypes/Mtrl.cs
index 5b31a46f..b2df0451 100644
--- a/xivModdingFramework/Materials/FileTypes/Mtrl.cs
+++ b/xivModdingFramework/Materials/FileTypes/Mtrl.cs
@@ -262,7 +262,7 @@ public static XivMtrl GetXivMtrl(byte[] bytes, string internalMtrlPath = "")
xivMtrl.AdditionalData = br.ReadBytes(additionalDataSize);
- xivMtrl.ColorSetData = new List();
+ xivMtrl.ColorSetData = new List();
xivMtrl.ColorSetDyeData = new byte[0];
if (colorSetDataSize > 0)
@@ -273,7 +273,7 @@ public static XivMtrl GetXivMtrl(byte[] bytes, string internalMtrlPath = "")
for (var i = 0; i < colorDataSize / 2; i++)
{
- xivMtrl.ColorSetData.Add(new Half(br.ReadUInt16()));
+ xivMtrl.ColorSetData.Add(new SharpDX.Half(br.ReadUInt16()));
}
// If the color set is 544 (DT: 2080) in length, it has an extra 32 bytes at the end
diff --git a/xivModdingFramework/Materials/FileTypes/STM.cs b/xivModdingFramework/Materials/FileTypes/STM.cs
index b666b84e..f5d2e989 100644
--- a/xivModdingFramework/Materials/FileTypes/STM.cs
+++ b/xivModdingFramework/Materials/FileTypes/STM.cs
@@ -139,30 +139,30 @@ public class StainingTemplateEntry
{
// Data Entries, in the format of
// [Data Offset] => [Dye Id] = Dye values
- public readonly List> Entries = new List>();
+ public readonly List> Entries = new List>();
- public Half[] GetDiffuseData(int dyeId = 0)
+ public SharpDX.Half[] GetDiffuseData(int dyeId = 0)
{
return GetData(0, dyeId);
}
- public Half[] GetSpecularData(int dyeId = 0)
+ public SharpDX.Half[] GetSpecularData(int dyeId = 0)
{
return GetData(1, dyeId);
}
- public Half[] GetEmissiveData(int dyeId = 0)
+ public SharpDX.Half[] GetEmissiveData(int dyeId = 0)
{
return GetData(2, dyeId);
}
- public Half[] GetSpecularPowerData(int dyeId = 0)
+ public SharpDX.Half[] GetSpecularPowerData(int dyeId = 0)
{
return GetData(3, dyeId);
}
- public Half[] GetGlossData(int dyeId = 0)
+ public SharpDX.Half[] GetGlossData(int dyeId = 0)
{
return GetData(4, dyeId);
}
- public Half[] GetData(int offset, int dyeId = 0)
+ public SharpDX.Half[] GetData(int offset, int dyeId = 0)
{
if(offset >= Entries.Count)
{
@@ -225,7 +225,7 @@ public StainingTemplateEntry(byte[] data, int offset, EStainingTemplate template
var lastOffset = 0;
for (int x = 0; x < _ItemCount; x++)
{
- Entries.Add(new List());
+ Entries.Add(new List());
var elementSize = 1;
if(x < 3)
{
@@ -265,20 +265,20 @@ public StainingTemplateEntry(byte[] data, int offset, EStainingTemplate template
var arrayStart = lastOffset;
var offsetStart = (start + headerSize + (arrayStart * 2));
- List halfData = new List();
+ List halfData = new List();
for (int i = 0; i < arraySize; i++)
{
- Half[] halfs = new Half[elementSize];
+ SharpDX.Half[] halfs = new SharpDX.Half[elementSize];
var elementStart = offsetStart + ((i * 2) * elementSize);
- halfs[0] = new Half(BitConverter.ToUInt16(data, elementStart));
+ halfs[0] = new SharpDX.Half(BitConverter.ToUInt16(data, elementStart));
if (elementSize > 1)
{
- halfs[1] = new Half(BitConverter.ToUInt16(data, elementStart + 2));
- halfs[2] = new Half(BitConverter.ToUInt16(data, elementStart + 4));
+ halfs[1] = new SharpDX.Half(BitConverter.ToUInt16(data, elementStart + 2));
+ halfs[2] = new SharpDX.Half(BitConverter.ToUInt16(data, elementStart + 4));
}
halfData.Add(halfs);
@@ -286,7 +286,7 @@ public StainingTemplateEntry(byte[] data, int offset, EStainingTemplate template
if(type == StainingTemplateArrayType.Indexed)
{
- var nArray = new List();
+ var nArray = new List();
// The first entry in the list is an 0xFF byte that we skip
// Since that would leave us with one less value than we need, as dummy value is added for the last dye
for (int i = 1; i < numDyes + 1; i++)
@@ -298,11 +298,11 @@ public StainingTemplateEntry(byte[] data, int offset, EStainingTemplate template
{
if (x < 3)
{
- nArray.Add(new Half[] { new Half(), new Half(), new Half() });
+ nArray.Add(new SharpDX.Half[] { new SharpDX.Half(), new SharpDX.Half(), new SharpDX.Half() });
}
else
{
- nArray.Add(new Half[] { new Half() });
+ nArray.Add(new SharpDX.Half[] { new SharpDX.Half() });
}
continue;
}
diff --git a/xivModdingFramework/Models/FileTypes/Mdl.cs b/xivModdingFramework/Models/FileTypes/Mdl.cs
index b62e39b0..81de9007 100644
--- a/xivModdingFramework/Models/FileTypes/Mdl.cs
+++ b/xivModdingFramework/Models/FileTypes/Mdl.cs
@@ -90,7 +90,7 @@ public static class Mdl
// Simple internal use hashable pair of Halfs.
private struct HalfUV
{
- public HalfUV(Half _x, Half _y)
+ public HalfUV(SharpDX.Half _x, SharpDX.Half _y)
{
x = _x;
y = _y;
@@ -101,8 +101,8 @@ public HalfUV(float _x, float _y)
y = _y;
}
- public Half x;
- public Half y;
+ public SharpDX.Half x;
+ public SharpDX.Half y;
public override int GetHashCode()
{
@@ -4120,20 +4120,20 @@ private static bool WriteVectorData(List buffer, Dictionary buffer, VertexDataType dataType, Vector3 data, bool handedness = true, int wDefault = 0)
{
- Half hx, hy, hz;
+ SharpDX.Half hx, hy, hz;
if (dataType == VertexDataType.Half4)
{
- hx = new Half(data[0]);
- hy = new Half(data[1]);
- hz = new Half(data[2]);
+ hx = new SharpDX.Half(data[0]);
+ hy = new SharpDX.Half(data[1]);
+ hz = new SharpDX.Half(data[2]);
buffer.AddRange(BitConverter.GetBytes(hx.RawValue));
buffer.AddRange(BitConverter.GetBytes(hy.RawValue));
buffer.AddRange(BitConverter.GetBytes(hz.RawValue));
// Half float positions have a W coordinate that is typically defaulted to either 0 (position data) or 1 (normal data).
- var w = new Half(wDefault);
+ var w = new SharpDX.Half(wDefault);
buffer.AddRange(BitConverter.GetBytes(w.RawValue));
}
@@ -4248,12 +4248,12 @@ private static int WriteVertex(VertexByteData importData, Dictionary GetModelMaps(XivMtrl mtrl, bool pbrMa
var dataLength = normalPixels != null ? normalPixels.Length : diffusePixels.Length;
- var shaderFn = GetShaderMapper(GetCustomColors(), mtrl, settings);
+ var shaderFn = GetShaderMapper(colors, mtrl, settings);
bool invertNormalGreen = colors.InvertNormalGreen;
await Task.Run(() =>
@@ -647,7 +649,7 @@ private static ShaderMapperDelegate GetShaderMapper(CustomModelColors colors, Xi
specularColorMul *= specularColorMul;
emissiveColorMul *= emissiveColorMul;
- List colorset = null;
+ List colorset = null;
if(mtrl.ColorSetData != null && mtrl.ColorSetData.Count >= 1024)
{
// Clone the list in case the data is accessed or changed while we're working.
@@ -920,6 +922,7 @@ private static ShaderMapperDelegate GetShaderMapper(CustomModelColors colors, Xi
{
var hairColor = (Color4)colors.HairColor;
var bonusColor = GetHairBonusColor(mtrl, colors, colors.HairHighlightColor != null ? colors.HairHighlightColor.Value : colors.HairColor);
+ var lightColor = SrgbToLinear(new Color4(1, 0, 1, 1));
//bonusColor = SrgbToLinear(bonusColor);
@@ -928,13 +931,15 @@ private static ShaderMapperDelegate GetShaderMapper(CustomModelColors colors, Xi
var metalness = 0.0f;
var occlusion = 1.0f;
float bonusInfluence = normal.Blue;
+ float lightInfluence = (float)Math.Pow(mask.Red, 4.25f);
-
+ //Console.WriteLine($"light influence: {lightInfluence}");
roughness = mask.Green;
var specular = new Color4(mask.Red, mask.Red, mask.Red, 1.0f);
- diffuse = Color4.Lerp(hairColor, bonusColor, bonusInfluence);
+ var baseHairColor = Color4.Lerp(hairColor, bonusColor, bonusInfluence);
+ diffuse = Color4.Lerp(baseHairColor, colors.LightColor, lightInfluence);
diffuse *= diffuseColorMul;
occlusion = (mask.Alpha * mask.Alpha);
@@ -1336,7 +1341,7 @@ private static (Color4? Color, bool Blend) GetSkinBonusColor2(XivMtrl mtrl, Cust
///
///
///
- public static Half[] GetColorsetRow(List colorsetData, float indexRed, float indexGreen, bool visualizeOnly = false, int highlightRow = -1)
+ public static SharpDX.Half[] GetColorsetRow(List colorsetData, float indexRed, float indexGreen, bool visualizeOnly = false, int highlightRow = -1)
{
if(colorsetData == null || colorsetData.Count == 0) {
return null;
@@ -1365,7 +1370,7 @@ public static Half[] GetColorsetRow(List colorsetData, float indexRed, flo
}
- var rowData = new Half[_RowSize];
+ var rowData = new SharpDX.Half[_RowSize];
if (visualizeOnly)
{
for(int i = 0; i < 3; i++) {
@@ -1430,7 +1435,7 @@ public static Half[] GetColorsetRow(List colorsetData, float indexRed, flo
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static Half LerpHalf(Half a, Half b, float f)
+ public static SharpDX.Half LerpHalf(SharpDX.Half a, SharpDX.Half b, float f)
{
return a * (1.0f - f) + (b * f);
}
diff --git a/xivModdingFramework/Mods/EndwalkerUpgrade.cs b/xivModdingFramework/Mods/EndwalkerUpgrade.cs
index 3c213834..3270e446 100644
--- a/xivModdingFramework/Mods/EndwalkerUpgrade.cs
+++ b/xivModdingFramework/Mods/EndwalkerUpgrade.cs
@@ -794,7 +794,7 @@ private static async Task> UpdateEndwalkerColors
}
// Update Colorset
- List newData = new List(1024);
+ List newData = new List(1024);
for (int i = 0; i < 32; i++)
{
@@ -1226,9 +1226,9 @@ private static async Task UpdateEndwalkerHairTextures(string normalPath, string
}
}
- public static Half[] GetDefaultColorsetRow(EShaderPack pack)
+ public static SharpDX.Half[] GetDefaultColorsetRow(EShaderPack pack)
{
- var row = new Half[32];
+ var row = new SharpDX.Half[32];
// Diffuse pixel base
for (int i = 0; i < 8; i++)
diff --git a/xivModdingFramework/Mods/FileTypes/TTMP.cs b/xivModdingFramework/Mods/FileTypes/TTMP.cs
index 6669aa29..9968f54f 100644
--- a/xivModdingFramework/Mods/FileTypes/TTMP.cs
+++ b/xivModdingFramework/Mods/FileTypes/TTMP.cs
@@ -921,7 +921,7 @@ public static UpgradesNeeded DoesModpackNeedFix(string version)
string[] parts = version.Split('.');
int.TryParse(parts[0], out major);
if (parts.Length > 1)
- int.TryParse(new(parts[1].TakeWhile(char.IsDigit).ToArray()), out minor);
+ int.TryParse(new string(parts[1].TakeWhile(char.IsDigit).ToArray()), out minor);
if (major < 2)
return UpgradesNeeded.NeedsTexFix | UpgradesNeeded.NeedsMdlFix;
if (major == 2 && minor == 0)
diff --git a/xivModdingFramework/Mods/WizardData.cs b/xivModdingFramework/Mods/WizardData.cs
index b7873938..6d0964d3 100644
--- a/xivModdingFramework/Mods/WizardData.cs
+++ b/xivModdingFramework/Mods/WizardData.cs
@@ -57,8 +57,10 @@ public static string WriteImage(string currentPath, string tempFolder, string ne
Directory.CreateDirectory(dir);
using var fs = File.OpenWrite(fName);
- var enc = new PngEncoder();
- enc.BitDepth = PngBitDepth.Bit16;
+ var enc = new PngEncoder
+ {
+ BitDepth = PngBitDepth.Bit16
+ };
img.Save(fs, enc);
return path;
diff --git a/xivModdingFramework/Resources/XivStrings.Designer.cs b/xivModdingFramework/Resources/XivStrings.Designer.cs
index 4700f42b..e8ecc570 100644
--- a/xivModdingFramework/Resources/XivStrings.Designer.cs
+++ b/xivModdingFramework/Resources/XivStrings.Designer.cs
@@ -22,7 +22,7 @@ namespace xivModdingFramework.Resources {
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
- internal class XivStrings {
+ public class XivStrings {
private static global::System.Resources.ResourceManager resourceMan;
@@ -279,7 +279,7 @@ internal static string Bishop_Autoturret {
///
/// Looks up a localized string similar to Body.
///
- internal static string Body {
+ public static string Body {
get {
return ResourceManager.GetString("Body", resourceCulture);
}
@@ -936,7 +936,7 @@ internal static string ExdFolder {
///
/// Looks up a localized string similar to Face.
///
- internal static string Face {
+ public static string Face {
get {
return ResourceManager.GetString("Face", resourceCulture);
}
diff --git a/xivModdingFramework/SqPack/DataContainers/IndexFile.cs b/xivModdingFramework/SqPack/DataContainers/IndexFile.cs
index 418cae9a..6354bf31 100644
--- a/xivModdingFramework/SqPack/DataContainers/IndexFile.cs
+++ b/xivModdingFramework/SqPack/DataContainers/IndexFile.cs
@@ -105,8 +105,8 @@ public IndexFile(XivDataFile dataFile, BinaryReader index1Stream, BinaryReader i
public virtual void Save() {
var dir = XivCache.GameInfo.GameDirectory;
- var index1Path = XivDataFiles.GetFullPath(DataFile, Index.IndexExtension);
- var index2Path = XivDataFiles.GetFullPath(DataFile, Index.Index2Extension);
+ var index1Path = XivDataFiles.GetFullPath(DataFile, xivModdingFramework.SqPack.FileTypes.Index.IndexExtension);
+ var index2Path = XivDataFiles.GetFullPath(DataFile, xivModdingFramework.SqPack.FileTypes.Index.Index2Extension);
using (var index1Stream = new BinaryWriter(File.Open(index1Path, FileMode.OpenOrCreate, FileAccess.Write)))
{
using (var index2Stream = new BinaryWriter(File.Open(index2Path, FileMode.OpenOrCreate, FileAccess.Write)))
diff --git a/xivModdingFramework/Textures/FileTypes/DDS.cs b/xivModdingFramework/Textures/FileTypes/DDS.cs
index 2e86672e..b5d187fb 100644
--- a/xivModdingFramework/Textures/FileTypes/DDS.cs
+++ b/xivModdingFramework/Textures/FileTypes/DDS.cs
@@ -16,11 +16,13 @@
using SharpDX;
using SixLabors.ImageSharp;
+using SixLabors.ImageSharp.Formats;
using SixLabors.ImageSharp.Formats.Png;
using SixLabors.ImageSharp.Formats.Tga;
using SixLabors.ImageSharp.PixelFormats;
using System;
using System.Collections.Generic;
+using System.Data.Entity.ModelConfiguration.Conventions;
using System.Diagnostics;
using System.IO;
using System.Linq;
@@ -654,10 +656,10 @@ await Task.Run(async () =>
{
for (var x = 0; x < width; x++)
{
- var r = new Half(br.ReadUInt16());
- var g = new Half(br.ReadUInt16());
- var b = new Half(br.ReadUInt16());
- var a = new Half(br.ReadUInt16());
+ var r = new SharpDX.Half(br.ReadUInt16());
+ var g = new SharpDX.Half(br.ReadUInt16());
+ var b = new SharpDX.Half(br.ReadUInt16());
+ var a = new SharpDX.Half(br.ReadUInt16());
// 255 * value, clamped to 0-255.
var byteR = (byte)Math.Max(0, Math.Min(255, Math.Round(r * 255.0f)));
@@ -748,9 +750,11 @@ public static async Task TexConv(byte[] rgbaData, int width, int height,
{
using (var img = Image.LoadPixelData(rgbaData, width, height))
{
- var encoder = new TgaEncoder();
- encoder.Compression = TgaCompression.None;
- encoder.BitsPerPixel = TgaBitsPerPixel.Pixel32;
+ var encoder = new TgaEncoder
+ {
+ Compression = TgaCompression.None,
+ BitsPerPixel = TgaBitsPerPixel.Pixel32
+ };
img.SaveAsTga(input, encoder);
}
}
@@ -758,9 +762,11 @@ public static async Task TexConv(byte[] rgbaData, int width, int height,
{
using (var img = Image.LoadPixelData(rgbaData, width, height))
{
- var encoder = new TgaEncoder();
- encoder.Compression = TgaCompression.None;
- encoder.BitsPerPixel = TgaBitsPerPixel.Pixel32;
+ var encoder = new TgaEncoder
+ {
+ Compression = TgaCompression.None,
+ BitsPerPixel = TgaBitsPerPixel.Pixel32
+ };
img.SaveAsTga(input, encoder);
}
}
@@ -781,14 +787,20 @@ public static async Task TexConv(string file, string format, bool genera
// TexConv does not handle PNGs correctly. Rip the raw bytes ourselves and resave as TGA.
if (file.ToLower().EndsWith(".png"))
{
- var decoder = new PngDecoder();
+ var decoder = PngDecoder.Instance;
byte[] data;
int width, height;
- using (var img = Image.Load(file, decoder))
+
+ using (var stream = File.OpenRead(file))
{
- width = img.Width;
- height = img.Height;
- data = IOUtil.GetImageSharpPixels(img);
+ var options = new DecoderOptions { Configuration = SixLabors.ImageSharp.Configuration.Default };
+
+ using (var img = Image.Load(options, stream))
+ {
+ width = img.Width;
+ height = img.Height;
+ data = IOUtil.GetImageSharpPixels(img);
+ }
}
// TexConv does not handle PNG reading correctly.
return await TexConv(data, width, height, format, generateMipMaps);
diff --git a/xivModdingFramework/Textures/FileTypes/Tex.cs b/xivModdingFramework/Textures/FileTypes/Tex.cs
index cce7b1ea..0f5e84ee 100644
--- a/xivModdingFramework/Textures/FileTypes/Tex.cs
+++ b/xivModdingFramework/Textures/FileTypes/Tex.cs
@@ -1350,7 +1350,7 @@ public static async Task CompressTexFile(BinaryReader br, uint lengthInc
#region Colorset Import Handling
// Special one-off functions for importing colorsets as image files.
- public static (List ColorsetData, byte[] DyeData) GetColorsetDataFromDDS(string ddsFilePath)
+ public static (List ColorsetData, byte[] DyeData) GetColorsetDataFromDDS(string ddsFilePath)
{
var colorSetData = DDSToColorset(ddsFilePath);
var dyeData = GetColorsetDyeInformationFromFile(ddsFilePath);
@@ -1395,7 +1395,7 @@ public static void ImportColorsetTexture(XivMtrl xivMtrl, string ddsFilePath, bo
///
///
///
- public static List DDSToColorset(string ddsPath)
+ public static List DDSToColorset(string ddsPath)
{
using (var br = new BinaryReader(File.OpenRead(ddsPath)))
{
@@ -1436,14 +1436,14 @@ public static List DDSToColorset(string ddsPath)
}
var size = width * height * 4;
- var colorSetData = new List(size);
+ var colorSetData = new List(size);
br.BaseStream.Seek(128, SeekOrigin.Begin);
for (var i = 0; i < size; i++)
{
- colorSetData.Add((new Half(br.ReadUInt16())));
+ colorSetData.Add((new SharpDX.Half(br.ReadUInt16())));
}
return colorSetData;
diff --git a/xivModdingFramework/xivModdingFramework.csproj b/xivModdingFramework/xivModdingFramework.csproj
index 31146c25..7840122c 100644
--- a/xivModdingFramework/xivModdingFramework.csproj
+++ b/xivModdingFramework/xivModdingFramework.csproj
@@ -1,7 +1,7 @@
- netstandard2.0
+ net8.0
3.1.0.0
3.1.0
true
@@ -34,7 +34,7 @@
-
+
diff --git a/xivModdingFramework/xivModdingFramework.sln b/xivModdingFramework/xivModdingFramework.sln
new file mode 100644
index 00000000..612d8db4
--- /dev/null
+++ b/xivModdingFramework/xivModdingFramework.sln
@@ -0,0 +1,24 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.5.2.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xivModdingFramework", "xivModdingFramework.csproj", "{6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {6487CDA4-F7B7-6B62-ECD4-0B2CF7696991}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {A1F3DA06-CC78-4E54-8EA9-4A6FAFA6F16E}
+ EndGlobalSection
+EndGlobal