Add MI/GDB and VSCode tests for exit code status.
authorMikhail Kurinnoi <m.kurinnoi@samsung.com>
Tue, 30 Jun 2020 20:11:41 +0000 (23:11 +0300)
committerMikhail Kurinnoi <m.kurinnoi@samsung.com>
Thu, 30 Jul 2020 10:17:13 +0000 (13:17 +0300)
13 files changed:
test-suite/MITestExceptionBreakpoint/Program.cs
test-suite/MITestExitCode/MITestExitCode.csproj [new file with mode: 0644]
test-suite/MITestExitCode/Program.cs [new file with mode: 0644]
test-suite/MITestGDB/Program.cs
test-suite/VSCodeTestDisconnect/Program.cs
test-suite/VSCodeTestExitCode/Program.cs [new file with mode: 0644]
test-suite/VSCodeTestExitCode/VSCodeTestExitCode.csproj [new file with mode: 0644]
test-suite/XunitTests/LocalTest.cs
test-suite/run_tests.ps1
test-suite/run_tests.sh
test-suite/sdb_run_tests.ps1
test-suite/sdb_run_tests.sh
test-suite/test-suite.sln

index a60fc10a7bfe42713cc2937ebc242353e143cff0..2a1cf2cbea9726c0fcc2eeb67f42d47711c607ca 100644 (file)
@@ -142,13 +142,8 @@ namespace NetcoreDbgTest.Script
                     return false;\r
                 }\r
 \r
-                var exitCode = (MIConst)output["exit-code"];\r
-\r
-                if (exitCode.CString == "0") {\r
-                    return true;\r
-                }\r
-\r
-                return false;\r
+                // we don't check exit code here, since Windows and Linux provide different exit code in case of "-gdb-exit" usage\r
+                return true;\r
             };\r
 \r
             if (!MIDebugger.IsEventReceived(filter))\r
diff --git a/test-suite/MITestExitCode/MITestExitCode.csproj b/test-suite/MITestExitCode/MITestExitCode.csproj
new file mode 100644 (file)
index 0000000..2512674
--- /dev/null
@@ -0,0 +1,12 @@
+<Project Sdk="Microsoft.NET.Sdk">\r
+\r
+  <ItemGroup>\r
+    <ProjectReference Include="..\NetcoreDbgTest\NetcoreDbgTest.csproj" />\r
+  </ItemGroup>\r
+\r
+  <PropertyGroup>\r
+    <OutputType>Exe</OutputType>\r
+    <TargetFramework>netcoreapp3.1</TargetFramework>\r
+  </PropertyGroup>\r
+\r
+</Project>\r
diff --git a/test-suite/MITestExitCode/Program.cs b/test-suite/MITestExitCode/Program.cs
new file mode 100644 (file)
index 0000000..0d9912d
--- /dev/null
@@ -0,0 +1,179 @@
+using System;\r
+using System.IO;\r
+using System.Runtime.InteropServices;\r
+using System.Diagnostics;\r
+\r
+using NetcoreDbgTest;\r
+using NetcoreDbgTest.MI;\r
+using NetcoreDbgTest.Script;\r
+\r
+using Xunit;\r
+\r
+namespace NetcoreDbgTest.Script\r
+{\r
+    class Context\r
+    {\r
+        public static void Prepare()\r
+        {\r
+            Assert.Equal(MIResultClass.Done,\r
+                         MIDebugger.Request("-file-exec-and-symbols "\r
+                                            + DebuggeeInfo.CorerunPath).Class);\r
+\r
+            Assert.Equal(MIResultClass.Done,\r
+                         MIDebugger.Request("-exec-arguments "\r
+                                            + DebuggeeInfo.TargetAssemblyPath).Class);\r
+\r
+            Assert.Equal(MIResultClass.Running, MIDebugger.Request("-exec-run").Class);\r
+        }\r
+\r
+        static bool IsStoppedEvent(MIOutOfBandRecord record)\r
+        {\r
+            if (record.Type != MIOutOfBandRecordType.Async) {\r
+                return false;\r
+            }\r
+\r
+            var asyncRecord = (MIAsyncRecord)record;\r
+\r
+            if (asyncRecord.Class != MIAsyncRecordClass.Exec ||\r
+                asyncRecord.Output.Class != MIAsyncOutputClass.Stopped) {\r
+                return false;\r
+            }\r
+\r
+            return true;\r
+        }\r
+\r
+        public static void WasEntryPointHit()\r
+        {\r
+            Func<MIOutOfBandRecord, bool> filter = (record) => {\r
+                if (!IsStoppedEvent(record)) {\r
+                    return false;\r
+                }\r
+\r
+                var output = ((MIAsyncRecord)record).Output;\r
+                var reason = (MIConst)output["reason"];\r
+\r
+                if (reason.CString != "entry-point-hit") {\r
+                    return false;\r
+                }\r
+\r
+                var frame = (MITuple)(output["frame"]);\r
+                var func = (MIConst)(frame["func"]);\r
+                if (func.CString == DebuggeeInfo.TestName + ".Program.Main()") {\r
+                    return true;\r
+                }\r
+\r
+                return false;\r
+            };\r
+\r
+            if (!MIDebugger.IsEventReceived(filter))\r
+                throw new NetcoreDbgTestCore.ResultNotSuccessException();\r
+        }\r
+\r
+        public static void WasExit(int ExitCode)\r
+        {\r
+            Func<MIOutOfBandRecord, bool> filter = (record) => {\r
+                if (!IsStoppedEvent(record)) {\r
+                    return false;\r
+                }\r
+\r
+                var output = ((MIAsyncRecord)record).Output;\r
+                var reason = (MIConst)output["reason"];\r
+\r
+                if (reason.CString != "exited") {\r
+                    return false;\r
+                }\r
+\r
+                var exitCode = (MIConst)output["exit-code"];\r
+\r
+                if (exitCode.CString == ExitCode.ToString()) {\r
+                    return true;\r
+                }\r
+\r
+                return false;\r
+            };\r
+\r
+            if (!MIDebugger.IsEventReceived(filter))\r
+                throw new NetcoreDbgTestCore.ResultNotSuccessException();\r
+        }\r
+\r
+        public static void DebuggerExit()\r
+        {\r
+            Assert.Equal(MIResultClass.Exit, Context.MIDebugger.Request("-gdb-exit").Class);\r
+        }\r
+\r
+        public static void Continue()\r
+        {\r
+            Assert.Equal(MIResultClass.Running, MIDebugger.Request("-exec-continue").Class);\r
+        }\r
+\r
+        static MIDebugger MIDebugger = new MIDebugger();\r
+    }\r
+}\r
+\r
+namespace MITestExitCode\r
+{\r
+    class Program\r
+    {\r
+        [DllImport("libc")]\r
+        static extern void exit(int status);\r
+\r
+        [DllImport("libc")]\r
+        static extern void _exit(int status);\r
+\r
+        [DllImport("libc")]\r
+        static extern int kill(int pid, int sig);\r
+\r
+        [DllImport("kernel32.dll")]\r
+        static extern void ExitProcess(uint uExitCode);\r
+\r
+        [DllImport("kernel32.dll", SetLastError=true)]\r
+        [return: MarshalAs(UnmanagedType.Bool)]\r
+        static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);\r
+\r
+        static int Main(string[] args)\r
+        {\r
+            // first checkpoint (initialization) must provide "init" as id\r
+            Label.Checkpoint("init", "finish", () => {\r
+                Context.Prepare();\r
+                Context.WasEntryPointHit();\r
+                Context.Continue();\r
+            });\r
+\r
+            // TODO as soon, as netcoredbg will be able restart debuggee process, implement all tests\r
+\r
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))\r
+            {\r
+                //Console.WriteLine("Test TerminateProcess()");\r
+                //ExitProcess(3);\r
+\r
+                Console.WriteLine("Test TerminateProcess()");\r
+                TerminateProcess(Process.GetCurrentProcess().Handle, 3);\r
+            }\r
+            else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))\r
+            {\r
+                //Console.WriteLine("Test exit()");\r
+                //exit(3);\r
+\r
+                Console.WriteLine("Test _exit()");\r
+                _exit(3);\r
+\r
+                //int PID = Process.GetCurrentProcess().Id;\r
+                //Console.WriteLine("Test SIGABRT, process Id = " + PID);\r
+                //kill(PID, 6); // SIGABRT\r
+            }\r
+\r
+            //Console.WriteLine("Test return 3");\r
+            //return 3;\r
+\r
+            //Console.WriteLine("Test throw new System.Exception()");\r
+            //throw new System.Exception();\r
+\r
+            Label.Checkpoint("finish", "", () => {\r
+                Context.WasExit(3);\r
+                Context.DebuggerExit();\r
+            });\r
+\r
+            return 0;\r
+        }\r
+    }\r
+}\r
index 48a853a2aa332583079124dbca58ff85c07db6c9..fb95a6ab22fbc71b9dbbd664523d43de0e637403 100644 (file)
@@ -82,13 +82,8 @@ namespace NetcoreDbgTest.Script
                     return false;
                 }
 
-                var exitCode = (MIConst)output["exit-code"];
-
-                if (exitCode.CString == "0") {
-                    return true;
-                }
-
-                return false;
+                // we don't check exit code here, since Windows and Linux provide different exit code in case of "-gdb-exit" usage
+                return true;
             };
 
             if (!MIDebugger.IsEventReceived(filter))
index baa6b1dd365d4f6f239bf87c83e9bdbeef8151d4..2242334ea384a7250de16b0a1a8729624afa8310 100644 (file)
@@ -107,7 +107,8 @@ namespace NetcoreDbgTest.Script
                 if (VSCodeDebugger.isResponseContainProperty(resJSON, "event", "terminated")) {
                     wasTerminated = true;
                 }
-                if (wasExited && exitCode == 0 && wasTerminated)
+                // we don't check exit code here, since Windows and Linux provide different exit code in case of "disconnectRequest" usage
+                if (wasExited && wasTerminated)
                     return true;
 
                 return false;
diff --git a/test-suite/VSCodeTestExitCode/Program.cs b/test-suite/VSCodeTestExitCode/Program.cs
new file mode 100644 (file)
index 0000000..4f9d758
--- /dev/null
@@ -0,0 +1,178 @@
+using System;\r
+using System.IO;\r
+using System.Collections.Generic;\r
+using System.Runtime.InteropServices;\r
+using System.Diagnostics;\r
+\r
+using NetcoreDbgTest;\r
+using NetcoreDbgTest.VSCode;\r
+using NetcoreDbgTest.Script;\r
+\r
+using Xunit;\r
+using Newtonsoft.Json;\r
+\r
+namespace NetcoreDbgTest.Script\r
+{\r
+    // Context includes methods and constants which\r
+    // will be move to debugger API\r
+    class Context\r
+    {\r
+        public static void PrepareStart()\r
+        {\r
+            InitializeRequest initializeRequest = new InitializeRequest();\r
+            initializeRequest.arguments.clientID = "vscode";\r
+            initializeRequest.arguments.clientName = "Visual Studio Code";\r
+            initializeRequest.arguments.adapterID = "coreclr";\r
+            initializeRequest.arguments.pathFormat = "path";\r
+            initializeRequest.arguments.linesStartAt1 = true;\r
+            initializeRequest.arguments.columnsStartAt1 = true;\r
+            initializeRequest.arguments.supportsVariableType = true;\r
+            initializeRequest.arguments.supportsVariablePaging = true;\r
+            initializeRequest.arguments.supportsRunInTerminalRequest = true;\r
+            initializeRequest.arguments.locale = "en-us";\r
+            Assert.True(VSCodeDebugger.Request(initializeRequest).Success);\r
+\r
+            LaunchRequest launchRequest = new LaunchRequest();\r
+            launchRequest.arguments.name = ".NET Core Launch (console) with pipeline";\r
+            launchRequest.arguments.type = "coreclr";\r
+            launchRequest.arguments.preLaunchTask = "build";\r
+            launchRequest.arguments.program = DebuggeeInfo.TargetAssemblyPath;\r
+            launchRequest.arguments.cwd = "";\r
+            launchRequest.arguments.console = "internalConsole";\r
+            launchRequest.arguments.stopAtEntry = true;\r
+            launchRequest.arguments.internalConsoleOptions = "openOnSessionStart";\r
+            launchRequest.arguments.__sessionId = Guid.NewGuid().ToString();\r
+            Assert.True(VSCodeDebugger.Request(launchRequest).Success);\r
+        }\r
+\r
+        public static void PrepareEnd()\r
+        {\r
+            ConfigurationDoneRequest configurationDoneRequest = new ConfigurationDoneRequest();\r
+            Assert.True(VSCodeDebugger.Request(configurationDoneRequest).Success);\r
+        }\r
+\r
+        public static void WasEntryPointHit()\r
+        {\r
+            Func<string, bool> filter = (resJSON) => {\r
+                if (VSCodeDebugger.isResponseContainProperty(resJSON, "event", "stopped")\r
+                    && VSCodeDebugger.isResponseContainProperty(resJSON, "reason", "entry")) {\r
+                    threadId = Convert.ToInt32(VSCodeDebugger.GetResponsePropertyValue(resJSON, "threadId"));\r
+                    return true;\r
+                }\r
+                return false;\r
+            };\r
+\r
+            if (!VSCodeDebugger.IsEventReceived(filter))\r
+                throw new NetcoreDbgTestCore.ResultNotSuccessException();\r
+        }\r
+\r
+        public static void WasExit(int ExitCode)\r
+        {\r
+            bool wasExited = false;\r
+            int ?exitCode = null;\r
+            bool wasTerminated = false;\r
+\r
+            Func<string, bool> filter = (resJSON) => {\r
+                if (VSCodeDebugger.isResponseContainProperty(resJSON, "event", "exited")) {\r
+                    wasExited = true;\r
+                    ExitedEvent exitedEvent = JsonConvert.DeserializeObject<ExitedEvent>(resJSON);\r
+                    exitCode = exitedEvent.body.exitCode;\r
+                }\r
+                if (VSCodeDebugger.isResponseContainProperty(resJSON, "event", "terminated")) {\r
+                    wasTerminated = true;\r
+                }\r
+                if (wasExited && exitCode == ExitCode && wasTerminated)\r
+                    return true;\r
+\r
+                return false;\r
+            };\r
+\r
+            if (!VSCodeDebugger.IsEventReceived(filter))\r
+                throw new NetcoreDbgTestCore.ResultNotSuccessException();\r
+        }\r
+\r
+        public static void DebuggerExit()\r
+        {\r
+            DisconnectRequest disconnectRequest = new DisconnectRequest();\r
+            disconnectRequest.arguments = new DisconnectArguments();\r
+            disconnectRequest.arguments.restart = false;\r
+            Assert.True(VSCodeDebugger.Request(disconnectRequest).Success);\r
+        }\r
+\r
+        public static void Continue()\r
+        {\r
+            ContinueRequest continueRequest = new ContinueRequest();\r
+            continueRequest.arguments.threadId = threadId;\r
+            Assert.True(VSCodeDebugger.Request(continueRequest).Success);\r
+        }\r
+\r
+        static VSCodeDebugger VSCodeDebugger = new VSCodeDebugger();\r
+        static int threadId = -1;\r
+    }\r
+}\r
+\r
+namespace VSCodeTestExitCode\r
+{\r
+    class Program\r
+    {\r
+        [DllImport("libc")]\r
+        static extern void exit(int status);\r
+\r
+        [DllImport("libc")]\r
+        static extern void _exit(int status);\r
+\r
+        [DllImport("libc")]\r
+        static extern int kill(int pid, int sig);\r
+\r
+        [DllImport("kernel32.dll")]\r
+        static extern void ExitProcess(uint uExitCode);\r
+\r
+        [DllImport("kernel32.dll", SetLastError=true)]\r
+        [return: MarshalAs(UnmanagedType.Bool)]\r
+        static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);\r
+\r
+        static void Main(string[] args)\r
+        {\r
+            Label.Checkpoint("init", "finish", () => {\r
+                Context.PrepareStart();\r
+                Context.PrepareEnd();\r
+                Context.WasEntryPointHit();\r
+                Context.Continue();\r
+            });\r
+\r
+            // TODO as soon, as netcoredbg will be able restart debuggee process, implement all tests\r
+\r
+            if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))\r
+            {\r
+                //Console.WriteLine("Test TerminateProcess()");\r
+                //ExitProcess(3);\r
+\r
+                Console.WriteLine("Test TerminateProcess()");\r
+                TerminateProcess(Process.GetCurrentProcess().Handle, 3);\r
+            }\r
+            else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))\r
+            {\r
+                //Console.WriteLine("Test exit()");\r
+                //exit(3);\r
+\r
+                Console.WriteLine("Test _exit()");\r
+                _exit(3);\r
+\r
+                //int PID = Process.GetCurrentProcess().Id;\r
+                //Console.WriteLine("Test SIGABRT, process Id = " + PID);\r
+                //kill(PID, 6); // SIGABRT\r
+            }\r
+\r
+            //Console.WriteLine("Test return 3");\r
+            //return 3;\r
+\r
+            //Console.WriteLine("Test throw new System.Exception()");\r
+            //throw new System.Exception();\r
+\r
+            Label.Checkpoint("finish", "", () => {\r
+                Context.WasExit(3);\r
+                Context.DebuggerExit();\r
+            });\r
+        }\r
+    }\r
+}\r
diff --git a/test-suite/VSCodeTestExitCode/VSCodeTestExitCode.csproj b/test-suite/VSCodeTestExitCode/VSCodeTestExitCode.csproj
new file mode 100644 (file)
index 0000000..2512674
--- /dev/null
@@ -0,0 +1,12 @@
+<Project Sdk="Microsoft.NET.Sdk">\r
+\r
+  <ItemGroup>\r
+    <ProjectReference Include="..\NetcoreDbgTest\NetcoreDbgTest.csproj" />\r
+  </ItemGroup>\r
+\r
+  <PropertyGroup>\r
+    <OutputType>Exe</OutputType>\r
+    <TargetFramework>netcoreapp3.1</TargetFramework>\r
+  </PropertyGroup>\r
+\r
+</Project>\r
index 145b8d805c2c827a79ba3104d74f2e613e2d649f..9246d182cde5140678c1e6c549c9c7bc702e2dc7 100644 (file)
@@ -34,6 +34,7 @@ namespace XUnitTests
         [InlineData("MITestHandshake", "Program.cs")]
         [InlineData("MITestTarget", "Program.cs")]
         [InlineData("MITestExceptionBreakpoint", "Program.cs")]
+        [InlineData("MITestExitCode", "Program.cs")]
         [InlineData("VSCodeExampleTest", "Program.cs")]
         [InlineData("VSCodeTestBreakpoint", "Program.cs")]
         [InlineData("VSCodeTestFuncBreak", "Program.cs")]
@@ -45,6 +46,7 @@ namespace XUnitTests
         [InlineData("VSCodeTestEvaluate", "Program.cs")]
         [InlineData("VSCodeTestStepping", "Program.cs")]
         [InlineData("VSCodeTestEnv", "Program.cs")]
+        [InlineData("VSCodeTestExitCode", "Program.cs")]
         public void Run(string testCaseName, string testCourceList)
         {
             string testSuiteRoot = Path.GetFullPath(
index 6cc757dbd60804d56a492216d63e67ba61953716..5aa1b3c6d9ea161cef8c05a4595da7bdcb070c7e 100644 (file)
@@ -15,6 +15,7 @@ $ALL_TEST_NAMES = @(
     "MITestHandshake"
     "MITestTarget"
     "MITestExceptionBreakpoint"
+    "MITestExitCode"
     "VSCodeExampleTest"
     "VSCodeTestBreakpoint"
     "VSCodeTestFuncBreak"
@@ -26,6 +27,7 @@ $ALL_TEST_NAMES = @(
     "VSCodeTestEvaluate"
     "VSCodeTestStepping"
     "VSCodeTestEnv"
+    "VSCodeTestExitCode"
 )
 
 $TEST_NAMES = $args
index 24fe1a768b4e01236caa616b0f3df9af5ecd29c9..04cdb709ba0bf142be3cbe451c9b4c7b1dc0658d 100755 (executable)
@@ -17,6 +17,7 @@ ALL_TEST_NAMES=(
     "MITestHandshake"
     "MITestTarget"
     "MITestExceptionBreakpoint"
+    "MITestExitCode"
     "VSCodeExampleTest"
     "VSCodeTestBreakpoint"
     "VSCodeTestFuncBreak"
@@ -28,6 +29,7 @@ ALL_TEST_NAMES=(
     "VSCodeTestEvaluate"
     "VSCodeTestStepping"
     "VSCodeTestEnv"
+    "VSCodeTestExitCode"
 )
 
 TEST_NAMES="$@"
index 1e2a61a4f574793cb1f1fb861e38eee5c1f90d93..57b42d5d5a4c76656feeaacc315dde6817fcd2d1 100644 (file)
@@ -18,6 +18,7 @@ $ALL_TEST_NAMES = @(
     "MITestExecInt"
     "MITestHandshake"
     "MITestExceptionBreakpoint"
+    "MITestExitCode"
     "VSCodeExampleTest"
     "VSCodeTestBreakpoint"
     "VSCodeTestFuncBreak"
@@ -28,6 +29,7 @@ $ALL_TEST_NAMES = @(
     "VSCodeTestEvaluate"
     "VSCodeTestStepping"
     "VSCodeTestEnv"
+    "VSCodeTestExitCode"
 )
 
 $TEST_NAMES = $args
index d8215b779236b071d7bdc81e008b41b61890c8f1..7f52d374e7296fb67220d231ad5d1514b3d8cc04 100755 (executable)
@@ -32,6 +32,7 @@ ALL_TEST_NAMES=(
     "MITestExecInt"
     "MITestHandshake"
     "MITestExceptionBreakpoint"
+    "MITestExitCode"
     "VSCodeExampleTest"
     "VSCodeTestBreakpoint"
     "VSCodeTestFuncBreak"
@@ -42,6 +43,7 @@ ALL_TEST_NAMES=(
     "VSCodeTestEvaluate"
     "VSCodeTestStepping"
     "VSCodeTestEnv"
+    "VSCodeTestExitCode"
 )
 
 SDB=${SDB:-sdb}
index fd79e0ce4db11fd13285a0730ccc0e55082593a9..fb4aba66559a74084a1e6614e39bffbd612de960 100644 (file)
@@ -1,4 +1,4 @@
-
+
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
 VisualStudioVersion = 15.0.26124.0
@@ -61,6 +61,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MITestExceptionBreakpoint",
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSCodeTestEnv", "VSCodeTestEnv\VSCodeTestEnv.csproj", "{7555F581-C632-4490-A0E4-E4F1539E9209}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MITestExitCode", "MITestExitCode\MITestExitCode.csproj", "{9308CF34-12C5-4D5B-A318-00AD7AC1907A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSCodeTestExitCode", "VSCodeTestExitCode\VSCodeTestExitCode.csproj", "{045EE2A3-F595-4D40-8E1A-734CA9CEB10C}"
+EndProject
 Global
        GlobalSection(SolutionConfigurationPlatforms) = preSolution
                Debug|Any CPU = Debug|Any CPU
@@ -422,5 +426,29 @@ Global
                {7555F581-C632-4490-A0E4-E4F1539E9209}.Release|x64.Build.0 = Release|Any CPU
                {7555F581-C632-4490-A0E4-E4F1539E9209}.Release|x86.ActiveCfg = Release|Any CPU
                {7555F581-C632-4490-A0E4-E4F1539E9209}.Release|x86.Build.0 = Release|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|x64.Build.0 = Debug|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|x86.Build.0 = Debug|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|Any CPU.Build.0 = Release|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|x64.ActiveCfg = Release|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|x64.Build.0 = Release|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|x86.ActiveCfg = Release|Any CPU
+               {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|x86.Build.0 = Release|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|x64.ActiveCfg = Debug|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|x64.Build.0 = Debug|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|x86.ActiveCfg = Debug|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|x86.Build.0 = Debug|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|Any CPU.Build.0 = Release|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|x64.ActiveCfg = Release|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|x64.Build.0 = Release|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|x86.ActiveCfg = Release|Any CPU
+               {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|x86.Build.0 = Release|Any CPU
        EndGlobalSection
 EndGlobal