diff --git a/AssemblyData/AssemblyData.csproj b/AssemblyData/AssemblyData.csproj
index 919753d1..10fd66a4 100644
--- a/AssemblyData/AssemblyData.csproj
+++ b/AssemblyData/AssemblyData.csproj
@@ -37,6 +37,7 @@
+
@@ -46,6 +47,16 @@
+
+
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}
+ blocks
+
+
+ {D68133BD-1E63-496E-9EDE-4FBDBF77B486}
+ Mono.Cecil
+
+
+
\ No newline at end of file
diff --git a/de4dot.code/CommandLineParser.cs b/de4dot.code/CommandLineParser.cs
index 2b87d905..bb7b4ec1 100644
--- a/de4dot.code/CommandLineParser.cs
+++ b/de4dot.code/CommandLineParser.cs
@@ -78,6 +78,7 @@ namespace de4dot {
stringDecrypterTypes.add(DecrypterType.None, "none", "Don't decrypt strings");
stringDecrypterTypes.add(DecrypterType.Static, "static", "Use static string decrypter if available");
stringDecrypterTypes.add(DecrypterType.Delegate, "delegate", "Use a delegate to call the real string decrypter");
+ stringDecrypterTypes.add(DecrypterType.Emulate, "emulate", "Call real string decrypter and emulate certain instructions");
}
public CommandLineParser(IList deobfuscatorInfos, FilesDeobfuscator.Options filesOptions) {
diff --git a/de4dot.code/IObfuscatedFile.cs b/de4dot.code/IObfuscatedFile.cs
index dcb0272e..5a854c6a 100644
--- a/de4dot.code/IObfuscatedFile.cs
+++ b/de4dot.code/IObfuscatedFile.cs
@@ -26,6 +26,7 @@ namespace de4dot {
None,
Static,
Delegate,
+ Emulate,
}
interface IObfuscatedFile {
diff --git a/de4dot.code/ObfuscatedFile.cs b/de4dot.code/ObfuscatedFile.cs
index 5e4831c1..30adf84b 100644
--- a/de4dot.code/ObfuscatedFile.cs
+++ b/de4dot.code/ObfuscatedFile.cs
@@ -239,6 +239,7 @@ namespace de4dot {
break;
case DecrypterType.Delegate:
+ case DecrypterType.Emulate:
checkSupportedStringDecrypter(StringFeatures.AllowDynamicDecryption);
assemblyClient = assemblyClientFactory.create();
assemblyClient.connect();
@@ -272,6 +273,8 @@ namespace de4dot {
if (options.StringDecrypterType == DecrypterType.Delegate)
assemblyClient.Service.setStringDecrypterType(AssemblyData.StringDecrypterType.Delegate);
+ else if (options.StringDecrypterType == DecrypterType.Emulate)
+ assemblyClient.Service.setStringDecrypterType(AssemblyData.StringDecrypterType.Emulate);
else
throw new ApplicationException(string.Format("Invalid string decrypter type '{0}'", options.StringDecrypterType));
@@ -415,8 +418,11 @@ namespace de4dot {
var blocks = new Blocks(method);
deob.deobfuscateMethodBegin(blocks);
- if (options.ControlFlowDeobfuscation)
- blocks.deobfuscate();
+ if (options.ControlFlowDeobfuscation) {
+ int numDeadBlocks = blocks.deobfuscate();
+ if (numDeadBlocks > 0)
+ Log.v("Removed {0} dead block(s)", numDeadBlocks);
+ }
deobfuscateStrings(blocks);
deob.deobfuscateMethodEnd(blocks);
if (options.ControlFlowDeobfuscation)
@@ -444,6 +450,7 @@ namespace de4dot {
break;
case DecrypterType.Delegate:
+ case DecrypterType.Emulate:
dynamicStringDecrypter.decrypt(blocks);
break;
diff --git a/de4dot.code/Utils.cs b/de4dot.code/Utils.cs
index fcb90647..6645b65f 100644
--- a/de4dot.code/Utils.cs
+++ b/de4dot.code/Utils.cs
@@ -173,19 +173,5 @@ namespace de4dot {
public static string getPathOfOurFile(string filename) {
return Path.Combine(getOurBaseDir(), filename);
}
-
- public static IDictionary createObjectToIndexDictionary(IList objs) {
- var dict = new Dictionary();
- for (int i = 0; i < objs.Count; i++)
- dict[objs[i]] = i;
- return dict;
- }
-
- public static List convert(IEnumerable list) where TIn : TOut {
- var olist = new List();
- foreach (var l in list)
- olist.Add(l);
- return olist;
- }
}
}
diff --git a/de4dot.code/de4dot.code.csproj b/de4dot.code/de4dot.code.csproj
index 53b5c787..f170e897 100644
--- a/de4dot.code/de4dot.code.csproj
+++ b/de4dot.code/de4dot.code.csproj
@@ -54,27 +54,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -102,11 +87,9 @@
-
-
@@ -134,6 +117,10 @@
{FBD84077-9D35-41FE-89DF-8D79EFE0B595}
AssemblyData
+
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}
+ blocks
+
{D68133BD-1E63-496E-9EDE-4FBDBF77B486}
Mono.Cecil
diff --git a/de4dot.code/deobfuscators/CliSecure/Deobfuscator.cs b/de4dot.code/deobfuscators/CliSecure/Deobfuscator.cs
index c129a193..7dfae7d5 100644
--- a/de4dot.code/deobfuscators/CliSecure/Deobfuscator.cs
+++ b/de4dot.code/deobfuscators/CliSecure/Deobfuscator.cs
@@ -264,7 +264,7 @@ namespace de4dot.deobfuscators.CliSecure {
if (resource == null)
return;
- DotNetUtils.decryptAndAddResources(module, resource.Name, () => decryptResource(resource));
+ DeobUtils.decryptAndAddResources(module, resource.Name, () => decryptResource(resource));
addResourceToBeRemoved(resource, "Encrypted resource");
if (rsrcDecryptMethod != null)
diff --git a/de4dot.code/deobfuscators/DeobUtils.cs b/de4dot.code/deobfuscators/DeobUtils.cs
new file mode 100644
index 00000000..f326ab94
--- /dev/null
+++ b/de4dot.code/deobfuscators/DeobUtils.cs
@@ -0,0 +1,22 @@
+using System;
+using System.IO;
+using Mono.Cecil;
+
+namespace de4dot.deobfuscators {
+ static class DeobUtils {
+ public static void decryptAndAddResources(ModuleDefinition module, string encryptedName, Func decryptResource) {
+ Log.v("Decrypting resources, name: {0}", Utils.toCsharpString(encryptedName));
+ var decryptedResourceData = decryptResource();
+ if (decryptedResourceData == null)
+ throw new ApplicationException("decryptedResourceData is null");
+ var resourceModule = ModuleDefinition.ReadModule(new MemoryStream(decryptedResourceData));
+
+ Log.indent();
+ foreach (var rsrc in resourceModule.Resources) {
+ Log.v("Adding decrypted resource {0}", Utils.toCsharpString(rsrc.Name));
+ module.Resources.Add(rsrc);
+ }
+ Log.deIndent();
+ }
+ }
+}
diff --git a/de4dot.code/deobfuscators/Eazfuscator/Deobfuscator.cs b/de4dot.code/deobfuscators/Eazfuscator/Deobfuscator.cs
index 4c5b1589..cd83320c 100644
--- a/de4dot.code/deobfuscators/Eazfuscator/Deobfuscator.cs
+++ b/de4dot.code/deobfuscators/Eazfuscator/Deobfuscator.cs
@@ -20,6 +20,7 @@
using System.Collections.Generic;
using Mono.Cecil;
using Mono.Cecil.Cil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.Eazfuscator {
class DeobfuscatorInfo : DeobfuscatorInfoBase {
diff --git a/de4dot.code/deobfuscators/SmartAssembly/AssemblyResolverInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/AssemblyResolverInfo.cs
index 2833daf4..bf9b8934 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/AssemblyResolverInfo.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/AssemblyResolverInfo.cs
@@ -22,6 +22,7 @@ using System.Collections.Generic;
using System.Text;
using Mono.Cecil;
using Mono.Cecil.Cil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
class AssemblyResolverInfo : ResolverInfoBase {
diff --git a/de4dot.code/deobfuscators/SmartAssembly/AutomatedErrorReportingFinder.cs b/de4dot.code/deobfuscators/SmartAssembly/AutomatedErrorReportingFinder.cs
index 3150c29e..8b000f24 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/AutomatedErrorReportingFinder.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/AutomatedErrorReportingFinder.cs
@@ -20,6 +20,7 @@
using System.Collections.Generic;
using Mono.Cecil;
using Mono.Cecil.Cil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
class AutomatedErrorReportingFinder {
diff --git a/de4dot.code/deobfuscators/SmartAssembly/MemoryManagerInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/MemoryManagerInfo.cs
index f36df1b2..8a523011 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/MemoryManagerInfo.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/MemoryManagerInfo.cs
@@ -18,6 +18,7 @@
*/
using Mono.Cecil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
class MemoryManagerInfo {
diff --git a/de4dot.code/deobfuscators/SmartAssembly/ProxyDelegateFinder.cs b/de4dot.code/deobfuscators/SmartAssembly/ProxyDelegateFinder.cs
index c7b8be5b..8ecdd6a2 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/ProxyDelegateFinder.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/ProxyDelegateFinder.cs
@@ -19,6 +19,7 @@
using System.Collections.Generic;
using Mono.Cecil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
class ProxyDelegateFinder : ProxyDelegateFinderBase {
diff --git a/de4dot.code/deobfuscators/SmartAssembly/ResolverInfoBase.cs b/de4dot.code/deobfuscators/SmartAssembly/ResolverInfoBase.cs
index 0f091602..cdd4a8bd 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/ResolverInfoBase.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/ResolverInfoBase.cs
@@ -20,6 +20,7 @@
using System.Collections.Generic;
using Mono.Cecil;
using Mono.Cecil.Cil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
abstract class ResolverInfoBase {
diff --git a/de4dot.code/deobfuscators/SmartAssembly/ResourceDecrypterInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/ResourceDecrypterInfo.cs
index c76f7090..c58b86b7 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/ResourceDecrypterInfo.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/ResourceDecrypterInfo.cs
@@ -20,6 +20,7 @@
using System.Collections.Generic;
using Mono.Cecil;
using Mono.Cecil.Cil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
class ResourceDecrypterInfo {
diff --git a/de4dot.code/deobfuscators/SmartAssembly/ResourceResolver.cs b/de4dot.code/deobfuscators/SmartAssembly/ResourceResolver.cs
index 4c23e326..28aac825 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/ResourceResolver.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/ResourceResolver.cs
@@ -20,6 +20,7 @@
using System;
using System.IO;
using Mono.Cecil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
class ResourceResolver {
@@ -46,7 +47,7 @@ namespace de4dot.deobfuscators.SmartAssembly {
if (resource == null)
return null;
- DotNetUtils.decryptAndAddResources(module, resource.Name, () => assemblyResolver.removeDecryptedResource(resource));
+ DeobUtils.decryptAndAddResources(module, resource.Name, () => assemblyResolver.removeDecryptedResource(resource));
mergedIt = true;
return resource;
}
diff --git a/de4dot.code/deobfuscators/SmartAssembly/ResourceResolverInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/ResourceResolverInfo.cs
index 7c50b8a4..98d94338 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/ResourceResolverInfo.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/ResourceResolverInfo.cs
@@ -19,6 +19,7 @@
using Mono.Cecil;
using Mono.Cecil.Cil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
class ResourceResolverInfo : ResolverInfoBase {
diff --git a/de4dot.code/deobfuscators/SmartAssembly/SimpleZipInfo.cs b/de4dot.code/deobfuscators/SmartAssembly/SimpleZipInfo.cs
index b02b9bf0..4a90afa4 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/SimpleZipInfo.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/SimpleZipInfo.cs
@@ -18,6 +18,7 @@
*/
using Mono.Cecil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
class SimpleZipInfo {
diff --git a/de4dot.code/deobfuscators/SmartAssembly/StringEncoderClassFinder.cs b/de4dot.code/deobfuscators/SmartAssembly/StringEncoderClassFinder.cs
index 6c36763f..f3a10234 100644
--- a/de4dot.code/deobfuscators/SmartAssembly/StringEncoderClassFinder.cs
+++ b/de4dot.code/deobfuscators/SmartAssembly/StringEncoderClassFinder.cs
@@ -20,6 +20,7 @@
using System.Collections.Generic;
using Mono.Cecil;
using Mono.Cecil.Cil;
+using de4dot.blocks;
namespace de4dot.deobfuscators.SmartAssembly {
class StringsEncoderInfo {
diff --git a/de4dot.code/renamer/DefinitionsRenamer.cs b/de4dot.code/renamer/DefinitionsRenamer.cs
index 0a02d124..ed534101 100644
--- a/de4dot.code/renamer/DefinitionsRenamer.cs
+++ b/de4dot.code/renamer/DefinitionsRenamer.cs
@@ -20,6 +20,7 @@
using System;
using System.Collections.Generic;
using Mono.Cecil;
+using de4dot.blocks;
namespace de4dot.renamer {
// Renames all typedefs, methoddefs, eventdefs, fielddefs, and propdefs
diff --git a/de4dot.code/renamer/MemberRefFinder.cs b/de4dot.code/renamer/MemberRefFinder.cs
index ca6d94f4..ddb65a9d 100644
--- a/de4dot.code/renamer/MemberRefFinder.cs
+++ b/de4dot.code/renamer/MemberRefFinder.cs
@@ -21,6 +21,7 @@ using System;
using System.Collections.Generic;
using Mono.Cecil;
using Mono.Cecil.Cil;
+using de4dot.blocks;
namespace de4dot {
// If it's a non-generic memberref, you could use GetMemberReference() to get a cached
diff --git a/de4dot.code/renamer/MemberReferenceExpander.cs b/de4dot.code/renamer/MemberReferenceExpander.cs
index e8f6dcd3..4b7ddd10 100644
--- a/de4dot.code/renamer/MemberReferenceExpander.cs
+++ b/de4dot.code/renamer/MemberReferenceExpander.cs
@@ -19,6 +19,7 @@
using System;
using Mono.Cecil;
+using de4dot.blocks;
namespace de4dot.renamer {
abstract class Expander {
diff --git a/de4dot.code/renamer/MemberRefs.cs b/de4dot.code/renamer/MemberRefs.cs
index a6314543..f2f16bff 100644
--- a/de4dot.code/renamer/MemberRefs.cs
+++ b/de4dot.code/renamer/MemberRefs.cs
@@ -21,6 +21,7 @@ using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Mono.Cecil;
+using de4dot.blocks;
using de4dot.deobfuscators;
namespace de4dot.renamer {
diff --git a/de4dot.code/renamer/MemberRenameState.cs b/de4dot.code/renamer/MemberRenameState.cs
index 091294d9..820b3108 100644
--- a/de4dot.code/renamer/MemberRenameState.cs
+++ b/de4dot.code/renamer/MemberRenameState.cs
@@ -18,6 +18,7 @@
*/
using System.Collections.Generic;
+using de4dot.blocks;
namespace de4dot.renamer {
class MemberRenameState {
diff --git a/de4dot.code/renamer/NameCreators.cs b/de4dot.code/renamer/NameCreators.cs
index 9face138..438c6498 100644
--- a/de4dot.code/renamer/NameCreators.cs
+++ b/de4dot.code/renamer/NameCreators.cs
@@ -20,6 +20,7 @@
using System;
using System.Collections.Generic;
using Mono.Cecil;
+using de4dot.blocks;
namespace de4dot.renamer {
interface INameCreator {
diff --git a/de4dot.sln b/de4dot.sln
index 518a99fb..706278e7 100644
--- a/de4dot.sln
+++ b/de4dot.sln
@@ -30,6 +30,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AssemblyServer-x64", "Assem
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dumpMethodsN", "dumpMethodsN\dumpMethodsN.vcxproj", "{3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "blocks", "blocks\blocks.csproj", "{045B96F2-AF80-4C4C-8D27-E38635AC705E}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1018,6 +1020,78 @@ Global
{3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Release|Win32.ActiveCfg = Release|Win32
{3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Release|Win32.Build.0 = Release|Win32
{3D97F8AF-494F-4AB2-82ED-E1BE532E4CB9}.winphone_Release|x86.ActiveCfg = Release|Win32
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|Win32.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Any CPU.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|Win32.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Debug|x86.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Any CPU.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Any CPU.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|Win32.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_2_0_Release|x86.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Any CPU.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|Win32.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Debug|x86.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Any CPU.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Any CPU.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|Win32.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_3_5_Release|x86.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Any CPU.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|Win32.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Debug|x86.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Any CPU.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Any CPU.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|Win32.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.net_4_0_Release|x86.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|Win32.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.Release|x86.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Any CPU.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|Win32.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Debug|x86.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Any CPU.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Any CPU.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|Win32.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.silverlight_Release|x86.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Any CPU.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Mixed Platforms.Build.0 = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|Win32.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Debug|x86.ActiveCfg = Debug|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Any CPU.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Any CPU.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Mixed Platforms.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Mixed Platforms.Build.0 = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|Win32.ActiveCfg = Release|Any CPU
+ {045B96F2-AF80-4C4C-8D27-E38635AC705E}.winphone_Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE