diff --git a/README.md b/README.md
index ceeb3a06f067..4c960294fbf8 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,8 @@ Today, the repository contains the following components:
* **System.Diagnostics.Process**. Provides access to local and remote processes, and enables the starting and
stopping of local system processes.
+* **System.Globalization.Extensions**. Provides classes for performing unicode string normalization, culture-specific string comparisons and support the use of non-ASCII characters for Internet domain names.
+
* **System.IO.FileSystem**. Provides access to the file system, including support for enumerating and manipulating
file system objects and for reading and writing files via streams.
diff --git a/dir.props b/dir.props
index e58acde1d27e..368ab9fa3723 100644
--- a/dir.props
+++ b/dir.props
@@ -10,7 +10,7 @@
$(ProjectDir)src\
$(ProjectDir)bin\
$(BinDir)tests\
- $(SourceDir)packages\
+ $(ProjectDir)packages\
$(PackagesDir)Microsoft.DotNet.BuildTools.$(BuildToolsVersion)\lib\
diff --git a/src/Common/src/Interop/Interop.Globalization.Extensions.manual.cs b/src/Common/src/Interop/Interop.Globalization.Extensions.manual.cs
new file mode 100644
index 000000000000..33a553d4a78e
--- /dev/null
+++ b/src/Common/src/Interop/Interop.Globalization.Extensions.manual.cs
@@ -0,0 +1,65 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Runtime.InteropServices;
+
+internal partial class Interop
+{
+ // These are error codes we get back from the Normalization DLL
+ internal const int ERROR_SUCCESS = 0;
+ internal const int ERROR_NOT_ENOUGH_MEMORY = 8;
+ internal const int ERROR_INVALID_PARAMETER = 87;
+ internal const int ERROR_INSUFFICIENT_BUFFER = 122;
+ internal const int ERROR_NO_UNICODE_TRANSLATION = 1113;
+
+ // The VM can override the last error code with this value in debug builds
+ // so this value for us is equivalent to ERROR_SUCCESS
+ internal const int LAST_ERROR_TRASH_VALUE = 42424;
+
+ internal partial class mincore
+ {
+ //
+ // Idn APIs
+ //
+
+ [DllImport("api-ms-win-core-localization-l1-2-0.dll", CharSet = CharSet.Unicode, SetLastError = true)]
+ internal static extern int IdnToAscii(
+ uint dwFlags,
+ string lpUnicodeCharStr,
+ int cchUnicodeChar,
+ [System.Runtime.InteropServices.OutAttribute()]
+
+ char[] lpASCIICharStr,
+ int cchASCIIChar);
+
+ [DllImport("api-ms-win-core-localization-l1-2-0.dll", CharSet = CharSet.Unicode, SetLastError = true)]
+ internal static extern int IdnToUnicode(
+ uint dwFlags,
+ string lpASCIICharStr,
+ int cchASCIIChar,
+ [System.Runtime.InteropServices.OutAttribute()]
+
+ char[] lpUnicodeCharStr,
+ int cchUnicodeChar);
+ //
+ // Normalization APIs
+ //
+
+ [DllImport("api-ms-win-core-normalization-l1-1-0.dll", CharSet = CharSet.Unicode, SetLastError = true)]
+ internal static extern bool IsNormalizedString(int normForm, string source, int length);
+
+ [DllImport("api-ms-win-core-normalization-l1-1-0.dll", CharSet = CharSet.Unicode, SetLastError = true)]
+ internal static extern int NormalizeString(
+ int normForm,
+ string source,
+ int sourceLength,
+ [System.Runtime.InteropServices.OutAttribute()]
+ char[] destenation,
+ int destenationLength);
+ }
+}
+
+
+
+
diff --git a/src/Common/src/System/Globalization/IdnMapping.cs b/src/Common/src/System/Globalization/IdnMapping.cs
new file mode 100644
index 000000000000..11405477b56d
--- /dev/null
+++ b/src/Common/src/System/Globalization/IdnMapping.cs
@@ -0,0 +1,245 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+//
+// This file contains the IDN functions and implementation.
+//
+// This allows encoding of non-ASCII domain names in a "punycode" form,
+// for example:
+//
+// \u5B89\u5BA4\u5948\u7F8E\u6075-with-SUPER-MONKEYS
+//
+// is encoded as:
+//
+// xn---with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n
+//
+// Additional options are provided to allow unassigned IDN characters and
+// to validate according to the Std3ASCII Rules (like DNS names).
+//
+// There are also rules regarding bidirectionality of text and the length
+// of segments.
+//
+// For additional rules see also:
+// RFC 3490 - Internationalizing Domain Names in Applications (IDNA)
+// RFC 3491 - Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN)
+// RFC 3492 - Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA)
+//
+
+using System.Runtime.InteropServices;
+using System.Diagnostics.Contracts;
+
+namespace System.Globalization
+{
+ // IdnMapping class used to map names to Punycode
+#if INTERNAL_GLOBALIZATION_EXTENSIONS
+ internal
+#else
+ public
+#endif
+ sealed class IdnMapping
+ {
+ bool m_bAllowUnassigned;
+ bool m_bUseStd3AsciiRules;
+
+ public IdnMapping()
+ {
+ }
+
+ public bool AllowUnassigned
+ {
+ get
+ {
+ return this.m_bAllowUnassigned;
+ }
+
+ set
+ {
+ this.m_bAllowUnassigned = value;
+ }
+ }
+
+ public bool UseStd3AsciiRules
+ {
+ get
+ {
+ return this.m_bUseStd3AsciiRules;
+ }
+
+ set
+ {
+ this.m_bUseStd3AsciiRules = value;
+ }
+ }
+
+ // Gets ASCII (Punycode) version of the string
+ public String GetAscii(String unicode)
+ {
+ return GetAscii(unicode, 0);
+ }
+
+ public String GetAscii(String unicode, int index)
+ {
+ if (unicode == null) throw new ArgumentNullException("unicode");
+ Contract.EndContractBlock();
+ return GetAscii(unicode, index, unicode.Length - index);
+ }
+
+ public String GetAscii(String unicode, int index, int count)
+ {
+ if (unicode == null) throw new ArgumentNullException("unicode");
+ if (index < 0 || count < 0)
+ throw new ArgumentOutOfRangeException((index < 0) ? "index" : "count", SR.ArgumentOutOfRange_NeedNonNegNum);
+ if (index > unicode.Length)
+ throw new ArgumentOutOfRangeException("byteIndex", SR.ArgumentOutOfRange_Index);
+ if (index > unicode.Length - count)
+ throw new ArgumentOutOfRangeException("unicode", SR.ArgumentOutOfRange_IndexCountBuffer);
+ Contract.EndContractBlock();
+
+ // We're only using part of the string
+ unicode = unicode.Substring(index, count);
+
+ return GetAsciiUsingOS(unicode);
+ }
+
+ [System.Security.SecuritySafeCritical]
+ private String GetAsciiUsingOS(String unicode)
+ {
+ if (unicode.Length == 0)
+ {
+ throw new ArgumentException(SR.Argument_IdnBadLabelSize, "unicode");
+ }
+
+ if (unicode[unicode.Length - 1] == 0)
+ {
+ throw new ArgumentException(SR.Format(SR.Argument_InvalidCharSequence, unicode.Length - 1), "unicode");
+ }
+
+ uint flags = (uint)((AllowUnassigned ? IDN_ALLOW_UNASSIGNED : 0) | (UseStd3AsciiRules ? IDN_USE_STD3_ASCII_RULES : 0));
+ int length = Interop.mincore.IdnToAscii(flags, unicode, unicode.Length, null, 0);
+
+ int lastError;
+
+ if (length == 0)
+ {
+ lastError = Marshal.GetLastWin32Error();
+ if (lastError == ERROR_INVALID_NAME)
+ {
+ throw new ArgumentException(SR.Argument_IdnIllegalName, "unicode");
+ }
+
+ throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "unicode");
+ }
+
+ char[] output = new char[length];
+
+ length = Interop.mincore.IdnToAscii(flags, unicode, unicode.Length, output, length);
+ if (length == 0)
+ {
+ lastError = Marshal.GetLastWin32Error();
+ if (lastError == ERROR_INVALID_NAME)
+ {
+ throw new ArgumentException(SR.Argument_IdnIllegalName, "unicode");
+ }
+
+ throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "unicode");
+ }
+
+ return new String(output, 0, length);
+ }
+
+ // Gets Unicode version of the string. Normalized and limited to IDNA characters.
+ public String GetUnicode(String ascii)
+ {
+ return GetUnicode(ascii, 0);
+ }
+
+ public String GetUnicode(String ascii, int index)
+ {
+ if (ascii == null) throw new ArgumentNullException("ascii");
+ Contract.EndContractBlock();
+ return GetUnicode(ascii, index, ascii.Length - index);
+ }
+
+ public String GetUnicode(String ascii, int index, int count)
+ {
+ if (ascii == null) throw new ArgumentNullException("ascii");
+ if (index < 0 || count < 0)
+ throw new ArgumentOutOfRangeException((index < 0) ? "index" : "count", SR.ArgumentOutOfRange_NeedNonNegNum);
+ if (index > ascii.Length)
+ throw new ArgumentOutOfRangeException("byteIndex", SR.ArgumentOutOfRange_Index);
+ if (index > ascii.Length - count)
+ throw new ArgumentOutOfRangeException("ascii", SR.ArgumentOutOfRange_IndexCountBuffer);
+
+ // This is a case (i.e. explicitly null-terminated input) where behavior in .NET and Win32 intentionally differ.
+ // The .NET APIs should (and did in v4.0 and earlier) throw an ArgumentException on input that includes a terminating null.
+ // The Win32 APIs fail on an embedded null, but not on a terminating null.
+ if (count > 0 && ascii[index + count - 1] == (char)0)
+ throw new ArgumentException("ascii", SR.Argument_IdnBadPunycode);
+ Contract.EndContractBlock();
+
+ // We're only using part of the string
+ ascii = ascii.Substring(index, count);
+
+ return GetUnicodeUsingOS(ascii);
+ }
+
+
+ [System.Security.SecuritySafeCritical]
+ private string GetUnicodeUsingOS(string ascii)
+ {
+ uint flags = (uint)((AllowUnassigned ? IDN_ALLOW_UNASSIGNED : 0) | (UseStd3AsciiRules ? IDN_USE_STD3_ASCII_RULES : 0));
+ int length = Interop.mincore.IdnToUnicode(flags, ascii, ascii.Length, null, 0);
+ int lastError;
+
+ if (length == 0)
+ {
+ lastError = Marshal.GetLastWin32Error();
+ if (lastError == ERROR_INVALID_NAME)
+ {
+ throw new ArgumentException(SR.Argument_IdnIllegalName, "ascii");
+ }
+
+ throw new ArgumentException(SR.Argument_IdnBadPunycode, "ascii");
+ }
+
+ char[] output = new char[length];
+
+ length = Interop.mincore.IdnToUnicode(flags, ascii, ascii.Length, output, length);
+ if (length == 0)
+ {
+ lastError = Marshal.GetLastWin32Error();
+ if (lastError == ERROR_INVALID_NAME)
+ {
+ throw new ArgumentException(SR.Argument_IdnIllegalName, "ascii");
+ }
+
+ throw new ArgumentException(SR.Argument_IdnBadPunycode, "ascii");
+ }
+
+ return new String(output, 0, length);
+ }
+
+ public override bool Equals(Object obj)
+ {
+ IdnMapping that = obj as IdnMapping;
+
+ if (that != null)
+ {
+ return this.m_bAllowUnassigned == that.m_bAllowUnassigned &&
+ this.m_bUseStd3AsciiRules == that.m_bUseStd3AsciiRules;
+ }
+
+ return (false);
+ }
+
+ public override int GetHashCode()
+ {
+ return (this.m_bAllowUnassigned ? 100 : 200) + (this.m_bUseStd3AsciiRules ? 1000 : 2000);
+ }
+
+ private const int IDN_ALLOW_UNASSIGNED = 0x1;
+ private const int IDN_USE_STD3_ASCII_RULES = 0x2;
+ private const int ERROR_INVALID_NAME = 123;
+ }
+}
+
diff --git a/src/Common/src/System/StringNormalizationExtensions.cs b/src/Common/src/System/StringNormalizationExtensions.cs
new file mode 100644
index 000000000000..b8a7fb36bd94
--- /dev/null
+++ b/src/Common/src/System/StringNormalizationExtensions.cs
@@ -0,0 +1,145 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System.Text;
+using System.Diagnostics.Contracts;
+using System.Runtime.InteropServices;
+
+namespace System
+{
+
+#if INTERNAL_GLOBALIZATION_EXTENSIONS
+ internal
+#else
+ public
+#endif
+ static class StringNormalizationExtensions
+ {
+ public static bool IsNormalized(this string value)
+ {
+ return IsNormalized(value, NormalizationForm.FormC);
+ }
+
+ [System.Security.SecurityCritical]
+ public static bool IsNormalized(this string value, NormalizationForm normalizationForm)
+ {
+ Contract.Requires(value != null);
+
+ if (value == null)
+ {
+ throw new ArgumentNullException("value");
+ }
+
+ // The only way to know if IsNormalizedString failed is through checking the Win32 last error
+ Interop.mincore.SetLastError(Interop.ERROR_SUCCESS);
+ bool result = Interop.mincore.IsNormalizedString((int)normalizationForm, value, value.Length);
+
+ int lastError = Marshal.GetLastWin32Error();
+ switch (lastError)
+ {
+ case Interop.ERROR_SUCCESS:
+ case Interop.LAST_ERROR_TRASH_VALUE:
+ break;
+
+ case Interop.ERROR_INVALID_PARAMETER:
+ case Interop.ERROR_NO_UNICODE_TRANSLATION:
+ throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "value");
+
+ case Interop.ERROR_NOT_ENOUGH_MEMORY:
+ throw new OutOfMemoryException(SR.Arg_OutOfMemoryException);
+
+ default:
+ throw new InvalidOperationException(SR.Format(SR.UnknownError_Num, lastError));
+ }
+
+ return result;
+ }
+
+ public static String Normalize(this string value)
+ {
+ // Default to Form C
+ return Normalize(value, NormalizationForm.FormC);
+ }
+
+ [System.Security.SecurityCritical]
+ public static String Normalize(this string value, NormalizationForm normalizationForm)
+ {
+ Contract.Requires(value != null);
+
+ if (value == null)
+ {
+ throw new ArgumentNullException("value");
+ }
+
+ // we depend on Win32 last error when calling NormalizeString
+ Interop.mincore.SetLastError(Interop.ERROR_SUCCESS);
+
+ // Guess our buffer size first
+ int iLength = Interop.mincore.NormalizeString((int)normalizationForm, value, value.Length, null, 0);
+
+ int lastError = Marshal.GetLastWin32Error();
+ // Could have an error (actually it'd be quite hard to have an error here)
+ if ((lastError != Interop.ERROR_SUCCESS && lastError != Interop.LAST_ERROR_TRASH_VALUE) ||
+ iLength < 0)
+ {
+ if (lastError == Interop.ERROR_INVALID_PARAMETER)
+ throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "value");
+
+ // We shouldn't really be able to get here..., guessing length is
+ // a trivial math function...
+ // Can't really be Out of Memory, but just in case:
+ if (lastError == Interop.ERROR_NOT_ENOUGH_MEMORY)
+ throw new OutOfMemoryException(SR.Arg_OutOfMemoryException);
+
+ // Who knows what happened? Not us!
+ throw new InvalidOperationException(SR.Format(SR.UnknownError_Num, lastError));
+ }
+
+ // Don't break for empty strings (only possible for D & KD and not really possible at that)
+ if (iLength == 0) return String.Empty;
+
+ // Someplace to stick our buffer
+ char[] cBuffer = null;
+
+ for (; ;)
+ {
+ // (re)allocation buffer and normalize string
+ cBuffer = new char[iLength];
+
+ // Reset last error
+ Interop.mincore.SetLastError(Interop.ERROR_SUCCESS);
+ iLength = Interop.mincore.NormalizeString((int)normalizationForm, value, value.Length, cBuffer, cBuffer.Length);
+ lastError = Marshal.GetLastWin32Error();
+
+ if (lastError == Interop.ERROR_SUCCESS || lastError == Interop.LAST_ERROR_TRASH_VALUE)
+ break;
+
+ // Could have an error (actually it'd be quite hard to have an error here)
+ switch (lastError)
+ {
+ // Do appropriate stuff for the individual errors:
+ case Interop.ERROR_INSUFFICIENT_BUFFER:
+ iLength = Math.Abs(iLength);
+ Contract.Assert(iLength > cBuffer.Length, "Buffer overflow should have iLength > cBuffer.Length");
+ continue;
+
+ case Interop.ERROR_INVALID_PARAMETER:
+ case Interop.ERROR_NO_UNICODE_TRANSLATION:
+ // Illegal code point or order found. Ie: FFFE or D800 D800, etc.
+ throw new ArgumentException(SR.Argument_InvalidCharSequenceNoIndex, "value");
+
+ case Interop.ERROR_NOT_ENOUGH_MEMORY:
+ throw new OutOfMemoryException(SR.Arg_OutOfMemoryException);
+
+ default:
+ // We shouldn't get here...
+ throw new InvalidOperationException(SR.Format(SR.UnknownError_Num, lastError));
+ }
+ }
+
+ // Copy our buffer into our new string, which will be the appropriate size
+ return new String(cBuffer, 0, iLength);
+ }
+ }
+}
+
diff --git a/src/Common/src/System/Text/NormalizationForm.cs b/src/Common/src/System/Text/NormalizationForm.cs
new file mode 100644
index 000000000000..1651201c00d0
--- /dev/null
+++ b/src/Common/src/System/Text/NormalizationForm.cs
@@ -0,0 +1,20 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+namespace System.Text
+{
+ // This is the enumeration for Normalization Forms
+#if INTERNAL_GLOBALIZATION_EXTENSIONS
+ internal
+#else
+ [System.Runtime.InteropServices.ComVisible(true)]
+ public
+#endif
+ enum NormalizationForm
+ {
+ FormC = 1,
+ FormD = 2,
+ FormKC = 5,
+ FormKD = 6
+ }
+}
diff --git a/src/NuGet.Config b/src/NuGet.Config
index a9acfbcc30af..52845f5d9f17 100644
--- a/src/NuGet.Config
+++ b/src/NuGet.Config
@@ -11,4 +11,7 @@
+
+
+
\ No newline at end of file
diff --git a/src/System.Collections.NonGeneric/src/System/Collections/KeyValuePairs.cs b/src/System.Collections.NonGeneric/src/System/Collections/KeyValuePairs.cs
index 76f2010917c1..dd5aafd11109 100644
--- a/src/System.Collections.NonGeneric/src/System/Collections/KeyValuePairs.cs
+++ b/src/System.Collections.NonGeneric/src/System/Collections/KeyValuePairs.cs
@@ -14,7 +14,7 @@
namespace System.Collections
{
- [DebuggerDisplay("{value}", Name = "[{key}]", Type = "")]
+ [DebuggerDisplay("{_value}", Name = "[{_key}]", Type = "")]
internal class KeyValuePairs
{
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
diff --git a/src/System.ComponentModel.Primitives.sln b/src/System.ComponentModel.Primitives.sln
new file mode 100644
index 000000000000..e15d7ad60f92
--- /dev/null
+++ b/src/System.ComponentModel.Primitives.sln
@@ -0,0 +1,39 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.31101.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{47919FF5-DA40-4D99-AF2D-F560282AA913}"
+ ProjectSection(SolutionItems) = preProject
+ .nuget\packages.config = .nuget\packages.config
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.ComponentModel.Primitives", "System.ComponentModel.Primitives\src\System.ComponentModel.Primitives.csproj", "{F620F382-30D1-451E-B125-2A612F92068B}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.ComponentModel.Primitives.Tests", "System.ComponentModel.Primitives\tests\System.ComponentModel.Primitives.Tests.csproj", "{C9534425-93FB-494F-8DD8-1E4E3E626FDE}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XunitTraitsDiscoverers", "Common\tests\XunitTraitsDiscoverers\XunitTraitsDiscoverers.csproj", "{BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F620F382-30D1-451E-B125-2A612F92068B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F620F382-30D1-451E-B125-2A612F92068B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F620F382-30D1-451E-B125-2A612F92068B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F620F382-30D1-451E-B125-2A612F92068B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C9534425-93FB-494F-8DD8-1E4E3E626FDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C9534425-93FB-494F-8DD8-1E4E3E626FDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C9534425-93FB-494F-8DD8-1E4E3E626FDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C9534425-93FB-494F-8DD8-1E4E3E626FDE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BE8ED8C1-C314-4C4E-A929-64C9C8B3552A}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/System.ComponentModel.Primitives/src/Properties/AssemblyInfo.cs b/src/System.ComponentModel.Primitives/src/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000000..64ef1d952b42
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/src/Properties/AssemblyInfo.cs
@@ -0,0 +1,30 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Reflection;
+using System.Resources;
+using System.Runtime.InteropServices;
+
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+[assembly: AssemblyCopyright("\x00a9 Microsoft Corporation. All rights reserved.")]
+[assembly: AssemblyCompany("Microsoft Corporation")]
+[assembly: AssemblyFileVersion("999.999.999.0")]
+[assembly: AssemblyInformationalVersion("999.999.999.0")]
+[assembly: AssemblyVersion("999.999.999.0")]
+[assembly: AssemblyTitle("System.ComponentModel.Primitives")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyProduct("System.ComponentModel.Primitives")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+[assembly: NeutralResourcesLanguageAttribute("en-US")]
+
+// Setting ComVisible to false makes the types in this assembly not visible
+// to COM components. If you need to access a type in this assembly from
+// COM, set the ComVisible attribute to true on that type.
+[assembly: ComVisible(false)]
+[assembly: CLSCompliant(true)]
+
diff --git a/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj b/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj
new file mode 100644
index 000000000000..33202d28ccfc
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/src/System.ComponentModel.Primitives.csproj
@@ -0,0 +1,28 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {F620F382-30D1-451E-B125-2A612F92068B}
+ Library
+ System.ComponentModel.Primitives
+ System.ComponentModel.Primitives
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/ComponentCollection.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/ComponentCollection.cs
new file mode 100644
index 000000000000..dbaeb8e702ad
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/ComponentCollection.cs
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+
+// Placeholder stub without functionality, here only to support existence of
+// TypeConverter.
+// Dependency chain: TypeConverter -> ITypeDescriptorContext -> IContainer -> ComponentCollection
+
+namespace System.ComponentModel
+{
+ public class ComponentCollection
+ {
+ private ComponentCollection() { }
+ }
+}
+
diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/IComponent.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/IComponent.cs
new file mode 100644
index 000000000000..0f69ffa17c6f
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/IComponent.cs
@@ -0,0 +1,45 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System.Runtime.InteropServices;
+
+namespace System.ComponentModel
+{
+ /*
+ * A "component" is an object that can be placed in a container.
+ *
+ * In this context, "containment" refers to logical containment, not visual
+ * containment. Components and containers can be used in a variety of
+ * scenarios, including both visual and non-visual scenarios.
+ *
+ * To be a component, a class implements the IComponent interface, and provides
+ * a parameter-less constructor.
+ *
+ * A component interacts with its container primarily through a container-
+ * provided "site".
+ */
+
+ ///
+ /// Provides functionality required by all components.
+ ///
+ [ComVisible(true)]
+ public interface IComponent : IDisposable
+ {
+ // The site of the component.
+ ///
+ /// When implemented by a class, gets or sets
+ /// the associated
+ /// with the .
+ ///
+ ISite Site
+ {
+ get;
+ set;
+ }
+
+ ///
+ /// Adds a event handler to listen to the Disposed event on the component.
+ ///
+ event EventHandler Disposed;
+ }
+}
diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/IContainer.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/IContainer.cs
new file mode 100644
index 000000000000..377877d9d78c
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/IContainer.cs
@@ -0,0 +1,50 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System.Runtime.InteropServices;
+
+namespace System.ComponentModel
+{
+ /*
+ * A "container" is an object that logically contains zero or more child
+ * components.
+ *
+ * In this context, "containment" refers to logical containment, not visual
+ * containment. Components and containers can be used in a variety of
+ * scenarios, including both visual and non-visual scenarios.
+ */
+
+ ///
+ /// Provides
+ /// functionality for containers. Containers are objects that logically contain zero or more components.
+ ///
+ [ComVisible(true)]
+ public interface IContainer : IDisposable
+ {
+ // Adds a component to the container.
+ ///
+ /// Adds the specified to the
+ /// at the end of the list.
+ ///
+ void Add(IComponent component);
+
+ // Adds a component to the container.
+ ///
+ /// Adds the specified to the
+ /// at the end of the list, and assigns a name to the component.
+ ///
+ void Add(IComponent component, String name);
+
+ // The components in the container.
+ ///
+ /// Gets all the components in the .
+ ///
+ ComponentCollection Components { get; }
+
+ // Removes a component from the container.
+ ///
+ /// Removes a component from the .
+ ///
+ void Remove(IComponent component);
+ }
+}
diff --git a/src/System.ComponentModel.Primitives/src/System/ComponentModel/ISite.cs b/src/System.ComponentModel.Primitives/src/System/ComponentModel/ISite.cs
new file mode 100644
index 000000000000..100c5401307c
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/src/System/ComponentModel/ISite.cs
@@ -0,0 +1,53 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System.Runtime.InteropServices;
+
+namespace System.ComponentModel
+{
+ /*
+ * Containers use sites to manage and communicate their child components.
+ *
+ * A site is a convenient place for a container to store container-specific
+ * per-component information. The canonical example of such a piece of
+ * information is the name of the component.
+ *
+ * To be a site, a class implements the ISite interface.
+ */
+
+ ///
+ /// Provides functionality required by sites. Sites bind
+ /// a to a
+ /// and enable communication between them, as well as provide a way
+ /// for the container to manage its components.
+ ///
+ [ComVisible(true)]
+ public interface ISite : IServiceProvider
+ {
+ // The component sited by this component site.
+ ///
+ /// When implemented by a class, gets the component associated with the .
+ ///
+ IComponent Component { get; }
+
+ // The container in which the component is sited.
+ ///
+ /// When implemented by a class, gets the container associated with the .
+ ///
+ IContainer Container { get; }
+
+ // Indicates whether the component is in design mode.
+ ///
+ /// When implemented by a class, determines whether the component is in design mode.
+ ///
+ bool DesignMode { get; }
+
+ // The name of the component.
+ //
+ ///
+ /// When implemented by a class, gets or sets the name of
+ /// the component associated with the .
+ ///
+ String Name { get; set; }
+ }
+}
diff --git a/src/System.ComponentModel.Primitives/src/packages.config b/src/System.ComponentModel.Primitives/src/packages.config
new file mode 100644
index 000000000000..97030129e50f
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/src/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/System.ComponentModel.Primitives/tests/ComponentModelPrimitivesBasicTests.cs b/src/System.ComponentModel.Primitives/tests/ComponentModelPrimitivesBasicTests.cs
new file mode 100644
index 000000000000..b67c17d4e224
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/tests/ComponentModelPrimitivesBasicTests.cs
@@ -0,0 +1,32 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.ComponentModel;
+using Xunit;
+
+namespace Test
+{
+ public class ComponentModelPrimitivesTests
+ {
+ [Fact]
+ public static void TestComponentPrimitivesModelBasic()
+ {
+ // dummy tests to make sure the System.ComponentModel.Primitives library loaded successfully
+#pragma warning disable 0219
+ IComponent iComponent = null;
+ Assert.Null(iComponent);
+
+ IContainer iContainer = null;
+ Assert.Null(iContainer);
+
+ ISite iSite = null;
+ IServiceProvider iServiceProvider = iSite;
+ Assert.Null(iServiceProvider);
+
+ ComponentCollection componentCollection = null;
+ Assert.Null(componentCollection);
+#pragma warning restore 0219
+ }
+ }
+}
diff --git a/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj b/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj
new file mode 100644
index 000000000000..1529926f58fe
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/tests/System.ComponentModel.Primitives.Tests.csproj
@@ -0,0 +1,35 @@
+
+
+
+
+ Debug
+ AnyCPU
+ Library
+ {C9534425-93FB-494F-8DD8-1E4E3E626FDE}
+ System.ComponentModel.Primitives.Tests
+ System.ComponentModel.Primitives.Tests
+
+
+
+
+
+
+
+
+
+
+
+
+ {be8ed8c1-c314-4c4e-a929-64c9c8b3552a}
+ XunitTraitsDiscoverers
+
+
+ {F620F382-30D1-451E-B125-2A612F92068B}
+ System.ComponentModel.Primitives
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/System.ComponentModel.Primitives/tests/packages.config b/src/System.ComponentModel.Primitives/tests/packages.config
new file mode 100644
index 000000000000..09f726b9aa72
--- /dev/null
+++ b/src/System.ComponentModel.Primitives/tests/packages.config
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/System.Diagnostics.FileVersionInfo/tests/Assembly1.csproj b/src/System.Diagnostics.FileVersionInfo/tests/Assembly1.csproj
index bd931736e9a8..e940b65a31e7 100644
--- a/src/System.Diagnostics.FileVersionInfo/tests/Assembly1.csproj
+++ b/src/System.Diagnostics.FileVersionInfo/tests/Assembly1.csproj
@@ -29,7 +29,7 @@
- ..\..\packages\System.Runtime.4.0.20-beta-22412\lib\portable-wpa80+win80+net45+aspnetcore50\System.Runtime.dll
+ $(PackagesDir)\System.Runtime.4.0.20-beta-22412\lib\portable-wpa80+win80+net45+aspnetcore50\System.Runtime.dll
diff --git a/src/System.Globalization.Extensions.sln b/src/System.Globalization.Extensions.sln
new file mode 100644
index 000000000000..c7c27463c9ef
--- /dev/null
+++ b/src/System.Globalization.Extensions.sln
@@ -0,0 +1,33 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.30723.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Globalization.Extensions", "System.Globalization.Extensions\src\System.Globalization.Extensions.csproj", "{2B96AA10-84C0-4927-8611-8D2474B990E8}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{9618597D-FDAE-42CB-B368-80DB80EA1E37}"
+ ProjectSection(SolutionItems) = preProject
+ .nuget\packages.config = .nuget\packages.config
+ EndProjectSection
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "System.Globalization.Extensions.Tests", "System.Globalization.Extensions\tests\System.Globalization.Extensions.Tests.csproj", "{BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {2B96AA10-84C0-4927-8611-8D2474B990E8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2B96AA10-84C0-4927-8611-8D2474B990E8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2B96AA10-84C0-4927-8611-8D2474B990E8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2B96AA10-84C0-4927-8611-8D2474B990E8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/System.Globalization.Extensions/src/Interop/Interop.Manual.cs b/src/System.Globalization.Extensions/src/Interop/Interop.Manual.cs
new file mode 100644
index 000000000000..89d6a9850027
--- /dev/null
+++ b/src/System.Globalization.Extensions/src/Interop/Interop.Manual.cs
@@ -0,0 +1,14 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Runtime.InteropServices;
+
+internal static partial class Interop
+{
+ internal static partial class mincore
+ {
+ [DllImport("api-ms-win-core-errorhandling-l1-1-0.dll")]
+ internal extern static void SetLastError(uint dwErrCode);
+ }
+}
diff --git a/src/System.Globalization.Extensions/src/Resources/Strings.Designer.cs b/src/System.Globalization.Extensions/src/Resources/Strings.Designer.cs
new file mode 100644
index 000000000000..ffea82cd99c2
--- /dev/null
+++ b/src/System.Globalization.Extensions/src/Resources/Strings.Designer.cs
@@ -0,0 +1,163 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.34014
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+namespace Resources {
+ using System;
+ using System.Reflection;
+
+
+ ///
+ /// A strongly-typed resource class, for looking up localized strings, etc.
+ ///
+ // This class was auto-generated by the StronglyTypedResourceBuilder
+ // class via a tool like ResGen or Visual Studio.
+ // To add or remove a member, edit your .ResX file then rerun ResGen
+ // with the /str option, or rebuild your VS project.
+ [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+ internal class Strings {
+
+ private static global::System.Resources.ResourceManager resourceMan;
+
+ private static global::System.Globalization.CultureInfo resourceCulture;
+
+ [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+ internal Strings() {
+ }
+
+ ///
+ /// Returns the cached ResourceManager instance used by this class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Resources.ResourceManager ResourceManager {
+ get {
+ if (object.ReferenceEquals(resourceMan, null)) {
+ global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("System.Globalization.Extensions.Resources.Strings", typeof(Strings).GetTypeInfo().Assembly);
+ resourceMan = temp;
+ }
+ return resourceMan;
+ }
+ }
+
+ ///
+ /// Overrides the current thread's CurrentUICulture property for all
+ /// resource lookups using this strongly typed resource class.
+ ///
+ [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+ internal static global::System.Globalization.CultureInfo Culture {
+ get {
+ return resourceCulture;
+ }
+ set {
+ resourceCulture = value;
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Insufficient memory to continue the execution of the program..
+ ///
+ internal static string Arg_OutOfMemoryException {
+ get {
+ return ResourceManager.GetString("Arg_OutOfMemoryException", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to IDN labels must be between 1 and 63 characters long..
+ ///
+ internal static string Argument_IdnBadLabelSize {
+ get {
+ return ResourceManager.GetString("Argument_IdnBadLabelSize", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Invalid IDN encoded string..
+ ///
+ internal static string Argument_IdnBadPunycode {
+ get {
+ return ResourceManager.GetString("Argument_IdnBadPunycode", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Decoded string is not a valid IDN name..
+ ///
+ internal static string Argument_IdnIllegalName {
+ get {
+ return ResourceManager.GetString("Argument_IdnIllegalName", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Invalid Unicode code point found at index {0}..
+ ///
+ internal static string Argument_InvalidCharSequence {
+ get {
+ return ResourceManager.GetString("Argument_InvalidCharSequence", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to String contains invalid Unicode code points..
+ ///
+ internal static string Argument_InvalidCharSequenceNoIndex {
+ get {
+ return ResourceManager.GetString("Argument_InvalidCharSequenceNoIndex", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Value of flags is invalid..
+ ///
+ internal static string Argument_InvalidFlag {
+ get {
+ return ResourceManager.GetString("Argument_InvalidFlag", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Index was out of range. Must be non-negative and less than the size of the collection..
+ ///
+ internal static string ArgumentOutOfRange_Index {
+ get {
+ return ResourceManager.GetString("ArgumentOutOfRange_Index", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Index and count must refer to a location within the buffer..
+ ///
+ internal static string ArgumentOutOfRange_IndexCountBuffer {
+ get {
+ return ResourceManager.GetString("ArgumentOutOfRange_IndexCountBuffer", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Non-negative number required..
+ ///
+ internal static string ArgumentOutOfRange_NeedNonNegNum {
+ get {
+ return ResourceManager.GetString("ArgumentOutOfRange_NeedNonNegNum", resourceCulture);
+ }
+ }
+
+ ///
+ /// Looks up a localized string similar to Unknown error '{0}'..
+ ///
+ internal static string UnknownError_Num {
+ get {
+ return ResourceManager.GetString("UnknownError_Num", resourceCulture);
+ }
+ }
+ }
+}
diff --git a/src/System.Globalization.Extensions/src/Resources/Strings.resx b/src/System.Globalization.Extensions/src/Resources/Strings.resx
new file mode 100644
index 000000000000..cc4359bb2e86
--- /dev/null
+++ b/src/System.Globalization.Extensions/src/Resources/Strings.resx
@@ -0,0 +1,48 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ Insufficient memory to continue the execution of the program.
+
+
+ IDN labels must be between 1 and 63 characters long.
+
+
+ Invalid IDN encoded string.
+
+
+ Decoded string is not a valid IDN name.
+
+
+ Invalid Unicode code point found at index {0}.
+
+
+ String contains invalid Unicode code points.
+
+
+ Value of flags is invalid.
+
+
+ Index was out of range. Must be non-negative and less than the size of the collection.
+
+
+ Index and count must refer to a location within the buffer.
+
+
+ Non-negative number required.
+
+
+ Unknown error '{0}'.
+
+
\ No newline at end of file
diff --git a/src/System.Globalization.Extensions/src/System.Globalization.Extensions.csproj b/src/System.Globalization.Extensions/src/System.Globalization.Extensions.csproj
new file mode 100644
index 000000000000..21a3676d7c64
--- /dev/null
+++ b/src/System.Globalization.Extensions/src/System.Globalization.Extensions.csproj
@@ -0,0 +1,54 @@
+
+
+
+
+ Debug
+ AnyCPU
+ Library
+ System.Globalization.Extensions
+ System.Globalization.Extensions
+ {2B96AA10-84C0-4927-8611-8D2474B990E8}
+
+
+
+
+
+
+
+
+
+ Common\System\SR.cs
+
+
+ True
+ True
+ Strings.resx
+
+
+ Common\Interop\Interop.Globalization.Extensions.manual.cs
+
+
+ Common\System\StringNormalizationExtensions.cs
+
+
+ Common\System\Globalization\IdnMapping.cs
+
+
+ Common\System\Text\NormalizationForm.cs
+
+
+
+
+
+
+ ResXFileCodeGenerator
+ Strings.Designer.cs
+ Resources
+ Designer
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/System.Globalization.Extensions/src/System/Globalization/Extensions.cs b/src/System.Globalization.Extensions/src/System/Globalization/Extensions.cs
new file mode 100644
index 000000000000..2de0e47c1668
--- /dev/null
+++ b/src/System.Globalization.Extensions/src/System/Globalization/Extensions.cs
@@ -0,0 +1,98 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Diagnostics.Contracts;
+
+namespace System.Globalization
+{
+ public static class GlobalizationExtensions
+ {
+ public static StringComparer GetStringComparer(this CompareInfo compareInfo, CompareOptions options)
+ {
+ if (compareInfo == null)
+ {
+ throw new ArgumentNullException("compareInfo");
+ }
+
+ if (options == CompareOptions.Ordinal)
+ {
+ return StringComparer.Ordinal;
+ }
+
+ if (options == CompareOptions.OrdinalIgnoreCase)
+ {
+ return StringComparer.OrdinalIgnoreCase;
+ }
+
+ if ((options & CultureAwareComparer.ValidCompareMaskOffFlags) != 0)
+ {
+ throw new ArgumentException(SR.Argument_InvalidFlag, "options");
+ }
+
+ return new CultureAwareComparer(compareInfo, options);
+ }
+ }
+
+ internal sealed class CultureAwareComparer : StringComparer
+ {
+ internal const CompareOptions ValidCompareMaskOffFlags =
+ ~(CompareOptions.IgnoreCase | CompareOptions.IgnoreSymbols | CompareOptions.IgnoreNonSpace |
+ CompareOptions.IgnoreWidth | CompareOptions.IgnoreKanaType | CompareOptions.StringSort);
+
+ private CompareInfo _compareInfo;
+ private CompareOptions _options;
+
+ internal CultureAwareComparer(CompareInfo compareInfo, CompareOptions options)
+ {
+ Contract.Assert((options & ValidCompareMaskOffFlags) == 0);
+ _compareInfo = compareInfo;
+ _options = options;
+ }
+
+ public override int Compare(string x, string y)
+ {
+ if (Object.ReferenceEquals(x, y)) return 0;
+ if (x == null) return -1;
+ if (y == null) return 1;
+ return _compareInfo.Compare(x, y, _options);
+ }
+
+ public override bool Equals(string x, string y)
+ {
+ if (Object.ReferenceEquals(x, y)) return true;
+ if (x == null || y == null) return false;
+
+ return (_compareInfo.Compare(x, y, _options) == 0);
+ }
+
+ public override int GetHashCode(string obj)
+ {
+ if (obj == null)
+ {
+ throw new ArgumentNullException("obj");
+ }
+ Contract.EndContractBlock();
+
+ // StringSort used in compare operation and not with the hashing
+ return _compareInfo.GetHashCode(obj, _options & (~CompareOptions.StringSort));
+ }
+
+ // Equals method for the comparer itself.
+ public override bool Equals(Object obj)
+ {
+ CultureAwareComparer comparer = obj as CultureAwareComparer;
+ if (comparer == null)
+ {
+ return false;
+ }
+ return (_options == comparer._options) && (_compareInfo.Equals(comparer._compareInfo));
+ }
+
+ public override int GetHashCode()
+ {
+ return _compareInfo.GetHashCode() ^ ((int)_options & 0x7FFFFFFF);
+ }
+ }
+}
+
diff --git a/src/System.Globalization.Extensions/src/packages.config b/src/System.Globalization.Extensions/src/packages.config
new file mode 100644
index 000000000000..764a516bfa1e
--- /dev/null
+++ b/src/System.Globalization.Extensions/src/packages.config
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/ConformanceIdnaTestResult.cs b/src/System.Globalization.Extensions/tests/IdnMapping/Data/ConformanceIdnaTestResult.cs
new file mode 100644
index 000000000000..ed39feeec101
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/ConformanceIdnaTestResult.cs
@@ -0,0 +1,50 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using System;
+using System.Collections.Generic;
+
+namespace System.Globalization.Extensions.Tests
+{
+ public class ConformanceIdnaTestResult
+ {
+ ///
+ /// Determines if the intended result is a success or failure
+ ///
+ public bool Success { get; private set; }
+
+ ///
+ /// If Success is true, then the value shows the expected value of the test
+ /// If Success is false, then the value shows the conversion steps that have issues
+ ///
+ /// For details, see the explanation in IdnaTest.txt for the Unicode version being tested
+ ///
+ public string Value { get; private set; }
+
+ public ConformanceIdnaTestResult(string entry)
+ : this(entry, null)
+ { }
+
+ public ConformanceIdnaTestResult(string entry, string fallbackValue)
+ {
+ if (string.IsNullOrWhiteSpace(entry))
+ SetValues(fallbackValue);
+ else
+ SetValues(entry);
+ }
+
+ private void SetValues(string entry)
+ {
+ if (entry.Trim().StartsWith("[", StringComparison.Ordinal))
+ {
+ Success = false;
+ Value = entry.Trim();
+ }
+ else
+ {
+ Success = true;
+ Value = entry.Trim();
+ }
+ }
+ }
+}
diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/Factory.cs b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Factory.cs
new file mode 100644
index 000000000000..cf450d4aa0fa
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Factory.cs
@@ -0,0 +1,80 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Xunit;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
+using System.Text;
+
+namespace System.Globalization.Extensions.Tests
+{
+ public static class Factory
+ {
+ ///
+ /// Removes comments from the end of a line
+ ///
+ private static string RemoveComment(string line)
+ {
+ var idx = line.IndexOf("#", StringComparison.Ordinal);
+
+ return idx < 0 ? line : line.Substring(0, idx);
+ }
+
+ ///
+ /// Retrieves the IdnaTest.txt included in assembly as an embedded resource.
+ ///
+ private static Stream GetIdnaTestTxt()
+ {
+ foreach (var name in typeof(Factory).GetTypeInfo().Assembly.GetManifestResourceNames())
+ {
+ if (name.EndsWith("IdnaTest.txt", StringComparison.Ordinal))
+ {
+ return typeof(Factory).GetTypeInfo().Assembly.GetManifestResourceStream(name);
+ }
+ }
+
+ Assert.False(true, "Verify test file 'IdnaTest.txt' is included as an embedded resource");
+ return null;
+ }
+
+ private static IEnumerable ParseFile(Stream stream, Func f)
+ {
+ using (var reader = new StreamReader(stream))
+ {
+ int lineCount = 0;
+ while (!reader.EndOfStream)
+ {
+ lineCount++;
+
+ var noComment = RemoveComment(reader.ReadLine());
+
+ if (!String.IsNullOrWhiteSpace(noComment))
+ yield return f(noComment, lineCount);
+ }
+ }
+ }
+
+ ///
+ /// Abstracts retrieving the dataset so this can be changed depending on platform support, such as
+ /// when the IDNA implementation is updated to a newer version of Unicode. Windows currently supports
+ /// and uses 6.0 in IDNA processing but 6.3 is the latest version available and may be used at
+ /// some point.
+ ///
+ /// This method retrieves the dataset to be used by the test. Windows implementation uses transitional
+ /// mappings, which only affect 4 characters, known as deviations. See the description at
+ /// http://www.unicode.org/reports/tr46/#Deviations for more information. Windows also throws an error
+ /// when an empty string is given, so we want to filter that from the IDNA test set
+ ///
+ ///
+ public static IEnumerable GetDataset()
+ {
+ foreach (var entry in ParseFile(GetIdnaTestTxt(), (line, lineCount) => new Unicode_6_0_IdnaTest(line, lineCount)))
+ {
+ if (entry.Type != IdnType.Nontransitional && entry.Source != String.Empty)
+ yield return entry;
+ }
+ }
+ }
+}
diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/IConformanceIdnaTest.cs b/src/System.Globalization.Extensions/tests/IdnMapping/Data/IConformanceIdnaTest.cs
new file mode 100644
index 000000000000..4601b1945dac
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/IConformanceIdnaTest.cs
@@ -0,0 +1,16 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+namespace System.Globalization.Extensions.Tests
+{
+ public enum IdnType { Transitional, Nontransitional, Both };
+
+ public interface IConformanceIdnaTest
+ {
+ IdnType Type { get; }
+ string Source { get; }
+ ConformanceIdnaTestResult GetUnicodeResult { get; }
+ ConformanceIdnaTestResult GetASCIIResult { get; }
+ int LineNumber { get; }
+ }
+}
diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/IdnaTest.txt b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/IdnaTest.txt
new file mode 100644
index 000000000000..45f6ff06e21b
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/IdnaTest.txt
@@ -0,0 +1,850 @@
+# IdnaTest.txt
+# Date: 2010-05-12 MD
+#
+# Copyright (c) 1991-2010 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+#
+# Idna Test Suite
+#
+# Contains test cases for verifying UTS46 conformance. For more information,
+# see http://www.unicode.org/reports/tr46/
+#
+# FORMAT:
+#
+# This file is UTF8, with certain characters escaped using the \uXXXX convention for readability
+# Columns (c1, c2,...) are separated by semicolons.
+# Leading and trailing spaces and tabs in each column are ignored.
+# Comments are indicated with hash marks.
+#
+# Column 1: type - T for transitional, N for nontransitional, B for both
+# Column 2: source - the source string to be tested
+# Column 3: toUnicode - the result of applying toUnicode to the source, using the specified type
+# Column 4: toASCII - the result of applying toASCII to the source, using nontransitional
+#
+# If the value of toUnicode or toASCII is the same as source, the column will be blank.
+#
+# An error in toUnicode or toASCII is indicated by a value of the form [...].
+# In such a case, the contents is a list of error codes based on the step numbers in UTS46 and IDNA2008:
+# Pn for Section 4 Processing step n
+# Vn for 4.1 Validity Criteria step n
+# An for 4.2 ToASCII step n
+# Bn for Bidi (in IDNA2008)
+# Cn for ContextJ (in IDNA2008)
+#
+# However, these particular error codes are only informative;
+# the important feature is whether or not there is an error.
+#
+# CONFORMANCE:
+#
+# To test for conformance to UTS46, on each line, perform the toASCII and to Unicode operations
+# on the source string, with the indicated type.
+# The results must match what is given in the toUnicode and toASCII columns, except that for errors,
+# an implementation only needs to record that there is an error;
+# it need not reproduce the results in [...].
+# ====================================================================================================
+B; fass.de; ;
+B; FASS.DE; fass.de;
+B; Fass.de; fass.de;
+T; faß.de; ; fass.de
+N; faß.de; ; xn--fa-hia.de
+T; Faß.de; faß.de; fass.de
+N; Faß.de; faß.de; xn--fa-hia.de
+#B; xn--fa-hia.de; faß.de; xn--fa-hia.de # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--FA-HIA.DE; faß.de; xn--fa-hia.de # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Fa-Hia.de; faß.de; xn--fa-hia.de # GETUNICODE FAILS ON WINDOWS 8.1
+#B; à\u05D0; [B5 B6]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; À\u05D0; [B5 B6]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; 0à.\u05D0; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; 0À.\u05D0; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; à.\u05D0\u0308; ; xn--0ca.xn--ssa73l
+B; À.\u05D0\u0308; à.\u05D0\u0308; xn--0ca.xn--ssa73l
+B; xn--0ca.xn--ssa73l; à.\u05D0\u0308; xn--0ca.xn--ssa73l
+B; XN--0CA.XN--SSA73L; à.\u05D0\u0308; xn--0ca.xn--ssa73l
+B; Xn--0Ca.xn--Ssa73l; à.\u05D0\u0308; xn--0ca.xn--ssa73l
+#B; à.\u05D00\u0660\u05D0; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; À.\u05D00\u0660\u05D0; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; \u0308.\u05D0; [V5 B1 B3 B6]; [V5 B1 B3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; à.\u05D00\u0660; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; À.\u05D00\u0660; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; àˇ.\u05D0; [B6]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Àˇ.\u05D0; [B6]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; à\u0308.\u05D0; ; xn--0ca81i.xn--4db
+B; À\u0308.\u05D0; à\u0308.\u05D0; xn--0ca81i.xn--4db
+B; xn--0ca81i.xn--4db; à\u0308.\u05D0; xn--0ca81i.xn--4db
+B; XN--0CA81I.XN--4DB; à\u0308.\u05D0; xn--0ca81i.xn--4db
+B; Xn--0Ca81i.xn--4Db; à\u0308.\u05D0; xn--0ca81i.xn--4db
+T; a\u200Cb; [C1]; ab
+N; a\u200Cb; [C1]; [C1]
+T; A\u200CB; [C1]; ab
+N; A\u200CB; [C1]; [C1]
+T; A\u200Cb; [C1]; ab
+N; A\u200Cb; [C1]; [C1]
+B; ab; ;
+B; AB; ab;
+B; Ab; ab;
+T; a\u094D\u200Cb; ; xn--ab-fsf
+N; a\u094D\u200Cb; ; xn--ab-fsf604u
+T; A\u094D\u200CB; a\u094D\u200Cb; xn--ab-fsf
+N; A\u094D\u200CB; a\u094D\u200Cb; xn--ab-fsf604u
+T; A\u094D\u200Cb; a\u094D\u200Cb; xn--ab-fsf
+N; A\u094D\u200Cb; a\u094D\u200Cb; xn--ab-fsf604u
+B; xn--ab-fsf; a\u094Db; xn--ab-fsf
+B; XN--AB-FSF; a\u094Db; xn--ab-fsf
+B; Xn--Ab-Fsf; a\u094Db; xn--ab-fsf
+B; a\u094Db; ; xn--ab-fsf
+B; A\u094DB; a\u094Db; xn--ab-fsf
+B; A\u094Db; a\u094Db; xn--ab-fsf
+#B; xn--ab-fsf604u; a\u094D\u200Cb; xn--ab-fsf604u # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--AB-FSF604U; a\u094D\u200Cb; xn--ab-fsf604u # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Ab-Fsf604u; a\u094D\u200Cb; xn--ab-fsf604u # GETUNICODE FAILS ON WINDOWS 8.1
+#T; \u0308\u200C\u0308\u0628b; [V5 B1 C1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0308\u200C\u0308\u0628b; [V5 B1 C1]; [V5 B1 C1]
+#T; \u0308\u200C\u0308\u0628B; [V5 B1 C1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0308\u200C\u0308\u0628B; [V5 B1 C1]; [V5 B1 C1]
+#T; a\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; a\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6 C1]
+#T; A\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; A\u0628\u0308\u200C\u0308; [B5 B6 C1]; [B5 B6 C1]
+#T; a\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; a\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5]
+#T; A\u0628\u0308\u200C\u0308\u0628B; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; A\u0628\u0308\u200C\u0308\u0628B; [B5]; [B5]
+#T; A\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; A\u0628\u0308\u200C\u0308\u0628b; [B5]; [B5]
+T; a\u200Db; [C2]; ab
+N; a\u200Db; [C2]; [C2]
+T; A\u200DB; [C2]; ab
+N; A\u200DB; [C2]; [C2]
+T; A\u200Db; [C2]; ab
+N; A\u200Db; [C2]; [C2]
+T; a\u094D\u200Db; ; xn--ab-fsf
+N; a\u094D\u200Db; ; xn--ab-fsf014u
+T; A\u094D\u200DB; a\u094D\u200Db; xn--ab-fsf
+N; A\u094D\u200DB; a\u094D\u200Db; xn--ab-fsf014u
+T; A\u094D\u200Db; a\u094D\u200Db; xn--ab-fsf
+N; A\u094D\u200Db; a\u094D\u200Db; xn--ab-fsf014u
+#B; xn--ab-fsf014u; a\u094D\u200Db; xn--ab-fsf014u # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--AB-FSF014U; a\u094D\u200Db; xn--ab-fsf014u # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Ab-Fsf014u; a\u094D\u200Db; xn--ab-fsf014u # GETUNICODE FAILS ON WINDOWS 8.1
+#T; \u0308\u200D\u0308\u0628b; [V5 B1 C2]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0308\u200D\u0308\u0628b; [V5 B1 C2]; [V5 B1 C2]
+#T; \u0308\u200D\u0308\u0628B; [V5 B1 C2]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0308\u200D\u0308\u0628B; [V5 B1 C2]; [V5 B1 C2]
+#T; a\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; a\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6 C2]
+#T; A\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; A\u0628\u0308\u200D\u0308; [B5 B6 C2]; [B5 B6 C2]
+#T; a\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; a\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5 C2]
+#T; A\u0628\u0308\u200D\u0308\u0628B; [B5 C2]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; A\u0628\u0308\u200D\u0308\u0628B; [B5 C2]; [B5 C2]
+#T; A\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; A\u0628\u0308\u200D\u0308\u0628b; [B5 C2]; [B5 C2]
+B; 1234567890ä1234567890123456789012345678901234567890123456; ; [A4_2]
+B; 1234567890Ä1234567890123456789012345678901234567890123456; 1234567890ä1234567890123456789012345678901234567890123456; [A4_2]
+B; www.eXample.cOm; www.example.com;
+B; www.example.com; ;
+B; WWW.EXAMPLE.COM; www.example.com;
+B; Www.example.com; www.example.com;
+B; Bücher.de; bücher.de; xn--bcher-kva.de
+B; bücher.de; ; xn--bcher-kva.de
+B; BÜCHER.DE; bücher.de; xn--bcher-kva.de
+B; xn--bcher-kva.de; bücher.de; xn--bcher-kva.de
+B; XN--BCHER-KVA.DE; bücher.de; xn--bcher-kva.de
+B; Xn--Bcher-Kva.de; bücher.de; xn--bcher-kva.de
+B; ÖBB; öbb; xn--bb-eka
+B; öbb; ; xn--bb-eka
+B; Öbb; öbb; xn--bb-eka
+B; xn--bb-eka; öbb; xn--bb-eka
+B; XN--BB-EKA; öbb; xn--bb-eka
+B; Xn--Bb-Eka; öbb; xn--bb-eka
+#B; XN--fA-hia.dE; faß.de; xn--fa-hia.de # GETUNICODE FAILS ON WINDOWS 8.1
+T; βόλος.com; ; xn--nxasmq6b.com
+N; βόλος.com; ; xn--nxasmm1c.com
+B; ΒΌΛΟΣ.COM; βόλοσ.com; xn--nxasmq6b.com
+B; βόλοσ.com; ; xn--nxasmq6b.com
+B; Βόλοσ.com; βόλοσ.com; xn--nxasmq6b.com
+B; xn--nxasmq6b.com; βόλοσ.com; xn--nxasmq6b.com
+B; XN--NXASMQ6B.COM; βόλοσ.com; xn--nxasmq6b.com
+B; Xn--Nxasmq6b.com; βόλοσ.com; xn--nxasmq6b.com
+T; Βόλος.com; βόλος.com; xn--nxasmq6b.com
+N; Βόλος.com; βόλος.com; xn--nxasmm1c.com
+#B; xn--nxasmm1c.com; βόλος.com; xn--nxasmm1c.com # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--NXASMM1C.COM; βόλος.com; xn--nxasmm1c.com # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Nxasmm1c.com; βόλος.com; xn--nxasmm1c.com # GETUNICODE FAILS ON WINDOWS 8.1
+#B; xn--nxasmm1c; βόλος; xn--nxasmm1c # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--NXASMM1C; βόλος; xn--nxasmm1c # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Nxasmm1c; βόλος; xn--nxasmm1c # GETUNICODE FAILS ON WINDOWS 8.1
+T; βόλος; ; xn--nxasmq6b
+N; βόλος; ; xn--nxasmm1c
+B; ΒΌΛΟΣ; βόλοσ; xn--nxasmq6b
+B; βόλοσ; ; xn--nxasmq6b
+B; Βόλοσ; βόλοσ; xn--nxasmq6b
+B; xn--nxasmq6b; βόλοσ; xn--nxasmq6b
+B; XN--NXASMQ6B; βόλοσ; xn--nxasmq6b
+B; Xn--Nxasmq6b; βόλοσ; xn--nxasmq6b
+T; Βόλος; βόλος; xn--nxasmq6b
+N; Βόλος; βόλος; xn--nxasmm1c
+T; www.ශ\u0DCA\u200Dර\u0DD3.com; ; www.xn--10cl1a0b.com
+N; www.ශ\u0DCA\u200Dර\u0DD3.com; ; www.xn--10cl1a0b660p.com
+T; WWW.ශ\u0DCA\u200Dර\u0DD3.COM; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b.com
+N; WWW.ශ\u0DCA\u200Dර\u0DD3.COM; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com
+T; Www.ශ\u0DCA\u200Dර\u0DD3.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b.com
+N; Www.ශ\u0DCA\u200Dර\u0DD3.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com
+B; www.xn--10cl1a0b.com; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com
+B; WWW.XN--10CL1A0B.COM; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com
+B; Www.xn--10Cl1a0b.com; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com
+B; www.ශ\u0DCAර\u0DD3.com; ; www.xn--10cl1a0b.com
+B; WWW.ශ\u0DCAර\u0DD3.COM; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com
+B; Www.ශ\u0DCAර\u0DD3.com; www.ශ\u0DCAර\u0DD3.com; www.xn--10cl1a0b.com
+#B; www.xn--10cl1a0b660p.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com # GETUNICODE FAILS ON WINDOWS 8.1
+#B; WWW.XN--10CL1A0B660P.COM; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Www.xn--10Cl1a0b660p.com; www.ශ\u0DCA\u200Dර\u0DD3.com; www.xn--10cl1a0b660p.com # GETUNICODE FAILS ON WINDOWS 8.1
+T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; ; xn--mgba3gch31f
+N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; ; xn--mgba3gch31f060k
+B; xn--mgba3gch31f; \u0646\u0627\u0645\u0647\u0627\u06CC; xn--mgba3gch31f
+B; XN--MGBA3GCH31F; \u0646\u0627\u0645\u0647\u0627\u06CC; xn--mgba3gch31f
+B; Xn--Mgba3gch31f; \u0646\u0627\u0645\u0647\u0627\u06CC; xn--mgba3gch31f
+B; \u0646\u0627\u0645\u0647\u0627\u06CC; ; xn--mgba3gch31f
+#B; xn--mgba3gch31f060k; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; xn--mgba3gch31f060k # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--MGBA3GCH31F060K; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; xn--mgba3gch31f060k # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Mgba3gch31f060k; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC; xn--mgba3gch31f060k # GETUNICODE FAILS ON WINDOWS 8.1
+#B; xn--mgba3gch31f060k.com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--MGBA3GCH31F060K.COM; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Mgba3gch31f060k.com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com # GETUNICODE FAILS ON WINDOWS 8.1
+T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; ; xn--mgba3gch31f.com
+N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; ; xn--mgba3gch31f060k.com
+T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.COM; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f.com
+N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.COM; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com
+T; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.Com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f.com
+N; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.Com; \u0646\u0627\u0645\u0647\u200C\u0627\u06CC.com; xn--mgba3gch31f060k.com
+B; xn--mgba3gch31f.com; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com
+B; XN--MGBA3GCH31F.COM; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com
+B; Xn--Mgba3gch31f.com; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com
+B; \u0646\u0627\u0645\u0647\u0627\u06CC.com; ; xn--mgba3gch31f.com
+B; \u0646\u0627\u0645\u0647\u0627\u06CC.COM; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com
+B; \u0646\u0627\u0645\u0647\u0627\u06CC.Com; \u0646\u0627\u0645\u0647\u0627\u06CC.com; xn--mgba3gch31f.com
+#B; a.b.c。d。; a.b.c.d.; # GETUNICODE FAILS ON WINDOWS 8.1
+#B; A.B.C。D。; a.b.c.d.; # GETUNICODE FAILS ON WINDOWS 8.1
+#B; A.b.c。D。; a.b.c.d.; # GETUNICODE FAILS ON WINDOWS 8.1
+B; a.b.c.d.; ;
+B; A.B.C.D.; a.b.c.d.;
+B; A.b.c.d.; a.b.c.d.;
+#B; U\u0308.xn--tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Ü.xn--tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1
+#B; ü.xn--tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Ü.XN--TDA; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Ü.xn--Tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1
+B; xn--tda.xn--tda; ü.ü; xn--tda.xn--tda
+B; XN--TDA.XN--TDA; ü.ü; xn--tda.xn--tda
+B; Xn--Tda.xn--Tda; ü.ü; xn--tda.xn--tda
+B; ü.ü; ; xn--tda.xn--tda
+B; Ü.Ü; ü.ü; xn--tda.xn--tda
+B; Ü.ü; ü.ü; xn--tda.xn--tda
+#B; u\u0308.xn--tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1
+#B; U\u0308.XN--TDA; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1
+#B; U\u0308.xn--Tda; ü.ü; xn--tda.xn--tda # GETUNICODE FAILS ON WINDOWS 8.1
+#B; xn--u-ccb; [V1]; [V1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; XN--U-CCB; [V1]; [V1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Xn--U-Ccb; [V1]; [V1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; a⒈com; [P1 V6]; [P1 V6]
+B; A⒈COM; [P1 V6]; [P1 V6]
+B; A⒈Com; [P1 V6]; [P1 V6]
+#B; xn--a-ecp.ru; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; XN--A-ECP.RU; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Xn--A-Ecp.ru; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; xn--0.pt; [A3]; [A3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; XN--0.PT; [A3]; [A3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Xn--0.Pt; [A3]; [A3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; xn--a.pt; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; XN--A.PT; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Xn--A.pt; [V6]; [V6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; xn--a-Ä.pt; [A3]; [A3]
+B; xn--a-ä.pt; [A3]; [A3]
+B; XN--A-Ä.PT; [A3]; [A3]
+B; Xn--A-Ä.pt; [A3]; [A3]
+#B; 日本語。JP; 日本語.jp; xn--wgv71a119e.jp # GETUNICODE FAILS ON WINDOWS 8.1
+#B; 日本語。jp; 日本語.jp; xn--wgv71a119e.jp # GETUNICODE FAILS ON WINDOWS 8.1
+#B; 日本語。Jp; 日本語.jp; xn--wgv71a119e.jp # GETUNICODE FAILS ON WINDOWS 8.1
+B; xn--wgv71a119e.jp; 日本語.jp; xn--wgv71a119e.jp
+B; XN--WGV71A119E.JP; 日本語.jp; xn--wgv71a119e.jp
+B; Xn--Wgv71a119e.jp; 日本語.jp; xn--wgv71a119e.jp
+B; 日本語.jp; ; xn--wgv71a119e.jp
+B; 日本語.JP; 日本語.jp; xn--wgv71a119e.jp
+B; 日本語.Jp; 日本語.jp; xn--wgv71a119e.jp
+B; ☕; ; xn--53h
+B; xn--53h; ☕; xn--53h
+B; XN--53H; ☕; xn--53h
+B; Xn--53H; ☕; xn--53h
+T; 1.aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [A4_2]
+N; 1.aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [C1 C2 A4_2]
+T; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSS\u0302SSZ; [C1 C2]; [A4_2]
+N; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSS\u0302SSZ; [C1 C2]; [C1 C2 A4_2]
+T; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; [C1 C2]; [A4_2]
+N; 1.ASS\u200C\u200DB\u200C\u200DCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; [C1 C2]; [C1 C2 A4_2]
+T; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [A4_2]
+N; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [C1 C2 A4_2]
+T; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [A4_2]
+N; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1 C2]; [C1 C2 A4_2]
+T; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [A4_2]
+N; 1.ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [C1 C2 A4_2]
+T; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [A4_2]
+N; 1.Ass\u200C\u200Db\u200C\u200Dcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssyssssssssssssssss\u0302ssz; [C1 C2]; [C1 C2 A4_2]
+T; 1.Aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [A4_2]
+N; 1.Aß\u200C\u200Db\u200C\u200Dcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß\u0302ßz; [C1 C2]; [C1 C2 A4_2]
+T; \u200Cx\u200Dn\u200C-\u200D-bß; [C1 C2]; xn--bss
+N; \u200Cx\u200Dn\u200C-\u200D-bß; [C1 C2]; [C1 C2]
+T; \u200CX\u200DN\u200C-\u200D-BSS; [C1 C2]; xn--bss
+N; \u200CX\u200DN\u200C-\u200D-BSS; [C1 C2]; [C1 C2]
+T; \u200Cx\u200Dn\u200C-\u200D-bss; [C1 C2]; xn--bss
+N; \u200Cx\u200Dn\u200C-\u200D-bss; [C1 C2]; [C1 C2]
+T; \u200CX\u200Dn\u200C-\u200D-Bss; [C1 C2]; xn--bss
+N; \u200CX\u200Dn\u200C-\u200D-Bss; [C1 C2]; [C1 C2]
+B; xn--bss; 夙; xn--bss
+B; XN--BSS; 夙; xn--bss
+B; Xn--Bss; 夙; xn--bss
+B; 夙; ; xn--bss
+T; \u200CX\u200Dn\u200C-\u200D-Bß; [C1 C2]; xn--bss
+N; \u200CX\u200Dn\u200C-\u200D-Bß; [C1 C2]; [C1 C2]
+#B; ˣ\u034Fℕ\u200B﹣\u00AD-\u180Cℬ\uFE00ſ\u2064𝔰\uDB40\uDDEFffl; 夡夞夜夙; xn--bssffl # GETUNICODE FAILS ON WINDOWS 8.1
+#B; ˣ\u034Fℕ\u200B﹣\u00AD-\u180Cℬ\uFE00S\u2064𝔰\uDB40\uDDEFFFL; 夡夞夜夙; xn--bssffl # GETUNICODE FAILS ON WINDOWS 8.1
+#B; ˣ\u034Fℕ\u200B﹣\u00AD-\u180Cℬ\uFE00s\u2064𝔰\uDB40\uDDEFffl; 夡夞夜夙; xn--bssffl # GETUNICODE FAILS ON WINDOWS 8.1
+B; xn--bssffl; 夡夞夜夙; xn--bssffl
+B; XN--BSSFFL; 夡夞夜夙; xn--bssffl
+B; Xn--Bssffl; 夡夞夜夙; xn--bssffl
+B; 夡夞夜夙; ; xn--bssffl
+B; 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ;
+B; 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ;
+#B; 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; [A4_1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; [A4_2]
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; [A4_2]
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; [A4_2 A4_1]
+B; ä1234567890123456789012345678901234567890123456789012345; ; xn--1234567890123456789012345678901234567890123456789012345-9te
+B; Ä1234567890123456789012345678901234567890123456789012345; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te
+B; xn--1234567890123456789012345678901234567890123456789012345-9te; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te
+B; XN--1234567890123456789012345678901234567890123456789012345-9TE; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te
+B; Xn--1234567890123456789012345678901234567890123456789012345-9Te; ä1234567890123456789012345678901234567890123456789012345; xn--1234567890123456789012345678901234567890123456789012345-9te
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901
+B; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901
+B; 123456789012345678901234567890123456789012345678901234567890123.XN--1234567890123456789012345678901234567890123456789012345-KUE.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901
+B; 123456789012345678901234567890123456789012345678901234567890123.Xn--1234567890123456789012345678901234567890123456789012345-Kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.
+B; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.
+B; 123456789012345678901234567890123456789012345678901234567890123.XN--1234567890123456789012345678901234567890123456789012345-KUE.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.
+B; 123456789012345678901234567890123456789012345678901234567890123.Xn--1234567890123456789012345678901234567890123456789012345-Kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.
+#B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; [A4_1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; [A4_2]
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2]
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; [A4_2]
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2]
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; [A4_2 A4_1]
+B; 123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_2 A4_1]
+B; a.b..-q--a-.e; [V2 V3]; [V2 V3 A4_2]
+B; A.B..-Q--A-.E; [V2 V3]; [V2 V3 A4_2]
+B; A.b..-Q--A-.E; [V2 V3]; [V2 V3 A4_2]
+B; a.b..-q--ä-.e; [V2 V3]; [V2 V3 A4_2]
+B; A.B..-Q--Ä-.E; [V2 V3]; [V2 V3 A4_2]
+B; A.b..-Q--Ä-.E; [V2 V3]; [V2 V3 A4_2]
+B; a.b..xn---q----jra.e; [V2 V3]; [V2 V3 A4_2]
+B; A.B..XN---Q----JRA.E; [V2 V3]; [V2 V3 A4_2]
+B; A.b..Xn---Q----Jra.e; [V2 V3]; [V2 V3 A4_2]
+B; a..c; ; [A4_2]
+B; A..C; a..c; [A4_2]
+#B; a.-b.; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; A.-B.; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; a.b-.c; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; A.B-.C; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; A.b-.C; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; a.-.c; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; A.-.C; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; a.bc--de.f; [V2]; [V2] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; A.BC--DE.F; [V2]; [V2] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; A.bc--De.f; [V2]; [V2] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; ä.\u00AD.c; ä..c; [A4_2] # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Ä.\u00AD.C; ä..c; [A4_2] # GETUNICODE FAILS ON WINDOWS 8.1
+B; ä..c; ; [A4_2]
+B; Ä..C; ä..c; [A4_2]
+#B; ä.-b.; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Ä.-B.; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; ä.b-.c; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Ä.B-.C; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Ä.b-.C; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; ä.-.c; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Ä.-.C; [V3]; [V3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; ä.bc--de.f; [V2]; [V2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Ä.BC--DE.F; [V2]; [V2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; Ä.bc--De.f; [V2]; [V2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; a.b.\u0308c.d; [V5]; [V5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; A.B.\u0308C.D; [V5]; [V5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; A.b.\u0308c.d; [V5]; [V5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; a.b.xn--c-bcb.d; [V5]; [V5] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; A.B.XN--C-BCB.D; [V5]; [V5] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; A.b.xn--C-Bcb.d; [V5]; [V5] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+B; A0; a0;
+B; a0; ;
+B; 0A; 0a;
+B; 0a; ;
+#B; 0A.\u05D0; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; 0a.\u05D0; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; c.xn--0-eha.xn--4db; [B1]; [B1] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; C.XN--0-EHA.XN--4DB; [B1]; [B1] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; C.xn--0-Eha.xn--4Db; [B1]; [B1] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; b-.\u05D0; [V3 B6]; [V3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; B-.\u05D0; [V3 B6]; [V3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; d.xn----dha.xn--4db; [V3 B6]; [V3 B6] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; D.XN----DHA.XN--4DB; [V3 B6]; [V3 B6] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; D.xn----Dha.xn--4Db; [V3 B6]; [V3 B6] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+#B; a\u05D0; [B5 B6]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; A\u05D0; [B5 B6]; [B5 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; \u05D0\u05C7; ; xn--vdbr
+B; xn--vdbr; \u05D0\u05C7; xn--vdbr
+B; XN--VDBR; \u05D0\u05C7; xn--vdbr
+B; Xn--Vdbr; \u05D0\u05C7; xn--vdbr
+B; \u05D09\u05C7; ; xn--9-ihcz
+B; xn--9-ihcz; \u05D09\u05C7; xn--9-ihcz
+B; XN--9-IHCZ; \u05D09\u05C7; xn--9-ihcz
+B; Xn--9-Ihcz; \u05D09\u05C7; xn--9-ihcz
+#B; \u05D0a\u05C7; [B2 B3]; [B2 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; \u05D0A\u05C7; [B2 B3]; [B2 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; \u05D0\u05EA; ; xn--4db6c
+B; xn--4db6c; \u05D0\u05EA; xn--4db6c
+B; XN--4DB6C; \u05D0\u05EA; xn--4db6c
+B; Xn--4Db6c; \u05D0\u05EA; xn--4db6c
+B; \u05D0\u05F3\u05EA; ; xn--4db6c0a
+B; xn--4db6c0a; \u05D0\u05F3\u05EA; xn--4db6c0a
+B; XN--4DB6C0A; \u05D0\u05F3\u05EA; xn--4db6c0a
+B; Xn--4Db6c0a; \u05D0\u05F3\u05EA; xn--4db6c0a
+#B; a\u05D0Tz; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; a\u05D0tz; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; A\u05D0TZ; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; A\u05D0tz; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; \u05D0T\u05EA; [B2]; [B2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; \u05D0t\u05EA; [B2]; [B2] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; \u05D07\u05EA; ; xn--7-zhc3f
+B; xn--7-zhc3f; \u05D07\u05EA; xn--7-zhc3f
+B; XN--7-ZHC3F; \u05D07\u05EA; xn--7-zhc3f
+B; Xn--7-Zhc3f; \u05D07\u05EA; xn--7-zhc3f
+B; \u05D0\u0667\u05EA; ; xn--4db6c6t
+B; xn--4db6c6t; \u05D0\u0667\u05EA; xn--4db6c6t
+B; XN--4DB6C6T; \u05D0\u0667\u05EA; xn--4db6c6t
+B; Xn--4Db6c6t; \u05D0\u0667\u05EA; xn--4db6c6t
+#B; a7\u0667z; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; A7\u0667Z; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; A7\u0667z; [B5]; [B5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; \u05D07\u0667\u05EA; [B4]; [B4] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+T; ஹ\u0BCD\u200D; ; xn--dmc4b
+N; ஹ\u0BCD\u200D; ; xn--dmc4b194h
+B; xn--dmc4b; ஹ\u0BCD; xn--dmc4b
+B; XN--DMC4B; ஹ\u0BCD; xn--dmc4b
+B; Xn--Dmc4b; ஹ\u0BCD; xn--dmc4b
+B; ஹ\u0BCD; ; xn--dmc4b
+#B; xn--dmc4b194h; ஹ\u0BCD\u200D; xn--dmc4b194h # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--DMC4B194H; ஹ\u0BCD\u200D; xn--dmc4b194h # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Dmc4b194h; ஹ\u0BCD\u200D; xn--dmc4b194h # GETUNICODE FAILS ON WINDOWS 8.1
+T; ஹ\u200D; [C2]; xn--dmc
+N; ஹ\u200D; [C2]; [C2]
+B; xn--dmc; ஹ; xn--dmc
+B; XN--DMC; ஹ; xn--dmc
+B; Xn--Dmc; ஹ; xn--dmc
+B; ஹ; ; xn--dmc
+T; \u200D; [C2];
+N; \u200D; [C2]; [C2]
+B; ; ;
+T; ஹ\u0BCD\u200C; ; xn--dmc4b
+N; ஹ\u0BCD\u200C; ; xn--dmc4by94h
+#B; xn--dmc4by94h; ஹ\u0BCD\u200C; xn--dmc4by94h # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--DMC4BY94H; ஹ\u0BCD\u200C; xn--dmc4by94h # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Dmc4by94h; ஹ\u0BCD\u200C; xn--dmc4by94h # GETUNICODE FAILS ON WINDOWS 8.1
+T; ஹ\u200C; [C1]; xn--dmc
+N; ஹ\u200C; [C1]; [C1]
+T; \u200C; [C1];
+N; \u200C; [C1]; [C1]
+T; \u0644\u0670\u200C\u06ED\u06EF; ; xn--ghb2gxqia
+N; \u0644\u0670\u200C\u06ED\u06EF; ; xn--ghb2gxqia7523a
+B; xn--ghb2gxqia; \u0644\u0670\u06ED\u06EF; xn--ghb2gxqia
+B; XN--GHB2GXQIA; \u0644\u0670\u06ED\u06EF; xn--ghb2gxqia
+B; Xn--Ghb2gxqia; \u0644\u0670\u06ED\u06EF; xn--ghb2gxqia
+B; \u0644\u0670\u06ED\u06EF; ; xn--ghb2gxqia
+#B; xn--ghb2gxqia7523a; \u0644\u0670\u200C\u06ED\u06EF; xn--ghb2gxqia7523a # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--GHB2GXQIA7523A; \u0644\u0670\u200C\u06ED\u06EF; xn--ghb2gxqia7523a # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Ghb2gxqia7523a; \u0644\u0670\u200C\u06ED\u06EF; xn--ghb2gxqia7523a # GETUNICODE FAILS ON WINDOWS 8.1
+T; \u0644\u0670\u200C\u06EF; ; xn--ghb2g3q
+N; \u0644\u0670\u200C\u06EF; ; xn--ghb2g3qq34f
+B; xn--ghb2g3q; \u0644\u0670\u06EF; xn--ghb2g3q
+B; XN--GHB2G3Q; \u0644\u0670\u06EF; xn--ghb2g3q
+B; Xn--Ghb2g3q; \u0644\u0670\u06EF; xn--ghb2g3q
+B; \u0644\u0670\u06EF; ; xn--ghb2g3q
+#B; xn--ghb2g3qq34f; \u0644\u0670\u200C\u06EF; xn--ghb2g3qq34f # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--GHB2G3QQ34F; \u0644\u0670\u200C\u06EF; xn--ghb2g3qq34f # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Ghb2g3qq34f; \u0644\u0670\u200C\u06EF; xn--ghb2g3qq34f # GETUNICODE FAILS ON WINDOWS 8.1
+T; \u0644\u200C\u06ED\u06EF; ; xn--ghb25aga
+N; \u0644\u200C\u06ED\u06EF; ; xn--ghb25aga828w
+B; xn--ghb25aga; \u0644\u06ED\u06EF; xn--ghb25aga
+B; XN--GHB25AGA; \u0644\u06ED\u06EF; xn--ghb25aga
+B; Xn--Ghb25aga; \u0644\u06ED\u06EF; xn--ghb25aga
+B; \u0644\u06ED\u06EF; ; xn--ghb25aga
+#B; xn--ghb25aga828w; \u0644\u200C\u06ED\u06EF; xn--ghb25aga828w # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--GHB25AGA828W; \u0644\u200C\u06ED\u06EF; xn--ghb25aga828w # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Ghb25aga828w; \u0644\u200C\u06ED\u06EF; xn--ghb25aga828w # GETUNICODE FAILS ON WINDOWS 8.1
+T; \u0644\u200C\u06EF; ; xn--ghb65a
+N; \u0644\u200C\u06EF; ; xn--ghb65a953d
+B; xn--ghb65a; \u0644\u06EF; xn--ghb65a
+B; XN--GHB65A; \u0644\u06EF; xn--ghb65a
+B; Xn--Ghb65a; \u0644\u06EF; xn--ghb65a
+B; \u0644\u06EF; ; xn--ghb65a
+#B; xn--ghb65a953d; \u0644\u200C\u06EF; xn--ghb65a953d # GETUNICODE FAILS ON WINDOWS 8.1
+#B; XN--GHB65A953D; \u0644\u200C\u06EF; xn--ghb65a953d # GETUNICODE FAILS ON WINDOWS 8.1
+#B; Xn--Ghb65a953d; \u0644\u200C\u06EF; xn--ghb65a953d # GETUNICODE FAILS ON WINDOWS 8.1
+T; \u0644\u0670\u200C\u06ED; [B3 C1]; xn--ghb2gxq
+N; \u0644\u0670\u200C\u06ED; [B3 C1]; [B3 C1]
+B; xn--ghb2gxq; \u0644\u0670\u06ED; xn--ghb2gxq
+B; XN--GHB2GXQ; \u0644\u0670\u06ED; xn--ghb2gxq
+B; Xn--Ghb2gxq; \u0644\u0670\u06ED; xn--ghb2gxq
+B; \u0644\u0670\u06ED; ; xn--ghb2gxq
+T; \u06EF\u200C\u06EF; [C1]; xn--cmba
+N; \u06EF\u200C\u06EF; [C1]; [C1]
+B; xn--cmba; \u06EF\u06EF; xn--cmba
+B; XN--CMBA; \u06EF\u06EF; xn--cmba
+B; Xn--Cmba; \u06EF\u06EF; xn--cmba
+B; \u06EF\u06EF; ; xn--cmba
+T; \u0644\u200C; [B3 C1]; xn--ghb
+N; \u0644\u200C; [B3 C1]; [B3 C1]
+B; xn--ghb; \u0644; xn--ghb
+B; XN--GHB; \u0644; xn--ghb
+B; Xn--Ghb; \u0644; xn--ghb
+B; \u0644; ; xn--ghb
+B; \u063D\uD803\uDDD6\u1039; [P1 V6]; [P1 V6]
+#B; 𝟽\u1A56\uD803\uDE7B; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+T; \uDB40\uDDC8.\u0684\u200C\uD83B\uDD62\u06EE; [P1 V6 C1]; [P1 V6]
+N; \uDB40\uDDC8.\u0684\u200C\uD83B\uDD62\u06EE; [P1 V6 C1]; [P1 V6 C1]
+T; ς\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1]
+N; ς\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1]
+T; Σ\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1]
+N; Σ\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1]
+T; σ\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1]
+N; σ\u069C\u0772\u05BC。𝟎-\uD802\uDE3F\u200C\u1BA3\uFD24。〓-\uD939\uDC84\u0321; [P1 V6 B5 B6 B1]; [P1 V6 B5 B6 B1]
+B; \uFD55\uDA68\uDF38-\uD803\uDE66\uD802\uDC37\uDB41\uDCD8\uDB40\uDD94; [P1 V6 B2 B3]; [P1 V6 B2 B3]
+T; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200Cς。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2]
+N; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200Cς。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2]
+T; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200CΣ。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2]
+N; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200CΣ。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2]
+T; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200Cσ。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2]
+N; \uA953\u0636\uD802\uDE3F\u06C1\u17D2\u200Cσ。\uD803\uDD1F\uD807\uDC05\u067A\u062D; [P1 V5 V6 B5 B2]; [P1 V5 V6 B5 B2]
+B; \uDA4C\uDF36\u0340\u0721\u07DC\uD870\uDC1B; [P1 V6 B5]; [P1 V6 B5]
+B; \uDA4C\uDF36\u0300\u0721\u07DC\uD870\uDC1B; [P1 V6 B5]; [P1 V6 B5]
+B; \u067B; ; xn--0ib
+B; xn--0ib; \u067B; xn--0ib
+B; XN--0IB; \u067B; xn--0ib
+B; Xn--0Ib; \u067B; xn--0ib
+T; \uDB47\uDFA9-6\uDB43\uDF69。𝟪\u200C\u200C-.-; [P1 V6 V3 C1]; [P1 V6 V3]
+N; \uDB47\uDFA9-6\uDB43\uDF69。𝟪\u200C\u200C-.-; [P1 V6 V3 C1]; [P1 V6 V3 C1]
+T; \u0661\u200C\uD83B\uDCD1; [P1 V6 B1 C1]; [P1 V6 B1]
+N; \u0661\u200C\uD83B\uDCD1; [P1 V6 B1 C1]; [P1 V6 B1 C1]
+B; \uD82A\uDCF4.\u069F\u0639.-\u06E2⒎; [P1 V6 V3 B1]; [P1 V6 V3 B1]
+B; \u067F\uD803\uDE6E。-\u063D\uD925\uDF0E。⫍\u06AA\uFD9F-; [P1 V3 V6 B1]; [P1 V3 V6 B1]
+B; \uDB40\uDD40\uA806.🄅\u0643.\uFEE6\uDB40\uDC82\u069E; [P1 V5 V6 B1 B3 B6]; [P1 V5 V6 B1 B3 B6]
+T; ß-⒏\uA802; [P1 V6]; [P1 V6]
+N; ß-⒏\uA802; [P1 V6]; [P1 V6]
+B; SS-⒏\uA802; [P1 V6]; [P1 V6]
+B; ss-⒏\uA802; [P1 V6]; [P1 V6]
+B; Ss-⒏\uA802; [P1 V6]; [P1 V6]
+T; \u066B\uDB40\uDDDFς\uD803\uDE78\uD803\uDE67\u0733。\uFFF4\u075E\uD803\uDE78; [P1 V6 B1]; [P1 V6 B1]
+N; \u066B\uDB40\uDDDFς\uD803\uDE78\uD803\uDE67\u0733。\uFFF4\u075E\uD803\uDE78; [P1 V6 B1]; [P1 V6 B1]
+B; \u066B\uDB40\uDDDFΣ\uD803\uDE78\uD803\uDE67\u0733。\uFFF4\u075E\uD803\uDE78; [P1 V6 B1]; [P1 V6 B1]
+B; \u066B\uDB40\uDDDFσ\uD803\uDE78\uD803\uDE67\u0733。\uFFF4\u075E\uD803\uDE78; [P1 V6 B1]; [P1 V6 B1]
+T; 𝟾\uDB93\uDFAE。\uDB40\uDDA3\u0662\u074F\uD802\uDFDD\uD97C\uDD8C。ς\u1714\u0F84\u07D6-; [P1 V6 V3 B1 B5 B6]; [P1 V6 V3 B1 B5 B6]
+N; 𝟾\uDB93\uDFAE。\uDB40\uDDA3\u0662\u074F\uD802\uDFDD\uD97C\uDD8C。ς\u1714\u0F84\u07D6-; [P1 V6 V3 B1 B5 B6]; [P1 V6 V3 B1 B5 B6]
+B; 𝟾\uDB93\uDFAE。\uDB40\uDDA3\u0662\u074F\uD802\uDFDD\uD97C\uDD8C。Σ\u1714\u0F84\u07D6-; [P1 V6 V3 B1 B5 B6]; [P1 V6 V3 B1 B5 B6]
+B; 𝟾\uDB93\uDFAE。\uDB40\uDDA3\u0662\u074F\uD802\uDFDD\uD97C\uDD8C。σ\u1714\u0F84\u07D6-; [P1 V6 V3 B1 B5 B6]; [P1 V6 V3 B1 B5 B6]
+#B; \uD803\uDE6D; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+T; \u0660\u072B⒊\uD9F3\uDD67\u0626\u0678。\uD803\uDE71\u0662\u200D\u0770\u0E3A\uDB40\uDD9F; [P1 V6 B1 C2]; [P1 V6 B1]
+N; \u0660\u072B⒊\uD9F3\uDD67\u0626\u0678。\uD803\uDE71\u0662\u200D\u0770\u0E3A\uDB40\uDD9F; [P1 V6 B1 C2]; [P1 V6 B1 C2]
+B; \uDB40\uDD12𝟭۵-\uDB43\uDE3F-\uDB40\uDD0E; [P1 V3 V6]; [P1 V3 V6]
+#B; \u031C; [V5]; [V5] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+T; \u0F79⒏\u0647\uA92C\u07D2\uD803\uDED8\u059A。\u200C\u069E; [P1 V5 V6 B1 C1]; [P1 V5 V6 B1]
+N; \u0F79⒏\u0647\uA92C\u07D2\uD803\uDED8\u059A。\u200C\u069E; [P1 V5 V6 B1 C1]; [P1 V5 V6 B1 C1]
+T; \u200D\u17D2\uD9A9\uDD48\u0683℈\u20D9; [P1 V6 B1 C2]; [P1 V5 V6 B1]
+N; \u200D\u17D2\uD9A9\uDD48\u0683℈\u20D9; [P1 V6 B1 C2]; [P1 V6 B1 C2]
+T; \uDB40\uDF21\u200C-; [P1 V3 V6 C1]; [P1 V3 V6]
+N; \uDB40\uDF21\u200C-; [P1 V3 V6 C1]; [P1 V3 V6 C1]
+T; \u17B5\uDA37\uDF60-。\uDB41\uDD97\u200C\u200D; [P1 V3 V6 C1 C2]; [P1 V3 V6]
+N; \u17B5\uDA37\uDF60-。\uDB41\uDD97\u200C\u200D; [P1 V3 V6 C1 C2]; [P1 V3 V6 C1 C2]
+B; 𐅫; ; xn--gy7c
+B; xn--gy7c; 𐅫; xn--gy7c
+B; XN--GY7C; 𐅫; xn--gy7c
+B; Xn--Gy7c; 𐅫; xn--gy7c
+T; \u064A\u0BCD-⁹\uD837\uDEFD\u06C5\uDB40\uDD63.\uD803\uDE77\u200D\u0AC3\uDB40\uDD3B-.\uDB41\uDCAD\u07ED\uDB42\uDC17\u0626𝟕; [P1 V6 V3 B2 B1 C2]; [P1 V6 V3 B2 B1]
+N; \u064A\u0BCD-⁹\uD837\uDEFD\u06C5\uDB40\uDD63.\uD803\uDE77\u200D\u0AC3\uDB40\uDD3B-.\uDB41\uDCAD\u07ED\uDB42\uDC17\u0626𝟕; [P1 V6 V3 B2 B1 C2]; [P1 V6 V3 B2 B1 C2]
+T; \uD803\uDE69\u06AD\u200C\u0309。🄂\uDB40\uDC7A\uA806\uD8DF\uDF43--.\uDB90\uDE73⩆⫝; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6]
+N; \uD803\uDE69\u06AD\u200C\u0309。🄂\uDB40\uDC7A\uA806\uD8DF\uDF43--.\uDB90\uDE73⩆⫝; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 C1]
+T; \u06B7\u200D\u06FA\u0646\u066F.\u0771\uDB41\uDE7C\uD83A\uDD73\u066C\u0B4D.\u0649\u0714\uD802\uDE01\uDB42\uDFC1\uD803\uDE7E; [P1 V6 C2]; [P1 V6]
+N; \u06B7\u200D\u06FA\u0646\u066F.\u0771\uDB41\uDE7C\uD83A\uDD73\u066C\u0B4D.\u0649\u0714\uD802\uDE01\uDB42\uDFC1\uD803\uDE7E; [P1 V6 C2]; [P1 V6 C2]
+T; \uDB43\uDC53\u06B7⒕ς\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1]
+N; \uDB43\uDC53\u06B7⒕ς\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1 C2]
+T; \uDB43\uDC53\u06B7⒕Σ\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1]
+N; \uDB43\uDC53\u06B7⒕Σ\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1 C2]
+T; \uDB43\uDC53\u06B7⒕σ\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1]
+N; \uDB43\uDC53\u06B7⒕σ\u1A7F₆\uDB42\uDE0E。\u094D\u1714\uDB1C\uDE41\u0765\uDA22\uDDA0。\uDB40\uDC6C\u200D\u06BC; [P1 V6 V5 B1 C2]; [P1 V6 V5 B1 C2]
+#T; 𦜲\uABE8\u200D\u0760。\u0F84.ß; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; 𦜲\uABE8\u200D\u0760。\u0F84.ß; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3 C2]
+#T; 𦜲\uABE8\u200D\u0760。\u0F84.SS; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; 𦜲\uABE8\u200D\u0760。\u0F84.SS; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3 C2]
+#T; 𦜲\uABE8\u200D\u0760。\u0F84.ss; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; 𦜲\uABE8\u200D\u0760。\u0F84.ss; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3 C2]
+#T; 𦜲\uABE8\u200D\u0760。\u0F84.Ss; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; 𦜲\uABE8\u200D\u0760。\u0F84.Ss; [V5 B5 B6 B1 B3 C2]; [V5 B5 B6 B1 B3 C2]
+T; \u0FBC\u2DF5\uDB42\uDF68.\u102D\u200C; [P1 V5 V6 C1]; [P1 V5 V6]
+N; \u0FBC\u2DF5\uDB42\uDF68.\u102D\u200C; [P1 V5 V6 C1]; [P1 V5 V6 C1]
+T; ß\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+N; ß\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+B; SS\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+B; ss\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+B; Ss\u0778\uDB41\uDD31\u0F19\u0649; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+T; \uDB40\uDD2E.\u0C4D\u077F\uFBE1\u200D\u200D\u05C4\u200C。\u0F35\u200C\u0BCD\u06AB\u0666; [V5 B1 C2 C1]; [V5 B1]
+N; \uDB40\uDD2E.\u0C4D\u077F\uFBE1\u200D\u200D\u05C4\u200C。\u0F35\u200C\u0BCD\u06AB\u0666; [V5 B1 C2 C1]; [V5 B1 C2 C1]
+T; 𝟣.\uDB41\uDF61\uD98F\uDF52\uDB9D\uDC35\uDB40\uDD6F6-\u0943。\uD90F\uDC57ς\u072D\u1CD4𝟟\uDB40\uDD26; [P1 V6 B1 B5]; [P1 V6 B1 B5]
+N; 𝟣.\uDB41\uDF61\uD98F\uDF52\uDB9D\uDC35\uDB40\uDD6F6-\u0943。\uD90F\uDC57ς\u072D\u1CD4𝟟\uDB40\uDD26; [P1 V6 B1 B5]; [P1 V6 B1 B5]
+B; 𝟣.\uDB41\uDF61\uD98F\uDF52\uDB9D\uDC35\uDB40\uDD6F6-\u0943。\uD90F\uDC57Σ\u072D\u1CD4𝟟\uDB40\uDD26; [P1 V6 B1 B5]; [P1 V6 B1 B5]
+B; 𝟣.\uDB41\uDF61\uD98F\uDF52\uDB9D\uDC35\uDB40\uDD6F6-\u0943。\uD90F\uDC57σ\u072D\u1CD4𝟟\uDB40\uDD26; [P1 V6 B1 B5]; [P1 V6 B1 B5]
+T; \uD83B\uDE79\u200Cς\uDB42\uDD34\u1DD6.\uD83B\uDCB2ς\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1]
+N; \uD83B\uDE79\u200Cς\uDB42\uDD34\u1DD6.\uD83B\uDCB2ς\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1 C1 C2]
+T; \uD83B\uDE79\u200CΣ\uDB42\uDD34\u1DD6.\uD83B\uDCB2Σ\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1]
+N; \uD83B\uDE79\u200CΣ\uDB42\uDD34\u1DD6.\uD83B\uDCB2Σ\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1 C1 C2]
+T; \uD83B\uDE79\u200Cσ\uDB42\uDD34\u1DD6.\uD83B\uDCB2σ\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1]
+N; \uD83B\uDE79\u200Cσ\uDB42\uDD34\u1DD6.\uD83B\uDCB2σ\uD803\uDE79\uDB7A\uDFF8\u06A4\u200D\uD803\uDE7A。\uA806\uD802\uDEF3\u06C1\uD83A\uDEAA; [P1 V6 V5 B2 B3 B1 C1 C2]; [P1 V6 V5 B2 B3 B1 C1 C2]
+T; \u06CA\uA8C4\u066B。\uDB40\uDD77\uD830\uDD80\u200C\u200D\u06E7\uD803\uDE79; [P1 V6 B5 B6 C1 C2]; [P1 V6 B5 B6]
+N; \u06CA\uA8C4\u066B。\uDB40\uDD77\uD830\uDD80\u200C\u200D\u06E7\uD803\uDE79; [P1 V6 B5 B6 C1 C2]; [P1 V6 B5 B6 C1 C2]
+T; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBς\uD950\uDCA2-.\u200C\u0750ς; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 B2 B3]
+N; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBς\uD950\uDCA2-.\u200C\u0750ς; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 C1]
+T; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBΣ\uD950\uDCA2-.\u200C\u0750Σ; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 B2 B3]
+N; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBΣ\uD950\uDCA2-.\u200C\u0750Σ; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 C1]
+T; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBσ\uD950\uDCA2-.\u200C\u0750σ; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 B2 B3]
+N; -𝟴。\uDBD5\uDF18\uD834\uDD86₆\uDA26\uDEEBσ\uD950\uDCA2-.\u200C\u0750σ; [P1 V3 V6 B1 B6 C1]; [P1 V3 V6 B1 B6 C1]
+T; \uDB40\uDDC5\u0DCAß\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+N; \uDB40\uDDC5\u0DCAß\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+B; \uDB40\uDDC5\u0DCASS\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+B; \uDB40\uDDC5\u0DCAss\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+B; \uDB40\uDDC5\u0DCASs\u07DB-\uDB40\uDE46; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+#T; \u0767\uA825。ß-\u200C\u2DF2; [B6 C1]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0767\uA825。ß-\u200C\u2DF2; [B6 C1]; [B6 C1]
+#T; \u0767\uA825。SS-\u200C\u2DF2; [B6 C1]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0767\uA825。SS-\u200C\u2DF2; [B6 C1]; [B6 C1]
+#T; \u0767\uA825。ss-\u200C\u2DF2; [B6 C1]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0767\uA825。ss-\u200C\u2DF2; [B6 C1]; [B6 C1]
+#T; \u0767\uA825。Ss-\u200C\u2DF2; [B6 C1]; [B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0767\uA825。Ss-\u200C\u2DF2; [B6 C1]; [B6 C1]
+T; -\u0758-\u200D꒸。\u07AB.\uD802\uDC9D\uDB40\uDF17\uABED\u1036; [P1 V3 V5 V6 B1 B3 B6 C2]; [P1 V3 V5 V6 B1 B3 B6]
+N; -\u0758-\u200D꒸。\u07AB.\uD802\uDC9D\uDB40\uDF17\uABED\u1036; [P1 V3 V5 V6 B1 B3 B6 C2]; [P1 V3 V5 V6 B1 B3 B6 C2]
+#T; \u200C𝟒\u0625\u200C\u0667.\uD803\uDE6C\u200C\u0F9E; [B1 C1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u200C𝟒\u0625\u200C\u0667.\uD803\uDE6C\u200C\u0F9E; [B1 C1]; [B1 C1]
+#T; \u0671𝟎。\uA8C4\u200D\uD834\uDD81\u17C9; [V5 B1]; [V5 B1 B3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0671𝟎。\uA8C4\u200D\uD834\uDD81\u17C9; [V5 B1]; [V5 B1]
+B; \u062D\uD890\uDFB8; [P1 V6 B2 B3]; [P1 V6 B2 B3]
+B; \uDAAC\uDE2C; [P1 V6]; [P1 V6]
+T; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8ß\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3]
+N; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8ß\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3]
+B; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8SS\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3]
+B; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8ss\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3]
+B; 𝟥\uD83A\uDE8D\u0F84\uD8D5\uDE30⁰。\u06C8Ss\uD834\uDD69; [P1 V6 B1 B2 B3]; [P1 V6 B1 B2 B3]
+T; \u0661ß。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+N; \u0661ß。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+B; \u0661SS。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+B; \u0661ss。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+B; \u0661Ss。\u1A60\uDB2A\uDE74\uD803\uDE7B; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+T; ς\uD803\uDE73\u0635⒓; [P1 V6 B5]; [P1 V6 B5]
+N; ς\uD803\uDE73\u0635⒓; [P1 V6 B5]; [P1 V6 B5]
+B; Σ\uD803\uDE73\u0635⒓; [P1 V6 B5]; [P1 V6 B5]
+B; σ\uD803\uDE73\u0635⒓; [P1 V6 B5]; [P1 V6 B5]
+T; \uD825\uDF85㊲\uDBEF\uDE82\u200D。\uDB40\uDD36\u2062¹; [P1 V6 C2]; [P1 V6]
+N; \uD825\uDF85㊲\uDBEF\uDE82\u200D。\uDB40\uDD36\u2062¹; [P1 V6 C2]; [P1 V6 C2]
+#T; \u200D\uA953.\uFB2A.-𝟨\u200C-; [V3 B1 C2 C1]; [V5 V3 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u200D\uA953.\uFB2A.-𝟨\u200C-; [V3 B1 C2 C1]; [V3 B1 C2 C1]
+#T; \u200D\uA953.\u05E9\u05C1.-𝟨\u200C-; [V3 B1 C2 C1]; [V5 V3 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u200D\uA953.\u05E9\u05C1.-𝟨\u200C-; [V3 B1 C2 C1]; [V3 B1 C2 C1]
+T; \u06B2\u200C-.\u0D4D。🄇-\uDB42\uDED8\u1DC9\uDBA9\uDE29\uDB42\uDFC5\u20E7; [P1 V3 V5 V6 B3 B1 B6 C1]; [P1 V3 V5 V6 B3 B1 B6]
+N; \u06B2\u200C-.\u0D4D。🄇-\uDB42\uDED8\u1DC9\uDBA9\uDE29\uDB42\uDFC5\u20E7; [P1 V3 V5 V6 B3 B1 B6 C1]; [P1 V3 V5 V6 B3 B1 B6 C1]
+#B; -; [V3]; [V3] # GETUNICODE DOES NOT FAIL ON WINDOWS 8.1
+B; \u0680\u0DCA\u1A60\u0616\uDB42\uDE69。\u1039; [P1 V6 V5 B3 B1 B6]; [P1 V6 V5 B3 B1 B6]
+T; -\u0683\u1BAA\u062B𝟦.\uFE25\u200D\uD802\uDC99\u0777𝟣.\uDA4A\uDE06\u0760; [P1 V3 V5 V6 B1 B5 B6 C2]; [P1 V3 V5 V6 B1 B5 B6]
+N; -\u0683\u1BAA\u062B𝟦.\uFE25\u200D\uD802\uDC99\u0777𝟣.\uDA4A\uDE06\u0760; [P1 V3 V5 V6 B1 B5 B6 C2]; [P1 V3 V5 V6 B1 B5 B6 C2]
+B; \uD8A8\uDD31; [P1 V6]; [P1 V6]
+T; \u0837。\u0680\u031E\u0601ß⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4]
+N; \u0837。\u0680\u031E\u0601ß⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4]
+B; \u0837。\u0680\u031E\u0601SS⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4]
+B; \u0837。\u0680\u031E\u0601ss⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4]
+B; \u0837。\u0680\u031E\u0601Ss⁸; [P1 V6 B2 B4]; [P1 V6 B2 B4]
+#B; -。\u06A97; [V3 B1]; [V3 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+T; \u200D\uDAC9\uDFF8\u07D7𝟼\uDB40\uDDE8; [P1 V6 B1 C2]; [P1 V6 B5]
+N; \u200D\uDAC9\uDFF8\u07D7𝟼\uDB40\uDDE8; [P1 V6 B1 C2]; [P1 V6 B1 C2]
+B; \u1CED\uD803\uDE61\u0DCA\uD802\uDC15\u0CC6.𝟙\u0DCA。\uA67D\u0AC3\uD83A\uDF53; [P1 V5 V6 B1]; [P1 V5 V6 B1]
+T; \u077B\u0D43-\u200D.\uD802\uDC25\uDB43\uDFAC\u06BC\u200C\uD803\uDE68.𝟶\u071B𝟲; [P1 V6 B3 B1 C2 C1]; [P1 V3 V6 B3 B1]
+N; \u077B\u0D43-\u200D.\uD802\uDC25\uDB43\uDFAC\u06BC\u200C\uD803\uDE68.𝟶\u071B𝟲; [P1 V6 B3 B1 C2 C1]; [P1 V6 B3 B1 C2 C1]
+T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200Dς\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1]
+N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200Dς\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2]
+T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200Dς\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1]
+N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200Dς\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2]
+T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200DΣ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1]
+N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200DΣ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2]
+T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200Dσ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1]
+N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\u0C4D\uA8EF\u200Dσ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2]
+T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200DΣ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1]
+N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200DΣ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2]
+T; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200Dσ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1]
+N; \u200D\uD803\uDE6B囓\u06A8。\u0F39\u0723\uA8EF\u0C4D\u200Dσ\u0BCD.\uDB40\uDCA1\u200D\uD802\uDCB2䷠\u0718; [P1 V5 V6 B1 C2]; [P1 V5 V6 B1 C2]
+T; 𝟚ß\u200D\u0332; [C2]; xn--2ss-7ic
+N; 𝟚ß\u200D\u0332; [C2]; [C2]
+T; 𝟚SS\u200D\u0332; [C2]; xn--2ss-7ic
+N; 𝟚SS\u200D\u0332; [C2]; [C2]
+T; 𝟚ss\u200D\u0332; [C2]; xn--2ss-7ic
+N; 𝟚ss\u200D\u0332; [C2]; [C2]
+T; 𝟚Ss\u200D\u0332; [C2]; xn--2ss-7ic
+N; 𝟚Ss\u200D\u0332; [C2]; [C2]
+B; xn--2ss-7ic; 2ss\u0332; xn--2ss-7ic
+B; XN--2SS-7IC; 2ss\u0332; xn--2ss-7ic
+B; Xn--2Ss-7Ic; 2ss\u0332; xn--2ss-7ic
+B; 2ss\u0332; ; xn--2ss-7ic
+B; 2SS\u0332; 2ss\u0332; xn--2ss-7ic
+B; 2Ss\u0332; 2ss\u0332; xn--2ss-7ic
+T; -\u200D.\u200D; [V3 C2]; [V3]
+N; -\u200D.\u200D; [V3 C2]; [V3 C2]
+T; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200Cß⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 B6]
+N; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200Cß⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 C1]
+T; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200CSS⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 B6]
+N; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200CSS⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 C1]
+T; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200Css⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 B6]
+N; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200Css⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 C1]
+T; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200CSs⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 B6]
+N; \u2DEC\uD83A\uDFCD\uD803\uDE66.\u200CSs⒕-; [P1 V5 V6 V3 B1 C1]; [P1 V5 V6 V3 B1 C1]
+T; ⒌\u033A--.8\u09CD\u200D𝟴\u1BA5.\uD803\uDE7B\u077A\u0626\u0644𝟪\u0729; [P1 V2 V3 V6 B1]; [P1 V2 V3 V6 B1]
+N; ⒌\u033A--.8\u09CD\u200D𝟴\u1BA5.\uD803\uDE7B\u077A\u0626\u0644𝟪\u0729; [P1 V2 V3 V6 B1]; [P1 V2 V3 V6 B1]
+T; \uDABF\uDD9A𝟝\uD83B\uDEBA。𝟑\uD803\uDD2D\u200C\u077F.₧\uD8ED\uDC31\u200C\u0663│\u06A6\uD83B\uDC45; [P1 V6 B5 B6 B1 C1]; [P1 V6 B5 B6 B1]
+N; \uDABF\uDD9A𝟝\uD83B\uDEBA。𝟑\uD803\uDD2D\u200C\u077F.₧\uD8ED\uDC31\u200C\u0663│\u06A6\uD83B\uDC45; [P1 V6 B5 B6 B1 C1]; [P1 V6 B5 B6 B1 C1]
+B; \u0726\u0757\uDB42\uDC87\uDB43\uDF9A\uDA7B\uDCF4\u0639; [P1 V6 B2]; [P1 V6 B2]
+T; \uDB40\uDD0D\u200C。-; [V3 C1]; [V3]
+N; \uDB40\uDD0D\u200C。-; [V3 C1]; [V3 C1]
+#T; \u200D\u06C7.\uD803\uDE72\u2CEF; [B1 C2]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u200D\u06C7.\uD803\uDE72\u2CEF; [B1 C2]; [B1 C2]
+T; \uD9F5\uDDEC\u1A6A\u077F\u200Cß\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5]
+N; \uD9F5\uDDEC\u1A6A\u077F\u200Cß\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5 C1]
+T; \uD9F5\uDDEC\u1A6A\u077F\u200CSS\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5]
+N; \uD9F5\uDDEC\u1A6A\u077F\u200CSS\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5 C1]
+T; \uD9F5\uDDEC\u1A6A\u077F\u200Css\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5]
+N; \uD9F5\uDDEC\u1A6A\u077F\u200Css\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5 C1]
+T; \uD9F5\uDDEC\u1A6A\u077F\u200CSs\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5]
+N; \uD9F5\uDDEC\u1A6A\u077F\u200CSs\u07D6𝟔; [P1 V6 B5 C1]; [P1 V6 B5 C1]
+T; ß\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1]
+N; ß\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1 C2 C1]
+T; SS\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1]
+N; SS\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1 C2 C1]
+T; ss\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1]
+N; ss\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1 C2 C1]
+T; Ss\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1]
+N; Ss\uD802\uDE0D-\u200D\uD83B\uDC71\u05AA\u200C。\uD802\uDE3F\uDB40\uDD17\u0768; [P1 V6 V5 B5 B6 B1 C2 C1]; [P1 V6 V5 B5 B6 B1 C2 C1]
+T; \uDB40\uDD3F\u067D\u0615\uA80B\u200C\u0886。\uD89E\uDF43𝟿\uD803\uDE61\uD898\uDD46-。\u062D\u200C\uA8ED\uDB41\uDCD4\u200C\u1732; [P1 V6 V3 B5 B6 B3 C1]; [P1 V6 V3 B5 B6 B3]
+N; \uDB40\uDD3F\u067D\u0615\uA80B\u200C\u0886。\uD89E\uDF43𝟿\uD803\uDE61\uD898\uDD46-。\u062D\u200C\uA8ED\uDB41\uDCD4\u200C\u1732; [P1 V6 V3 B5 B6 B3 C1]; [P1 V6 V3 B5 B6 B3 C1]
+T; \u068Eß\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1]
+N; \u068Eß\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2]
+T; \u068Eß\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1]
+N; \u068Eß\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2]
+T; \u068ESS\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1]
+N; \u068ESS\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2]
+T; \u068Ess\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1]
+N; \u068Ess\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2]
+T; \u068ESs\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1]
+N; \u068ESs\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\u05E3\u05BC.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2]
+T; \u068ESS\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1]
+N; \u068ESS\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2]
+T; \u068Ess\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1]
+N; \u068Ess\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2]
+T; \u068ESs\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 V3 B2 B3 B1]
+N; \u068ESs\u06DC.\u200D\uDB41\uDFD9\u068E\u07E7\uFB43.\u06AB\uFE05-\u200D\u200D; [P1 V6 B2 B3 B1 C2]; [P1 V6 B2 B3 B1 C2]
+T; \uD809\uDF88\uD802\uDE0E\uD83B\uDE51\uD802\uDD7A\u200D; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6]
+N; \uD809\uDF88\uD802\uDE0E\uD83B\uDE51\uD802\uDD7A\u200D; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2]
+T; \uDB25\uDFCD1\u0FA9\u200D\uD803\uDE7E₁。\u200C\u200D; [P1 V6 B5 B1 C2 C1]; [P1 V6 B5]
+N; \uDB25\uDFCD1\u0FA9\u200D\uD803\uDE7E₁。\u200C\u200D; [P1 V6 B5 B1 C2 C1]; [P1 V6 B5 B1 C2 C1]
+B; \u07E9\uD802\uDCC4\u06D1\uDB41\uDE16\u068E; [P1 V6]; [P1 V6]
+B; \uD802\uDDF2.---\u06A5\u07D2; [P1 V6 V3 B1]; [P1 V6 V3 B1]
+T; \u0682\u0B4D-\uD803\uDE73\uD803\uDE64⛛.\uD803\uDE62\uAA2D\u0723\u200C\u0758\uD823\uDF9A; [P1 V6 B3 B1]; [P1 V6 B3 B1]
+N; \u0682\u0B4D-\uD803\uDE73\uD803\uDE64⛛.\uD803\uDE62\uAA2D\u0723\u200C\u0758\uD823\uDF9A; [P1 V6 B3 B1]; [P1 V6 B3 B1]
+#T; -❵\u200C\u0649; [V3 B1 C1]; [V3 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; -❵\u200C\u0649; [V3 B1 C1]; [V3 B1 C1]
+#T; 🄈\u200C\u0665-。\u1DD9⬚\u06A9; [P1 V3 V6 V5 B1 C1]; [P1 V3 V6 V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; 🄈\u200C\u0665-。\u1DD9⬚\u06A9; [P1 V3 V6 V5 B1 C1]; [P1 V3 V6 V5 B1 C1]
+T; ß\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6]
+N; ß\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2]
+T; SS\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6]
+N; SS\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2]
+T; ss\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6]
+N; ss\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2]
+T; Ss\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6]
+N; Ss\u0CBF\u200D\u0603\u0727; [P1 V6 B5 B6 C2]; [P1 V6 B5 B6 C2]
+B; -\uAAB7\uDB43\uDDE2\uD803\uDDEC\uA806; [P1 V3 V6 B1]; [P1 V3 V6 B1]
+#T; \u0C4Dς\u0DCA\u06B0; [V5 B1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u0C4Dς\u0DCA\u06B0; [V5 B1]; [V5 B1]
+#B; \u0C4DΣ\u0DCA\u06B0; [V5 B1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#B; \u0C4Dσ\u0DCA\u06B0; [V5 B1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+B; 3\uD83A\uDE3B\u0623\u0DD6\uD803\uDE7B-。\uD803\uDE78\uD803\uDE7C\u094D۶-\uD802\uDD90; [P1 V3 V6 B1]; [P1 V3 V6 B1]
+T; \u0770\uD803\uDE78\u200C\u200C\u200C; [B3 C1]; xn--0pb6875k
+N; \u0770\uD803\uDE78\u200C\u200C\u200C; [B3 C1]; [B3 C1]
+B; xn--0pb6875k; \u0770\uD803\uDE78; xn--0pb6875k
+B; XN--0PB6875K; \u0770\uD803\uDE78; xn--0pb6875k
+B; Xn--0Pb6875k; \u0770\uD803\uDE78; xn--0pb6875k
+B; \u0770\uD803\uDE78; ; xn--0pb6875k
+B; \u0717\uD802\uDE0C.\uD803\uDE7D\u067C\u0311\uA9B8.\uDB42\uDEDD\u06C5\uD803\uDED7; [P1 V6 B1]; [P1 V6 B1]
+B; \uD803\uDE78。\uD803\uDEA9\u094D; [P1 V6 B1]; [P1 V6 B1]
+T; \uDBF5\uDEF5\uA806\uD90E\uDC87ς\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6]
+N; \uDBF5\uDEF5\uA806\uD90E\uDC87ς\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6 C2]
+T; \uDBF5\uDEF5\uA806\uD90E\uDC87Σ\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6]
+N; \uDBF5\uDEF5\uA806\uD90E\uDC87Σ\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6 C2]
+T; \uDBF5\uDEF5\uA806\uD90E\uDC87σ\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6]
+N; \uDBF5\uDEF5\uA806\uD90E\uDC87σ\u200D\uDB40\uDDA7; [P1 V6 C2]; [P1 V6 C2]
+T; ß\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200Cß\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2]
+N; ß\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200Cß\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2 C1]
+T; SS\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200CSS\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2]
+N; SS\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200CSS\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2 C1]
+T; ss\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200Css\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2]
+N; ss\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200Css\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2 C1]
+T; Ss\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200CSs\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2]
+N; Ss\u0687\u07DE\u06A2.\uD802\uDDF1\u06AC-\u200CSs\uDAFA\uDFAE𝟺; [P1 V6 B5 B6 B2 C1]; [P1 V6 B5 B6 B2 C1]
+T; \uD803\uDE7A\u0F84\uD8AE\uDCCA\u200D∤\u200C-; [P1 V3 V6 B1 C2 C1]; [P1 V3 V6 B1]
+N; \uD803\uDE7A\u0F84\uD8AE\uDCCA\u200D∤\u200C-; [P1 V3 V6 B1 C2 C1]; [P1 V3 V6 B1 C2 C1]
+T; ß\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+N; ß\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+B; SS\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+B; ss\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+B; Ss\uDB40\uDC5B\uD83A\uDEC7\u063A; [P1 V6 B5 B6]; [P1 V6 B5 B6]
+B; \uDB40\uDC64\u1039\u0B4D-; [P1 V3 V6]; [P1 V3 V6]
+#B; \u0954\uD803\uDE68☞; [V5 B1]; [V5 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+T; \u17B5ς; [P1 V6]; [P1 V6]
+N; \u17B5ς; [P1 V6]; [P1 V6]
+B; \u17B5Σ; [P1 V6]; [P1 V6]
+B; \u17B5σ; [P1 V6]; [P1 V6]
+T; \uD803\uDCC8\u07BE.ς\u200D\u032F.\u0E48\uD9B5\uDFCBς-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B1]
+N; \uD803\uDCC8\u07BE.ς\u200D\u032F.\u0E48\uD9B5\uDFCBς-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B6 B1 C2]
+T; \uD803\uDCC8\u07BE.Σ\u200D\u032F.\u0E48\uD9B5\uDFCBΣ-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B1]
+N; \uD803\uDCC8\u07BE.Σ\u200D\u032F.\u0E48\uD9B5\uDFCBΣ-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B6 B1 C2]
+T; \uD803\uDCC8\u07BE.σ\u200D\u032F.\u0E48\uD9B5\uDFCBσ-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B1]
+N; \uD803\uDCC8\u07BE.σ\u200D\u032F.\u0E48\uD9B5\uDFCBσ-; [P1 V6 V3 V5 B6 B1 C2]; [P1 V6 V3 V5 B6 B1 C2]
+T; \uD83A\uDD46\u0315ß\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2]
+N; \uD83A\uDD46\u0315ß\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2 C1]
+T; \uD83A\uDD46\u0315SS\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2]
+N; \uD83A\uDD46\u0315SS\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2 C1]
+T; \uD83A\uDD46\u0315ss\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2]
+N; \uD83A\uDD46\u0315ss\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2 C1]
+T; \uD83A\uDD46\u0315Ss\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2]
+N; \uD83A\uDD46\u0315Ss\u200C⓽-\uD83B\uDF9E; [P1 V6 B2 C1]; [P1 V6 B2 C1]
+#B; \u0666; [B1]; [B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+#T; \u06A3ς\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u06A3ς\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1 C2]
+#T; \u06A3Σ\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u06A3Σ\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1 C2]
+#T; \u06A3σ\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+N; \u06A3σ\u07E4。۹\uD803\uDE73\uD804\uDCB91\u200D; [B2 B1 C2]; [B2 B1 C2]
+#B; \u0342.\u0663; [V5 B1 B3 B6]; [V5 B1 B3 B6] # GETASCII DOES NOT FAIL ON WINDOWS 8.1
+T; \u0D4D\u200C\u200D\uD8A8\uDF73.\uDB40\uDD44\u0764\uD803\uDE66\uD8AD\uDC4A\uD83A\uDFAE𥐿.-🄇\uD803\uDE62\u200D; [P1 V5 V6 V3 B1 B2 B3 C2]; [P1 V5 V6 V3 B1 B2 B3]
+N; \u0D4D\u200C\u200D\uD8A8\uDF73.\uDB40\uDD44\u0764\uD803\uDE66\uD8AD\uDC4A\uD83A\uDFAE𥐿.-🄇\uD803\uDE62\u200D; [P1 V5 V6 V3 B1 B2 B3 C2]; [P1 V5 V6 V3 B1 B2 B3 C2]
+T; \u200C\uD803\uDE7A。\u0660²\uD834\uDD74\uDAD0\uDE5E\uD803\uDE79。\u200D\u06619; [P1 V6 B1 C1 C2]; [P1 V6 B1]
+N; \u200C\uD803\uDE7A。\u0660²\uD834\uDD74\uDAD0\uDE5E\uD803\uDE79。\u200D\u06619; [P1 V6 B1 C1 C2]; [P1 V6 B1 C1 C2]
diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/ReadMe.txt b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/ReadMe.txt
new file mode 100644
index 000000000000..b3efb0659f88
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/ReadMe.txt
@@ -0,0 +1,5 @@
+This directory contains data files for version 6.0 of
+UTS #46: Unicode IDNA Compatibility Processing,
+http://www.unicode.org/reports/tr46/tr46-5.html .
+
+Retrieved from http://www.unicode.org/Public/idna/6.3.0/ on 4 March 2014
\ No newline at end of file
diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/Unicode_6_0_IdnaTest.cs b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/Unicode_6_0_IdnaTest.cs
new file mode 100644
index 000000000000..3332661020ab
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/IdnMapping/Data/Unicode_6_0/Unicode_6_0_IdnaTest.cs
@@ -0,0 +1,88 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Xunit;
+using System;
+using System.Text;
+
+namespace System.Globalization.Extensions.Tests
+{
+ ///
+ /// Class to read data obtained from http://www.unicode.org/Public/idna. For more information read the information
+ /// contained in Data\6.0\IdnaTest.txt
+ ///
+ /// The structure of the data set is a semicolon deliminated list with the following columns:
+ ///
+ /// Column 1: type - T for transitional, N for nontransitional, B for both
+ /// Column 2: source - the source string to be tested
+ /// Column 3: toUnicode - the result of applying toUnicode to the source, using the specified type
+ /// Column 4: toASCII - the result of applying toASCII to the source, using nontransitional
+ ///
+ /// If the value of toUnicode or toASCII is the same as source, the column will be blank.
+ ///
+ public class Unicode_6_0_IdnaTest : IConformanceIdnaTest
+ {
+ public IdnType Type { get; set; }
+ public string Source { get; set; }
+ public ConformanceIdnaTestResult GetUnicodeResult { get; set; }
+ public ConformanceIdnaTestResult GetASCIIResult { get; set; }
+ public int LineNumber { get; set; }
+
+ public Unicode_6_0_IdnaTest(string line, int lineNumber)
+ {
+ var split = line.Split(';');
+
+ Type = ConvertStringToType(split[0].Trim());
+ Source = EscapedToLiteralString(split[1], lineNumber);
+ GetUnicodeResult = new ConformanceIdnaTestResult(EscapedToLiteralString(split[2], lineNumber), Source);
+ GetASCIIResult = new ConformanceIdnaTestResult(EscapedToLiteralString(split[3], lineNumber), GetUnicodeResult.Value);
+ LineNumber = lineNumber;
+ }
+
+ private static IdnType ConvertStringToType(string idnType)
+ {
+ switch (idnType)
+ {
+ case "T":
+ return IdnType.Transitional;
+ case "N":
+ return IdnType.Nontransitional;
+ case "B":
+ return IdnType.Both;
+ default:
+ throw new ArgumentOutOfRangeException("idnType", "Unknown idnType");
+ }
+ }
+
+ ///
+ /// This will convert strings with escaped sequences to literal characters. The input string is
+ /// expected to have escaped sequences in the form of '\uXXXX'.
+ ///
+ /// Example: "a\u0020b" will be converted to 'a b'.
+ ///
+ private static string EscapedToLiteralString(string escaped, int lineNumber)
+ {
+ var sb = new StringBuilder();
+
+ for (int i = 0; i < escaped.Length; i++)
+ {
+ if (i + 1 < escaped.Length && escaped[i] == '\\' && escaped[i + 1] == 'u')
+ {
+ // Verify that the escaped sequence is not malformed
+ if (i + 5 >= escaped.Length)
+ Assert.False(true, "There was a problem converting to literal string on Line " + lineNumber);
+
+ var codepoint = Convert.ToInt32(escaped.Substring(i + 2, 4), 16);
+ sb.Append((char)codepoint);
+ i += 5;
+ }
+ else
+ {
+ sb.Append(escaped[i]);
+ }
+ }
+
+ return sb.ToString().Trim();
+ }
+ }
+}
diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/GetAsciiTests.cs b/src/System.Globalization.Extensions/tests/IdnMapping/GetAsciiTests.cs
new file mode 100644
index 000000000000..1764673dc7d1
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/IdnMapping/GetAsciiTests.cs
@@ -0,0 +1,126 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Xunit;
+using System;
+using System.Globalization;
+
+namespace System.Globalization.Extensions.Tests
+{
+ public class GetAsciiTests
+ {
+ [Fact]
+ public void SimpleValidationTests()
+ {
+ var idn = new IdnMapping();
+
+ Assert.Equal("xn--yda", idn.GetAscii("\u0101"));
+ Assert.Equal("xn--yda", idn.GetAscii("\u0101", 0));
+ Assert.Equal("xn--yda", idn.GetAscii("\u0101", 0, 1));
+
+ Assert.Equal("xn--aa-cla", idn.GetAscii("\u0101\u0061\u0041"));
+ Assert.Equal("xn--ab-dla", idn.GetAscii("\u0061\u0101\u0062"));
+ Assert.Equal("xn--ab-ela", idn.GetAscii("\u0061\u0062\u0101"));
+ }
+
+ [Fact]
+ public void SurrogatePairsConsecutive()
+ {
+ var idn = new IdnMapping();
+
+ Assert.Equal("xn--097ccd", idn.GetAscii("\uD800\uDF00\uD800\uDF01\uD800\uDF02"));
+ }
+
+ [Fact]
+ public void SurrogatePairsSeparatedByAscii()
+ {
+ var idn = new IdnMapping();
+
+ Assert.Equal("xn--ab-ic6nfag", idn.GetAscii("\uD800\uDF00\u0061\uD800\uDF01\u0042\uD800\uDF02"));
+ }
+
+ [Fact]
+ public void SurrogatePairsSeparatedByNonAscii()
+ {
+ var idn = new IdnMapping();
+
+ Assert.Equal("xn--yda263v6b6kfag", idn.GetAscii("\uD800\uDF00\u0101\uD800\uDF01\u305D\uD800\uDF02"));
+ }
+
+ [Fact]
+ public void SurrogatePairsSeparatedByAsciiAndNonAscii()
+ {
+ var idn = new IdnMapping();
+
+ Assert.Equal("xn--a-nha4529qfag", idn.GetAscii("\uD800\uDF00\u0101\uD800\uDF01\u0061\uD800\uDF02"));
+ }
+
+ [Fact]
+ public void FullyQualifiedDomainNameVsIndividualLabels()
+ {
+ var idn = new IdnMapping();
+
+ // ASCII only code points
+ Assert.Equal("\u0061\u0062\u0063", idn.GetAscii("\u0061\u0062\u0063"));
+ // non-ASCII only code points
+ Assert.Equal("xn--d9juau41awczczp", idn.GetAscii("\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067"));
+ // ASCII and non-ASCII code points
+ Assert.Equal("xn--de-jg4avhby1noc0d", idn.GetAscii("\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0"));
+ // Fully Qualified Domain Name
+ Assert.Equal("abc.xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0"));
+ }
+
+ [Fact]
+ public void EmbeddedNulls()
+ {
+ var idn = new IdnMapping();
+
+ Assert.Throws(() => idn.GetAscii("\u0101\u0000"));
+ Assert.Throws(() => idn.GetAscii("\u0101\u0000", 0));
+ Assert.Throws(() => idn.GetAscii("\u0101\u0000", 0, 2));
+ Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101"));
+ Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101", 0));
+ Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101", 0, 3));
+ Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101\u0000"));
+ Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101\u0000", 0));
+ Assert.Throws(() => idn.GetAscii("\u0101\u0000\u0101\u0000", 0, 4));
+ }
+
+ ///
+ /// Embedded domain name conversion (NLS+ only) (Priority 1)
+ ///
+ /// Per the spec [7], “The index and count parameters (when provided) allow the
+ /// conversion to be done on a larger string where the domain name is embedded
+ /// (such as a URI or IRI). The output string is only the converted FQDN or
+ /// label, not the whole input string (if the input string contains more
+ /// character than the substring to convert).”
+ ///
+ /// Fully Qualified Domain Name (Label1.Label2.Label3)
+ ///
+ ///
+ /// An FQDN/label can NOT begin with a label separator, but may end
+ /// with one. This will cause an ArgumentException.
+ ///
+ [Fact]
+ public void EmbeddedDomainNameConversion()
+ {
+ var idn = new IdnMapping();
+
+ Assert.Equal("abc.xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 0));
+ Assert.Equal("abc.xn--d9juau41awczczp", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 0, 11));
+ Assert.Equal("abc.xn--d9juau41awczczp.", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 0, 12));
+ Assert.Equal("abc.xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 0, 21));
+ Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 3));
+ Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 3, 8));
+ Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 3, 9));
+ Assert.Equal("xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 4));
+ Assert.Equal("xn--d9juau41awczczp", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 4, 7));
+ Assert.Equal("xn--d9juau41awczczp.", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 4, 8));
+ Assert.Equal("xn--d9juau41awczczp.xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 4, 17));
+ Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 11));
+ Assert.Throws(() => idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 11, 10));
+ Assert.Equal("xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 12));
+ Assert.Equal("xn--de-jg4avhby1noc0d", idn.GetAscii("\u0061\u0062\u0063.\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067.\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", 12, 9));
+ }
+ }
+}
diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/IdnaConformanceTests.cs b/src/System.Globalization.Extensions/tests/IdnMapping/IdnaConformanceTests.cs
new file mode 100644
index 000000000000..bf36ef3829a6
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/IdnMapping/IdnaConformanceTests.cs
@@ -0,0 +1,119 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Xunit;
+using System;
+using System.Collections.Generic;
+
+namespace System.Globalization.Extensions.Tests
+{
+ ///
+ /// This suite of tests enumerate a set of input and outputs provided by the Unicode consortium.
+ /// For more information, see the files within Data\[Unicode version]. This tests positive
+ /// and negative test cases for both GetASCII and GetUnicode methods.
+ ///
+ public class IdnaConformanceTests
+ {
+ ///
+ /// Tests whether the expected object is equal to the actual object as determined by
+ /// the supplied comparer and throws an exception if it is not.
+ ///
+ /// Expected object.
+ /// Actual object.
+ /// Comparer to be used to determine equality of objects.
+ /// Message to display upon failure.
+ public static void CompareResult(T expected, T actual, IComparer comparer, string message)
+ {
+ if (comparer.Compare(expected, actual) != 0)
+ {
+ Assert.False(true, string.Format(@"Expected: <{1}>. Actual:<{2}>. {0}", message, expected, actual));
+ }
+ }
+
+ ///
+ /// Tests positive cases for GetAscii.
+ ///
+ [Fact]
+ public void TestAsciiPositive()
+ {
+ foreach (var entry in Factory.GetDataset())
+ {
+ if (entry.GetASCIIResult.Success)
+ {
+ var map = new System.Globalization.IdnMapping();
+ var asciiResult = map.GetAscii(entry.Source);
+
+ CompareResult(entry.GetASCIIResult.Value, asciiResult, StringComparer.OrdinalIgnoreCase, "Error on line number " + entry.LineNumber);
+ }
+ }
+ }
+
+ ///
+ /// Tests positive cases for GetUnicode. Windows fails by design on some entries that should pass. The recommendation is to take the source input
+ /// for this if needed.
+ ///
+ /// There are some others that failed which have been commented out and marked in the dataset as "GETUNICODE DOES FAILS ON WINDOWS 8.1"
+ ///
+ [Fact]
+ public void TestUnicodePositive()
+ {
+ foreach (var entry in Factory.GetDataset())
+ {
+ if (entry.GetUnicodeResult.Success)
+ {
+ try
+ {
+ var map = new System.Globalization.IdnMapping { UseStd3AsciiRules = true, AllowUnassigned = true };
+ var unicodeResult = map.GetUnicode(entry.Source);
+
+ CompareResult(entry.GetUnicodeResult.Value, unicodeResult, StringComparer.OrdinalIgnoreCase, "Error on line number " + entry.LineNumber);
+ }
+ catch (ArgumentException)
+ {
+ CompareResult(entry.GetUnicodeResult.Value, entry.Source, StringComparer.OrdinalIgnoreCase, "Error on line number " + entry.LineNumber);
+ }
+ }
+ }
+ }
+
+ ///
+ /// Tests negative cases for GetAscii.
+ ///
+ ///
+ /// There are some failures on Windows 8.1 that have been commented out
+ /// from the 6.0\IdnaTest.txt. To find them, search for "GETASCII DOES NOT FAIL ON WINDOWS 8.1"
+ ///
+ [Fact]
+ public void TestAsciiNegative()
+ {
+ foreach (var entry in Factory.GetDataset())
+ {
+ if (!entry.GetASCIIResult.Success)
+ {
+ var map = new System.Globalization.IdnMapping();
+ Assert.Throws(() => map.GetAscii(entry.Source));
+ }
+ }
+ }
+
+ ///
+ /// Tests negative cases for GetUnicode.
+ ///
+ ///
+ /// There are some failures on Windows 8.1 that have been commented out
+ /// from the 6.0\IdnaTest.txt. To find them, search for "GETUNICODE DOES NOT FAIL ON WINDOWS 8.1"
+ ///
+ [Fact]
+ public void TestUnicodeNegative()
+ {
+ foreach (var entry in Factory.GetDataset())
+ {
+ if (!entry.GetUnicodeResult.Success)
+ {
+ var map = new System.Globalization.IdnMapping();
+ Assert.Throws(() => map.GetUnicode(entry.Source));
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/System.Globalization.Extensions/tests/IdnMapping/UseStd3AsciiRules.cs b/src/System.Globalization.Extensions/tests/IdnMapping/UseStd3AsciiRules.cs
new file mode 100644
index 000000000000..95c45e062aca
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/IdnMapping/UseStd3AsciiRules.cs
@@ -0,0 +1,104 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Xunit;
+using System;
+using System.Globalization;
+
+namespace System.Globalization.Extensions.Tests
+{
+ ///
+ /// According to the ToASCII algorithm, if the UseSTD3ASCIIRules flag is set,
+ /// then perform these checks:
+ ///
+ /// (a) Verify the absence of non-LDH ASCII code points; that is, the absence
+ /// of 0..2C, 2E..2F, 3A..40, 5B..60, and 7B..7F.
+ ///
+ /// (b) Verify the absence of leading and trailing hyphen-minus; that is, the
+ /// absence of U+002D at the beginning and end of the sequence.
+ ///
+ /// By default this flag should not be set.
+ ///
+ public class UseStd3AsciiRules
+ {
+ private void VerifyStd3AsciiRules(string unicode)
+ {
+ var idnStd3False = new IdnMapping { UseStd3AsciiRules = false };
+ var idnStd3True = new IdnMapping { UseStd3AsciiRules = true };
+
+ Assert.Equal(unicode, idnStd3False.GetAscii(unicode));
+ Assert.Throws(() => idnStd3True.GetAscii(unicode));
+ }
+
+ [Fact]
+ public void DefaultIsFalse()
+ {
+ Assert.False(new IdnMapping().UseStd3AsciiRules);
+ }
+
+ [Fact]
+ public void SanityCheck()
+ {
+ VerifyStd3AsciiRules("\u0020\u0061\u0062");
+ VerifyStd3AsciiRules("\u0061\u002F\u0062");
+ VerifyStd3AsciiRules("\u0061\u0062\u003D");
+ VerifyStd3AsciiRules("\u0061\u0062\u005D");
+ VerifyStd3AsciiRules("\u007E\u0061\u0062");
+ VerifyStd3AsciiRules("\u0020\u002E\u003D\u005D\u007E");
+ VerifyStd3AsciiRules("\u007E\u002E\u0061");
+ VerifyStd3AsciiRules("\u0061\u002E\u007E");
+ }
+
+ [Fact]
+ public void LeadingHyphenMinus()
+ {
+ VerifyStd3AsciiRules("\u002D\u0061\u0062");
+ }
+
+ [Fact]
+ public void LeadingHyphenMinusInFirstLabel()
+ {
+ VerifyStd3AsciiRules("\u002D\u0061\u0062\u002E\u0063\u0064");
+ }
+
+ [Fact]
+ public void LeadingHyphenMinusInSecondLabel()
+ {
+ VerifyStd3AsciiRules("\u0061\u0062\u002E\u002D\u0063\u0064");
+ }
+
+ [Fact]
+ public void TrailingHyphenMinus()
+ {
+ VerifyStd3AsciiRules("\u0061\u0062\u002D");
+ }
+
+ [Fact]
+ public void TrailingHyphenMinusInFirstLabel()
+ {
+ VerifyStd3AsciiRules("\u0061\u0062\u002D\u002E\u0063\u0064");
+ }
+
+ [Fact]
+ public void TrailingHyphenMinusInSecondLabel()
+ {
+ VerifyStd3AsciiRules("\u0061\u0062\u002E\u0063\u0064\u002D");
+ }
+
+ [Fact]
+ public void LeadingAndTrailingHyphenMinus()
+ {
+ VerifyStd3AsciiRules("\u002D");
+ VerifyStd3AsciiRules("\u002D\u0062\u002D");
+ }
+
+ [Fact]
+ public void NonLDH_ASCII_Codepoint()
+ {
+ var idnStd3False = new IdnMapping { UseStd3AsciiRules = false };
+ var unicode = "\u0030\u002D\u0045\u007A";
+
+ Assert.Equal(unicode, idnStd3False.GetAscii(unicode));
+ }
+ }
+}
diff --git a/src/System.Globalization.Extensions/tests/Normalization/Normalization.cs b/src/System.Globalization.Extensions/tests/Normalization/Normalization.cs
new file mode 100644
index 000000000000..84b7be73bc1e
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/Normalization/Normalization.cs
@@ -0,0 +1,72 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Xunit;
+using System;
+using System.Text;
+using System.Globalization;
+
+namespace System.Globalization.Extensions.Tests
+{
+ public class StringNormalization
+ {
+ [Fact]
+ public void NormalizeTest()
+ {
+ string composed = "\u00C4\u00C7"; // "ÄÇ"
+ string decomposed = "A\u0308C\u0327";
+
+ Assert.True(composed.IsNormalized());
+ Assert.True(composed.IsNormalized(NormalizationForm.FormC));
+ Assert.False(composed.IsNormalized(NormalizationForm.FormD));
+
+ Assert.True(decomposed.IsNormalized(NormalizationForm.FormD));
+ Assert.False(decomposed.IsNormalized(NormalizationForm.FormC));
+
+ Assert.True("".Normalize(NormalizationForm.FormC).Length == 0);
+
+ Assert.True(composed.Normalize(NormalizationForm.FormD).Equals(decomposed));
+ Assert.True(decomposed.Normalize().Equals(composed));
+ Assert.True(decomposed.Normalize(NormalizationForm.FormC).Equals(composed));
+
+ string fi = "\uFB01";
+ string decomposedFi = "fi";
+
+ Assert.True(fi.Normalize(NormalizationForm.FormC).Equals(fi));
+ Assert.True(fi.Normalize(NormalizationForm.FormD).Equals(fi));
+ Assert.True(fi.Normalize(NormalizationForm.FormKD).Equals(decomposedFi));
+ Assert.True(fi.Normalize(NormalizationForm.FormKC).Equals(decomposedFi));
+
+ string fwith2dots = "\u1E9b\u0323";
+ string decomposedFwith2dots = "\u017f\u0323\u0307";
+ string decomposedCompatFwith2dots = "\u0073\u0323\u0307";
+ string composedCompatFwith2dots = "\u1E69";
+
+ Assert.True(fwith2dots.Normalize(NormalizationForm.FormC).Equals(fwith2dots));
+ Assert.True(fwith2dots.Normalize(NormalizationForm.FormD).Equals(decomposedFwith2dots));
+ Assert.True(fwith2dots.Normalize(NormalizationForm.FormKC).Equals(composedCompatFwith2dots));
+ Assert.True(fwith2dots.Normalize(NormalizationForm.FormKD).Equals(decomposedCompatFwith2dots));
+ }
+
+ [Fact]
+ public void ExceptionsTest()
+ {
+ string fi = "\uFB01";
+ // "Expected to throw with invalid Normalization"
+ Assert.Throws(() => fi.IsNormalized((NormalizationForm)10));
+ // "Expected to throw with invalid Normalization"
+ Assert.Throws(() => fi.Normalize((NormalizationForm)7));
+
+ string invalidCodepoint = "\uFFFE";
+ string invalidSurrogate = "\uD800\uD800";
+
+ // "Expected to throw with invalid codepoint"
+ Assert.Throws(() => invalidCodepoint.Normalize());
+ // "Expected to throw with invalid surrogate pair"
+ Assert.Throws(() => invalidSurrogate.Normalize());
+
+ // "Expected ArgumentNullException when passing null string"
+ Assert.Throws(() => StringNormalizationExtensions.Normalize(null));
+ }
+ }
+}
diff --git a/src/System.Globalization.Extensions/tests/Normalization/NormalizationAll.cs b/src/System.Globalization.Extensions/tests/Normalization/NormalizationAll.cs
new file mode 100644
index 000000000000..59271238f640
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/Normalization/NormalizationAll.cs
@@ -0,0 +1,18354 @@
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using Xunit;
+using System;
+using System.Text;
+using System.Globalization;
+
+namespace System.Globalization.Extensions.Tests
+{
+ public class NormalizationAll
+ {
+ [Fact]
+ public void NormalizeTest()
+ {
+ bool failed = false;
+
+ for (int i = 0; i < s_normalizationData.Length; i++)
+ {
+ NormalizationForm form = NormalizationForm.FormC;
+ try
+ {
+ form = NormalizationForm.FormC;
+ // Form C
+ failed |= VerifyConformanceInvariant(NormalizationForm.FormC, s_normalizationData[i][0], s_normalizationData[i][1], s_normalizationData[i][2], s_normalizationData[i][3], s_normalizationData[i][4]);
+
+ form = NormalizationForm.FormD;
+ // Form D
+ failed |= VerifyConformanceInvariant(NormalizationForm.FormD, s_normalizationData[i][0], s_normalizationData[i][1], s_normalizationData[i][2], s_normalizationData[i][3], s_normalizationData[i][4]);
+
+ form = NormalizationForm.FormKC;
+
+ // Form KC
+ failed |= VerifyConformanceInvariant(NormalizationForm.FormKC, s_normalizationData[i][0], s_normalizationData[i][1], s_normalizationData[i][2], s_normalizationData[i][3], s_normalizationData[i][4]);
+
+ form = NormalizationForm.FormKD;
+ // Form KD
+ failed |= VerifyConformanceInvariant(NormalizationForm.FormKD, s_normalizationData[i][0], s_normalizationData[i][1], s_normalizationData[i][2], s_normalizationData[i][3], s_normalizationData[i][4]);
+ }
+ catch
+ {
+ Console.WriteLine("Wrong index: {0} length = {1} form = {2}", i, s_normalizationData[i].Length, form);
+ for (int j = 0; j < s_normalizationData[i].Length; j++ )
+ {
+ Console.WriteLine("'{0}'", DumpStringAsCodepoints(s_normalizationData[i][j]));
+ }
+ throw;
+ }
+ }
+
+ Assert.False(failed);
+ }
+
+ // ------------------------------------------------------------------------
+ // VerifyConformanceInvariant()
+ //
+ // Verifies the first normalization conformance invariant for the
+ // specified normalization form, where the rule as defined for all
+ // Unicode normalization forms is as follows:
+ //
+ // 1. The following invariants must be true for all conformant
+ // implementations:
+ //
+ // NFC
+ // c2 == NFC(c1) == NFC(c2) == NFC(c3)
+ // c4 == NFC(c4) == NFC(c5)
+ //
+ // NFD
+ // c3 == NFD(c1) == NFD(c2) == NFD(c3)
+ // c5 == NFD(c4) == NFD(c5)
+ //
+ // NFKC
+ // c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
+ //
+ // NFKD
+ // c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
+ //
+ // NOTE: The argument defines whether the results should
+ // be taken from NLS (via NLS_PLATFORM) or NLS+ (via NLS_PLUS_PLATFORM)
+ // ------------------------------------------------------------------------
+
+ private static bool VerifyConformanceInvariant(
+ NormalizationForm normForm,
+ string c1,
+ string c2,
+ string c3,
+ string c4,
+ string c5
+ )
+ {
+ bool failed = false;
+ // Initialize variables according to
+ string strNFc1 = c1.Normalize(normForm);
+ bool bNFc1 = c1.IsNormalized(normForm);
+ string strNFc2 = c2.Normalize(normForm);
+ bool bNFc2 = c2.IsNormalized(normForm);
+ string strNFc3 = c3.Normalize(normForm);
+ bool bNFc3 = c3.IsNormalized(normForm);
+ string strNFc4 = c4.Normalize(normForm);
+ bool bNFc4 = c4.IsNormalized(normForm);
+ string strNFc5 = c5.Normalize(normForm);
+ bool bNFc5 = c5.IsNormalized(normForm);
+
+ // Verify conformance invariants particular to
+ switch (normForm)
+ {
+ case NormalizationForm.FormC:
+ // c2 == NFC(c1) == NFC(c2) == NFC(c3)
+ failed |= CheckFailue(normForm, c2, strNFc1);
+ failed |= CheckFailue(normForm, c2, strNFc2);
+ failed |= CheckFailue(normForm, c2, strNFc3);
+
+ // c4 == NFC(c4) == NFC(c5)
+ failed |= CheckFailue(normForm, c4, strNFc4);
+ failed |= CheckFailue(normForm, c4, strNFc5);
+
+ // c2 is normalized to Form C
+ if (!bNFc2)
+ {
+ Console.WriteLine("'{0}' is marked as not normalized with form {1}", c2, normForm);
+ failed = true;
+ }
+
+ // c4 is normalized to Form C
+ if (!bNFc4)
+ {
+ Console.WriteLine("'{0}' is marked as not normalized with form {1}", c4, normForm);
+ failed = true;
+ }
+ break;
+
+ case NormalizationForm.FormD:
+ // c3 == NFD(c1) == NFD(c2) == NFD(c3)
+ failed |= CheckFailue(normForm, c3, strNFc1);
+ failed |= CheckFailue(normForm, c3, strNFc2);
+ failed |= CheckFailue(normForm, c3, strNFc3);
+
+ // c5 == NFD(c4) == NFD(c5)
+ failed |= CheckFailue(normForm, c5, strNFc4);
+ failed |= CheckFailue(normForm, c5, strNFc5);
+
+ // c3 is normalized to Form D
+ if (!bNFc3)
+ {
+ Console.WriteLine("'{0}' is marked as not normalized with form {1}", c3, normForm);
+ failed = true;
+ }
+ // c5 is normalized to Form D
+ if (!bNFc5)
+ {
+ Console.WriteLine("'{0}' is marked as not normalized with form {1}", c5, normForm);
+ failed = true;
+ }
+ break;
+
+ case NormalizationForm.FormKC:
+ // c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4)
+ // == NFKC(c5)
+ failed |= CheckFailue(normForm, c4, strNFc1);
+ failed |= CheckFailue(normForm, c4, strNFc2);
+ failed |= CheckFailue(normForm, c4, strNFc3);
+ failed |= CheckFailue(normForm, c4, strNFc4);
+ failed |= CheckFailue(normForm, c4, strNFc5);
+
+ // c4 is normalized to Form KC
+ if (!bNFc4)
+ {
+ Console.WriteLine("'{0}' is marked as not normalized with form {1}", c4, normForm);
+ failed = true;
+ }
+ break;
+
+ case NormalizationForm.FormKD:
+ // c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4)
+ // == NFKD(c5)
+ failed |= CheckFailue(normForm, c5, strNFc1);
+ failed |= CheckFailue(normForm, c5, strNFc2);
+ failed |= CheckFailue(normForm, c5, strNFc3);
+ failed |= CheckFailue(normForm, c5, strNFc4);
+ failed |= CheckFailue(normForm, c5, strNFc5);
+
+ // c5 is normalized to Form KD
+ if (!bNFc5)
+ {
+ Console.WriteLine("'{0}' is marked as not normalized with form {1}", c5, normForm);
+ failed = true;
+ }
+ break;
+ }
+ return failed;
+ }
+
+ private static bool CheckFailue(NormalizationForm normForm, string c, string cForm)
+ {
+ if (!c.Equals(cForm))
+ {
+ Console.WriteLine("'{0}' is not matched with the normalized form '{1} with {2} normalization", DumpStringAsCodepoints(c), DumpStringAsCodepoints(cForm), cForm);
+ return true;
+ }
+
+ return false;
+ }
+
+ private static string DumpStringAsCodepoints(string s)
+ {
+ StringBuilder sb = new StringBuilder();
+ for (int i=0; i
+
+
+
+ Debug
+ AnyCPU
+ Library
+ System.Globalization.Extensions.Tests
+ System.Globalization.Extensions.Tests
+ {BC439554-4AB4-4C94-8E28-C00EDE4FD1C7}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {2b96aa10-84c0-4927-8611-8d2474b990e8}
+ System.Globalization.Extensions
+
+
+
+
\ No newline at end of file
diff --git a/src/System.Globalization.Extensions/tests/packages.config b/src/System.Globalization.Extensions/tests/packages.config
new file mode 100644
index 000000000000..1c60b38169f2
--- /dev/null
+++ b/src/System.Globalization.Extensions/tests/packages.config
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/System.IO.Pipes/tests/System.IO.Pipes.BasicTests.csproj b/src/System.IO.Pipes/tests/System.IO.Pipes.BasicTests.csproj
index 9a0fbaad0b7d..77e1b2822baf 100644
--- a/src/System.IO.Pipes/tests/System.IO.Pipes.BasicTests.csproj
+++ b/src/System.IO.Pipes/tests/System.IO.Pipes.BasicTests.csproj
@@ -1,7 +1,6 @@
-
11.0
Debug
diff --git a/src/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj b/src/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj
index bdd3a7acd92a..473914823f13 100644
--- a/src/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj
+++ b/src/System.Reflection.Metadata/src/System.Reflection.Metadata.csproj
@@ -178,7 +178,7 @@
- ..\..\packages\System.Collections.Immutable.1.1.32-beta\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll
+ $(PackagesDir)\System.Collections.Immutable.1.1.32-beta\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll