diff --git a/src/.gitignore b/src/.gitignore index 7446ab0..ea585ce 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -328,4 +328,8 @@ ASALocalRun/ # MFractors (Xamarin productivity tool) working folder .mfractor/ -**/*.qmlc \ No newline at end of file +**/*.qmlc + +# VS Code +.ionide +.vscode diff --git a/src/Features/AsyncAwaitModel.cs b/src/Features.CSharp/AsyncAwaitModel.cs similarity index 100% rename from src/Features/AsyncAwaitModel.cs rename to src/Features.CSharp/AsyncAwaitModel.cs diff --git a/src/Features/CalculatorModel.cs b/src/Features.CSharp/CalculatorModel.cs similarity index 96% rename from src/Features/CalculatorModel.cs rename to src/Features.CSharp/CalculatorModel.cs index d9e027e..cda39e9 100644 --- a/src/Features/CalculatorModel.cs +++ b/src/Features.CSharp/CalculatorModel.cs @@ -1,80 +1,80 @@ -using Qml.Net; -using System; - -namespace Features -{ - public class CalculatorModel - { - private bool _isValid = false; - private string _computedResult = ""; - - [NotifySignal] - public string ComputedResult - { - get - { - return _computedResult; - } - set - { - if (_computedResult == value) - { - // No signal is raised, Qml doesn't update any bound properties. - return; - } - - _computedResult = value; - this.ActivateSignal("computedResultChanged"); - } - } - - [NotifySignal] - public bool IsValid - { - get - { - return _isValid; - } - set - { - if (_isValid == value) - { - // No signal is raised, Qml doesn't update any bound properties. - return; - } - - _isValid = value; - this.ActivateSignal("isValidChanged"); - } - } - - public void Add(string inputValue1, string inputValue2) - { - ComputedResult = Convert.ToString(decimal.Parse(inputValue1) + decimal.Parse(inputValue2)); - } - - public void Subtract(string inputValue1, string inputValue2) - { - ComputedResult = Convert.ToString(decimal.Parse(inputValue1) - decimal.Parse(inputValue2)); - } - - public void Multiply(string inputValue1, string inputValue2) - { - ComputedResult = Convert.ToString(decimal.Parse(inputValue1) * decimal.Parse(inputValue2)); - } - - public void Divide(string inputValue1, string inputValue2) - { - var value1 = decimal.Parse(inputValue1); - var value2 = decimal.Parse(inputValue2); - - if (value2 == 0) - { - ComputedResult = $"Cannot devide by zero."; - return; - } - - ComputedResult = Convert.ToString(value1 / value2); - } - } +using Qml.Net; +using System; + +namespace Features +{ + public class CalculatorModel + { + private bool _isValid = false; + private string _computedResult = ""; + + [NotifySignal] + public string ComputedResult + { + get + { + return _computedResult; + } + set + { + if (_computedResult == value) + { + // No signal is raised, Qml doesn't update any bound properties. + return; + } + + _computedResult = value; + this.ActivateSignal("computedResultChanged"); + } + } + + [NotifySignal] + public bool IsValid + { + get + { + return _isValid; + } + set + { + if (_isValid == value) + { + // No signal is raised, Qml doesn't update any bound properties. + return; + } + + _isValid = value; + this.ActivateSignal("isValidChanged"); + } + } + + public void Add(string inputValue1, string inputValue2) + { + ComputedResult = Convert.ToString(decimal.Parse(inputValue1) + decimal.Parse(inputValue2)); + } + + public void Subtract(string inputValue1, string inputValue2) + { + ComputedResult = Convert.ToString(decimal.Parse(inputValue1) - decimal.Parse(inputValue2)); + } + + public void Multiply(string inputValue1, string inputValue2) + { + ComputedResult = Convert.ToString(decimal.Parse(inputValue1) * decimal.Parse(inputValue2)); + } + + public void Divide(string inputValue1, string inputValue2) + { + var value1 = decimal.Parse(inputValue1); + var value2 = decimal.Parse(inputValue2); + + if (value2 == 0) + { + ComputedResult = $"Cannot devide by zero."; + return; + } + + ComputedResult = Convert.ToString(value1 / value2); + } + } } \ No newline at end of file diff --git a/src/Features/CollectionsModel.cs b/src/Features.CSharp/CollectionsModel.cs similarity index 100% rename from src/Features/CollectionsModel.cs rename to src/Features.CSharp/CollectionsModel.cs diff --git a/src/Features/DynamicModel.cs b/src/Features.CSharp/DynamicModel.cs similarity index 100% rename from src/Features/DynamicModel.cs rename to src/Features.CSharp/DynamicModel.cs diff --git a/src/Features/Features.csproj b/src/Features.CSharp/Features.CSharp.csproj similarity index 76% rename from src/Features/Features.csproj rename to src/Features.CSharp/Features.CSharp.csproj index 5cde5d8..0c2a8a2 100644 --- a/src/Features/Features.csproj +++ b/src/Features.CSharp/Features.CSharp.csproj @@ -14,8 +14,6 @@ - - - + diff --git a/src/Features/NetObjectsModel.cs b/src/Features.CSharp/NetObjectsModel.cs similarity index 100% rename from src/Features/NetObjectsModel.cs rename to src/Features.CSharp/NetObjectsModel.cs diff --git a/src/Features/NotifySignalsModel.cs b/src/Features.CSharp/NotifySignalsModel.cs similarity index 100% rename from src/Features/NotifySignalsModel.cs rename to src/Features.CSharp/NotifySignalsModel.cs diff --git a/src/Features/Program.cs b/src/Features.CSharp/Program.cs similarity index 85% rename from src/Features/Program.cs rename to src/Features.CSharp/Program.cs index 485b14d..5fa6ed9 100644 --- a/src/Features/Program.cs +++ b/src/Features.CSharp/Program.cs @@ -10,7 +10,7 @@ class Program static int Main(string[] args) { RuntimeManager.DiscoverOrDownloadSuitableQtRuntime(); - + QQuickStyle.SetStyle("Material"); using (var application = new QGuiApplication(args)) @@ -25,6 +25,8 @@ static int Main(string[] args) Qml.Net.Qml.RegisterType("Features"); Qml.Net.Qml.RegisterType("Features"); + string binaryPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location); + Directory.SetCurrentDirectory(binaryPath); qmlEngine.Load("Main.qml"); return application.Exec(); diff --git a/src/Features/SignalsModel.cs b/src/Features.CSharp/SignalsModel.cs similarity index 100% rename from src/Features/SignalsModel.cs rename to src/Features.CSharp/SignalsModel.cs diff --git a/src/Features.Common/Features.Common.csproj b/src/Features.Common/Features.Common.csproj new file mode 100644 index 0000000..93dcdf5 --- /dev/null +++ b/src/Features.Common/Features.Common.csproj @@ -0,0 +1,13 @@ + + + + netstandard2.0 + + + + + + + + + diff --git a/src/Features/Main.qml b/src/Features.Common/Main.qml similarity index 100% rename from src/Features/Main.qml rename to src/Features.Common/Main.qml diff --git a/src/Features/images/arrow.png b/src/Features.Common/images/arrow.png similarity index 100% rename from src/Features/images/arrow.png rename to src/Features.Common/images/arrow.png diff --git a/src/Features/images/back.png b/src/Features.Common/images/back.png similarity index 100% rename from src/Features/images/back.png rename to src/Features.Common/images/back.png diff --git a/src/Features/images/drawer.png b/src/Features.Common/images/drawer.png similarity index 100% rename from src/Features/images/drawer.png rename to src/Features.Common/images/drawer.png diff --git a/src/Features/images/menu.png b/src/Features.Common/images/menu.png similarity index 100% rename from src/Features/images/menu.png rename to src/Features.Common/images/menu.png diff --git a/src/Features/images/qt-logo.png b/src/Features.Common/images/qt-logo.png similarity index 100% rename from src/Features/images/qt-logo.png rename to src/Features.Common/images/qt-logo.png diff --git a/src/Features/pages/AsyncAwait.qml b/src/Features.Common/pages/AsyncAwait.qml similarity index 100% rename from src/Features/pages/AsyncAwait.qml rename to src/Features.Common/pages/AsyncAwait.qml diff --git a/src/Features/pages/Calculator.qml b/src/Features.Common/pages/Calculator.qml similarity index 96% rename from src/Features/pages/Calculator.qml rename to src/Features.Common/pages/Calculator.qml index cbbb094..7ca4493 100644 --- a/src/Features/pages/Calculator.qml +++ b/src/Features.Common/pages/Calculator.qml @@ -1,109 +1,109 @@ -import QtQuick 2.6 -import QtQuick.Controls 2.1 -import Features 1.0 - -ScrollablePage { - Column { - Label { text: qsTr("Input") } - - Grid { - id: inputContainer - columns: 2 - spacing: 12 - width: parent.width - - TextField { - id: txtValue1 - placeholderText: qsTr("Value 1") - - onEditingFinished: { - inputContainer.validateInput() - } - } - TextField { - id: txtValue2 - placeholderText: qsTr("Value 2") - - onEditingFinished: { - inputContainer.validateInput() - } - } - - Label { - id: lblValidation - color: 'red' - } - - function validateInput() { - var fieldsFilled = txtValue1.text !== "" && txtValue2.text !== "" - if (!fieldsFilled) { - model.isValid = false - lblValidation.text = '' - return - } - - model.isValid = !isNaN(txtValue1.text) && !isNaN(txtValue2.text) - if (!model.isValid) { - lblValidation.text = qsTr("Input value(s) is/are invalid.") - } - else { - lblValidation.text = '' - } - } - } - - Label { text: qsTr("Operations") } - - Grid { - id: operationsContainer - columns: 4 - spacing: 12 - width: parent.width - - Button { - text: "+" - onClicked: { - if (model.isValid) { - model.add(txtValue1.text, txtValue2.text) - } - } - } - - Button { - text: "-" - onClicked: { - if (model.isValid) { - model.subtract(txtValue1.text, txtValue2.text) - } - } - } - - Button { - text: "x" - onClicked: { - if (model.isValid) { - model.multiply(txtValue1.text, txtValue2.text) - } - } - } - - Button { - text: ":" - onClicked: { - if (model.isValid) { - model.divide(txtValue1.text, txtValue2.text) - } - } - } - } - - Label { - text: model.computedResult - color: 'green' - } - - CalculatorModel { - id: model - } - } -} +import QtQuick 2.6 +import QtQuick.Controls 2.1 +import Features 1.0 + +ScrollablePage { + Column { + Label { text: qsTr("Input") } + + Grid { + id: inputContainer + columns: 2 + spacing: 12 + width: parent.width + + TextField { + id: txtValue1 + placeholderText: qsTr("Value 1") + + onEditingFinished: { + inputContainer.validateInput() + } + } + TextField { + id: txtValue2 + placeholderText: qsTr("Value 2") + + onEditingFinished: { + inputContainer.validateInput() + } + } + + Label { + id: lblValidation + color: 'red' + } + + function validateInput() { + var fieldsFilled = txtValue1.text !== "" && txtValue2.text !== "" + if (!fieldsFilled) { + model.isValid = false + lblValidation.text = '' + return + } + + model.isValid = !isNaN(txtValue1.text) && !isNaN(txtValue2.text) + if (!model.isValid) { + lblValidation.text = qsTr("Input value(s) is/are invalid.") + } + else { + lblValidation.text = '' + } + } + } + + Label { text: qsTr("Operations") } + + Grid { + id: operationsContainer + columns: 4 + spacing: 12 + width: parent.width + + Button { + text: "+" + onClicked: { + if (model.isValid) { + model.add(txtValue1.text, txtValue2.text) + } + } + } + + Button { + text: "-" + onClicked: { + if (model.isValid) { + model.subtract(txtValue1.text, txtValue2.text) + } + } + } + + Button { + text: "x" + onClicked: { + if (model.isValid) { + model.multiply(txtValue1.text, txtValue2.text) + } + } + } + + Button { + text: ":" + onClicked: { + if (model.isValid) { + model.divide(txtValue1.text, txtValue2.text) + } + } + } + } + + Label { + text: model.computedResult + color: 'green' + } + + CalculatorModel { + id: model + } + } +} diff --git a/src/Features/pages/Collections.qml b/src/Features.Common/pages/Collections.qml similarity index 100% rename from src/Features/pages/Collections.qml rename to src/Features.Common/pages/Collections.qml diff --git a/src/Features/pages/Dynamics.qml b/src/Features.Common/pages/Dynamics.qml similarity index 100% rename from src/Features/pages/Dynamics.qml rename to src/Features.Common/pages/Dynamics.qml diff --git a/src/Features/pages/NetObjects.qml b/src/Features.Common/pages/NetObjects.qml similarity index 100% rename from src/Features/pages/NetObjects.qml rename to src/Features.Common/pages/NetObjects.qml diff --git a/src/Features/pages/NotifySignals.qml b/src/Features.Common/pages/NotifySignals.qml similarity index 100% rename from src/Features/pages/NotifySignals.qml rename to src/Features.Common/pages/NotifySignals.qml diff --git a/src/Features/pages/ScrollablePage.qml b/src/Features.Common/pages/ScrollablePage.qml similarity index 100% rename from src/Features/pages/ScrollablePage.qml rename to src/Features.Common/pages/ScrollablePage.qml diff --git a/src/Features/pages/Signals.qml b/src/Features.Common/pages/Signals.qml similarity index 100% rename from src/Features/pages/Signals.qml rename to src/Features.Common/pages/Signals.qml diff --git a/src/Features.FSharp/AsyncAwaitModel.fs b/src/Features.FSharp/AsyncAwaitModel.fs new file mode 100644 index 0000000..ff411ab --- /dev/null +++ b/src/Features.FSharp/AsyncAwaitModel.fs @@ -0,0 +1,11 @@ +namespace Features + +open System +open System.Threading.Tasks + +type AsyncAwaitModel() = + member this.RunAsyncTask(message: string) = + async { + do! Async.Sleep 2000 + return message + } |> Async.StartAsTask diff --git a/src/Features.FSharp/CalculatorModel.fs b/src/Features.FSharp/CalculatorModel.fs new file mode 100644 index 0000000..767b42e --- /dev/null +++ b/src/Features.FSharp/CalculatorModel.fs @@ -0,0 +1,49 @@ +namespace Features + +open Qml.Net + +type CalculatorModel() = + let mutable isValid = false + let mutable computedResult = "" + + [] + member this.ComputedResult + with get() = computedResult + and set(value) = + if value <> computedResult then + computedResult <- value + this.ActivateSignal("computedResultChanged") |> ignore + + [] + member this.IsValid + with get() = isValid + and set(value) = + if value <> isValid then + isValid <- value + this.ActivateSignal("isValidChanged") |> ignore + + member this.Add(inputValue1: string, inputValue2: string) = + let a = decimal inputValue1 + let b = decimal inputValue2 + let result = a + b + this.ComputedResult <- string result + + member this.Subtract(inputValue1: string, inputValue2: string) = + let a = decimal inputValue1 + let b = decimal inputValue2 + let result = a - b + this.ComputedResult <- string result + + member this.Multiply(inputValue1: string, inputValue2: string) = + let a = decimal inputValue1 + let b = decimal inputValue2 + let result = a * b + this.ComputedResult <- string result + + member this.Divide(inputValue1: string, inputValue2: string) = + let a = decimal inputValue1 + let b = decimal inputValue2 + try + let result = a / b + this.ComputedResult <- string result + with | :? System.DivideByZeroException -> this.ComputedResult <- "Division by zero!" diff --git a/src/Features.FSharp/CollectionsModel.fs b/src/Features.FSharp/CollectionsModel.fs new file mode 100644 index 0000000..e280695 --- /dev/null +++ b/src/Features.FSharp/CollectionsModel.fs @@ -0,0 +1,18 @@ +namespace Features + +open System.Collections.Generic + +type Contact = { Name: string; PhoneNumber: string } + +type CollectionsModel() = + let mutable contacts = List [ {Name = "Paul Knopf"; PhoneNumber = "525-525-52555" } ] + + member this.AddContact(name: string, phoneNumber: string) = + if System.String.IsNullOrEmpty name || System.String.IsNullOrEmpty phoneNumber then false + else + contacts.Add {Name = name; PhoneNumber = phoneNumber} + true + + member this.RemoveContact(index: int) = contacts.RemoveAt(index) + + member this.Contacts with get() = contacts diff --git a/src/Features.FSharp/DynamicModel.fs b/src/Features.FSharp/DynamicModel.fs new file mode 100644 index 0000000..aff0864 --- /dev/null +++ b/src/Features.FSharp/DynamicModel.fs @@ -0,0 +1,10 @@ +namespace Features + +open FSharp.Interop.Dynamic + +type DynamicModel() = + member this.InvokeJavascriptFunction(funct: obj, message: string) = + !?funct message |> ignore + + member this.Add(source: obj, destination: obj) = + destination?computedResult <- source?value1 + source?value2 diff --git a/src/Features.FSharp/Features.FSharp.fsproj b/src/Features.FSharp/Features.FSharp.fsproj new file mode 100644 index 0000000..c569cd8 --- /dev/null +++ b/src/Features.FSharp/Features.FSharp.fsproj @@ -0,0 +1,26 @@ + + + Exe + netcoreapp3.1 + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Features.FSharp/NetObjectsModel.fs b/src/Features.FSharp/NetObjectsModel.fs new file mode 100644 index 0000000..5ef11a3 --- /dev/null +++ b/src/Features.FSharp/NetObjectsModel.fs @@ -0,0 +1,8 @@ +namespace Features + +type NetObject() = + member val Property = "" with get, set + member this.UpdateProperty(value: string) = this.Property <- value + +type NetObjectsModel() = + member this.GetNetObject() = NetObject() diff --git a/src/Features.FSharp/NotifySignalsModel.fs b/src/Features.FSharp/NotifySignalsModel.fs new file mode 100644 index 0000000..e13b598 --- /dev/null +++ b/src/Features.FSharp/NotifySignalsModel.fs @@ -0,0 +1,17 @@ +namespace Features + +open System +open Qml.Net + +type NotifySignalsModel() = + let mutable bindableProperty = "" + + [] + member this.BindableProperty + with get() = bindableProperty + and set(value) = + bindableProperty <- value + this.ActivateSignal("bindablePropertyChanged") |> ignore + + member this.ChangeBindableProperty() = + this.BindableProperty <- DateTime.Now.ToLongTimeString(); diff --git a/src/Features.FSharp/Program.fs b/src/Features.FSharp/Program.fs new file mode 100644 index 0000000..815079a --- /dev/null +++ b/src/Features.FSharp/Program.fs @@ -0,0 +1,28 @@ +open System +open System.IO +open System.Reflection +open Qml.Net +open Qml.Net.Runtimes + +open Features + +[] +let main argv = + RuntimeManager.DiscoverOrDownloadSuitableQtRuntime() + QQuickStyle.SetStyle("Material"); + use app = new QGuiApplication(argv) + use engine = new QQmlApplicationEngine() + let registeredTypes = [ + Qml.RegisterType("Features") + Qml.RegisterType("Features") + Qml.RegisterType("Features") + Qml.RegisterType("Features") + Qml.RegisterType("Features") + Qml.RegisterType("Features") + Qml.RegisterType("Features") + + ] + let binaryPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + Directory.SetCurrentDirectory(binaryPath) + engine.Load("Main.qml") + app.Exec() diff --git a/src/Features.FSharp/SignalsModel.fs b/src/Features.FSharp/SignalsModel.fs new file mode 100644 index 0000000..ddde789 --- /dev/null +++ b/src/Features.FSharp/SignalsModel.fs @@ -0,0 +1,11 @@ +namespace Features + +open System +open Qml.Net + +[] +type SignalsModel() = + member this.RaiseSignal() = + let message = "Signal was raised from F# .NET at " + DateTime.Now.ToLongTimeString() + this.ActivateSignal("customSignal", message) + diff --git a/src/Qml.Net.Examples.sln b/src/Qml.Net.Examples.sln index b0d2c49..035bda1 100644 --- a/src/Qml.Net.Examples.sln +++ b/src/Qml.Net.Examples.sln @@ -3,7 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26124.0 MinimumVisualStudioVersion = 15.0.26124.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Features", "Features\Features.csproj", "{556C9821-F289-4B24-95B0-F5EDD1CDA832}" +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Features.FSharp", "Features.FSharp\Features.FSharp.fsproj", "{FBAAD685-EBB0-4166-920E-25F1612CFA6E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Features.CSharp", "Features.CSharp\Features.CSharp.csproj", "{1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Features.Common", "Features.Common\Features.Common.csproj", "{3FFEA843-CB10-4465-B645-7FA9A86531C6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -18,17 +22,41 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Debug|Any CPU.Build.0 = Debug|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Debug|x64.ActiveCfg = Debug|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Debug|x64.Build.0 = Debug|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Debug|x86.ActiveCfg = Debug|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Debug|x86.Build.0 = Debug|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Release|Any CPU.ActiveCfg = Release|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Release|Any CPU.Build.0 = Release|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Release|x64.ActiveCfg = Release|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Release|x64.Build.0 = Release|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Release|x86.ActiveCfg = Release|Any CPU - {556C9821-F289-4B24-95B0-F5EDD1CDA832}.Release|x86.Build.0 = Release|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Debug|x64.ActiveCfg = Debug|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Debug|x64.Build.0 = Debug|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Debug|x86.ActiveCfg = Debug|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Debug|x86.Build.0 = Debug|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Release|Any CPU.Build.0 = Release|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Release|x64.ActiveCfg = Release|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Release|x64.Build.0 = Release|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Release|x86.ActiveCfg = Release|Any CPU + {FBAAD685-EBB0-4166-920E-25F1612CFA6E}.Release|x86.Build.0 = Release|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Debug|x64.ActiveCfg = Debug|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Debug|x64.Build.0 = Debug|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Debug|x86.ActiveCfg = Debug|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Debug|x86.Build.0 = Debug|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Release|Any CPU.Build.0 = Release|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Release|x64.ActiveCfg = Release|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Release|x64.Build.0 = Release|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Release|x86.ActiveCfg = Release|Any CPU + {1EB48836-4EE9-4D13-BF65-53A2DAEB0F2E}.Release|x86.Build.0 = Release|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Debug|x64.ActiveCfg = Debug|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Debug|x64.Build.0 = Debug|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Debug|x86.Build.0 = Debug|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Release|Any CPU.Build.0 = Release|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Release|x64.ActiveCfg = Release|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Release|x64.Build.0 = Release|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Release|x86.ActiveCfg = Release|Any CPU + {3FFEA843-CB10-4465-B645-7FA9A86531C6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection EndGlobal